]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#104,!290] kea-dhcpv6 now supports fetching config from backends
authorThomas Markwalder <tmark@isc.org>
Tue, 26 Mar 2019 19:12:06 +0000 (15:12 -0400)
committerThomas Markwalder <tmark@isc.org>
Tue, 26 Mar 2019 19:12:06 +0000 (15:12 -0400)
    Infrastructure has been added to kea-dhcp6 such that it can
    now be configured to fetch full and then periodic updates
    from config backends.

    Merging the actual fetched content will be done under subsequent
    issues.

src/bin/dhcp6
    ctrl_dhcp6_srv.*
        - ControlledDhcpv6Srv::processConfig() - added logic to schedule CB update timer
        - ControlledDhcpv6Srv::cbFetchUpdates() - new callback function for CB updates

    dhcp6_lexer.ll
    dhcp6_parser.yy
        -  Added config-fetch-wait-time

    dhcp6_messages.mes
        -  New log messages

    dhcp6_srv.*
        - Dhcpv6Srv::cb_control_  - new member for config backend access
        - Dhcpv6Srv::inTestMode() - new function to test for unit test mode

    json_config_parser.cc
        - configureDhcp6Server() - invokes full fetch from config backend

src/bin/dhcp6/tests
    config_backend_unittest.cc - new file/tests for config backend testing
    config_parser_unittest.cc - updated
    get_config_unittest.cc - rebuild tests
    kea_controller_unittest.cc - added CB control/timer tests

src/lib/dhcpsrv/
    dhcpsrv_messages.mes - added log message
cb_ctl_dhcp6.* - new files that provide v6 impl of config backend controller

doc/examples/kea6/all-keys-current.json - added config-fetch-wait-time

27 files changed:
doc/examples/kea6/all-keys-current.json
src/bin/dhcp6/ctrl_dhcp6_srv.cc
src/bin/dhcp6/ctrl_dhcp6_srv.h
src/bin/dhcp6/dhcp6_lexer.cc
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_messages.cc
src/bin/dhcp6/dhcp6_messages.h
src/bin/dhcp6/dhcp6_messages.mes
src/bin/dhcp6/dhcp6_parser.cc
src/bin/dhcp6/dhcp6_parser.h
src/bin/dhcp6/dhcp6_parser.yy
src/bin/dhcp6/dhcp6_srv.cc
src/bin/dhcp6/dhcp6_srv.h
src/bin/dhcp6/json_config_parser.cc
src/bin/dhcp6/location.hh
src/bin/dhcp6/position.hh
src/bin/dhcp6/stack.hh
src/bin/dhcp6/tests/config_backend_unittest.cc [new file with mode: 0644]
src/bin/dhcp6/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/get_config_unittest.cc
src/bin/dhcp6/tests/kea_controller_unittest.cc
src/lib/dhcpsrv/Makefile.am
src/lib/dhcpsrv/cb_ctl_dhcp6.cc [new file with mode: 0644]
src/lib/dhcpsrv/cb_ctl_dhcp6.h [new file with mode: 0644]
src/lib/dhcpsrv/dhcpsrv_messages.cc
src/lib/dhcpsrv/dhcpsrv_messages.h
src/lib/dhcpsrv/dhcpsrv_messages.mes

index 489807a5a784cd3e7c1cf2cd1aee60f371957098..07dea2e142626dcaed64a7c21694a85d4a70690c 100644 (file)
                     // Type of the database, e.g. "mysql", "postgresql", "cql".
                     "type": "mysql"
                 }
-            ]
+            ],
+            // Intervals between attempts to fetch configuration updates
+            // via the configuration backends used.
+            "config-fetch-wait-time": 30
         },
 
         // Server tag.
index 93c89a58f44577d8a408cf5239cf6a811496d9bf..3e009bb67f22786666f7e01749ee458c5e31096d 100644 (file)
@@ -695,6 +695,34 @@ ControlledDhcpv6Srv::processConfig(isc::data::ConstElementPtr config) {
         return (isc::config::createAnswer(1, err.str()));
     }
 
+    // Setup config backend polling, if configured for it.
+    auto ctl_info = CfgMgr::instance().getStagingCfg()->getConfigControlInfo();
+    if (ctl_info) {
+        long fetch_time = static_cast<long>(ctl_info->getConfigFetchWaitTime());
+        // Only schedule the CB fetch timer if the fetch wait time is greater
+        // than 0.
+        if (fetch_time > 0) {
+            // When we run unit tests, we want to use milliseconds unit for the
+            // specified interval. Otherwise, we use seconds. Note that using
+            // milliseconds as a unit in unit tests prevents us from waiting 1
+            // second on more before the timer goes off. Instead, we wait one
+            // millisecond which significantly reduces the test time.
+            if (!server_->inTestMode()) {
+                fetch_time = 1000 * fetch_time;
+            }
+
+            boost::shared_ptr<unsigned> failure_count(new unsigned(0));
+            TimerMgr::instance()->
+                registerTimer("Dhcp6CBFetchTimer",
+                              boost::bind(&ControlledDhcpv6Srv::cbFetchUpdates,
+                                          server_, CfgMgr::instance().getStagingCfg(),
+                                          failure_count),
+                              fetch_time,
+                              asiolink::IntervalTimer::ONE_SHOT);
+            TimerMgr::instance()->setup("Dhcp6CBFetchTimer");
+        }
+    }
+
     // Finally, we can commit runtime option definitions in libdhcp++. This is
     // exception free.
     LibDHCP::commitRuntimeOptionDefs();
@@ -962,5 +990,36 @@ ControlledDhcpv6Srv::dbLostCallback(ReconnectCtlPtr db_reconnect_ctl) {
     return(true);
 }
 
+void
+ControlledDhcpv6Srv::cbFetchUpdates(const SrvConfigPtr& srv_cfg,
+                                    boost::shared_ptr<unsigned> failure_count) {
+    try {
+        // The true value indicates that the server should not reconnect
+        // to the configuration backends and should take into account
+        // audit entries stored in the database since last fetch.
+        server_->getCBControl()->databaseConfigFetch(srv_cfg,
+                                                     CBControlDHCPv6::FetchMode::FETCH_UPDATE);
+        (*failure_count) = 0;
+
+    } catch (const std::exception& ex) {
+        LOG_ERROR(dhcp6_logger, DHCP6_CB_FETCH_UPDATES_FAIL)
+            .arg(ex.what());
+
+        // We allow at most 10 consecutive failures after which we stop
+        // making further attempts to fetch the configuration updates.
+        // Let's return without re-scheduling the timer.
+        if (++(*failure_count) > 10) {
+            LOG_ERROR(dhcp6_logger, DHCP6_CB_FETCH_UPDATES_RETRIES_EXHAUSTED);
+            return;
+        }
+    }
+
+    // Reschedule the timer to fetch new updates or re-try if
+    // the previous attempt resulted in an error.
+    if (TimerMgr::instance()->isTimerRegistered("Dhcp6CBFetchTimer")) {
+        TimerMgr::instance()->setup("Dhcp6CBFetchTimer");
+    }
+}
+
 }; // end of isc::dhcp namespace
 }; // end of isc namespace
index ee81c36a530b6f607142881aecb1b5b4f31a2cd7..ef776c83a8d2fcd9eac0025059cd017c6e33ff40 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -357,6 +357,20 @@ private:
     /// configured reconnect parameters
     bool dbLostCallback(db::ReconnectCtlPtr db_reconnect_ctl);
 
+    /// @brief Callback invoked periodically to fetch configuration updates
+    /// from the Config Backends.
+    ///
+    /// This method calls @c CBControlDHCPv6::databaseConfigFetch and then
+    /// reschedules the timer.
+    ///
+    /// @param srv_cfg Server configuration holding the database credentials
+    /// and server tag.
+    /// @param failure_count pointer to failure counter which causes this
+    /// callback to stop scheduling the timer after 10 consecutive failures
+    /// to fetch the updates.
+    void cbFetchUpdates(const SrvConfigPtr& srv_cfg,
+                        boost::shared_ptr<unsigned> failure_count);
+
     /// @brief Static pointer to the sole instance of the DHCP server.
     ///
     /// This is required for config and command handlers to gain access to
index c18c9b4ff1967ff02d325ae889278c5f00929620..f247a88cdb3471245121e3ba70725cca55a05217 100644 (file)
@@ -1,6 +1,6 @@
-#line 1 "dhcp6_lexer.cc"
+#line 2 "dhcp6_lexer.cc"
 
-#line 3 "dhcp6_lexer.cc"
+#line 4 "dhcp6_lexer.cc"
 
 #define  YY_INT_ALIGNED short int
 
@@ -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 182
-#define YY_END_OF_BUFFER 183
+#define YY_NUM_RULES 183
+#define YY_END_OF_BUFFER 184
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -700,21 +700,21 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static const flex_int16_t yy_accept[1489] =
+static const flex_int16_t yy_accept[1505] =
     {   0,
-      175,  175,    0,    0,    0,    0,    0,    0,    0,    0,
-      183,  181,   10,   11,  181,    1,  175,  172,  175,  175,
-      181,  174,  173,  181,  181,  181,  181,  181,  168,  169,
-      181,  181,  181,  170,  171,    5,    5,    5,  181,  181,
-      181,   10,   11,    0,    0,  164,    0,    0,    0,    0,
+      176,  176,    0,    0,    0,    0,    0,    0,    0,    0,
+      184,  182,   10,   11,  182,    1,  176,  173,  176,  176,
+      182,  175,  174,  182,  182,  182,  182,  182,  169,  170,
+      182,  182,  182,  171,  172,    5,    5,    5,  182,  182,
+      182,   10,   11,    0,    0,  165,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    1,  175,
-      175,    0,  174,  175,    3,    2,    6,    0,  175,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    1,  176,
+      176,    0,  175,  176,    3,    2,    6,    0,  176,    0,
         0,    0,    0,    0,    0,    4,    0,    0,    9,    0,
 
-      165,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  167,    0,    0,    0,
+      166,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  168,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -722,149 +722,152 @@ static const flex_int16_t yy_accept[1489] =
         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,
-      142,    0,    0,  143,    0,    0,    0,    0,    0,    0,
+      143,    0,    0,  144,    0,    0,    0,    0,    0,    0,
 
-        0,    0,  166,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  167,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   97,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   98,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      180,  178,    0,  177,  176,    0,    0,    0,    0,    0,
+      181,  179,    0,  178,  177,    0,    0,    0,    0,    0,
 
-        0,    0,  141,    0,    0,   28,    0,   27,    0,    0,
-      104,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       54,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  142,    0,    0,   28,    0,   27,    0,    0,
+      105,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       55,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      101,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      102,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,  179,  176,    0,    0,    0,    0,    0,    0,
+        0,    0,  180,  177,    0,    0,    0,    0,    0,    0,
         0,    0,   29,    0,    0,   31,    0,    0,    0,    0,
-        0,  105,    0,    0,    0,    0,    0,    0,    0,   82,
-        0,    0,    0,    0,    0,    0,    0,  126,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   57,
+        0,  106,    0,    0,    0,    0,    0,    0,    0,   83,
+        0,    0,    0,    0,    0,    0,    0,  127,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   58,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       81,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,   91,    0,   58,    0,    0,    0,    0,
+       82,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   92,    0,   59,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  121,  146,   50,    0,   55,    0,
-        0,    0,    0,    0,    0,  161,   37,    0,   34,    0,
-       33,    0,    0,    0,  134,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  122,  147,   51,    0,   56,    0,
+        0,    0,    0,    0,    0,  162,   37,    0,   34,    0,
+       33,    0,    0,    0,  135,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,  113,    0,    0,
-        0,    0,    0,    0,    0,    0,  145,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  114,    0,    0,
+        0,    0,    0,    0,    0,    0,  146,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   52,    0,    0,   32,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,   84,    0,    0,    0,    0,
+        0,    0,   53,    0,    0,   32,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,   85,    0,    0,    0,    0,
 
-        0,    0,    0,    0,    0,    0,    0,  135,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  136,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  130,    0,    0,    0,    0,    0,    0,    7,   35,
+        0,  131,    0,    0,    0,    0,    0,    0,    7,   35,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      103,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      104,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      115,    0,    0,    0,    0,    0,    0,  112,    0,    0,
-        0,    0,    0,    0,    0,    0,   86,    0,    0,    0,
+      116,    0,    0,    0,    0,    0,    0,  113,    0,    0,
+        0,    0,    0,    0,    0,    0,   87,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       94,    0,    0,    0,    0,    0,    0,    0,    0,  109,
-        0,    0,    0,    0,   93,    0,    0,    0,    0,    0,
+       95,    0,    0,    0,    0,    0,    0,    0,    0,  110,
+        0,    0,    0,    0,   94,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  129,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  130,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  139,  110,    0,    0,    0,    0,  114,   51,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   59,
+        0,    0,  140,  111,    0,    0,    0,    0,  115,   52,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       60,    0,    0,    0,    0,    0,    0,    0,    0,    0,
 
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   77,
-        0,    0,    0,    0,    0,    0,  162,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  100,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,  128,    0,    0,    0,
-        0,    0,    0,   62,    0,    0,    0,    0,    0,    0,
+       78,    0,    0,    0,    0,    0,    0,  163,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       56,   85,    0,    0,    0,  125,    0,    0,    0,   49,
+        0,    0,    0,    0,    0,    0,    0,  101,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  129,    0,
+        0,    0,    0,    0,    0,   63,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   57,   86,    0,    0,    0,  126,    0,    0,
+        0,   50,    0,    0,    0,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,    0,    0,    0,    0,  117,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      118,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  160,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  161,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       95,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   96,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   41,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   16,    0,
-        0,  140,   14,    0,    0,    0,    0,    0,    0,    0,
-
+        0,    0,    0,    0,    0,    0,    0,    0,    0,   41,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  131,    0,  116,    0,    0,    0,
+        0,   16,    0,    0,  141,   14,    0,    0,    0,    0,
+
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,  127,  144,    0,   40,    0,  136,    0,
-        0,    0,    0,    0,    0,    0,    0,   20,    0,    0,
-        0,   79,    0,    0,    0,    0,  138,   53,    0,   87,
+        0,    0,    0,    0,    0,    0,    0,    0,  132,    0,
+      117,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  128,  145,    0,
+       40,    0,  137,    0,    0,    0,    0,    0,    0,    0,
+        0,   20,    0,    0,    0,   80,    0,    0,    0,    0,
+      139,   54,    0,   88,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   76,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   83,    0,
-        0,    0,    0,   63,    0,    0,    0,    0,    0,    0,
-
-        0,    0,  133,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  106,
-        0,    0,    0,    0,    0,   80,  102,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   73,    0,
-        0,    0,    0,    0,    0,   17,    0,   15,    0,  158,
-      157,    0,   68,    0,    0,    0,    0,    0,   30,  120,
+       77,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,   84,    0,    0,    0,    0,    0,   64,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  134,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-      155,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   96,    0,  124,   43,    0,   60,    0,    0,
-        0,    0,   19,    0,    0,    0,    0,    0,    0,   98,
-
-       74,    0,    0,  132,    0,    0,    0,    0,    0,  123,
-        0,    0,    0,    0,    0,   92,    0,  163,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   90,    0,    0,
-      147,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  107,    0,    0,    0,    0,    0,
+       81,  103,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   74,    0,    0,    0,    0,    0,    0,
+       17,    0,   15,    0,  159,  158,    0,   69,    0,    0,
+        0,    0,    0,   30,  121,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  156,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   97,    0,
+      125,   43,    0,   61,    0,    0,    0,    0,   19,    0,
+
+        0,    0,    0,    0,    0,   99,   75,    0,    0,  133,
+        0,    0,    0,    0,    0,  124,    0,    0,    0,    0,
+        0,   93,    0,  164,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   91,    0,    0,  148,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   42,
-        0,    0,   67,    0,    0,    0,  118,   47,    0,    0,
-       69,  156,   38,    0,    0,   12,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,   45,    0,    0,   44,   18,
-        0,    0,    0,    0,  111,    0,    0,    0,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   72,
-        0,    0,   61,    0,    0,   88,    0,    0,    0,    0,
-        0,  137,    0,    0,    0,   46,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,   66,
-        0,    0,    0,   78,    0,   36,   48,    0,    0,    0,
-        0,    0,   24,    0,    0,    0,    0,    0,    0,  153,
-        0,  122,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,   99,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,   25,   39,    0,    0,    0,    0,    0,   13,
-        0,    0,    0,    0,    0,    0,    0,    0,  159,    0,
-
-        0,    0,    0,    0,    0,  152,    0,    0,   21,   71,
-        0,    0,    0,    0,    0,   64,    0,    0,   89,    0,
-        0,  151,    0,    0,   70,    0,    0,   65,    0,   23,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   42,    0,    0,   68,
+        0,    0,    0,  119,   47,    0,    0,    0,   70,  157,
+       38,    0,    0,   12,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   45,    0,    0,   44,   18,    0,    0,
+
+        0,    0,  112,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,   73,    0,    0,
+        0,   62,    0,    0,   89,    0,    0,    0,    0,    0,
+      138,    0,    0,    0,   46,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   67,    0,
+        0,    0,   79,    0,   36,   48,    0,    0,    0,    0,
+        0,    0,   24,    0,    0,    0,    0,    0,    0,  154,
+        0,  123,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  100,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,   25,   39,    0,    0,    0,    0,    0,
+
+       13,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      160,    0,    0,    0,    0,    0,    0,  153,    0,    0,
+       21,   72,    0,    0,    0,    0,    0,   65,    0,    0,
+        0,   90,    0,    0,  152,    0,    0,   71,    0,    0,
+       66,    0,   23,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,   22,    0,  107,
-      119,    0,    0,    0,    0,    0,    0,  149,  154,   75,
-        0,    0,    0,    0,  148,    0,    0,   26,    0,    0,
-        0,    0,    0,  108,    0,    0,  150,    0
+        0,    0,    0,    0,    0,    0,    0,   49,    0,    0,
+        0,    0,    0,   22,    0,  108,  120,    0,    0,    0,
+        0,    0,    0,  150,  155,   76,    0,    0,    0,    0,
+      149,    0,    0,   26,    0,    0,    0,    0,    0,  109,
+
+        0,    0,  151,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -911,352 +914,356 @@ static const YY_CHAR yy_meta[72] =
         3
     } ;
 
-static const flex_int16_t yy_base[1501] =
+static const flex_int16_t yy_base[1517] =
     {   0,
         0,   70,   19,   29,   41,   49,   52,   58,   87,   95,
-     1852, 1853,   32, 1848,  141,    0,  201, 1853,  206,   88,
-       11,  213, 1853, 1830,  114,   25,    2,    6, 1853, 1853,
-       73,   11,   17, 1853, 1853, 1853,  104, 1836, 1791,    0,
-     1828,  107, 1843,  217,  241, 1853,  185, 1787, 1793, 1813,
+     1868, 1869,   32, 1864,  141,    0,  201, 1869,  206,   88,
+       11,  213, 1869, 1846,  114,   25,    2,    6, 1869, 1869,
+       73,   11,   17, 1869, 1869, 1869,  104, 1852, 1807,    0,
+     1844,  107, 1859,  217,  241, 1869,  185, 1803, 1809, 1829,
        93,   58,  190,   91,  211,  200,   14,  267,  213,  175,
-      269,   64,  231,  184,  187,   75, 1794,  274,  215,  290,
-      278,  297, 1777,  207,  302,  316,  316, 1796,    0,  355,
-      360,  372,  377,  380, 1853,    0, 1853,  295,  383,  227,
-      296,  283,  327,  361,  293, 1853, 1793, 1832, 1853,  237,
-
-     1853,  394,  363, 1780, 1790, 1829,  375,  321,  403, 1784,
-      369,  378,  376,  382,  388, 1827,    0,  445,  407, 1771,
-     1779,  364, 1775, 1764, 1765,  372, 1781, 1764, 1773,  387,
-      308,  378, 1767, 1765,  391, 1754, 1810,  416, 1757, 1808,
-     1750, 1773, 1770, 1770, 1764,  214, 1757, 1750, 1755, 1749,
-      382, 1760, 1753, 1744, 1743, 1757,  362, 1793, 1742,  414,
-     1754, 1757, 1741,  441, 1742,  417, 1754, 1751, 1752, 1750,
-      422, 1732, 1737, 1733, 1725, 1742, 1734,    0,  422,  450,
-      440,  446,  454,  470, 1733, 1853,    0,  476, 1724, 1727,
-     1853,  465,  447, 1853, 1779, 1734,  477, 1777,  481, 1776,
-
-      477, 1775, 1853,  521, 1774,  489, 1735, 1730, 1729, 1720,
-      491, 1769, 1763, 1729, 1708, 1716, 1722, 1710, 1724, 1720,
-     1721, 1721, 1716, 1708, 1710, 1694, 1698, 1711, 1713, 1710,
-     1702, 1692, 1695, 1709, 1853, 1695, 1703, 1706, 1687, 1686,
-     1736, 1685, 1695, 1733,  452, 1694, 1682, 1693, 1729,  490,
-     1733, 1670, 1685,    9, 1675, 1691, 1672, 1674, 1670, 1676,
-     1667, 1666, 1679, 1672, 1674, 1678, 1677, 1671,   80, 1678,
-     1673, 1665, 1655, 1670, 1665, 1669,  459, 1667, 1653, 1659,
-     1666, 1654,  230, 1647, 1661, 1660, 1663, 1645, 1653,  491,
-     1853, 1853,  501, 1853, 1853, 1640,    0,  376, 1642,  497,
-
-      503, 1696, 1853, 1649,  489, 1853, 1694, 1853, 1688,  557,
-     1853,  484, 1630, 1640, 1690, 1647, 1642, 1645, 1640,  304,
-     1853, 1642,  549, 1640, 1637, 1638,  303, 1642, 1680, 1630,
-     1625, 1622, 1618, 1620, 1669, 1628, 1617, 1633, 1665, 1613,
-      550, 1626, 1626, 1609, 1610, 1623, 1610, 1620, 1615, 1622,
-     1617, 1602,  470, 1611, 1614, 1609, 1605, 1653,  515,  524,
-     1853, 1647, 1599, 1598, 1591, 1593, 1597, 1586, 1593, 1598,
-      513, 1643, 1598,  510, 1595, 1599, 1597, 1586, 1586, 1598,
-      502, 1573, 1574, 1595,  536, 1577, 1574, 1588, 1591, 1586,
-     1572, 1584, 1583, 1582, 1581,  532, 1622, 1621, 1620, 1564,
-
-      581, 1577, 1853, 1853, 1576,    0,  556, 1564, 1615, 1614,
-     1572, 1612, 1853, 1560, 1610, 1853,  563,  609,  557, 1609,
-     1551, 1853, 1556, 1562, 1565, 1548, 1563, 1550, 1549, 1853,
-     1559, 1550, 1547, 1559,  549, 1544, 1546, 1853, 1552, 1537,
-     1539, 1550, 1548, 1543,  588, 1550, 1538, 1531, 1580, 1853,
-     1529, 1545, 1577, 1581, 1539, 1533, 1535, 1536, 1538, 1570,
-     1523, 1518, 1517, 1519, 1512, 1527, 1505, 1512, 1517, 1565,
-     1853, 1512, 1508, 1562, 1515, 1509, 1516, 1501, 1511, 1514,
-     1503, 1502, 1497, 1853, 1552, 1853, 1496, 1495, 1488, 1505,
-     1542, 1489, 1494, 1503, 1497, 1491, 1500,  602, 1535, 1499,
-
-     1482, 1482, 1477, 1473, 1479, 1484, 1477, 1485, 1489, 1472,
-     1528, 1470, 1484, 1473, 1853, 1853, 1853, 1473, 1853, 1483,
-     1517, 1479,    0, 1520, 1470, 1853, 1853, 1467, 1853, 1473,
-     1853,  569,  565,  604, 1853, 1511, 1458, 1509, 1456, 1455,
-     1454, 1461, 1454, 1462, 1465, 1464, 1448, 1463, 1445, 1492,
-     1459, 1495, 1441, 1443, 1455, 1455, 1454, 1853, 1439, 1436,
-     1492, 1449, 1441, 1447, 1438, 1446, 1853, 1431, 1442, 1446,
-     1428, 1442,  530, 1424, 1418, 1423, 1420, 1435, 1436, 1433,
-     1474, 1431, 1853, 1417, 1419, 1853, 1427, 1464, 1463,  605,
-     1426, 1409, 1410, 1415, 1406, 1853, 1420, 1406,  630, 1398,
-
-     1419, 1416, 1408, 1451, 1405, 1412, 1448, 1853, 1396, 1394,
-     1408, 1392, 1406, 1409, 1441, 1440, 1439, 1438, 1385, 1436,
-     1435, 1853,  622, 1397, 1397, 1395, 1384, 1386, 1853, 1853,
-     1429, 1377, 1432,  579,  591, 1375, 1390, 1429,  597, 1423,
-     1385, 1421, 1420, 1374, 1368, 1363, 1416, 1378, 1368, 1376,
-     1412, 1375, 1357, 1365, 1367, 1371, 1406, 1410, 1367, 1366,
-     1853, 1367, 1360, 1349, 1362, 1365, 1360, 1355, 1360, 1357,
-     1356, 1352, 1358, 1353, 1394, 1393, 1337, 1333,  582, 1390,
-     1853, 1389, 1338, 1330, 1381, 1344, 1331, 1853, 1331, 1340,
-     1339, 1339, 1323, 1378, 1321, 1334, 1853, 1326, 1318, 1327,
-
-     1320, 1331, 1308, 1312, 1363, 1327, 1309, 1307, 1318, 1358,
-     1357, 1356, 1303, 1319,  593, 1318,  607, 1295, 1305,  604,
-     1853, 1355, 1301, 1311, 1311, 1300, 1304, 1311, 1348, 1853,
-       17,  587,   11,   69, 1853,   68,  202,  221,  302,  373,
-      386,  488,  493,  549,  558,  582,  584,  583,  591,  645,
-      601,  618,  601,  653,  610, 1853,  622,  622,  616,  627,
-      625,  668,  612,  614,  629,  632,  619,  676,  635,  621,
-      624, 1853, 1853,  640,  639,  644,  632, 1853, 1853,  646,
-      633,  631,  649,  636,  636,  685,  637,  693,  694, 1853,
-      641,  655,  655,  698,  648,  650,  644,  702,  657,  647,
-
-      648,  644,  654,  658,  669,  653,  671,  666,  668,  661,
-      663,  664,  676,  666,  681,  720,  679,  684,  661, 1853,
-      686,  676,  721,  670,  685,  686, 1853,  705,  713,  682,
-      696,  684,  679,  691,  698,  687,  688,  684,  702,  694,
-      689,  740,  746,  705,  696, 1853,  708,  693,  709,  699,
-      711,  705,  751,  719,  704,  705, 1853,  721,  724,  707,
-      709,  765,  710, 1853,  727,  730,  710,  729,  767,  727,
-      723,  718,  736,  735,  721,  736,  728,  724,  742,  727,
-     1853, 1853,  735,  780,  735, 1853,  743,  738,  789, 1853,
-      740,  745,  787,  741,  742,  754,  748,  752,  750,  748,
-
-      759,  802,  748,  753,  805,  806,  752,  764, 1853,  752,
-      760,  758,  763,  775,  759,  773,  774,  775,  791,  796,
-      778,  766,  766,  786,  775,  764,  781,  788,  829,  773,
-      831,  780,  784, 1853,  829,  780,  798,  795,  833,  784,
-      802,  803,  789,  797,  806,  786,  803,  810,  850,  851,
-     1853,  806,  853,  854,  807,  817,  819,  803,  804,  811,
-      820,  863,  812,  811,  828,  867,  819,  823,  821,  819,
-      872,  873,  825,  875,  871,  831, 1853,  836,  829,  820,
-      839,  833,  828,  838,  835,  840,  836,  848, 1853,  832,
-      834, 1853, 1853,  834,  892,  833,  852,  853,  851,  836,
-
-      857,  839,  844,  851,  884,  875,  905,  850,  852,  869,
-      867,  910,  860,  864, 1853,  861, 1853,  875,  873,  876,
-      860,  861,  919,  874,  879,  866,  877,  869,  875,  872,
-      890,  891,  892, 1853, 1853,  890, 1853,  893, 1853,  878,
-      879,  898,  888,  938,  893,  935,  901, 1853,  893,  885,
-      944, 1853,  945,  894,  901,  943, 1853, 1853,  903, 1853,
-      894,  894,  897,  911,  916,  899,  910,  957,  916,  917,
-      918,  956,  914,  963,  918,  965, 1853,  914,  967,  968,
-      910,  970,  931,  915,  927,  917,  947,  976, 1853,  977,
-      926,  941,  928, 1853,  924,  940,  928,  946,  934,  934,
-
-      987,  946, 1853,  948,  947,  949,  942,  951,  952,  949,
-      939,  942,  942,  999,  948, 1001, 1002,  948, 1005, 1853,
-      943,  958,  951, 1009,  964, 1853, 1853,  960,  971,  956,
-      973,  959, 1018, 1020,  966,  976, 1023,  982, 1853,  974,
-      974,  976,  978, 1029,  974, 1853,  975, 1853,  977, 1853,
-     1853,  991, 1853,  985, 1035,  986, 1037, 1019, 1853, 1853,
-      983,  991,  985,  984,  987,  987,  983,  989, 1047,  997,
-     1853,  993, 1050, 1005,  996, 1011, 1011, 1014, 1014, 1011,
-     1053, 1017, 1853, 1009, 1853, 1853, 1020, 1853, 1021, 1022,
-     1019, 1061, 1853, 1012, 1012, 1018, 1017, 1029, 1029, 1853,
-
-     1853, 1068, 1017, 1853, 1034, 1019, 1019, 1021, 1027, 1853,
-     1080, 1024, 1034, 1083, 1046, 1853, 1043, 1853, 1062, 1087,
-     1088, 1047, 1033, 1091, 1092, 1093, 1048, 1853, 1038, 1096,
-     1853, 1036, 1093, 1058, 1054, 1096, 1046, 1051, 1049, 1106,
-     1064, 1108, 1109, 1072, 1061, 1055, 1072, 1115, 1059, 1076,
-     1061, 1076, 1060, 1116, 1117, 1118, 1067, 1120, 1085, 1853,
-     1085, 1072, 1853, 1083, 1130, 1102, 1853, 1853, 1076, 1133,
-     1853, 1853, 1853, 1082, 1080, 1853, 1136, 1084, 1133, 1078,
-     1083, 1142, 1092, 1102, 1103, 1853, 1146, 1101, 1853, 1853,
-     1092, 1107, 1095, 1110, 1853, 1147, 1115, 1108, 1109, 1118,
-
-     1100, 1106, 1109, 1161, 1123, 1122, 1114, 1166, 1117, 1853,
-     1168, 1169, 1853, 1119, 1119, 1853, 1123, 1118, 1117, 1175,
-     1130, 1853, 1172, 1125, 1122, 1853, 1136, 1139, 1182, 1137,
-     1184, 1127, 1129, 1137, 1127, 1143, 1144, 1138, 1154, 1853,
-     1144, 1194, 1155, 1853, 1191, 1853, 1853, 1192, 1149, 1157,
-     1148, 1155, 1853, 1152, 1157, 1155, 1205, 1206, 1151, 1853,
-     1166, 1853, 1156, 1168, 1169, 1212, 1156, 1164, 1158, 1166,
-     1179, 1853, 1156, 1179, 1167, 1221, 1171, 1183, 1174, 1183,
-     1185, 1189, 1853, 1853, 1228, 1173, 1189, 1231, 1232, 1853,
-     1228, 1192, 1189, 1194, 1181, 1238, 1177, 1198, 1853, 1241,
-
-     1200, 1201, 1244, 1203, 1206, 1853, 1247, 1210, 1853, 1853,
-     1192, 1250, 1199, 1252, 1197, 1853, 1214, 1200, 1853, 1200,
-     1202, 1853, 1207, 1217, 1853, 1203, 1215, 1853, 1211, 1853,
-     1221, 1215, 1219, 1210, 1262, 1211, 1219, 1228, 1221, 1216,
-     1217, 1232, 1223, 1230, 1217, 1232, 1237, 1280, 1239, 1282,
-     1283, 1228, 1244, 1235, 1249, 1245, 1238, 1853, 1290, 1853,
-     1853, 1291, 1292, 1249, 1248, 1249, 1239, 1853, 1853, 1853,
-     1297, 1241, 1257, 1300, 1853, 1296, 1247, 1853, 1246, 1248,
-     1259, 1306, 1257, 1853, 1266, 1309, 1853, 1853, 1315, 1320,
-     1325, 1330, 1335, 1340, 1345, 1348, 1322, 1327, 1329, 1342
-
+      269,   64,  231,  184,  187,   75, 1810,  274,  215,  290,
+      278,  297, 1793,  207,  302,  316,  316, 1812,    0,  355,
+      360,  372,  377,  380, 1869,    0, 1869,  295,  383,  227,
+      296,  283,  327,  361,  293, 1869, 1809, 1848, 1869,  237,
+
+     1869,  394,  363, 1796, 1806, 1845,  375,  321,  403, 1800,
+      369,  378,  376,  382,  388, 1843,    0,  445,  407, 1787,
+     1795,  364, 1791, 1780, 1781,  372, 1797, 1780, 1789,  387,
+      308,  378, 1783, 1781,  391, 1770, 1826,  416, 1773, 1824,
+     1766, 1789, 1786, 1786, 1780,  214, 1773, 1766, 1771, 1765,
+      382, 1776, 1769, 1760, 1759, 1773,  362, 1809, 1758,  414,
+     1770, 1773, 1757,  441, 1758,  417, 1770, 1767, 1768, 1766,
+      422, 1748, 1753, 1749, 1741, 1758, 1750,    0,  422,  450,
+      440,  446,  454,  470, 1749, 1869,    0,  476, 1740, 1743,
+     1869,  465,  447, 1869, 1795, 1750,  477, 1793,  481, 1792,
+
+      477, 1791, 1869,  521, 1790,  489, 1751, 1746, 1745, 1736,
+      491, 1785, 1779, 1745, 1724, 1732, 1738, 1726, 1740, 1736,
+     1737, 1737, 1732, 1724, 1726, 1710, 1714, 1727, 1729, 1726,
+     1718, 1708, 1711, 1725, 1869, 1711, 1719, 1722, 1703, 1702,
+     1752, 1701, 1711, 1749,  452, 1710, 1698, 1709, 1745,  490,
+     1749, 1686, 1701,    9, 1691, 1707, 1688, 1690, 1686, 1692,
+     1683, 1682, 1695, 1688, 1690, 1694, 1693, 1687,   80, 1694,
+     1689, 1681, 1671, 1686, 1681, 1685,  459, 1683, 1669, 1675,
+     1682, 1670,  230, 1663, 1677, 1676, 1679, 1661, 1669,  491,
+     1869, 1869,  501, 1869, 1869, 1656,    0,  376, 1658,  497,
+
+      503, 1712, 1869, 1665,  489, 1869, 1710, 1869, 1704,  557,
+     1869,  484, 1646, 1656, 1706, 1663, 1658, 1661, 1656,  304,
+     1869, 1658,  549, 1656, 1653, 1654,  303, 1658, 1696, 1646,
+     1641, 1638, 1634, 1636, 1685, 1644, 1633, 1649, 1681, 1629,
+      550, 1642, 1642, 1625, 1626, 1639, 1626, 1636, 1631, 1638,
+     1633, 1618,  470, 1627, 1630, 1625, 1621, 1669,  515,  524,
+     1869, 1663, 1615, 1614, 1607, 1609, 1613, 1602, 1609, 1614,
+      513, 1659, 1614,  510, 1611, 1615, 1613, 1602, 1602, 1614,
+      502, 1589, 1590, 1611,  536, 1593, 1590, 1604, 1607, 1602,
+     1588, 1600, 1599, 1598, 1597,  532, 1638, 1637, 1636, 1580,
+
+      581, 1593, 1869, 1869, 1592,    0,  556, 1580, 1631, 1630,
+     1588, 1628, 1869, 1576, 1626, 1869,  563,  609,  557, 1625,
+     1567, 1869, 1572, 1578, 1581, 1564, 1579, 1566, 1565, 1869,
+     1575, 1566, 1563, 1575,  549, 1560, 1562, 1869, 1568, 1553,
+     1555, 1566, 1564, 1559,  588, 1566, 1554, 1547, 1596, 1869,
+     1545, 1561, 1593, 1597, 1555, 1549, 1551, 1552, 1554, 1586,
+     1539, 1534, 1533, 1535, 1528, 1543, 1521, 1528, 1533, 1581,
+     1869, 1528, 1524, 1578, 1531, 1525, 1532, 1517, 1527, 1530,
+     1519, 1518, 1513, 1869, 1568, 1869, 1512, 1511, 1504, 1521,
+     1558, 1505, 1510, 1519, 1513, 1507, 1516,  602, 1551, 1515,
+
+     1498, 1498, 1493, 1489, 1495, 1500, 1493, 1501, 1505, 1488,
+     1544, 1486, 1500, 1489, 1869, 1869, 1869, 1489, 1869, 1499,
+     1533, 1495,    0, 1536, 1486, 1869, 1869, 1483, 1869, 1489,
+     1869,  569,  565,  604, 1869, 1527, 1474, 1525, 1472, 1471,
+     1470, 1477, 1470, 1478, 1481, 1480, 1464, 1479, 1461, 1508,
+     1475, 1511, 1457, 1459, 1471, 1471, 1470, 1869, 1455, 1452,
+     1508, 1465, 1457, 1463, 1454, 1462, 1869, 1447, 1458, 1462,
+     1444, 1458,  530, 1440, 1434, 1439, 1436, 1451, 1452, 1449,
+     1490, 1447, 1869, 1433, 1435, 1869, 1443, 1480, 1479,  605,
+     1442, 1425, 1426, 1431, 1422, 1869, 1436, 1422,  630, 1414,
+
+     1435, 1432, 1424, 1467, 1421, 1428, 1464, 1869, 1412, 1410,
+     1424, 1408, 1422, 1425, 1457, 1456, 1455, 1454, 1401, 1452,
+     1451, 1869,  622, 1413, 1413, 1411, 1400, 1402, 1869, 1869,
+     1445, 1393, 1448,  579,  591, 1391, 1406, 1445,  597, 1439,
+     1401, 1437, 1436, 1390, 1384, 1379, 1432, 1394, 1384, 1392,
+     1428, 1391, 1373, 1381, 1383, 1387, 1422, 1426, 1383, 1382,
+     1869, 1383, 1376, 1365, 1378, 1381, 1376, 1371, 1376, 1373,
+     1372, 1368, 1374, 1369, 1410, 1409, 1353, 1349,  582, 1406,
+     1869, 1405, 1354, 1346, 1397, 1360, 1347, 1869, 1347, 1356,
+     1355, 1355, 1339, 1394, 1337, 1350, 1869, 1342, 1334, 1343,
+
+     1336, 1347, 1324, 1328, 1379, 1343, 1325, 1323, 1334, 1374,
+     1373, 1372, 1319, 1335,  593, 1334,  607, 1311, 1321,  604,
+     1869, 1371, 1317, 1327, 1327, 1316, 1320, 1327, 1364, 1869,
+       17,  587,   11,   69, 1869,   68,  202,  236,  296,  375,
+      389,  470,  497,  549,  569,  570,  600,  588,  587,  601,
+      656,  604,  620,  603,  657,  614, 1869,  625,  625,  618,
+      629,  627,  670,  614,  617,  632,  634,  621,  678,  637,
+      623,  626, 1869, 1869,  642,  641,  646,  634, 1869, 1869,
+      648,  635,  633,  651,  638,  638,  687,  639,  695,  696,
+     1869,  643,  657,  657,  700,  650,  652,  646,  704,  659,
+
+      649,  650,  646,  656,  660,  671,  655,  673,  668,  670,
+      663,  665,  666,  678,  668,  683,  722,  681,  686,  663,
+     1869,  688,  678,  723,  672,  687,  688, 1869,  707,  715,
+      684,  698,  686,  681,  682,  694,  701,  690,  691,  687,
+      705,  697,  692,  743,  749,  708,  699, 1869,  711,  696,
+      712,  702,  714,  709,  754,  723,  707,  708, 1869,  724,
+      727,  710,  712,  768,  713, 1869,  730,  733,  713,  732,
+      770,  730,  726,  721,  739,  738,  724,  739,  731,  727,
+      745,  730, 1869, 1869,  738,  783,  738, 1869,  746,  741,
+      792, 1869,  743,  748,  790,  744,  745,  757,  751,  755,
+
+      753,  751,  762,  805,  751,  756,  808,  809,  755,  767,
+     1869,  755,  763,  761,  766,  778,  762,  776,  777,  778,
+      794,  799,  781,  769,  769,  789,  788,  779,  768,  785,
+      792,  833,  777,  835,  784,  788, 1869,  833,  784,  802,
+      799,  837,  788,  806,  807,  793,  801,  810,  792,  807,
+      814,  854,  855, 1869,  810,  857,  858,  811,  821,  823,
+      807,  808,  815,  824,  867,  816,  815,  832,  871,  823,
+      827,  825,  823,  876,  877,  829,  879,  875,  835, 1869,
+      840,  833,  824,  843,  837,  832,  842,  839,  844,  840,
+      852, 1869,  836,  838, 1869, 1869,  838,  896,  837,  856,
+
+      857,  855,  840,  861,  843,  848,  855,  888,  879,  909,
+      854,  856,  873,  868,  872,  915,  865,  869, 1869,  866,
+     1869,  880,  878,  881,  865,  866,  924,  879,  884,  871,
+      882,  874,  881,  877,  895,  896,  897, 1869, 1869,  896,
+     1869,  898, 1869,  883,  884,  903,  893,  943,  898,  940,
+      906, 1869,  898,  890,  949, 1869,  950,  899,  906,  948,
+     1869, 1869,  908, 1869,  899,  899,  902,  916,  921,  904,
+      915,  962,  921,  922,  923,  961,  919,  968,  923,  970,
+     1869,  919,  972,  973,  915,  975,  936,  920,  932,  922,
+      952,  981, 1869,  982,  931,  946,  980,  934, 1869,  930,
+
+      946,  934,  952,  940,  940,  993,  952, 1869,  954,  953,
+      955,  948,  957,  958,  955,  945,  948,  948, 1005,  954,
+     1007, 1009,  954, 1011, 1869,  949,  964,  957, 1015,  970,
+     1869, 1869,  967,  977,  962,  979,  965, 1025, 1026,  972,
+      982, 1029,  988, 1869,  980,  980,  982,  984, 1035,  980,
+     1869,  981, 1869,  983, 1869, 1869,  997, 1869,  991, 1041,
+      992, 1043, 1025, 1869, 1869,  989,  997,  991,  988,  991,
+      994,  994,  990,  996, 1054, 1004, 1869, 1000, 1057, 1012,
+     1003, 1018, 1018, 1021, 1021, 1018, 1060, 1024, 1869, 1017,
+     1869, 1869, 1027, 1869, 1028, 1029, 1026, 1068, 1869, 1019,
+
+     1019, 1025, 1024, 1036, 1036, 1869, 1869, 1075, 1024, 1869,
+     1041, 1026, 1026, 1028, 1034, 1869, 1087, 1031, 1041, 1090,
+     1053, 1869, 1050, 1869, 1069, 1094, 1095, 1054, 1059, 1041,
+     1099, 1100, 1101, 1056, 1869, 1046, 1104, 1869, 1044, 1101,
+     1066, 1062, 1104, 1054, 1059, 1057, 1114, 1072, 1116, 1117,
+     1080, 1069, 1064, 1080, 1123, 1067, 1084, 1069, 1084, 1068,
+     1124, 1125, 1126, 1075, 1128, 1093, 1869, 1093, 1080, 1869,
+     1091, 1138, 1110, 1869, 1869, 1084, 1095, 1142, 1869, 1869,
+     1869, 1091, 1089, 1869, 1145, 1093, 1142, 1087, 1092, 1151,
+     1101, 1111, 1112, 1869, 1155, 1110, 1869, 1869, 1101, 1116,
+
+     1104, 1119, 1869, 1156, 1124, 1117, 1118, 1127, 1109, 1116,
+     1118, 1171, 1132, 1131, 1123, 1175, 1126, 1869, 1177, 1178,
+     1122, 1869, 1129, 1129, 1869, 1133, 1128, 1127, 1185, 1140,
+     1869, 1182, 1135, 1132, 1869, 1146, 1149, 1192, 1147, 1194,
+     1137, 1139, 1147, 1137, 1153, 1154, 1148, 1164, 1869, 1154,
+     1204, 1165, 1869, 1201, 1869, 1869, 1202, 1203, 1160, 1168,
+     1159, 1166, 1869, 1163, 1168, 1166, 1216, 1217, 1162, 1869,
+     1177, 1869, 1167, 1179, 1180, 1223, 1167, 1175, 1169, 1177,
+     1190, 1869, 1167, 1190, 1174, 1179, 1233, 1183, 1195, 1186,
+     1195, 1197, 1201, 1869, 1869, 1240, 1185, 1201, 1243, 1244,
+
+     1869, 1240, 1204, 1201, 1206, 1193, 1250, 1189, 1206, 1211,
+     1869, 1254, 1213, 1214, 1257, 1216, 1219, 1869, 1260, 1223,
+     1869, 1869, 1205, 1263, 1212, 1265, 1210, 1869, 1227, 1218,
+     1214, 1869, 1214, 1216, 1869, 1221, 1231, 1869, 1217, 1229,
+     1869, 1225, 1869, 1235, 1229, 1237, 1234, 1225, 1277, 1226,
+     1234, 1243, 1236, 1231, 1232, 1247, 1290, 1239, 1246, 1233,
+     1248, 1253, 1296, 1255, 1298, 1299, 1244, 1869, 1260, 1251,
+     1265, 1261, 1254, 1869, 1306, 1869, 1869, 1307, 1308, 1265,
+     1264, 1265, 1255, 1869, 1869, 1869, 1313, 1257, 1273, 1316,
+     1869, 1312, 1263, 1869, 1262, 1264, 1275, 1322, 1273, 1869,
+
+     1282, 1325, 1869, 1869, 1331, 1336, 1341, 1346, 1351, 1356,
+     1361, 1364, 1338, 1343, 1345, 1358
     } ;
 
-static const flex_int16_t yy_def[1501] =
+static const flex_int16_t yy_def[1517] =
     {   0,
-     1489, 1489, 1490, 1490, 1489, 1489, 1489, 1489, 1489, 1489,
-     1488, 1488, 1488, 1488, 1488, 1491, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1492,
-     1488, 1488, 1488, 1493,   15, 1488,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1494,   45,   45,
+     1505, 1505, 1506, 1506, 1505, 1505, 1505, 1505, 1505, 1505,
+     1504, 1504, 1504, 1504, 1504, 1507, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1508,
+     1504, 1504, 1504, 1509,   15, 1504,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1510,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1491, 1488,
-     1488, 1488, 1488, 1488, 1488, 1495, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1492, 1488, 1493,
+       45,   45,   45,   45,   45,   45,   45,   45, 1507, 1504,
+     1504, 1504, 1504, 1504, 1504, 1511, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1508, 1504, 1509,
 
-     1488, 1488,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1496,   45, 1494,   45,   45,
+     1504, 1504,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45, 1512,   45, 1510,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1495, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1497,   45,   45,   45,
-     1488,   45,   45, 1488,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1511, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1513,   45,   45,   45,
+     1504,   45,   45, 1504,   45,   45,   45,   45,   45,   45,
 
-       45, 1496, 1488, 1494,   45,   45,   45,   45,   45,   45,
+       45, 1512, 1504, 1510,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45, 1488,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1504,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1498,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1514,   45,   45,   45,
 
-       45,   45, 1488,   45,   45, 1488,   45, 1488,   45, 1494,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45, 1504,   45,   45, 1504,   45, 1504,   45, 1510,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
-       45,   45, 1488, 1488, 1488, 1499,   45,   45,   45,   45,
-       45,   45, 1488,   45,   45, 1488,   45, 1494,   45,   45,
-       45, 1488,   45,   45,   45,   45,   45,   45,   45, 1488,
-       45,   45,   45,   45,   45,   45,   45, 1488,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
+       45,   45, 1504, 1504, 1504, 1515,   45,   45,   45,   45,
+       45,   45, 1504,   45,   45, 1504,   45, 1510,   45,   45,
+       45, 1504,   45,   45,   45,   45,   45,   45,   45, 1504,
+       45,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1504,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1488,   45, 1488,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45, 1504,   45, 1504,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45, 1488, 1488, 1488,   45, 1488,   45,
-       45, 1488, 1500,   45,   45, 1488, 1488,   45, 1488,   45,
-     1488,   45,   45,   45, 1488,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1504, 1504, 1504,   45, 1504,   45,
+       45, 1504, 1516,   45,   45, 1504, 1504,   45, 1504,   45,
+     1504,   45,   45,   45, 1504,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1488,   45,   45,
-       45,   45,   45,   45,   45,   45, 1488,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
+       45,   45,   45,   45,   45,   45, 1504,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45, 1488,   45,   45, 1488,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1488,   45,   45,   45,   45,
+       45,   45, 1504,   45,   45, 1504,   45,   45,   45,   45,
+       45,   45,   45,   45,   45, 1504,   45,   45,   45,   45,
 
-       45,   45,   45,   45,   45,   45,   45, 1488,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45, 1488,   45,   45,   45,   45,   45,   45, 1488, 1488,
+       45, 1504,   45,   45,   45,   45,   45,   45, 1504, 1504,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45, 1488,   45,   45,
-       45,   45,   45,   45,   45,   45, 1488,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
+       45,   45,   45,   45,   45,   45, 1504,   45,   45,   45,
 
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
-       45,   45,   45,   45, 1488,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45, 1504,
+       45,   45,   45,   45, 1504,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1488,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1504,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45, 1488, 1488,   45,   45,   45,   45, 1488, 1488,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
+       45,   45, 1504, 1504,   45,   45,   45,   45, 1504, 1504,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
-       45,   45,   45,   45,   45,   45, 1488,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1488,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1488,   45,   45,   45,
-       45,   45,   45, 1488,   45,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488, 1488,   45,   45,   45, 1488,   45,   45,   45, 1488,
+       45,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45, 1504,   45,
+       45,   45,   45,   45,   45, 1504,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45, 1504, 1504,   45,   45,   45, 1504,   45,   45,
+       45, 1504,   45,   45,   45,   45,   45,   45,   45,   45,
 
-       45,   45,   45,   45,   45,   45,   45,   45, 1488,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1488,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1504,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45, 1504,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1488,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1488,   45,
-       45, 1488, 1488,   45,   45,   45,   45,   45,   45,   45,
-
+       45,   45,   45,   45,   45,   45,   45,   45,   45, 1504,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45, 1488,   45, 1488,   45,   45,   45,
+       45, 1504,   45,   45, 1504, 1504,   45,   45,   45,   45,
+
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45, 1488, 1488,   45, 1488,   45, 1488,   45,
-       45,   45,   45,   45,   45,   45,   45, 1488,   45,   45,
-       45, 1488,   45,   45,   45,   45, 1488, 1488,   45, 1488,
+       45,   45,   45,   45,   45,   45,   45,   45, 1504,   45,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1504, 1504,   45,
+     1504,   45, 1504,   45,   45,   45,   45,   45,   45,   45,
+       45, 1504,   45,   45,   45, 1504,   45,   45,   45,   45,
+     1504, 1504,   45, 1504,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45, 1488,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1488,   45,
-       45,   45,   45, 1488,   45,   45,   45,   45,   45,   45,
-
-       45,   45, 1488,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
-       45,   45,   45,   45,   45, 1488, 1488,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45, 1488,   45,
-       45,   45,   45,   45,   45, 1488,   45, 1488,   45, 1488,
-     1488,   45, 1488,   45,   45,   45,   45,   45, 1488, 1488,
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45, 1504,   45,   45,   45,   45,   45, 1504,   45,
+
+       45,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45, 1488,   45, 1488, 1488,   45, 1488,   45,   45,
-       45,   45, 1488,   45,   45,   45,   45,   45,   45, 1488,
-
-     1488,   45,   45, 1488,   45,   45,   45,   45,   45, 1488,
-       45,   45,   45,   45,   45, 1488,   45, 1488,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1488,   45,   45,
-     1488,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1504,   45,   45,   45,   45,   45,
+     1504, 1504,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45, 1504,   45,   45,   45,   45,   45,   45,
+     1504,   45, 1504,   45, 1504, 1504,   45, 1504,   45,   45,
+       45,   45,   45, 1504, 1504,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1504,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45, 1504,   45,
+     1504, 1504,   45, 1504,   45,   45,   45,   45, 1504,   45,
+
+       45,   45,   45,   45,   45, 1504, 1504,   45,   45, 1504,
+       45,   45,   45,   45,   45, 1504,   45,   45,   45,   45,
+       45, 1504,   45, 1504,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45, 1504,   45,   45, 1504,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
-       45,   45, 1488,   45,   45,   45, 1488, 1488,   45,   45,
-     1488, 1488, 1488,   45,   45, 1488,   45,   45,   45,   45,
-       45,   45,   45,   45,   45, 1488,   45,   45, 1488, 1488,
-       45,   45,   45,   45, 1488,   45,   45,   45,   45,   45,
-
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
-       45,   45, 1488,   45,   45, 1488,   45,   45,   45,   45,
-       45, 1488,   45,   45,   45, 1488,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45,   45,   45, 1488,
-       45,   45,   45, 1488,   45, 1488, 1488,   45,   45,   45,
-       45,   45, 1488,   45,   45,   45,   45,   45,   45, 1488,
-       45, 1488,   45,   45,   45,   45,   45,   45,   45,   45,
-       45, 1488,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45, 1488, 1488,   45,   45,   45,   45,   45, 1488,
-       45,   45,   45,   45,   45,   45,   45,   45, 1488,   45,
-
-       45,   45,   45,   45,   45, 1488,   45,   45, 1488, 1488,
-       45,   45,   45,   45,   45, 1488,   45,   45, 1488,   45,
-       45, 1488,   45,   45, 1488,   45,   45, 1488,   45, 1488,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45, 1504,   45,   45, 1504,
+       45,   45,   45, 1504, 1504,   45,   45,   45, 1504, 1504,
+     1504,   45,   45, 1504,   45,   45,   45,   45,   45,   45,
+       45,   45,   45, 1504,   45,   45, 1504, 1504,   45,   45,
+
+       45,   45, 1504,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
+       45, 1504,   45,   45, 1504,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45, 1504,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45, 1504,   45,
+       45,   45, 1504,   45, 1504, 1504,   45,   45,   45,   45,
+       45,   45, 1504,   45,   45,   45,   45,   45,   45, 1504,
+       45, 1504,   45,   45,   45,   45,   45,   45,   45,   45,
+       45, 1504,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45, 1504, 1504,   45,   45,   45,   45,   45,
+
+     1504,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+     1504,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
+     1504, 1504,   45,   45,   45,   45,   45, 1504,   45,   45,
+       45, 1504,   45,   45, 1504,   45,   45, 1504,   45,   45,
+     1504,   45, 1504,   45,   45,   45,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
-       45,   45,   45,   45,   45,   45,   45, 1488,   45, 1488,
-     1488,   45,   45,   45,   45,   45,   45, 1488, 1488, 1488,
-       45,   45,   45,   45, 1488,   45,   45, 1488,   45,   45,
-       45,   45,   45, 1488,   45,   45, 1488,    0, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488
+       45,   45,   45,   45,   45,   45,   45, 1504,   45,   45,
+       45,   45,   45, 1504,   45, 1504, 1504,   45,   45,   45,
+       45,   45,   45, 1504, 1504, 1504,   45,   45,   45,   45,
+     1504,   45,   45, 1504,   45,   45,   45,   45,   45, 1504,
 
+       45,   45, 1504,    0, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504
     } ;
 
-static const flex_int16_t yy_nxt[1925] =
+static const flex_int16_t yy_nxt[1941] =
     {   0,
-     1488,   13,   14,   13, 1488,   15,   16, 1488,   17,   18,
+     1504,   13,   14,   13, 1504,   15,   16, 1504,   17,   18,
        19,   20,   21,   22,   22,   22,   23,   24,   85,  364,
-       37,   14,   37,   86,   25,   26,   38,  828, 1488,   27,
+       37,   14,   37,   86,   25,   26,   38,  829, 1504,   27,
        37,   14,   37,   42,   28,   42,   38,   91,   92,   29,
       115,   30,   13,   14,   13,   90,   91,   25,   31,   92,
-       13,   14,   13,   13,   14,   13,   32,   40,  830,   13,
+       13,   14,   13,   13,   14,   13,   32,   40,  831,   13,
        14,   13,   33,   40,  115,   91,   92,  365,   90,   34,
        35,   13,   14,   13,   94,   15,   16,   95,   17,   18,
        19,   20,   21,   22,   22,   22,   23,   24,   13,   14,
@@ -1264,7 +1271,7 @@ static const flex_int16_t yy_nxt[1925] =
 
        39,   84,   84,   84,   28,   42,   41,   42,   42,   29,
        42,   30,   82,  107,   41,  111,   93,   25,   31,  108,
-      130,  138,   88,  831,   88,  832,   32,   89,   89,   89,
+      130,  138,   88,  832,   88,  833,   32,   89,   89,   89,
       131,  139,   33,  140,  380,   82,  107,  381,  111,   34,
        35,   44,   44,   44,   45,   45,   46,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
@@ -1277,11 +1284,11 @@ static const flex_int16_t yy_nxt[1925] =
        45,   45,   80,  103,   81,   81,   81,   80,  109,   83,
        83,   83,  101,  114,   80,   82,   83,   83,   83,  121,
        82,  133,  122,  112,  123,  306,  124,   82,  134,  103,
-      396,  103,  101,  113,  135,  833,  114,  110,   82,  136,
+      396,  103,  101,  113,  135,  834,  114,  110,   82,  136,
       163,  107,  137,   82,  164,  179,  112,  102,  146,  244,
        82,   45,  147,   45,   45,   45,   45,  119,   45,   45,
        45,  113,  117,  120,  107,   45,   45,  102,   45,   45,
-      245,  179,  148,  834,   45,  132,   45,   45,   45,   45,
+      245,  179,  148,  835,   45,  132,   45,   45,   45,   45,
        45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
 
        45,   45,   45,   45,   45,   45,   45,   45,   89,   89,
@@ -1289,7 +1296,7 @@ static const flex_int16_t yy_nxt[1925] =
       128,  142,  143,   45,  180,  144,  152,   45,  181,   45,
       118,  145,  129,  149,  153,  150,  154,  151,  112,  114,
       157,  155,  156,  158,  159,  165,  181,  427,  113,  166,
-      180,  193,  167,  224,  160,  179,  184,  161,  835,  168,
+      180,  193,  167,  224,  160,  179,  184,  161,  836,  168,
       169,  171,  114,  172,  428,  170,  225,  173,   84,   84,
        84,   80,  175,   81,   81,   81,  113,  176,  193,   82,
        88,  182,   88,  174,   82,   89,   89,   89,   80,  180,
@@ -1298,8 +1305,8 @@ static const flex_int16_t yy_nxt[1925] =
       188,   82,   82,  192,   82,  197,  100,   82,  194,  198,
       209,  199,  201,  200,  407,  183,  215,  216,  197,  210,
       211,  235,  256,  257,   82,  226,  217,   82,  188,  192,
-      221,  836,  222,  197,  100,  201,  198,  195,  100,  199,
-      200,  227,  100,  407,  188,  230,  250,  837,  231,  223,
+      221,  837,  222,  197,  100,  201,  198,  195,  100,  199,
+      200,  227,  100,  407,  188,  230,  250,  838,  231,  223,
       100,  266,  232,  198,  100,  290,  100,  187,  204,  204,
       204,  205,  353,  236,  292,  204,  204,  204,  204,  204,
       204,  260,  206,  276,  261,  262,  302,  277,  291,  290,
@@ -1309,77 +1316,77 @@ static const flex_int16_t yy_nxt[1925] =
       273,  305,  274,  302,  291,  307,  309,  293,  294,  298,
       389,  409,  410,  354,  305,  403,  355,  295,  484,  298,
       411,  415,  407,  390,  305,  403,  301,  412,  307,  465,
-      466,  838,  312,  309,  310,  310,  310,  360,  403,  317,
-      839,  310,  310,  310,  310,  310,  310,  318,  404,  415,
+      466,  839,  312,  309,  310,  310,  310,  360,  403,  317,
+      840,  310,  310,  310,  310,  310,  310,  318,  404,  415,
       412,  419,  319,  320,  430,  450,  415,  488,  496,  431,
       451,  489,  497,  472,  310,  310,  310,  310,  310,  310,
       418,  418,  418,  473,  485,  672,  673,  418,  418,  418,
       418,  418,  418,  501,  474,  513,  519,  502,  514,  524,
-      524,  520,  532,  558,  533,  548,  840,  635,  559,  634,
+      524,  520,  532,  558,  533,  548,  841,  635,  559,  634,
 
       418,  418,  418,  418,  418,  418,  452,  608,  549,  630,
-      688,  453,  609,  731,  636,  732,  841,  524,  534,  532,
-      829,  533,   45,   45,   45,  635,  634,  721,  842,   45,
-       45,   45,   45,   45,   45,  697,  776,  722,  732,  777,
-      698,  731,  736,  737,  810,  843,  844,  689,  829,  845,
-      846,  811,   45,   45,   45,   45,   45,   45,  813,  847,
-      818,  848,  849,  850,  851,  814,  819,  852,  853,  815,
-      854,  855,  856,  857,  859,  860,  861,  699,  858,  862,
-      863,  864,  865,  866,  867,  868,  869,  870,  871,  872,
-      873,  874,  875,  877,  878,  879,  876,  880,  881,  882,
+      688,  453,  609,  731,  636,  732,  842,  524,  534,  532,
+      830,  533,   45,   45,   45,  635,  634,  721,  843,   45,
+       45,   45,   45,   45,   45,  697,  777,  722,  732,  778,
+      698,  731,  736,  737,  811,  738,  844,  689,  830,  845,
+      846,  812,   45,   45,   45,   45,   45,   45,  814,  847,
+      819,  848,  849,  850,  851,  815,  820,  852,  853,  816,
+      854,  855,  856,  857,  858,  859,  861,  699,  862,  863,
+      860,  864,  865,  866,  867,  868,  869,  870,  871,  872,
+      873,  874,  875,  876,  877,  879,  880,  881,  878,  882,
 
       883,  884,  885,  886,  887,  888,  889,  890,  891,  892,
       893,  894,  895,  896,  897,  898,  899,  900,  901,  902,
-      903,  904,  905,  907,  908,  909,  910,  911,  912,  913,
-      914,  915,  916,  917,  906,  918,  919,  920,  921,  922,
+      903,  904,  905,  906,  907,  909,  910,  911,  912,  913,
+      914,  915,  916,  917,  918,  919,  908,  920,  921,  922,
       923,  924,  925,  926,  927,  928,  929,  930,  931,  932,
       933,  934,  935,  936,  937,  938,  939,  940,  941,  942,
-      920,  943,  944,  919,  945,  946,  947,  948,  949,  950,
-      951,  954,  955,  956,  957,  952,  958,  959,  960,  961,
-      962,  963,  964,  965,  966,  967,  968,  969,  971,  972,
-      973,  974,  975,  976,  977,  978,  979,  980,  970,  981,
+      943,  944,  922,  945,  946,  921,  947,  948,  949,  950,
+      951,  952,  953,  954,  957,  958,  959,  960,  955,  961,
+      962,  963,  964,  965,  966,  967,  968,  969,  970,  971,
+      972,  974,  975,  976,  977,  978,  979,  980,  981,  982,
 
-      982,  983,  984,  985,  986,  987,  988,  989,  990,  991,
+      983,  973,  984,  985,  986,  987,  988,  989,  990,  991,
       992,  993,  994,  995,  996,  997,  998,  999, 1000, 1001,
-     1002, 1003, 1004, 1005, 1007, 1006,  953, 1008, 1009, 1010,
+     1002, 1003, 1004, 1005, 1006, 1007, 1008, 1010, 1009,  956,
      1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020,
      1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030,
-     1031, 1005, 1006, 1032, 1033, 1034, 1035, 1036, 1037, 1039,
-     1041, 1042, 1043, 1038, 1044, 1045, 1046, 1047, 1048, 1049,
+     1031, 1032, 1033, 1034, 1008, 1009, 1035, 1036, 1037, 1038,
+     1039, 1040, 1041, 1043, 1045, 1046, 1047, 1042, 1048, 1049,
      1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059,
      1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069,
      1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079,
 
-     1080, 1040, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088,
+     1080, 1081, 1082, 1083, 1084, 1044, 1085, 1086, 1087, 1088,
      1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098,
      1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108,
-     1109, 1087, 1110, 1111, 1112, 1113, 1114, 1088, 1115, 1116,
-     1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126,
+     1109, 1110, 1111, 1112, 1113, 1091, 1114, 1115, 1116, 1117,
+     1118, 1092, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126,
      1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136,
-     1137, 1138, 1139, 1140, 1141, 1142, 1143, 1145, 1146, 1147,
-     1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157,
-     1158, 1159, 1160, 1162, 1163, 1164, 1165, 1166, 1167, 1168,
+     1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146,
+     1147, 1148, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157,
+     1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1167, 1168,
      1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178,
 
-     1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1158, 1187,
-     1188, 1189, 1190, 1192, 1193, 1194, 1195, 1144, 1196, 1197,
-     1191, 1198, 1199, 1200, 1161, 1201, 1202, 1203, 1204, 1205,
+     1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188,
+     1189, 1190, 1191, 1163, 1192, 1193, 1194, 1195, 1196, 1198,
+     1199, 1200, 1149, 1201, 1202, 1203, 1197, 1204, 1205, 1166,
      1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215,
      1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225,
      1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235,
-     1236, 1237, 1238, 1239, 1240, 1241, 1219, 1242, 1243, 1244,
-     1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254,
+     1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245,
+     1246, 1247, 1225, 1248, 1249, 1250, 1251, 1252, 1253, 1254,
      1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264,
      1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274,
 
      1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284,
-     1285, 1286, 1288, 1289, 1290, 1291, 1292, 1293, 1266, 1294,
-     1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304,
+     1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294,
+     1296, 1297, 1298, 1299, 1300, 1273, 1301, 1302, 1303, 1304,
      1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314,
-     1315, 1316, 1318, 1319, 1320, 1321, 1317, 1322, 1323, 1324,
-     1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334,
-     1335, 1336, 1337, 1338, 1311, 1339, 1340, 1287, 1341, 1342,
-     1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352,
+     1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324,
+     1325, 1327, 1328, 1329, 1330, 1326, 1331, 1332, 1333, 1334,
+     1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344,
+     1345, 1346, 1319, 1347, 1348, 1295, 1349, 1350, 1351, 1352,
      1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362,
      1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372,
 
@@ -1395,77 +1402,78 @@ static const flex_int16_t yy_nxt[1925] =
      1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472,
 
      1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482,
-     1483, 1484, 1485, 1486, 1487,   12,   12,   12,   12,   12,
-       36,   36,   36,   36,   36,   79,  297,   79,   79,   79,
-       98,  406,   98,  523,   98,  100,  100,  100,  100,  100,
-      116,  116,  116,  116,  116,  178,  100,  178,  178,  178,
-      202,  202,  202,  827,  826,  825,  824,  823,  822,  821,
-      820,  817,  816,  812,  809,  808,  807,  806,  805,  804,
-      803,  802,  801,  800,  799,  798,  797,  796,  795,  794,
-      793,  792,  791,  790,  789,  788,  787,  786,  785,  784,
-      783,  782,  781,  780,  779,  778,  775,  774,  773,  772,
-
-      771,  770,  769,  768,  767,  766,  765,  764,  763,  762,
-      761,  760,  759,  758,  757,  756,  755,  754,  753,  752,
-      751,  750,  749,  748,  747,  746,  745,  744,  743,  742,
-      741,  740,  739,  738,  735,  734,  733,  730,  729,  728,
-      727,  726,  725,  724,  723,  720,  719,  718,  717,  716,
-      715,  714,  713,  712,  711,  710,  709,  708,  707,  706,
-      705,  704,  703,  702,  701,  700,  696,  695,  694,  693,
-      692,  691,  690,  687,  686,  685,  684,  683,  682,  681,
-      680,  679,  678,  677,  676,  675,  674,  671,  670,  669,
-      668,  667,  666,  665,  664,  663,  662,  661,  660,  659,
-
-      658,  657,  656,  655,  654,  653,  652,  651,  650,  649,
-      648,  647,  646,  645,  644,  643,  642,  641,  640,  639,
-      638,  637,  633,  632,  631,  630,  629,  628,  627,  626,
-      625,  624,  623,  622,  621,  620,  619,  618,  617,  616,
-      615,  614,  613,  612,  611,  610,  607,  606,  605,  604,
-      603,  602,  601,  600,  599,  598,  597,  596,  595,  594,
-      593,  592,  591,  590,  589,  588,  587,  586,  585,  584,
-      583,  582,  581,  580,  579,  578,  577,  576,  575,  574,
-      573,  572,  571,  570,  569,  568,  567,  566,  565,  564,
-      563,  562,  561,  560,  557,  556,  555,  554,  553,  552,
-
-      551,  550,  547,  546,  545,  544,  543,  542,  541,  540,
-      539,  538,  537,  536,  535,  531,  530,  529,  528,  527,
-      526,  525,  522,  521,  518,  517,  516,  515,  512,  511,
-      510,  509,  508,  507,  506,  505,  504,  503,  500,  499,
-      498,  495,  494,  493,  492,  491,  490,  487,  486,  483,
-      482,  481,  480,  479,  478,  477,  476,  475,  471,  470,
-      469,  468,  467,  464,  463,  462,  461,  460,  459,  458,
-      457,  456,  455,  454,  449,  448,  447,  446,  445,  444,
-      443,  442,  441,  440,  439,  438,  437,  434,  433,  432,
-      429,  426,  425,  424,  423,  422,  421,  420,  417,  416,
-
-      414,  413,  408,  405,  402,  401,  400,  399,  398,  397,
-      395,  394,  393,  392,  391,  388,  387,  386,  385,  384,
-      383,  382,  379,  378,  377,  376,  375,  374,  373,  372,
-      371,  370,  369,  368,  367,  366,  363,  362,  361,  359,
-      358,  357,  356,  352,  351,  350,  349,  348,  347,  346,
-      345,  344,  343,  342,  341,  340,  339,  338,  337,  336,
-      335,  334,  333,  332,  331,  330,  329,  328,  327,  326,
-      325,  324,  323,  322,  321,  316,  315,  314,  313,  311,
-      203,  308,  306,  304,  303,  300,  299,  296,  289,  288,
-      287,  286,  285,  284,  282,  281,  280,  279,  275,  265,
-
-      264,  263,  259,  258,  255,  254,  253,  252,  251,  249,
-      248,  247,  246,  243,  242,  241,  240,  239,  238,  237,
-      234,  233,  229,  228,  220,  219,  218,  214,  213,  212,
-      208,  207,  203,  196,  191,  190,  189,  186,  185,  177,
-      162,  141,  106,  105,  104,   43,   99,   97,   96,   87,
-       43, 1488,   11, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488
+     1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492,
+     1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502,
+     1503,   12,   12,   12,   12,   12,   36,   36,   36,   36,
+       36,   79,  297,   79,   79,   79,   98,  406,   98,  523,
+       98,  100,  100,  100,  100,  100,  116,  116,  116,  116,
+      116,  178,  100,  178,  178,  178,  202,  202,  202,  828,
+      827,  826,  825,  824,  823,  822,  821,  818,  817,  813,
+      810,  809,  808,  807,  806,  805,  804,  803,  802,  801,
+      800,  799,  798,  797,  796,  795,  794,  793,  792,  791,
+
+      790,  789,  788,  787,  786,  785,  784,  783,  782,  781,
+      780,  779,  776,  775,  774,  773,  772,  771,  770,  769,
+      768,  767,  766,  765,  764,  763,  762,  761,  760,  759,
+      758,  757,  756,  755,  754,  753,  752,  751,  750,  749,
+      748,  747,  746,  745,  744,  743,  742,  741,  740,  739,
+      735,  734,  733,  730,  729,  728,  727,  726,  725,  724,
+      723,  720,  719,  718,  717,  716,  715,  714,  713,  712,
+      711,  710,  709,  708,  707,  706,  705,  704,  703,  702,
+      701,  700,  696,  695,  694,  693,  692,  691,  690,  687,
+      686,  685,  684,  683,  682,  681,  680,  679,  678,  677,
+
+      676,  675,  674,  671,  670,  669,  668,  667,  666,  665,
+      664,  663,  662,  661,  660,  659,  658,  657,  656,  655,
+      654,  653,  652,  651,  650,  649,  648,  647,  646,  645,
+      644,  643,  642,  641,  640,  639,  638,  637,  633,  632,
+      631,  630,  629,  628,  627,  626,  625,  624,  623,  622,
+      621,  620,  619,  618,  617,  616,  615,  614,  613,  612,
+      611,  610,  607,  606,  605,  604,  603,  602,  601,  600,
+      599,  598,  597,  596,  595,  594,  593,  592,  591,  590,
+      589,  588,  587,  586,  585,  584,  583,  582,  581,  580,
+      579,  578,  577,  576,  575,  574,  573,  572,  571,  570,
+
+      569,  568,  567,  566,  565,  564,  563,  562,  561,  560,
+      557,  556,  555,  554,  553,  552,  551,  550,  547,  546,
+      545,  544,  543,  542,  541,  540,  539,  538,  537,  536,
+      535,  531,  530,  529,  528,  527,  526,  525,  522,  521,
+      518,  517,  516,  515,  512,  511,  510,  509,  508,  507,
+      506,  505,  504,  503,  500,  499,  498,  495,  494,  493,
+      492,  491,  490,  487,  486,  483,  482,  481,  480,  479,
+      478,  477,  476,  475,  471,  470,  469,  468,  467,  464,
+      463,  462,  461,  460,  459,  458,  457,  456,  455,  454,
+      449,  448,  447,  446,  445,  444,  443,  442,  441,  440,
+
+      439,  438,  437,  434,  433,  432,  429,  426,  425,  424,
+      423,  422,  421,  420,  417,  416,  414,  413,  408,  405,
+      402,  401,  400,  399,  398,  397,  395,  394,  393,  392,
+      391,  388,  387,  386,  385,  384,  383,  382,  379,  378,
+      377,  376,  375,  374,  373,  372,  371,  370,  369,  368,
+      367,  366,  363,  362,  361,  359,  358,  357,  356,  352,
+      351,  350,  349,  348,  347,  346,  345,  344,  343,  342,
+      341,  340,  339,  338,  337,  336,  335,  334,  333,  332,
+      331,  330,  329,  328,  327,  326,  325,  324,  323,  322,
+      321,  316,  315,  314,  313,  311,  203,  308,  306,  304,
+
+      303,  300,  299,  296,  289,  288,  287,  286,  285,  284,
+      282,  281,  280,  279,  275,  265,  264,  263,  259,  258,
+      255,  254,  253,  252,  251,  249,  248,  247,  246,  243,
+      242,  241,  240,  239,  238,  237,  234,  233,  229,  228,
+      220,  219,  218,  214,  213,  212,  208,  207,  203,  196,
+      191,  190,  189,  186,  185,  177,  162,  141,  106,  105,
+      104,   43,   99,   97,   96,   87,   43, 1504,   11, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504
     } ;
 
-static const flex_int16_t yy_chk[1925] =
+static const flex_int16_t yy_chk[1941] =
     {   0,
         0,    1,    1,    1,    0,    1,    1,    0,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,   21,  254,
@@ -1537,148 +1545,149 @@ static const flex_int16_t yy_chk[1925] =
       590,  341,  498,  634,  534,  635,  745,  407,  419,  417,
       732,  417,  418,  418,  418,  533,  532,  623,  746,  418,
       418,  418,  418,  418,  418,  599,  679,  623,  635,  679,
-      599,  634,  639,  639,  715,  747,  748,  590,  732,  749,
-      750,  715,  418,  418,  418,  418,  418,  418,  717,  751,
-      720,  752,  753,  754,  755,  717,  720,  757,  758,  717,
-      759,  760,  761,  762,  763,  764,  765,  599,  762,  766,
-      767,  768,  769,  770,  771,  774,  775,  776,  777,  780,
-      781,  782,  783,  784,  785,  786,  783,  787,  788,  789,
-
-      791,  792,  793,  794,  795,  796,  797,  798,  799,  800,
-      801,  802,  803,  804,  805,  806,  807,  808,  809,  810,
-      811,  812,  813,  814,  815,  816,  817,  818,  819,  821,
-      822,  823,  824,  825,  813,  826,  828,  829,  830,  831,
-      832,  833,  834,  835,  836,  837,  838,  839,  840,  841,
-      842,  843,  844,  845,  847,  848,  849,  850,  851,  852,
-      829,  853,  854,  828,  855,  856,  858,  859,  860,  861,
-      862,  863,  865,  866,  867,  862,  868,  869,  870,  871,
-      872,  873,  874,  875,  876,  877,  878,  879,  880,  883,
-      884,  885,  887,  888,  889,  891,  892,  893,  879,  894,
-
-      895,  896,  897,  898,  899,  900,  901,  902,  903,  904,
-      905,  906,  907,  908,  910,  911,  912,  913,  914,  915,
-      916,  917,  918,  919,  921,  920,  862,  922,  923,  924,
-      925,  926,  927,  928,  929,  930,  931,  932,  933,  935,
-      936,  937,  938,  939,  940,  941,  942,  943,  944,  945,
-      946,  919,  920,  947,  948,  949,  950,  952,  953,  954,
-      955,  956,  957,  953,  958,  959,  960,  961,  962,  963,
-      964,  965,  966,  967,  968,  969,  970,  971,  972,  973,
-      974,  975,  976,  978,  979,  980,  981,  982,  983,  984,
-      985,  986,  987,  988,  990,  991,  994,  995,  996,  997,
-
-      998,  954,  999, 1000, 1001, 1002, 1003, 1004, 1005, 1006,
-     1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1016, 1018,
-     1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028,
-     1029, 1005, 1030, 1031, 1032, 1033, 1036, 1006, 1038, 1040,
-     1041, 1042, 1043, 1044, 1045, 1046, 1047, 1049, 1050, 1051,
-     1053, 1054, 1055, 1056, 1059, 1061, 1062, 1063, 1064, 1065,
-     1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075,
-     1076, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086,
-     1087, 1088, 1090, 1091, 1092, 1093, 1095, 1096, 1097, 1098,
-     1099, 1100, 1101, 1102, 1104, 1105, 1106, 1107, 1108, 1109,
-
-     1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1087, 1118,
-     1119, 1121, 1122, 1123, 1124, 1125, 1128, 1072, 1129, 1130,
-     1122, 1131, 1132, 1133, 1090, 1134, 1135, 1136, 1137, 1138,
-     1140, 1141, 1142, 1143, 1144, 1145, 1147, 1149, 1152, 1154,
-     1155, 1156, 1157, 1158, 1161, 1162, 1163, 1164, 1165, 1166,
-     1167, 1168, 1169, 1170, 1172, 1173, 1174, 1175, 1176, 1177,
-     1178, 1179, 1180, 1181, 1182, 1184, 1158, 1187, 1189, 1190,
-     1191, 1192, 1194, 1195, 1196, 1197, 1198, 1199, 1202, 1203,
-     1205, 1206, 1207, 1208, 1209, 1211, 1212, 1213, 1214, 1215,
-     1217, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227,
-
-     1229, 1230, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239,
-     1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1219, 1247,
-     1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257,
-     1258, 1259, 1261, 1262, 1264, 1265, 1266, 1269, 1270, 1274,
-     1275, 1277, 1278, 1279, 1280, 1281, 1277, 1282, 1283, 1284,
-     1285, 1287, 1288, 1291, 1292, 1293, 1294, 1296, 1297, 1298,
-     1299, 1300, 1301, 1302, 1266, 1303, 1304, 1240, 1305, 1306,
-     1307, 1308, 1309, 1311, 1312, 1314, 1315, 1317, 1318, 1319,
-     1320, 1321, 1323, 1324, 1325, 1327, 1328, 1329, 1330, 1331,
-     1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1341, 1342,
-
-     1343, 1345, 1348, 1349, 1350, 1351, 1352, 1354, 1355, 1356,
-     1357, 1358, 1359, 1361, 1363, 1364, 1365, 1366, 1367, 1368,
-     1369, 1370, 1371, 1373, 1374, 1375, 1376, 1377, 1378, 1379,
-     1380, 1381, 1382, 1385, 1386, 1387, 1388, 1389, 1391, 1392,
-     1393, 1394, 1395, 1396, 1397, 1398, 1400, 1401, 1402, 1403,
-     1404, 1405, 1407, 1408, 1411, 1412, 1413, 1414, 1415, 1417,
-     1418, 1420, 1421, 1423, 1424, 1426, 1427, 1429, 1431, 1432,
-     1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442,
-     1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452,
-     1453, 1454, 1455, 1456, 1457, 1459, 1462, 1463, 1464, 1465,
-
-     1466, 1467, 1471, 1472, 1473, 1474, 1476, 1477, 1479, 1480,
-     1481, 1482, 1483, 1485, 1486, 1489, 1489, 1489, 1489, 1489,
-     1490, 1490, 1490, 1490, 1490, 1491, 1497, 1491, 1491, 1491,
-     1492, 1498, 1492, 1499, 1492, 1493, 1493, 1493, 1493, 1493,
-     1494, 1494, 1494, 1494, 1494, 1495, 1500, 1495, 1495, 1495,
-     1496, 1496, 1496,  729,  728,  727,  726,  725,  724,  723,
-      722,  719,  718,  716,  714,  713,  712,  711,  710,  709,
-      708,  707,  706,  705,  704,  703,  702,  701,  700,  699,
-      698,  696,  695,  694,  693,  692,  691,  690,  689,  687,
-      686,  685,  684,  683,  682,  680,  678,  677,  676,  675,
-
-      674,  673,  672,  671,  670,  669,  668,  667,  666,  665,
-      664,  663,  662,  660,  659,  658,  657,  656,  655,  654,
-      653,  652,  651,  650,  649,  648,  647,  646,  645,  644,
-      643,  642,  641,  640,  638,  637,  636,  633,  632,  631,
-      628,  627,  626,  625,  624,  621,  620,  619,  618,  617,
-      616,  615,  614,  613,  612,  611,  610,  609,  607,  606,
-      605,  604,  603,  602,  601,  600,  598,  597,  595,  594,
-      593,  592,  591,  589,  588,  587,  585,  584,  582,  581,
-      580,  579,  578,  577,  576,  575,  574,  572,  571,  570,
-      569,  568,  566,  565,  564,  563,  562,  561,  560,  559,
-
-      557,  556,  555,  554,  553,  552,  551,  550,  549,  548,
-      547,  546,  545,  544,  543,  542,  541,  540,  539,  538,
-      537,  536,  530,  528,  525,  524,  522,  521,  520,  518,
-      514,  513,  512,  511,  510,  509,  508,  507,  506,  505,
-      504,  503,  502,  501,  500,  499,  497,  496,  495,  494,
-      493,  492,  491,  490,  489,  488,  487,  485,  483,  482,
-      481,  480,  479,  478,  477,  476,  475,  474,  473,  472,
-      470,  469,  468,  467,  466,  465,  464,  463,  462,  461,
-      460,  459,  458,  457,  456,  455,  454,  453,  452,  451,
-      449,  448,  447,  446,  444,  443,  442,  441,  440,  439,
-
-      437,  436,  434,  433,  432,  431,  429,  428,  427,  426,
-      425,  424,  423,  421,  420,  415,  414,  412,  411,  410,
-      409,  408,  405,  402,  400,  399,  398,  397,  395,  394,
-      393,  392,  391,  390,  389,  388,  387,  386,  384,  383,
-      382,  380,  379,  378,  377,  376,  375,  373,  372,  370,
-      369,  368,  367,  366,  365,  364,  363,  362,  358,  357,
-      356,  355,  354,  352,  351,  350,  349,  348,  347,  346,
-      345,  344,  343,  342,  340,  339,  338,  337,  336,  335,
-      334,  333,  332,  331,  330,  329,  328,  326,  325,  324,
-      322,  319,  318,  317,  316,  315,  314,  313,  309,  307,
-
-      304,  302,  299,  296,  289,  288,  287,  286,  285,  284,
-      282,  281,  280,  279,  278,  276,  275,  274,  273,  272,
-      271,  270,  268,  267,  266,  265,  264,  263,  262,  261,
-      260,  259,  258,  257,  256,  255,  253,  252,  251,  249,
-      248,  247,  246,  244,  243,  242,  241,  240,  239,  238,
-      237,  236,  234,  233,  232,  231,  230,  229,  228,  227,
-      226,  225,  224,  223,  222,  221,  220,  219,  218,  217,
-      216,  215,  214,  213,  212,  210,  209,  208,  207,  205,
-      202,  200,  198,  196,  195,  190,  189,  185,  177,  176,
-      175,  174,  173,  172,  170,  169,  168,  167,  165,  163,
-
-      162,  161,  159,  158,  156,  155,  154,  153,  152,  150,
-      149,  148,  147,  145,  144,  143,  142,  141,  140,  139,
-      137,  136,  134,  133,  129,  128,  127,  125,  124,  123,
-      121,  120,  116,  110,  106,  105,  104,   98,   97,   78,
-       73,   67,   50,   49,   48,   43,   41,   39,   38,   24,
-       14,   11, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
-     1488, 1488, 1488, 1488
+      599,  634,  639,  639,  715,  639,  747,  590,  732,  748,
+      749,  715,  418,  418,  418,  418,  418,  418,  717,  750,
+      720,  751,  752,  753,  754,  717,  720,  755,  756,  717,
+      758,  759,  760,  761,  762,  763,  764,  599,  765,  766,
+      763,  767,  768,  769,  770,  771,  772,  775,  776,  777,
+      778,  781,  782,  783,  784,  785,  786,  787,  784,  788,
+
+      789,  790,  792,  793,  794,  795,  796,  797,  798,  799,
+      800,  801,  802,  803,  804,  805,  806,  807,  808,  809,
+      810,  811,  812,  813,  814,  815,  816,  817,  818,  819,
+      820,  822,  823,  824,  825,  826,  814,  827,  829,  830,
+      831,  832,  833,  834,  835,  836,  837,  838,  839,  840,
+      841,  842,  843,  844,  845,  846,  847,  849,  850,  851,
+      852,  853,  830,  854,  855,  829,  856,  857,  858,  860,
+      861,  862,  863,  864,  865,  867,  868,  869,  864,  870,
+      871,  872,  873,  874,  875,  876,  877,  878,  879,  880,
+      881,  882,  885,  886,  887,  889,  890,  891,  893,  894,
+
+      895,  881,  896,  897,  898,  899,  900,  901,  902,  903,
+      904,  905,  906,  907,  908,  909,  910,  912,  913,  914,
+      915,  916,  917,  918,  919,  920,  921,  923,  922,  864,
+      924,  925,  926,  927,  928,  929,  930,  931,  932,  933,
+      934,  935,  936,  938,  939,  940,  941,  942,  943,  944,
+      945,  946,  947,  948,  921,  922,  949,  950,  951,  952,
+      953,  955,  956,  957,  958,  959,  960,  956,  961,  962,
+      963,  964,  965,  966,  967,  968,  969,  970,  971,  972,
+      973,  974,  975,  976,  977,  978,  979,  981,  982,  983,
+      984,  985,  986,  987,  988,  989,  990,  991,  993,  994,
+
+      997,  998,  999, 1000, 1001,  957, 1002, 1003, 1004, 1005,
+     1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015,
+     1016, 1017, 1018, 1020, 1022, 1023, 1024, 1025, 1026, 1027,
+     1028, 1029, 1030, 1031, 1032, 1008, 1033, 1034, 1035, 1036,
+     1037, 1009, 1040, 1042, 1044, 1045, 1046, 1047, 1048, 1049,
+     1050, 1051, 1053, 1054, 1055, 1057, 1058, 1059, 1060, 1063,
+     1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074,
+     1075, 1076, 1077, 1078, 1079, 1080, 1082, 1083, 1084, 1085,
+     1086, 1087, 1088, 1089, 1090, 1091, 1092, 1094, 1095, 1096,
+     1097, 1098, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107,
+
+     1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118,
+     1119, 1120, 1121, 1091, 1122, 1123, 1124, 1126, 1127, 1128,
+     1129, 1130, 1076, 1133, 1134, 1135, 1127, 1136, 1137, 1094,
+     1138, 1139, 1140, 1141, 1142, 1143, 1145, 1146, 1147, 1148,
+     1149, 1150, 1152, 1154, 1157, 1159, 1160, 1161, 1162, 1163,
+     1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175,
+     1176, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186,
+     1187, 1188, 1163, 1190, 1193, 1195, 1196, 1197, 1198, 1200,
+     1201, 1202, 1203, 1204, 1205, 1208, 1209, 1211, 1212, 1213,
+     1214, 1215, 1217, 1218, 1219, 1220, 1221, 1223, 1225, 1226,
+
+     1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1236, 1237,
+     1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1246, 1247,
+     1248, 1249, 1250, 1251, 1252, 1225, 1253, 1254, 1255, 1256,
+     1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266,
+     1268, 1269, 1271, 1272, 1273, 1276, 1277, 1278, 1282, 1283,
+     1285, 1286, 1287, 1288, 1289, 1285, 1290, 1291, 1292, 1293,
+     1295, 1296, 1299, 1300, 1301, 1302, 1304, 1305, 1306, 1307,
+     1308, 1309, 1273, 1310, 1311, 1247, 1312, 1313, 1314, 1315,
+     1316, 1317, 1319, 1320, 1321, 1323, 1324, 1326, 1327, 1328,
+     1329, 1330, 1332, 1333, 1334, 1336, 1337, 1338, 1339, 1340,
+
+     1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1350, 1351,
+     1352, 1354, 1357, 1358, 1359, 1360, 1361, 1362, 1364, 1365,
+     1366, 1367, 1368, 1369, 1371, 1373, 1374, 1375, 1376, 1377,
+     1378, 1379, 1380, 1381, 1383, 1384, 1385, 1386, 1387, 1388,
+     1389, 1390, 1391, 1392, 1393, 1396, 1397, 1398, 1399, 1400,
+     1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1412,
+     1413, 1414, 1415, 1416, 1417, 1419, 1420, 1423, 1424, 1425,
+     1426, 1427, 1429, 1430, 1431, 1433, 1434, 1436, 1437, 1439,
+     1440, 1442, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451,
+     1452, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461,
+
+     1462, 1463, 1464, 1465, 1466, 1467, 1469, 1470, 1471, 1472,
+     1473, 1475, 1478, 1479, 1480, 1481, 1482, 1483, 1487, 1488,
+     1489, 1490, 1492, 1493, 1495, 1496, 1497, 1498, 1499, 1501,
+     1502, 1505, 1505, 1505, 1505, 1505, 1506, 1506, 1506, 1506,
+     1506, 1507, 1513, 1507, 1507, 1507, 1508, 1514, 1508, 1515,
+     1508, 1509, 1509, 1509, 1509, 1509, 1510, 1510, 1510, 1510,
+     1510, 1511, 1516, 1511, 1511, 1511, 1512, 1512, 1512,  729,
+      728,  727,  726,  725,  724,  723,  722,  719,  718,  716,
+      714,  713,  712,  711,  710,  709,  708,  707,  706,  705,
+      704,  703,  702,  701,  700,  699,  698,  696,  695,  694,
+
+      693,  692,  691,  690,  689,  687,  686,  685,  684,  683,
+      682,  680,  678,  677,  676,  675,  674,  673,  672,  671,
+      670,  669,  668,  667,  666,  665,  664,  663,  662,  660,
+      659,  658,  657,  656,  655,  654,  653,  652,  651,  650,
+      649,  648,  647,  646,  645,  644,  643,  642,  641,  640,
+      638,  637,  636,  633,  632,  631,  628,  627,  626,  625,
+      624,  621,  620,  619,  618,  617,  616,  615,  614,  613,
+      612,  611,  610,  609,  607,  606,  605,  604,  603,  602,
+      601,  600,  598,  597,  595,  594,  593,  592,  591,  589,
+      588,  587,  585,  584,  582,  581,  580,  579,  578,  577,
+
+      576,  575,  574,  572,  571,  570,  569,  568,  566,  565,
+      564,  563,  562,  561,  560,  559,  557,  556,  555,  554,
+      553,  552,  551,  550,  549,  548,  547,  546,  545,  544,
+      543,  542,  541,  540,  539,  538,  537,  536,  530,  528,
+      525,  524,  522,  521,  520,  518,  514,  513,  512,  511,
+      510,  509,  508,  507,  506,  505,  504,  503,  502,  501,
+      500,  499,  497,  496,  495,  494,  493,  492,  491,  490,
+      489,  488,  487,  485,  483,  482,  481,  480,  479,  478,
+      477,  476,  475,  474,  473,  472,  470,  469,  468,  467,
+      466,  465,  464,  463,  462,  461,  460,  459,  458,  457,
+
+      456,  455,  454,  453,  452,  451,  449,  448,  447,  446,
+      444,  443,  442,  441,  440,  439,  437,  436,  434,  433,
+      432,  431,  429,  428,  427,  426,  425,  424,  423,  421,
+      420,  415,  414,  412,  411,  410,  409,  408,  405,  402,
+      400,  399,  398,  397,  395,  394,  393,  392,  391,  390,
+      389,  388,  387,  386,  384,  383,  382,  380,  379,  378,
+      377,  376,  375,  373,  372,  370,  369,  368,  367,  366,
+      365,  364,  363,  362,  358,  357,  356,  355,  354,  352,
+      351,  350,  349,  348,  347,  346,  345,  344,  343,  342,
+      340,  339,  338,  337,  336,  335,  334,  333,  332,  331,
+
+      330,  329,  328,  326,  325,  324,  322,  319,  318,  317,
+      316,  315,  314,  313,  309,  307,  304,  302,  299,  296,
+      289,  288,  287,  286,  285,  284,  282,  281,  280,  279,
+      278,  276,  275,  274,  273,  272,  271,  270,  268,  267,
+      266,  265,  264,  263,  262,  261,  260,  259,  258,  257,
+      256,  255,  253,  252,  251,  249,  248,  247,  246,  244,
+      243,  242,  241,  240,  239,  238,  237,  236,  234,  233,
+      232,  231,  230,  229,  228,  227,  226,  225,  224,  223,
+      222,  221,  220,  219,  218,  217,  216,  215,  214,  213,
+      212,  210,  209,  208,  207,  205,  202,  200,  198,  196,
+
+      195,  190,  189,  185,  177,  176,  175,  174,  173,  172,
+      170,  169,  168,  167,  165,  163,  162,  161,  159,  158,
+      156,  155,  154,  153,  152,  150,  149,  148,  147,  145,
+      144,  143,  142,  141,  140,  139,  137,  136,  134,  133,
+      129,  128,  127,  125,  124,  123,  121,  120,  116,  110,
+      106,  105,  104,   98,   97,   78,   73,   67,   50,   49,
+       48,   43,   41,   39,   38,   24,   14,   11, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504,
+     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -1687,28 +1696,28 @@ static char *yy_last_accepting_cpos;
 extern int yy_flex_debug;
 int yy_flex_debug = 1;
 
-static const flex_int16_t yy_rule_linenum[182] =
+static const flex_int16_t yy_rule_linenum[183] =
     {   0,
       149,  151,  153,  158,  159,  164,  165,  166,  178,  181,
       186,  193,  202,  211,  220,  229,  238,  247,  256,  265,
       274,  283,  292,  301,  310,  319,  328,  338,  348,  358,
       368,  378,  387,  397,  407,  417,  427,  436,  445,  454,
-      463,  472,  481,  490,  499,  508,  517,  526,  536,  545,
-      558,  567,  576,  585,  594,  605,  616,  627,  638,  650,
-      661,  672,  683,  694,  705,  716,  727,  738,  749,  760,
-      771,  782,  793,  804,  815,  824,  833,  843,  852,  861,
-      876,  892,  901,  910,  919,  928,  937,  946,  955,  964,
-      973,  982, 1004, 1026, 1035, 1045, 1055, 1064, 1074, 1085,
-
-     1094, 1103, 1112, 1121, 1130, 1140, 1149, 1158, 1167, 1176,
-     1185, 1194, 1203, 1212, 1221, 1231, 1240, 1249, 1259, 1271,
-     1284, 1293, 1302, 1312, 1322, 1331, 1342, 1352, 1361, 1371,
-     1381, 1390, 1399, 1408, 1417, 1427, 1436, 1446, 1455, 1464,
-     1473, 1482, 1491, 1500, 1509, 1518, 1527, 1536, 1545, 1554,
-     1563, 1572, 1581, 1590, 1599, 1608, 1617, 1626, 1635, 1644,
-     1653, 1662, 1671, 1681, 1780, 1785, 1790, 1795, 1796, 1797,
-     1798, 1799, 1800, 1802, 1820, 1833, 1838, 1842, 1844, 1846,
-     1848
+      463,  472,  481,  490,  499,  508,  517,  526,  535,  544,
+      553,  566,  575,  584,  593,  602,  613,  624,  635,  646,
+      658,  669,  680,  691,  702,  713,  724,  735,  746,  757,
+      768,  779,  790,  801,  812,  823,  832,  841,  851,  860,
+      869,  884,  900,  909,  918,  927,  936,  945,  954,  963,
+      972,  981,  990, 1012, 1034, 1043, 1053, 1063, 1072, 1082,
+
+     1093, 1102, 1111, 1120, 1129, 1138, 1148, 1157, 1166, 1175,
+     1184, 1193, 1202, 1211, 1220, 1229, 1239, 1248, 1257, 1267,
+     1279, 1292, 1301, 1310, 1320, 1330, 1339, 1350, 1360, 1369,
+     1379, 1389, 1398, 1407, 1416, 1425, 1435, 1444, 1454, 1463,
+     1472, 1481, 1490, 1499, 1508, 1517, 1526, 1535, 1544, 1553,
+     1562, 1571, 1580, 1589, 1598, 1607, 1616, 1625, 1634, 1643,
+     1652, 1661, 1670, 1679, 1689, 1788, 1793, 1798, 1803, 1804,
+     1805, 1806, 1807, 1808, 1810, 1828, 1841, 1846, 1850, 1852,
+     1854, 1856
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1761,7 +1770,7 @@ using namespace isc::dhcp;
 
 /* To avoid the call to exit... oops! */
 #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg)
-#line 1764 "dhcp6_lexer.cc"
+#line 1774 "dhcp6_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
@@ -1787,8 +1796,8 @@ using namespace isc::dhcp;
    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 1790 "dhcp6_lexer.cc"
-#line 1791 "dhcp6_lexer.cc"
+#line 1800 "dhcp6_lexer.cc"
+#line 1801 "dhcp6_lexer.cc"
 
 #define INITIAL 0
 #define COMMENT 1
@@ -2120,7 +2129,7 @@ YY_DECL
     }
 
 
-#line 2123 "dhcp6_lexer.cc"
+#line 2133 "dhcp6_lexer.cc"
 
        while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
@@ -2149,13 +2158,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 >= 1489 )
+                               if ( yy_current_state >= 1505 )
                                        yy_c = yy_meta[yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
                        ++yy_cp;
                        }
-               while ( yy_current_state != 1488 );
+               while ( yy_current_state != 1504 );
                yy_cp = (yy_last_accepting_cpos);
                yy_current_state = (yy_last_accepting_state);
 
@@ -2174,13 +2183,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 < 182 )
+                       else if ( yy_act < 183 )
                                fprintf( stderr, "--accepting rule at line %ld (\"%s\")\n",
                                         (long)yy_rule_linenum[yy_act], yytext );
-                       else if ( yy_act == 182 )
+                       else if ( yy_act == 183 )
                                fprintf( stderr, "--accepting default rule (\"%s\")\n",
                                         yytext );
-                       else if ( yy_act == 183 )
+                       else if ( yy_act == 184 )
                                fprintf( stderr, "--(end of buffer or a NUL)\n" );
                        else
                                fprintf( stderr, "--EOF (start condition %d)\n", YY_START );
@@ -2739,7 +2748,19 @@ YY_RULE_SETUP
        YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 536 "dhcp6_lexer.ll"
+#line 535 "dhcp6_lexer.ll"
+{
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::CONFIG_CONTROL:
+        return isc::dhcp::Dhcp6Parser::make_CONFIG_FETCH_WAIT_TIME(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("config-fetch-wait-time", driver.loc_);
+    }
+}
+       YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 544 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOSTS_DATABASE:
@@ -2749,9 +2770,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 50:
+case 51:
 YY_RULE_SETUP
-#line 545 "dhcp6_lexer.ll"
+#line 553 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2765,9 +2786,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 51:
+case 52:
 YY_RULE_SETUP
-#line 558 "dhcp6_lexer.ll"
+#line 566 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DATABASE_TYPE:
@@ -2777,9 +2798,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 52:
+case 53:
 YY_RULE_SETUP
-#line 567 "dhcp6_lexer.ll"
+#line 575 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DATABASE_TYPE:
@@ -2789,9 +2810,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 53:
+case 54:
 YY_RULE_SETUP
-#line 576 "dhcp6_lexer.ll"
+#line 584 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DATABASE_TYPE:
@@ -2801,9 +2822,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 54:
+case 55:
 YY_RULE_SETUP
-#line 585 "dhcp6_lexer.ll"
+#line 593 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DATABASE_TYPE:
@@ -2813,9 +2834,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 55:
+case 56:
 YY_RULE_SETUP
-#line 594 "dhcp6_lexer.ll"
+#line 602 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2827,9 +2848,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 56:
+case 57:
 YY_RULE_SETUP
-#line 605 "dhcp6_lexer.ll"
+#line 613 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2841,9 +2862,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 57:
+case 58:
 YY_RULE_SETUP
-#line 616 "dhcp6_lexer.ll"
+#line 624 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2855,9 +2876,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 58:
+case 59:
 YY_RULE_SETUP
-#line 627 "dhcp6_lexer.ll"
+#line 635 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2869,9 +2890,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 59:
+case 60:
 YY_RULE_SETUP
-#line 638 "dhcp6_lexer.ll"
+#line 646 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2884,9 +2905,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 60:
+case 61:
 YY_RULE_SETUP
-#line 650 "dhcp6_lexer.ll"
+#line 658 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2898,9 +2919,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 61:
+case 62:
 YY_RULE_SETUP
-#line 661 "dhcp6_lexer.ll"
+#line 669 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2912,9 +2933,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 62:
+case 63:
 YY_RULE_SETUP
-#line 672 "dhcp6_lexer.ll"
+#line 680 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2926,9 +2947,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 63:
+case 64:
 YY_RULE_SETUP
-#line 683 "dhcp6_lexer.ll"
+#line 691 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2940,9 +2961,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 64:
+case 65:
 YY_RULE_SETUP
-#line 694 "dhcp6_lexer.ll"
+#line 702 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2954,9 +2975,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 65:
+case 66:
 YY_RULE_SETUP
-#line 705 "dhcp6_lexer.ll"
+#line 713 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2968,9 +2989,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 66:
+case 67:
 YY_RULE_SETUP
-#line 716 "dhcp6_lexer.ll"
+#line 724 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2982,9 +3003,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 67:
+case 68:
 YY_RULE_SETUP
-#line 727 "dhcp6_lexer.ll"
+#line 735 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -2996,9 +3017,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 68:
+case 69:
 YY_RULE_SETUP
-#line 738 "dhcp6_lexer.ll"
+#line 746 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -3010,9 +3031,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 69:
+case 70:
 YY_RULE_SETUP
-#line 749 "dhcp6_lexer.ll"
+#line 757 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -3024,9 +3045,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 70:
+case 71:
 YY_RULE_SETUP
-#line 760 "dhcp6_lexer.ll"
+#line 768 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -3038,9 +3059,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 71:
+case 72:
 YY_RULE_SETUP
-#line 771 "dhcp6_lexer.ll"
+#line 779 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3052,9 +3073,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 72:
+case 73:
 YY_RULE_SETUP
-#line 782 "dhcp6_lexer.ll"
+#line 790 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3066,9 +3087,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 73:
+case 74:
 YY_RULE_SETUP
-#line 793 "dhcp6_lexer.ll"
+#line 801 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3080,9 +3101,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 74:
+case 75:
 YY_RULE_SETUP
-#line 804 "dhcp6_lexer.ll"
+#line 812 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3094,9 +3115,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 75:
+case 76:
 YY_RULE_SETUP
-#line 815 "dhcp6_lexer.ll"
+#line 823 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3106,9 +3127,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 76:
+case 77:
 YY_RULE_SETUP
-#line 824 "dhcp6_lexer.ll"
+#line 832 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3118,9 +3139,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 77:
+case 78:
 YY_RULE_SETUP
-#line 833 "dhcp6_lexer.ll"
+#line 841 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3131,9 +3152,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 78:
+case 79:
 YY_RULE_SETUP
-#line 843 "dhcp6_lexer.ll"
+#line 851 "dhcp6_lexer.ll"
 {
     switch (driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3143,9 +3164,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 79:
+case 80:
 YY_RULE_SETUP
-#line 852 "dhcp6_lexer.ll"
+#line 860 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3155,9 +3176,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 80:
+case 81:
 YY_RULE_SETUP
-#line 861 "dhcp6_lexer.ll"
+#line 869 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3173,9 +3194,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 81:
+case 82:
 YY_RULE_SETUP
-#line 876 "dhcp6_lexer.ll"
+#line 884 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -3192,9 +3213,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 82:
+case 83:
 YY_RULE_SETUP
-#line 892 "dhcp6_lexer.ll"
+#line 900 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DATA:
@@ -3204,9 +3225,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 83:
+case 84:
 YY_RULE_SETUP
-#line 901 "dhcp6_lexer.ll"
+#line 909 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DATA:
@@ -3216,9 +3237,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 84:
+case 85:
 YY_RULE_SETUP
-#line 910 "dhcp6_lexer.ll"
+#line 918 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3228,9 +3249,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 85:
+case 86:
 YY_RULE_SETUP
-#line 919 "dhcp6_lexer.ll"
+#line 927 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3240,9 +3261,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 86:
+case 87:
 YY_RULE_SETUP
-#line 928 "dhcp6_lexer.ll"
+#line 936 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3252,9 +3273,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 87:
+case 88:
 YY_RULE_SETUP
-#line 937 "dhcp6_lexer.ll"
+#line 945 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3264,9 +3285,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 88:
+case 89:
 YY_RULE_SETUP
-#line 946 "dhcp6_lexer.ll"
+#line 954 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3276,9 +3297,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 89:
+case 90:
 YY_RULE_SETUP
-#line 955 "dhcp6_lexer.ll"
+#line 963 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3288,9 +3309,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 90:
+case 91:
 YY_RULE_SETUP
-#line 964 "dhcp6_lexer.ll"
+#line 972 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::PD_POOLS:
@@ -3300,9 +3321,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 91:
+case 92:
 YY_RULE_SETUP
-#line 973 "dhcp6_lexer.ll"
+#line 981 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::POOLS:
@@ -3312,9 +3333,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 92:
+case 93:
 YY_RULE_SETUP
-#line 982 "dhcp6_lexer.ll"
+#line 990 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3337,9 +3358,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 93:
+case 94:
 YY_RULE_SETUP
-#line 1004 "dhcp6_lexer.ll"
+#line 1012 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3362,9 +3383,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 94:
+case 95:
 YY_RULE_SETUP
-#line 1026 "dhcp6_lexer.ll"
+#line 1034 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3374,9 +3395,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 95:
+case 96:
 YY_RULE_SETUP
-#line 1035 "dhcp6_lexer.ll"
+#line 1043 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3387,9 +3408,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 96:
+case 97:
 YY_RULE_SETUP
-#line 1045 "dhcp6_lexer.ll"
+#line 1053 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3400,9 +3421,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 97:
+case 98:
 YY_RULE_SETUP
-#line 1055 "dhcp6_lexer.ll"
+#line 1063 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3412,9 +3433,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 98:
+case 99:
 YY_RULE_SETUP
-#line 1064 "dhcp6_lexer.ll"
+#line 1072 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3425,9 +3446,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 99:
+case 100:
 YY_RULE_SETUP
-#line 1074 "dhcp6_lexer.ll"
+#line 1082 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3439,9 +3460,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 100:
+case 101:
 YY_RULE_SETUP
-#line 1085 "dhcp6_lexer.ll"
+#line 1093 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -3451,9 +3472,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 101:
+case 102:
 YY_RULE_SETUP
-#line 1094 "dhcp6_lexer.ll"
+#line 1102 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -3463,9 +3484,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 102:
+case 103:
 YY_RULE_SETUP
-#line 1103 "dhcp6_lexer.ll"
+#line 1111 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -3475,9 +3496,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 103:
+case 104:
 YY_RULE_SETUP
-#line 1112 "dhcp6_lexer.ll"
+#line 1120 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -3487,9 +3508,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 104:
+case 105:
 YY_RULE_SETUP
-#line 1121 "dhcp6_lexer.ll"
+#line 1129 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATION_MODE:
@@ -3499,9 +3520,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 105:
+case 106:
 YY_RULE_SETUP
-#line 1130 "dhcp6_lexer.ll"
+#line 1138 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -3512,9 +3533,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 106:
+case 107:
 YY_RULE_SETUP
-#line 1140 "dhcp6_lexer.ll"
+#line 1148 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3524,9 +3545,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 107:
+case 108:
 YY_RULE_SETUP
-#line 1149 "dhcp6_lexer.ll"
+#line 1157 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3536,9 +3557,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 108:
+case 109:
 YY_RULE_SETUP
-#line 1158 "dhcp6_lexer.ll"
+#line 1166 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3548,9 +3569,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 109:
+case 110:
 YY_RULE_SETUP
-#line 1167 "dhcp6_lexer.ll"
+#line 1175 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONFIG:
@@ -3560,9 +3581,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 110:
+case 111:
 YY_RULE_SETUP
-#line 1176 "dhcp6_lexer.ll"
+#line 1184 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LOGGING:
@@ -3572,9 +3593,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 111:
+case 112:
 YY_RULE_SETUP
-#line 1185 "dhcp6_lexer.ll"
+#line 1193 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LOGGERS:
@@ -3584,9 +3605,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 112:
+case 113:
 YY_RULE_SETUP
-#line 1194 "dhcp6_lexer.ll"
+#line 1202 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -3596,9 +3617,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 113:
+case 114:
 YY_RULE_SETUP
-#line 1203 "dhcp6_lexer.ll"
+#line 1211 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -3608,9 +3629,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 114:
+case 115:
 YY_RULE_SETUP
-#line 1212 "dhcp6_lexer.ll"
+#line 1220 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -3620,9 +3641,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 115:
+case 116:
 YY_RULE_SETUP
-#line 1221 "dhcp6_lexer.ll"
+#line 1229 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
@@ -3632,9 +3653,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 116:
+case 117:
 YY_RULE_SETUP
-#line 1231 "dhcp6_lexer.ll"
+#line 1239 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LOGGERS:
@@ -3644,9 +3665,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 117:
+case 118:
 YY_RULE_SETUP
-#line 1240 "dhcp6_lexer.ll"
+#line 1248 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LOGGERS:
@@ -3656,9 +3677,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 118:
+case 119:
 YY_RULE_SETUP
-#line 1249 "dhcp6_lexer.ll"
+#line 1257 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3669,9 +3690,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 119:
+case 120:
 YY_RULE_SETUP
-#line 1259 "dhcp6_lexer.ll"
+#line 1267 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3684,9 +3705,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 120:
+case 121:
 YY_RULE_SETUP
-#line 1271 "dhcp6_lexer.ll"
+#line 1279 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3700,9 +3721,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 121:
+case 122:
 YY_RULE_SETUP
-#line 1284 "dhcp6_lexer.ll"
+#line 1292 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CLIENT_CLASSES:
@@ -3712,9 +3733,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 122:
+case 123:
 YY_RULE_SETUP
-#line 1293 "dhcp6_lexer.ll"
+#line 1301 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CLIENT_CLASSES:
@@ -3724,9 +3745,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 123:
+case 124:
 YY_RULE_SETUP
-#line 1302 "dhcp6_lexer.ll"
+#line 1310 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3737,9 +3758,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 124:
+case 125:
 YY_RULE_SETUP
-#line 1312 "dhcp6_lexer.ll"
+#line 1320 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATIONS:
@@ -3750,9 +3771,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 125:
+case 126:
 YY_RULE_SETUP
-#line 1322 "dhcp6_lexer.ll"
+#line 1330 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATIONS:
@@ -3762,9 +3783,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 126:
+case 127:
 YY_RULE_SETUP
-#line 1331 "dhcp6_lexer.ll"
+#line 1339 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::MAC_SOURCES:
@@ -3776,9 +3797,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 127:
+case 128:
 YY_RULE_SETUP
-#line 1342 "dhcp6_lexer.ll"
+#line 1350 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS:
@@ -3789,9 +3810,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 128:
+case 129:
 YY_RULE_SETUP
-#line 1352 "dhcp6_lexer.ll"
+#line 1360 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RESERVATIONS:
@@ -3801,9 +3822,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 129:
+case 130:
 YY_RULE_SETUP
-#line 1361 "dhcp6_lexer.ll"
+#line 1369 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS:
@@ -3814,9 +3835,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 130:
+case 131:
 YY_RULE_SETUP
-#line 1371 "dhcp6_lexer.ll"
+#line 1379 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -3827,9 +3848,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 131:
+case 132:
 YY_RULE_SETUP
-#line 1381 "dhcp6_lexer.ll"
+#line 1389 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DATA:
@@ -3839,9 +3860,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 132:
+case 133:
 YY_RULE_SETUP
-#line 1390 "dhcp6_lexer.ll"
+#line 1398 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -3851,9 +3872,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 133:
+case 134:
 YY_RULE_SETUP
-#line 1399 "dhcp6_lexer.ll"
+#line 1407 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -3863,9 +3884,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 134:
+case 135:
 YY_RULE_SETUP
-#line 1408 "dhcp6_lexer.ll"
+#line 1416 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::OPTION_DEF:
@@ -3875,9 +3896,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 135:
+case 136:
 YY_RULE_SETUP
-#line 1417 "dhcp6_lexer.ll"
+#line 1425 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:
@@ -3888,9 +3909,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 136:
+case 137:
 YY_RULE_SETUP
-#line 1427 "dhcp6_lexer.ll"
+#line 1435 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::RELAY:
@@ -3900,9 +3921,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 137:
+case 138:
 YY_RULE_SETUP
-#line 1436 "dhcp6_lexer.ll"
+#line 1444 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3912,9 +3933,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 138:
+case 139:
 YY_RULE_SETUP
-#line 1446 "dhcp6_lexer.ll"
+#line 1454 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOOKS_LIBRARIES:
@@ -3924,9 +3945,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 139:
+case 140:
 YY_RULE_SETUP
-#line 1455 "dhcp6_lexer.ll"
+#line 1463 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::HOOKS_LIBRARIES:
@@ -3936,9 +3957,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 140:
+case 141:
 YY_RULE_SETUP
-#line 1464 "dhcp6_lexer.ll"
+#line 1472 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -3948,9 +3969,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 141:
+case 142:
 YY_RULE_SETUP
-#line 1473 "dhcp6_lexer.ll"
+#line 1481 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DUID_TYPE:
@@ -3960,9 +3981,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 142:
+case 143:
 YY_RULE_SETUP
-#line 1482 "dhcp6_lexer.ll"
+#line 1490 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DUID_TYPE:
@@ -3972,9 +3993,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 143:
+case 144:
 YY_RULE_SETUP
-#line 1491 "dhcp6_lexer.ll"
+#line 1499 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DUID_TYPE:
@@ -3984,9 +4005,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 144:
+case 145:
 YY_RULE_SETUP
-#line 1500 "dhcp6_lexer.ll"
+#line 1508 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -3996,9 +4017,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 145:
+case 146:
 YY_RULE_SETUP
-#line 1509 "dhcp6_lexer.ll"
+#line 1517 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -4008,9 +4029,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 146:
+case 147:
 YY_RULE_SETUP
-#line 1518 "dhcp6_lexer.ll"
+#line 1526 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -4020,9 +4041,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 147:
+case 148:
 YY_RULE_SETUP
-#line 1527 "dhcp6_lexer.ll"
+#line 1535 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SERVER_ID:
@@ -4032,9 +4053,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 148:
+case 149:
 YY_RULE_SETUP
-#line 1536 "dhcp6_lexer.ll"
+#line 1544 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4044,9 +4065,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 149:
+case 150:
 YY_RULE_SETUP
-#line 1545 "dhcp6_lexer.ll"
+#line 1553 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4056,9 +4077,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 150:
+case 151:
 YY_RULE_SETUP
-#line 1554 "dhcp6_lexer.ll"
+#line 1562 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4068,9 +4089,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 151:
+case 152:
 YY_RULE_SETUP
-#line 1563 "dhcp6_lexer.ll"
+#line 1571 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4080,9 +4101,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 152:
+case 153:
 YY_RULE_SETUP
-#line 1572 "dhcp6_lexer.ll"
+#line 1580 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4092,9 +4113,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 153:
+case 154:
 YY_RULE_SETUP
-#line 1581 "dhcp6_lexer.ll"
+#line 1589 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4104,9 +4125,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 154:
+case 155:
 YY_RULE_SETUP
-#line 1590 "dhcp6_lexer.ll"
+#line 1598 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
@@ -4116,9 +4137,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 155:
+case 156:
 YY_RULE_SETUP
-#line 1599 "dhcp6_lexer.ll"
+#line 1607 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4128,9 +4149,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 156:
+case 157:
 YY_RULE_SETUP
-#line 1608 "dhcp6_lexer.ll"
+#line 1616 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4140,9 +4161,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 157:
+case 158:
 YY_RULE_SETUP
-#line 1617 "dhcp6_lexer.ll"
+#line 1625 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONTROL_SOCKET:
@@ -4152,9 +4173,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 158:
+case 159:
 YY_RULE_SETUP
-#line 1626 "dhcp6_lexer.ll"
+#line 1634 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONTROL_SOCKET:
@@ -4164,9 +4185,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 159:
+case 160:
 YY_RULE_SETUP
-#line 1635 "dhcp6_lexer.ll"
+#line 1643 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4176,9 +4197,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 160:
+case 161:
 YY_RULE_SETUP
-#line 1644 "dhcp6_lexer.ll"
+#line 1652 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
@@ -4188,9 +4209,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 161:
+case 162:
 YY_RULE_SETUP
-#line 1653 "dhcp6_lexer.ll"
+#line 1661 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONFIG:
@@ -4200,9 +4221,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 162:
+case 163:
 YY_RULE_SETUP
-#line 1662 "dhcp6_lexer.ll"
+#line 1670 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONFIG:
@@ -4212,9 +4233,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 163:
+case 164:
 YY_RULE_SETUP
-#line 1671 "dhcp6_lexer.ll"
+#line 1679 "dhcp6_lexer.ll"
 {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::CONFIG:
@@ -4224,9 +4245,9 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 164:
+case 165:
 YY_RULE_SETUP
-#line 1681 "dhcp6_lexer.ll"
+#line 1689 "dhcp6_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.
@@ -4326,65 +4347,65 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp6Parser::make_STRING(decoded, driver.loc_);
 }
        YY_BREAK
-case 165:
-/* rule 165 can match eol */
+case 166:
+/* rule 166 can match eol */
 YY_RULE_SETUP
-#line 1780 "dhcp6_lexer.ll"
+#line 1788 "dhcp6_lexer.ll"
 {
     /* Bad string with a forbidden control character inside */
     driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
 }
        YY_BREAK
-case 166:
-/* rule 166 can match eol */
+case 167:
+/* rule 167 can match eol */
 YY_RULE_SETUP
-#line 1785 "dhcp6_lexer.ll"
+#line 1793 "dhcp6_lexer.ll"
 {
     /* Bad string with a bad escape inside */
     driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
 }
        YY_BREAK
-case 167:
+case 168:
 YY_RULE_SETUP
-#line 1790 "dhcp6_lexer.ll"
+#line 1798 "dhcp6_lexer.ll"
 {
     /* Bad string with an open escape at the end */
     driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
 }
        YY_BREAK
-case 168:
+case 169:
 YY_RULE_SETUP
-#line 1795 "dhcp6_lexer.ll"
+#line 1803 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 169:
+case 170:
 YY_RULE_SETUP
-#line 1796 "dhcp6_lexer.ll"
+#line 1804 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); }
        YY_BREAK
-case 170:
+case 171:
 YY_RULE_SETUP
-#line 1797 "dhcp6_lexer.ll"
+#line 1805 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 171:
+case 172:
 YY_RULE_SETUP
-#line 1798 "dhcp6_lexer.ll"
+#line 1806 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); }
        YY_BREAK
-case 172:
+case 173:
 YY_RULE_SETUP
-#line 1799 "dhcp6_lexer.ll"
+#line 1807 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); }
        YY_BREAK
-case 173:
+case 174:
 YY_RULE_SETUP
-#line 1800 "dhcp6_lexer.ll"
+#line 1808 "dhcp6_lexer.ll"
 { return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); }
        YY_BREAK
-case 174:
+case 175:
 YY_RULE_SETUP
-#line 1802 "dhcp6_lexer.ll"
+#line 1810 "dhcp6_lexer.ll"
 {
     /* An integer was found. */
     std::string tmp(yytext);
@@ -4403,9 +4424,9 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp6Parser::make_INTEGER(integer, driver.loc_);
 }
        YY_BREAK
-case 175:
+case 176:
 YY_RULE_SETUP
-#line 1820 "dhcp6_lexer.ll"
+#line 1828 "dhcp6_lexer.ll"
 {
     /* A floating point was found. */
     std::string tmp(yytext);
@@ -4419,43 +4440,43 @@ YY_RULE_SETUP
     return isc::dhcp::Dhcp6Parser::make_FLOAT(fp, driver.loc_);
 }
        YY_BREAK
-case 176:
+case 177:
 YY_RULE_SETUP
-#line 1833 "dhcp6_lexer.ll"
+#line 1841 "dhcp6_lexer.ll"
 {
     string tmp(yytext);
     return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_);
 }
        YY_BREAK
-case 177:
+case 178:
 YY_RULE_SETUP
-#line 1838 "dhcp6_lexer.ll"
+#line 1846 "dhcp6_lexer.ll"
 {
    return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_);
 }
        YY_BREAK
-case 178:
+case 179:
 YY_RULE_SETUP
-#line 1842 "dhcp6_lexer.ll"
+#line 1850 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
        YY_BREAK
-case 179:
+case 180:
 YY_RULE_SETUP
-#line 1844 "dhcp6_lexer.ll"
+#line 1852 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
        YY_BREAK
-case 180:
+case 181:
 YY_RULE_SETUP
-#line 1846 "dhcp6_lexer.ll"
+#line 1854 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
        YY_BREAK
-case 181:
+case 182:
 YY_RULE_SETUP
-#line 1848 "dhcp6_lexer.ll"
+#line 1856 "dhcp6_lexer.ll"
 driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
        YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 1850 "dhcp6_lexer.ll"
+#line 1858 "dhcp6_lexer.ll"
 {
     if (driver.states_.empty()) {
         return isc::dhcp::Dhcp6Parser::make_END(driver.loc_);
@@ -4479,12 +4500,12 @@ case YY_STATE_EOF(INITIAL):
     BEGIN(DIR_EXIT);
 }
        YY_BREAK
-case 182:
+case 183:
 YY_RULE_SETUP
-#line 1873 "dhcp6_lexer.ll"
+#line 1881 "dhcp6_lexer.ll"
 ECHO;
        YY_BREAK
-#line 4487 "dhcp6_lexer.cc"
+#line 4509 "dhcp6_lexer.cc"
 
        case YY_END_OF_BUFFER:
                {
@@ -4803,7 +4824,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 >= 1489 )
+                       if ( yy_current_state >= 1505 )
                                yy_c = yy_meta[yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -4836,11 +4857,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 >= 1489 )
+               if ( yy_current_state >= 1505 )
                        yy_c = yy_meta[yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-       yy_is_jam = (yy_current_state == 1488);
+       yy_is_jam = (yy_current_state == 1504);
 
                return yy_is_jam ? 0 : yy_current_state;
 }
@@ -5589,7 +5610,7 @@ void yyfree (void * ptr )
 
 /* %ok-for-header */
 
-#line 1873 "dhcp6_lexer.ll"
+#line 1881 "dhcp6_lexer.ll"
 
 
 using namespace isc::dhcp;
index f463ef3d50ff6314ba0fa9d6c0d52784811a0c50..3a2f461158e025713c5243a84d42236b4bdd7f6e 100644 (file)
@@ -531,6 +531,14 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"config-fetch-wait-time\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::CONFIG_CONTROL:
+        return isc::dhcp::Dhcp6Parser::make_CONFIG_FETCH_WAIT_TIME(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("config-fetch-wait-time", driver.loc_);
+    }
+}
 
 \"readonly\" {
     switch(driver.ctx_) {
index 84f65315f8a8f0cd85b082a3c1741b428cf03b1a..1bd1c732721ba994c12ab0e28816a9f7296eb0c3 100644 (file)
@@ -1,4 +1,4 @@
-// File created from ../../../src/bin/dhcp6/dhcp6_messages.mes on Fri Feb 08 2019 20:33
+// File created from ../../../src/bin/dhcp6/dhcp6_messages.mes on Tue Mar 26 2019 13:41
 
 #include <cstddef>
 #include <log/message_types.h>
@@ -14,6 +14,8 @@ extern const isc::log::MessageID DHCP6_ALREADY_RUNNING = "DHCP6_ALREADY_RUNNING"
 extern const isc::log::MessageID DHCP6_BUFFER_RECEIVED = "DHCP6_BUFFER_RECEIVED";
 extern const isc::log::MessageID DHCP6_BUFFER_UNPACK = "DHCP6_BUFFER_UNPACK";
 extern const isc::log::MessageID DHCP6_BUFFER_WAIT_SIGNAL = "DHCP6_BUFFER_WAIT_SIGNAL";
+extern const isc::log::MessageID DHCP6_CB_FETCH_UPDATES_FAIL = "DHCP6_CB_FETCH_UPDATES_FAIL";
+extern const isc::log::MessageID DHCP6_CB_FETCH_UPDATES_RETRIES_EXHAUSTED = "DHCP6_CB_FETCH_UPDATES_RETRIES_EXHAUSTED";
 extern const isc::log::MessageID DHCP6_CLASS_ASSIGNED = "DHCP6_CLASS_ASSIGNED";
 extern const isc::log::MessageID DHCP6_CLASS_UNCONFIGURED = "DHCP6_CLASS_UNCONFIGURED";
 extern const isc::log::MessageID DHCP6_CLASS_UNDEFINED = "DHCP6_CLASS_UNDEFINED";
@@ -152,6 +154,8 @@ const char* values[] = {
     "DHCP6_BUFFER_RECEIVED", "received buffer from %1:%2 to %3:%4 over interface %5",
     "DHCP6_BUFFER_UNPACK", "parsing buffer received from %1 to %2 over interface %3",
     "DHCP6_BUFFER_WAIT_SIGNAL", "signal received while waiting for next packet, next waiting signal is %1",
+    "DHCP6_CB_FETCH_UPDATES_FAIL", "error on attempt to fetch configuration updates from the configuration backend(s): %1",
+    "DHCP6_CB_FETCH_UPDATES_RETRIES_EXHAUSTED", "maximum number of configuration fetch attempts: 10, has been exhausted without success",
     "DHCP6_CLASS_ASSIGNED", "%1: client packet has been assigned to the following class(es): %2",
     "DHCP6_CLASS_UNCONFIGURED", "%1: client packet belongs to an unconfigured class: %2",
     "DHCP6_CLASS_UNDEFINED", "required class %1 has no definition",
index e814d610f554acb005f58b00556bf6c4cae61001..19f22199fcd5736d399af1ac70b547a167dad557 100644 (file)
@@ -1,4 +1,4 @@
-// File created from ../../../src/bin/dhcp6/dhcp6_messages.mes on Fri Feb 08 2019 20:33
+// File created from ../../../src/bin/dhcp6/dhcp6_messages.mes on Tue Mar 26 2019 13:41
 
 #ifndef DHCP6_MESSAGES_H
 #define DHCP6_MESSAGES_H
@@ -15,6 +15,8 @@ extern const isc::log::MessageID DHCP6_ALREADY_RUNNING;
 extern const isc::log::MessageID DHCP6_BUFFER_RECEIVED;
 extern const isc::log::MessageID DHCP6_BUFFER_UNPACK;
 extern const isc::log::MessageID DHCP6_BUFFER_WAIT_SIGNAL;
+extern const isc::log::MessageID DHCP6_CB_FETCH_UPDATES_FAIL;
+extern const isc::log::MessageID DHCP6_CB_FETCH_UPDATES_RETRIES_EXHAUSTED;
 extern const isc::log::MessageID DHCP6_CLASS_ASSIGNED;
 extern const isc::log::MessageID DHCP6_CLASS_UNCONFIGURED;
 extern const isc::log::MessageID DHCP6_CLASS_UNDEFINED;
index 9079efb09ef79eeff3678c74c1f0c2822eae9644..964f4bfff4f63e4015fb7792b3092c5a9c0dd26a 100644 (file)
@@ -74,6 +74,20 @@ has no definition.
 This debug message informs that a class was listed for required evaluation but
 its definition does not include a test expression to evaluate.
 
+% DHCP6_CB_FETCH_UPDATES_FAIL error on attempt to fetch configuration updates from the configuration backend(s): %1
+This error message is issued when the server attempted to fetch
+configuration updates from the database and this attempt failed.
+The server will re-try according to the configured value of the
+config-fetch-wait-time parameter. The sole argument contains the
+reason for failure.
+
+% DHCP6_CB_FETCH_UPDATES_RETRIES_EXHAUSTED maximum number of configuration fetch attempts: 10, has been exhausted without success
+This error indicates that the server has made a number of unsuccessful
+attempts to fetch configuration updates from a configuration backend.
+The server will continue to operate but won't make any further attempts
+to fetch configuration updates. The administrator must fix the configuration
+in the database and reload (or restart) the server.
+
 % DHCP6_COMMAND_RECEIVED received command %1, arguments: %2
 A debug message listing the command (and possible arguments) received
 from the Kea control system by the IPv6 DHCP server.
index 5a0f7ace1035cea939c801bd6d5758b35a3e01d5..4b9143ad979d68e5e69dad66c10ee112a65ffda1 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.3.2.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Skeleton implementation for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 
 
 // Unqualified %code blocks.
-#line 34 "dhcp6_parser.yy" // lalr1.cc:435
+#line 34 "dhcp6_parser.yy" // lalr1.cc:438
 
 #include <dhcp6/parser_context.h>
 
-#line 51 "dhcp6_parser.cc" // lalr1.cc:435
+#line 51 "dhcp6_parser.cc" // lalr1.cc:438
 
 
 #ifndef YY_
@@ -88,7 +88,7 @@
         {                                                               \
           (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end;      \
         }                                                               \
-    while (false)
+    while (/*CONSTCOND*/ false)
 # endif
 
 
 #define YYERROR         goto yyerrorlab
 #define YYRECOVERING()  (!!yyerrstatus_)
 
-#line 14 "dhcp6_parser.yy" // lalr1.cc:510
+#line 14 "dhcp6_parser.yy" // lalr1.cc:513
 namespace isc { namespace dhcp {
-#line 146 "dhcp6_parser.cc" // lalr1.cc:510
+#line 146 "dhcp6_parser.cc" // lalr1.cc:513
 
   /* Return YYSTR after stripping away unnecessary quotes and
      backslashes, so that it's suitable for yyerror.  The heuristic is
@@ -154,7 +154,7 @@ namespace isc { namespace dhcp {
   {
     if (*yystr == '"')
       {
-        std::string yyr;
+        std::string yyr = "";
         char const *yyp = yystr;
 
         for (;;)
@@ -167,10 +167,7 @@ namespace isc { namespace dhcp {
             case '\\':
               if (*++yyp != '\\')
                 goto do_not_strip_quotes;
-              else
-                goto append;
-
-            append:
+              // Fall through.
             default:
               yyr += *yyp;
               break;
@@ -198,8 +195,6 @@ namespace isc { namespace dhcp {
   Dhcp6Parser::~Dhcp6Parser ()
   {}
 
-  Dhcp6Parser::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW
-  {}
 
   /*---------------.
   | Symbol types.  |
@@ -208,16 +203,16 @@ namespace isc { namespace dhcp {
 
 
   // by_state.
-  Dhcp6Parser::by_state::by_state () YY_NOEXCEPT
+  Dhcp6Parser::by_state::by_state ()
     : state (empty_state)
   {}
 
-  Dhcp6Parser::by_state::by_state (const by_state& that) YY_NOEXCEPT
-    : state (that.state)
+  Dhcp6Parser::by_state::by_state (const by_state& other)
+    : state (other.state)
   {}
 
   void
-  Dhcp6Parser::by_state::clear () YY_NOEXCEPT
+  Dhcp6Parser::by_state::clear ()
   {
     state = empty_state;
   }
@@ -229,12 +224,12 @@ namespace isc { namespace dhcp {
     that.clear ();
   }
 
-  Dhcp6Parser::by_state::by_state (state_type s) YY_NOEXCEPT
+  Dhcp6Parser::by_state::by_state (state_type s)
     : state (s)
   {}
 
   Dhcp6Parser::symbol_number_type
-  Dhcp6Parser::by_state::type_get () const YY_NOEXCEPT
+  Dhcp6Parser::by_state::type_get () const
   {
     if (state == empty_state)
       return empty_symbol;
@@ -250,29 +245,29 @@ namespace isc { namespace dhcp {
   {
     switch (that.type_get ())
     {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
+      case 195: // value
+      case 199: // map_value
+      case 253: // db_type
+      case 346: // hr_mode
+      case 482: // duid_type
+      case 517: // ncr_protocol_value
+      case 524: // replace_client_name_value
         value.YY_MOVE_OR_COPY< ElementPtr > (YY_MOVE (that.value));
         break;
 
-      case 176: // "boolean"
+      case 177: // "boolean"
         value.YY_MOVE_OR_COPY< bool > (YY_MOVE (that.value));
         break;
 
-      case 175: // "floating point"
+      case 176: // "floating point"
         value.YY_MOVE_OR_COPY< double > (YY_MOVE (that.value));
         break;
 
-      case 174: // "integer"
+      case 175: // "integer"
         value.YY_MOVE_OR_COPY< int64_t > (YY_MOVE (that.value));
         break;
 
-      case 173: // "constant string"
+      case 174: // "constant string"
         value.YY_MOVE_OR_COPY< std::string > (YY_MOVE (that.value));
         break;
 
@@ -280,7 +275,7 @@ namespace isc { namespace dhcp {
         break;
     }
 
-#if 201103L <= YY_CPLUSPLUS
+#if defined __cplusplus && 201103L <= __cplusplus
     // that is emptied.
     that.state = empty_state;
 #endif
@@ -291,29 +286,29 @@ namespace isc { namespace dhcp {
   {
     switch (that.type_get ())
     {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
+      case 195: // value
+      case 199: // map_value
+      case 253: // db_type
+      case 346: // hr_mode
+      case 482: // duid_type
+      case 517: // ncr_protocol_value
+      case 524: // replace_client_name_value
         value.move< ElementPtr > (YY_MOVE (that.value));
         break;
 
-      case 176: // "boolean"
+      case 177: // "boolean"
         value.move< bool > (YY_MOVE (that.value));
         break;
 
-      case 175: // "floating point"
+      case 176: // "floating point"
         value.move< double > (YY_MOVE (that.value));
         break;
 
-      case 174: // "integer"
+      case 175: // "integer"
         value.move< int64_t > (YY_MOVE (that.value));
         break;
 
-      case 173: // "constant string"
+      case 174: // "constant string"
         value.move< std::string > (YY_MOVE (that.value));
         break;
 
@@ -325,36 +320,36 @@ namespace isc { namespace dhcp {
     that.type = empty_symbol;
   }
 
-#if YY_CPLUSPLUS < 201103L
+#if !defined __cplusplus || __cplusplus < 201103L
   Dhcp6Parser::stack_symbol_type&
   Dhcp6Parser::stack_symbol_type::operator= (stack_symbol_type& that)
   {
     state = that.state;
     switch (that.type_get ())
     {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
+      case 195: // value
+      case 199: // map_value
+      case 253: // db_type
+      case 346: // hr_mode
+      case 482: // duid_type
+      case 517: // ncr_protocol_value
+      case 524: // replace_client_name_value
         value.move< ElementPtr > (that.value);
         break;
 
-      case 176: // "boolean"
+      case 177: // "boolean"
         value.move< bool > (that.value);
         break;
 
-      case 175: // "floating point"
+      case 176: // "floating point"
         value.move< double > (that.value);
         break;
 
-      case 174: // "integer"
+      case 175: // "integer"
         value.move< int64_t > (that.value);
         break;
 
-      case 173: // "constant string"
+      case 174: // "constant string"
         value.move< std::string > (that.value);
         break;
 
@@ -386,83 +381,93 @@ namespace isc { namespace dhcp {
     std::ostream& yyoutput = yyo;
     YYUSE (yyoutput);
     symbol_number_type yytype = yysym.type_get ();
-#if defined __GNUC__ && ! defined __clang__ && ! defined __ICC && __GNUC__ * 100 + __GNUC_MINOR__ <= 408
     // Avoid a (spurious) G++ 4.8 warning about "array subscript is
     // below array bounds".
     if (yysym.empty ())
       std::abort ();
-#endif
     yyo << (yytype < yyntokens_ ? "token" : "nterm")
         << ' ' << yytname_[yytype] << " ("
         << yysym.location << ": ";
     switch (yytype)
     {
-      case 173: // "constant string"
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < std::string > (); }
-#line 404 "dhcp6_parser.cc" // lalr1.cc:676
+            case 174: // "constant string"
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< std::string > (); }
+#line 398 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 174: // "integer"
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < int64_t > (); }
-#line 410 "dhcp6_parser.cc" // lalr1.cc:676
+      case 175: // "integer"
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< int64_t > (); }
+#line 405 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 175: // "floating point"
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < double > (); }
-#line 416 "dhcp6_parser.cc" // lalr1.cc:676
+      case 176: // "floating point"
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< double > (); }
+#line 412 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 176: // "boolean"
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < bool > (); }
-#line 422 "dhcp6_parser.cc" // lalr1.cc:676
+      case 177: // "boolean"
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< bool > (); }
+#line 419 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 194: // value
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 428 "dhcp6_parser.cc" // lalr1.cc:676
+      case 195: // value
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 426 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 198: // map_value
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 434 "dhcp6_parser.cc" // lalr1.cc:676
+      case 199: // map_value
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 433 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 252: // db_type
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 440 "dhcp6_parser.cc" // lalr1.cc:676
+      case 253: // db_type
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 440 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 345: // hr_mode
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 446 "dhcp6_parser.cc" // lalr1.cc:676
+      case 346: // hr_mode
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 447 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 481: // duid_type
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 452 "dhcp6_parser.cc" // lalr1.cc:676
+      case 482: // duid_type
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 454 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 516: // ncr_protocol_value
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 458 "dhcp6_parser.cc" // lalr1.cc:676
+      case 517: // ncr_protocol_value
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 461 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
-      case 523: // replace_client_name_value
-#line 251 "dhcp6_parser.yy" // lalr1.cc:676
-        { yyoutput << yysym.value.template as < ElementPtr > (); }
-#line 464 "dhcp6_parser.cc" // lalr1.cc:676
+      case 524: // replace_client_name_value
+
+#line 253 "dhcp6_parser.yy" // lalr1.cc:672
+        { yyoutput << yysym.value.template as< ElementPtr > (); }
+#line 468 "dhcp6_parser.cc" // lalr1.cc:672
         break;
 
+
       default:
         break;
     }
@@ -481,7 +486,7 @@ namespace isc { namespace dhcp {
   void
   Dhcp6Parser::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym)
   {
-#if 201103L <= YY_CPLUSPLUS
+#if defined __cplusplus && 201103L <= __cplusplus
     yypush_ (m, stack_symbol_type (s, std::move (sym)));
 #else
     stack_symbol_type ss (s, sym);
@@ -585,22 +590,17 @@ namespace isc { namespace dhcp {
     yystack_.clear ();
     yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla));
 
-  /*-----------------------------------------------.
-  | yynewstate -- push a new symbol on the stack.  |
-  `-----------------------------------------------*/
+    // A new symbol was pushed on the stack.
   yynewstate:
     YYCDEBUG << "Entering state " << yystack_[0].state << '\n';
 
     // Accept?
     if (yystack_[0].state == yyfinal_)
-      YYACCEPT;
+      goto yyacceptlab;
 
     goto yybackup;
 
-
-  /*-----------.
-  | yybackup.  |
-  `-----------*/
+    // Backup.
   yybackup:
     // Try to take a decision without lookahead.
     yyn = yypact_[yystack_[0].state];
@@ -621,7 +621,6 @@ namespace isc { namespace dhcp {
 #if YY_EXCEPTIONS
         catch (const syntax_error& yyexc)
           {
-            YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
             error (yyexc);
             goto yyerrlab1;
           }
@@ -653,7 +652,6 @@ namespace isc { namespace dhcp {
     yypush_ ("Shifting", yyn, YY_MOVE (yyla));
     goto yynewstate;
 
-
   /*-----------------------------------------------------------.
   | yydefault -- do the default action for the current state.  |
   `-----------------------------------------------------------*/
@@ -663,9 +661,8 @@ namespace isc { namespace dhcp {
       goto yyerrlab;
     goto yyreduce;
 
-
   /*-----------------------------.
-  | yyreduce -- do a reduction.  |
+  | yyreduce -- Do a reduction.  |
   `-----------------------------*/
   yyreduce:
     yylen = yyr2_[yyn];
@@ -677,29 +674,29 @@ namespace isc { namespace dhcp {
          when using variants.  */
       switch (yyr1_[yyn])
     {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
+      case 195: // value
+      case 199: // map_value
+      case 253: // db_type
+      case 346: // hr_mode
+      case 482: // duid_type
+      case 517: // ncr_protocol_value
+      case 524: // replace_client_name_value
         yylhs.value.emplace< ElementPtr > ();
         break;
 
-      case 176: // "boolean"
+      case 177: // "boolean"
         yylhs.value.emplace< bool > ();
         break;
 
-      case 175: // "floating point"
+      case 176: // "floating point"
         yylhs.value.emplace< double > ();
         break;
 
-      case 174: // "integer"
+      case 175: // "integer"
         yylhs.value.emplace< int64_t > ();
         break;
 
-      case 173: // "constant string"
+      case 174: // "constant string"
         yylhs.value.emplace< std::string > ();
         break;
 
@@ -710,8 +707,8 @@ namespace isc { namespace dhcp {
 
       // Default location.
       {
-        stack_type::slice range (yystack_, yylen);
-        YYLLOC_DEFAULT (yylhs.location, range, yylen);
+        slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
+        YYLLOC_DEFAULT (yylhs.location, slice, yylen);
         yyerror_range[1].location = yylhs.location;
       }
 
@@ -724,286 +721,286 @@ namespace isc { namespace dhcp {
           switch (yyn)
             {
   case 2:
-#line 260 "dhcp6_parser.yy" // lalr1.cc:919
+#line 262 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.NO_KEYWORD; }
-#line 730 "dhcp6_parser.cc" // lalr1.cc:919
+#line 727 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 4:
-#line 261 "dhcp6_parser.yy" // lalr1.cc:919
+#line 263 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.CONFIG; }
-#line 736 "dhcp6_parser.cc" // lalr1.cc:919
+#line 733 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 6:
-#line 262 "dhcp6_parser.yy" // lalr1.cc:919
+#line 264 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.DHCP6; }
-#line 742 "dhcp6_parser.cc" // lalr1.cc:919
+#line 739 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 8:
-#line 263 "dhcp6_parser.yy" // lalr1.cc:919
+#line 265 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.INTERFACES_CONFIG; }
-#line 748 "dhcp6_parser.cc" // lalr1.cc:919
+#line 745 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 10:
-#line 264 "dhcp6_parser.yy" // lalr1.cc:919
+#line 266 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.SUBNET6; }
-#line 754 "dhcp6_parser.cc" // lalr1.cc:919
+#line 751 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 12:
-#line 265 "dhcp6_parser.yy" // lalr1.cc:919
+#line 267 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.POOLS; }
-#line 760 "dhcp6_parser.cc" // lalr1.cc:919
+#line 757 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 14:
-#line 266 "dhcp6_parser.yy" // lalr1.cc:919
+#line 268 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.PD_POOLS; }
-#line 766 "dhcp6_parser.cc" // lalr1.cc:919
+#line 763 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 16:
-#line 267 "dhcp6_parser.yy" // lalr1.cc:919
+#line 269 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.RESERVATIONS; }
-#line 772 "dhcp6_parser.cc" // lalr1.cc:919
+#line 769 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 18:
-#line 268 "dhcp6_parser.yy" // lalr1.cc:919
+#line 270 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.DHCP6; }
-#line 778 "dhcp6_parser.cc" // lalr1.cc:919
+#line 775 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 20:
-#line 269 "dhcp6_parser.yy" // lalr1.cc:919
+#line 271 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.OPTION_DEF; }
-#line 784 "dhcp6_parser.cc" // lalr1.cc:919
+#line 781 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 22:
-#line 270 "dhcp6_parser.yy" // lalr1.cc:919
+#line 272 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.OPTION_DATA; }
-#line 790 "dhcp6_parser.cc" // lalr1.cc:919
+#line 787 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 24:
-#line 271 "dhcp6_parser.yy" // lalr1.cc:919
+#line 273 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.HOOKS_LIBRARIES; }
-#line 796 "dhcp6_parser.cc" // lalr1.cc:919
+#line 793 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 26:
-#line 272 "dhcp6_parser.yy" // lalr1.cc:919
+#line 274 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.DHCP_DDNS; }
-#line 802 "dhcp6_parser.cc" // lalr1.cc:919
+#line 799 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 28:
-#line 273 "dhcp6_parser.yy" // lalr1.cc:919
+#line 275 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.LOGGING; }
-#line 808 "dhcp6_parser.cc" // lalr1.cc:919
+#line 805 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 30:
-#line 274 "dhcp6_parser.yy" // lalr1.cc:919
+#line 276 "dhcp6_parser.yy" // lalr1.cc:907
     { ctx.ctx_ = ctx.CONFIG_CONTROL; }
-#line 814 "dhcp6_parser.cc" // lalr1.cc:919
+#line 811 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 32:
-#line 282 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location))); }
-#line 820 "dhcp6_parser.cc" // lalr1.cc:919
+#line 284 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location))); }
+#line 817 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 33:
-#line 283 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as < double > (), ctx.loc2pos(yystack_[0].location))); }
-#line 826 "dhcp6_parser.cc" // lalr1.cc:919
+#line 285 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new DoubleElement(yystack_[0].value.as< double > (), ctx.loc2pos(yystack_[0].location))); }
+#line 823 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 34:
-#line 284 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location))); }
-#line 832 "dhcp6_parser.cc" // lalr1.cc:919
+#line 286 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location))); }
+#line 829 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 35:
-#line 285 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location))); }
-#line 838 "dhcp6_parser.cc" // lalr1.cc:919
+#line 287 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location))); }
+#line 835 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 36:
-#line 286 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
-#line 844 "dhcp6_parser.cc" // lalr1.cc:919
+#line 288 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new NullElement(ctx.loc2pos(yystack_[0].location))); }
+#line 841 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 37:
-#line 287 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 850 "dhcp6_parser.cc" // lalr1.cc:919
+#line 289 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 847 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 38:
-#line 288 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 856 "dhcp6_parser.cc" // lalr1.cc:919
+#line 290 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 853 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 39:
-#line 291 "dhcp6_parser.yy" // lalr1.cc:919
+#line 293 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Push back the JSON value on the stack
-    ctx.stack_.push_back(yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.push_back(yystack_[0].value.as< ElementPtr > ());
 }
-#line 865 "dhcp6_parser.cc" // lalr1.cc:919
+#line 862 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 40:
-#line 296 "dhcp6_parser.yy" // lalr1.cc:919
+#line 298 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 876 "dhcp6_parser.cc" // lalr1.cc:919
+#line 873 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 41:
-#line 301 "dhcp6_parser.yy" // lalr1.cc:919
+#line 303 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
     // for it.
 }
-#line 886 "dhcp6_parser.cc" // lalr1.cc:919
+#line 883 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 42:
-#line 307 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
-#line 892 "dhcp6_parser.cc" // lalr1.cc:919
+#line 309 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ctx.stack_.back(); ctx.stack_.pop_back(); }
+#line 889 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 45:
-#line 314 "dhcp6_parser.yy" // lalr1.cc:919
+#line 316 "dhcp6_parser.yy" // lalr1.cc:907
     {
                   // map containing a single entry
-                  ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 901 "dhcp6_parser.cc" // lalr1.cc:919
+#line 898 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 46:
-#line 318 "dhcp6_parser.yy" // lalr1.cc:919
+#line 320 "dhcp6_parser.yy" // lalr1.cc:907
     {
                   // map consisting of a shorter map followed by
                   // comma and string:value
-                  ctx.stack_.back()->set(yystack_[2].value.as < std::string > (), yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->set(yystack_[2].value.as< std::string > (), yystack_[0].value.as< ElementPtr > ());
                   }
-#line 911 "dhcp6_parser.cc" // lalr1.cc:919
+#line 908 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 47:
-#line 325 "dhcp6_parser.yy" // lalr1.cc:919
+#line 327 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(l);
 }
-#line 920 "dhcp6_parser.cc" // lalr1.cc:919
+#line 917 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 48:
-#line 328 "dhcp6_parser.yy" // lalr1.cc:919
+#line 330 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // list parsing complete. Put any sanity checking here
 }
-#line 928 "dhcp6_parser.cc" // lalr1.cc:919
+#line 925 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 51:
-#line 336 "dhcp6_parser.yy" // lalr1.cc:919
+#line 338 "dhcp6_parser.yy" // lalr1.cc:907
     {
                   // List consisting of a single element.
-                  ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 937 "dhcp6_parser.cc" // lalr1.cc:919
+#line 934 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 52:
-#line 340 "dhcp6_parser.yy" // lalr1.cc:919
+#line 342 "dhcp6_parser.yy" // lalr1.cc:907
     {
                   // List ending with , and a value.
-                  ctx.stack_.back()->add(yystack_[0].value.as < ElementPtr > ());
+                  ctx.stack_.back()->add(yystack_[0].value.as< ElementPtr > ());
                   }
-#line 946 "dhcp6_parser.cc" // lalr1.cc:919
+#line 943 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 53:
-#line 347 "dhcp6_parser.yy" // lalr1.cc:919
+#line 349 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // List parsing about to start
 }
-#line 954 "dhcp6_parser.cc" // lalr1.cc:919
+#line 951 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 54:
-#line 349 "dhcp6_parser.yy" // lalr1.cc:919
+#line 351 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // list parsing complete. Put any sanity checking here
     //ctx.stack_.pop_back();
 }
-#line 963 "dhcp6_parser.cc" // lalr1.cc:919
+#line 960 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 57:
-#line 358 "dhcp6_parser.yy" // lalr1.cc:919
+#line 360 "dhcp6_parser.yy" // lalr1.cc:907
     {
-                          ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+                          ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
                           ctx.stack_.back()->add(s);
                           }
-#line 972 "dhcp6_parser.cc" // lalr1.cc:919
+#line 969 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 58:
-#line 362 "dhcp6_parser.yy" // lalr1.cc:919
+#line 364 "dhcp6_parser.yy" // lalr1.cc:907
     {
-                          ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+                          ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
                           ctx.stack_.back()->add(s);
                           }
-#line 981 "dhcp6_parser.cc" // lalr1.cc:919
+#line 978 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 59:
-#line 373 "dhcp6_parser.yy" // lalr1.cc:919
+#line 375 "dhcp6_parser.yy" // lalr1.cc:907
     {
     const std::string& where = ctx.contextName();
-    const std::string& keyword = yystack_[1].value.as < std::string > ();
+    const std::string& keyword = yystack_[1].value.as< std::string > ();
     error(yystack_[1].location,
           "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
 }
-#line 992 "dhcp6_parser.cc" // lalr1.cc:919
+#line 989 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 60:
-#line 383 "dhcp6_parser.yy" // lalr1.cc:919
+#line 385 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // This code is executed when we're about to start parsing
     // the content of the map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1003 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1000 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 61:
-#line 388 "dhcp6_parser.yy" // lalr1.cc:919
+#line 390 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // map parsing completed. If we ever want to do any wrap up
     // (maybe some sanity checking), this would be the best place
@@ -1012,11 +1009,11 @@ namespace isc { namespace dhcp {
     // Dhcp6 is required
     ctx.require("Dhcp6", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 }
-#line 1016 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1013 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 70:
-#line 411 "dhcp6_parser.yy" // lalr1.cc:919
+#line 413 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // This code is executed when we're about to start parsing
     // the content of the map
@@ -1025,893 +1022,893 @@ namespace isc { namespace dhcp {
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCP6);
 }
-#line 1029 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1026 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 71:
-#line 418 "dhcp6_parser.yy" // lalr1.cc:919
+#line 420 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // No global parameter is required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1039 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1036 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 72:
-#line 426 "dhcp6_parser.yy" // lalr1.cc:919
+#line 428 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the Dhcp6 map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1049 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1046 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 73:
-#line 430 "dhcp6_parser.yy" // lalr1.cc:919
+#line 432 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // No global parameter is required
     // parsing completed
 }
-#line 1058 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1055 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 109:
-#line 476 "dhcp6_parser.yy" // lalr1.cc:919
+#line 478 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1066 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1063 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 110:
-#line 478 "dhcp6_parser.yy" // lalr1.cc:919
+#line 480 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr datadir(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr datadir(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("data-directory", datadir);
     ctx.leave();
 }
-#line 1076 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1073 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 111:
-#line 484 "dhcp6_parser.yy" // lalr1.cc:919
+#line 486 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("preferred-lifetime", prf);
 }
-#line 1085 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1082 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 112:
-#line 489 "dhcp6_parser.yy" // lalr1.cc:919
+#line 491 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("valid-lifetime", prf);
 }
-#line 1094 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1091 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 113:
-#line 494 "dhcp6_parser.yy" // lalr1.cc:919
+#line 496 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("renew-timer", prf);
 }
-#line 1103 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1100 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 114:
-#line 499 "dhcp6_parser.yy" // lalr1.cc:919
+#line 501 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rebind-timer", prf);
 }
-#line 1112 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1109 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 115:
-#line 504 "dhcp6_parser.yy" // lalr1.cc:919
+#line 506 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr dpp(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr dpp(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("decline-probation-period", dpp);
 }
-#line 1121 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1118 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 116:
-#line 509 "dhcp6_parser.yy" // lalr1.cc:919
+#line 511 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1129 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1126 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 117:
-#line 511 "dhcp6_parser.yy" // lalr1.cc:919
+#line 513 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr stag(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr stag(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-tag", stag);
     ctx.leave();
 }
-#line 1139 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1136 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 118:
-#line 517 "dhcp6_parser.yy" // lalr1.cc:919
+#line 519 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces-config", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.INTERFACES_CONFIG);
 }
-#line 1150 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1147 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 119:
-#line 522 "dhcp6_parser.yy" // lalr1.cc:919
+#line 524 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // No interfaces config param is required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1160 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1157 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 120:
-#line 528 "dhcp6_parser.yy" // lalr1.cc:919
+#line 530 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the interfaces-config map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1170 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1167 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 121:
-#line 532 "dhcp6_parser.yy" // lalr1.cc:919
+#line 534 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // No interfaces config param is required
     // parsing completed
 }
-#line 1179 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1176 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 129:
-#line 548 "dhcp6_parser.yy" // lalr1.cc:919
+#line 550 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interfaces", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1190 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1187 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 130:
-#line 553 "dhcp6_parser.yy" // lalr1.cc:919
+#line 555 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1199 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1196 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 131:
-#line 558 "dhcp6_parser.yy" // lalr1.cc:919
+#line 560 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("re-detect", b);
 }
-#line 1208 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1205 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 132:
-#line 564 "dhcp6_parser.yy" // lalr1.cc:919
+#line 566 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lease-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.LEASE_DATABASE);
 }
-#line 1219 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1216 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 133:
-#line 569 "dhcp6_parser.yy" // lalr1.cc:919
+#line 571 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The type parameter is required
     ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1230 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1227 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 134:
-#line 576 "dhcp6_parser.yy" // lalr1.cc:919
+#line 578 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hosts-database", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.HOSTS_DATABASE);
 }
-#line 1241 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1238 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 135:
-#line 581 "dhcp6_parser.yy" // lalr1.cc:919
+#line 583 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The type parameter is required
     ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1252 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1249 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 136:
-#line 588 "dhcp6_parser.yy" // lalr1.cc:919
+#line 590 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hosts-databases", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOSTS_DATABASE);
 }
-#line 1263 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1260 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 137:
-#line 593 "dhcp6_parser.yy" // lalr1.cc:919
+#line 595 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1272 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1269 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 142:
-#line 606 "dhcp6_parser.yy" // lalr1.cc:919
+#line 608 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1282 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1279 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 143:
-#line 610 "dhcp6_parser.yy" // lalr1.cc:919
+#line 612 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The type parameter is required
     ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 1292 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1289 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 166:
-#line 642 "dhcp6_parser.yy" // lalr1.cc:919
+#line 644 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.DATABASE_TYPE);
 }
-#line 1300 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1297 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 167:
-#line 644 "dhcp6_parser.yy" // lalr1.cc:919
+#line 646 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("type", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1309 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1306 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 168:
-#line 649 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); }
-#line 1315 "dhcp6_parser.cc" // lalr1.cc:919
+#line 651 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("memfile", ctx.loc2pos(yystack_[0].location))); }
+#line 1312 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 169:
-#line 650 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); }
-#line 1321 "dhcp6_parser.cc" // lalr1.cc:919
+#line 652 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("mysql", ctx.loc2pos(yystack_[0].location))); }
+#line 1318 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 170:
-#line 651 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); }
-#line 1327 "dhcp6_parser.cc" // lalr1.cc:919
+#line 653 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("postgresql", ctx.loc2pos(yystack_[0].location))); }
+#line 1324 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 171:
-#line 652 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); }
-#line 1333 "dhcp6_parser.cc" // lalr1.cc:919
+#line 654 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("cql", ctx.loc2pos(yystack_[0].location))); }
+#line 1330 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 172:
-#line 655 "dhcp6_parser.yy" // lalr1.cc:919
+#line 657 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1341 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1338 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 173:
-#line 657 "dhcp6_parser.yy" // lalr1.cc:919
+#line 659 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("user", user);
     ctx.leave();
 }
-#line 1351 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1348 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 174:
-#line 663 "dhcp6_parser.yy" // lalr1.cc:919
+#line 665 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1359 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1356 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 175:
-#line 665 "dhcp6_parser.yy" // lalr1.cc:919
+#line 667 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr pwd(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr pwd(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("password", pwd);
     ctx.leave();
 }
-#line 1369 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1366 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 176:
-#line 671 "dhcp6_parser.yy" // lalr1.cc:919
+#line 673 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1377 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1374 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 177:
-#line 673 "dhcp6_parser.yy" // lalr1.cc:919
+#line 675 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr h(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr h(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host", h);
     ctx.leave();
 }
-#line 1387 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1384 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 178:
-#line 679 "dhcp6_parser.yy" // lalr1.cc:919
+#line 681 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr p(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr p(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("port", p);
 }
-#line 1396 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1393 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 179:
-#line 684 "dhcp6_parser.yy" // lalr1.cc:919
+#line 686 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1404 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1401 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 180:
-#line 686 "dhcp6_parser.yy" // lalr1.cc:919
+#line 688 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr name(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("name", name);
     ctx.leave();
 }
-#line 1414 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1411 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 181:
-#line 692 "dhcp6_parser.yy" // lalr1.cc:919
+#line 694 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("persist", n);
 }
-#line 1423 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1420 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 182:
-#line 697 "dhcp6_parser.yy" // lalr1.cc:919
+#line 699 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("lfc-interval", n);
 }
-#line 1432 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1429 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 183:
-#line 702 "dhcp6_parser.yy" // lalr1.cc:919
+#line 704 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("readonly", n);
 }
-#line 1441 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1438 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 184:
-#line 707 "dhcp6_parser.yy" // lalr1.cc:919
+#line 709 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("connect-timeout", n);
 }
-#line 1450 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1447 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 185:
-#line 712 "dhcp6_parser.yy" // lalr1.cc:919
+#line 714 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reconnect-wait-time", n);
 }
-#line 1459 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1456 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 186:
-#line 717 "dhcp6_parser.yy" // lalr1.cc:919
+#line 719 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("request-timeout", n);
 }
-#line 1468 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1465 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 187:
-#line 722 "dhcp6_parser.yy" // lalr1.cc:919
+#line 724 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("tcp-keepalive", n);
 }
-#line 1477 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1474 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 188:
-#line 727 "dhcp6_parser.yy" // lalr1.cc:919
+#line 729 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("tcp-nodelay", n);
 }
-#line 1486 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1483 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 189:
-#line 732 "dhcp6_parser.yy" // lalr1.cc:919
+#line 734 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1494 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1491 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 190:
-#line 734 "dhcp6_parser.yy" // lalr1.cc:919
+#line 736 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr cp(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr cp(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("contact-points", cp);
     ctx.leave();
 }
-#line 1504 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1501 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 191:
-#line 740 "dhcp6_parser.yy" // lalr1.cc:919
+#line 742 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr n(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr n(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-reconnect-tries", n);
 }
-#line 1513 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1510 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 192:
-#line 745 "dhcp6_parser.yy" // lalr1.cc:919
+#line 747 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1521 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1518 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 193:
-#line 747 "dhcp6_parser.yy" // lalr1.cc:919
+#line 749 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr ks(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr ks(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("keyspace", ks);
     ctx.leave();
 }
-#line 1531 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1528 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 194:
-#line 753 "dhcp6_parser.yy" // lalr1.cc:919
+#line 755 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1539 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1536 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 195:
-#line 755 "dhcp6_parser.yy" // lalr1.cc:919
+#line 757 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr c(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr c(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("consistency", c);
     ctx.leave();
 }
-#line 1549 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1546 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 196:
-#line 761 "dhcp6_parser.yy" // lalr1.cc:919
+#line 763 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1557 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1554 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 197:
-#line 763 "dhcp6_parser.yy" // lalr1.cc:919
+#line 765 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr c(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr c(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("serial-consistency", c);
     ctx.leave();
 }
-#line 1567 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1564 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 198:
-#line 769 "dhcp6_parser.yy" // lalr1.cc:919
+#line 771 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sanity-checks", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SANITY_CHECKS);
 }
-#line 1578 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1575 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 199:
-#line 774 "dhcp6_parser.yy" // lalr1.cc:919
+#line 776 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1587 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1584 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 203:
-#line 784 "dhcp6_parser.yy" // lalr1.cc:919
+#line 786 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1595 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1592 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 204:
-#line 786 "dhcp6_parser.yy" // lalr1.cc:919
+#line 788 "dhcp6_parser.yy" // lalr1.cc:907
     {
 
-    if ( (string(yystack_[0].value.as < std::string > ()) == "none") ||
-         (string(yystack_[0].value.as < std::string > ()) == "warn") ||
-         (string(yystack_[0].value.as < std::string > ()) == "fix") ||
-         (string(yystack_[0].value.as < std::string > ()) == "fix-del") ||
-         (string(yystack_[0].value.as < std::string > ()) == "del")) {
-        ElementPtr user(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    if ( (string(yystack_[0].value.as< std::string > ()) == "none") ||
+         (string(yystack_[0].value.as< std::string > ()) == "warn") ||
+         (string(yystack_[0].value.as< std::string > ()) == "fix") ||
+         (string(yystack_[0].value.as< std::string > ()) == "fix-del") ||
+         (string(yystack_[0].value.as< std::string > ()) == "del")) {
+        ElementPtr user(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
         ctx.stack_.back()->set("lease-checks", user);
         ctx.leave();
     } else {
-        error(yystack_[0].location, "Unsupported 'lease-checks value: " + string(yystack_[0].value.as < std::string > ()) +
+        error(yystack_[0].location, "Unsupported 'lease-checks value: " + string(yystack_[0].value.as< std::string > ()) +
               ", supported values are: none, warn, fix, fix-del, del");
     }
 }
-#line 1615 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1612 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 205:
-#line 802 "dhcp6_parser.yy" // lalr1.cc:919
+#line 804 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("mac-sources", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.MAC_SOURCES);
 }
-#line 1626 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1623 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 206:
-#line 807 "dhcp6_parser.yy" // lalr1.cc:919
+#line 809 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1635 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1632 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 211:
-#line 820 "dhcp6_parser.yy" // lalr1.cc:919
+#line 822 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr duid(new StringElement("duid", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(duid);
 }
-#line 1644 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1641 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 212:
-#line 825 "dhcp6_parser.yy" // lalr1.cc:919
+#line 827 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr duid(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr duid(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(duid);
 }
-#line 1653 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1650 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 213:
-#line 830 "dhcp6_parser.yy" // lalr1.cc:919
+#line 832 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("host-reservation-identifiers", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS);
 }
-#line 1664 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1661 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 214:
-#line 835 "dhcp6_parser.yy" // lalr1.cc:919
+#line 837 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1673 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1670 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 220:
-#line 849 "dhcp6_parser.yy" // lalr1.cc:919
+#line 851 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(hwaddr);
 }
-#line 1682 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1679 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 221:
-#line 854 "dhcp6_parser.yy" // lalr1.cc:919
+#line 856 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr flex_id(new StringElement("flex-id", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(flex_id);
 }
-#line 1691 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1688 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 222:
-#line 861 "dhcp6_parser.yy" // lalr1.cc:919
+#line 863 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("relay-supplied-options", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1702 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1699 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 223:
-#line 866 "dhcp6_parser.yy" // lalr1.cc:919
+#line 868 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1711 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1708 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 224:
-#line 871 "dhcp6_parser.yy" // lalr1.cc:919
+#line 873 "dhcp6_parser.yy" // lalr1.cc:907
     {
     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 1722 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1719 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 225:
-#line 876 "dhcp6_parser.yy" // lalr1.cc:919
+#line 878 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1731 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1728 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 230:
-#line 889 "dhcp6_parser.yy" // lalr1.cc:919
+#line 891 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1741 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1738 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 231:
-#line 893 "dhcp6_parser.yy" // lalr1.cc:919
+#line 895 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The library hooks parameter is required
     ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 1751 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1748 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 232:
-#line 899 "dhcp6_parser.yy" // lalr1.cc:919
+#line 901 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the hooks-libraries list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1761 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1758 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 233:
-#line 903 "dhcp6_parser.yy" // lalr1.cc:919
+#line 905 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The library hooks parameter is required
     ctx.require("library", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 1771 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1768 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 239:
-#line 918 "dhcp6_parser.yy" // lalr1.cc:919
+#line 920 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1779 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1776 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 240:
-#line 920 "dhcp6_parser.yy" // lalr1.cc:919
+#line 922 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr lib(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr lib(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("library", lib);
     ctx.leave();
 }
-#line 1789 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1786 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 241:
-#line 926 "dhcp6_parser.yy" // lalr1.cc:919
+#line 928 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1797 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1794 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 242:
-#line 928 "dhcp6_parser.yy" // lalr1.cc:919
+#line 930 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("parameters", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("parameters", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 1806 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1803 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 243:
-#line 934 "dhcp6_parser.yy" // lalr1.cc:919
+#line 936 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("expired-leases-processing", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.EXPIRED_LEASES_PROCESSING);
 }
-#line 1817 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1814 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 244:
-#line 939 "dhcp6_parser.yy" // lalr1.cc:919
+#line 941 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // No expired lease parameter is required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1827 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1824 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 253:
-#line 957 "dhcp6_parser.yy" // lalr1.cc:919
+#line 959 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reclaim-timer-wait-time", value);
 }
-#line 1836 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1833 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 254:
-#line 962 "dhcp6_parser.yy" // lalr1.cc:919
+#line 964 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush-reclaimed-timer-wait-time", value);
 }
-#line 1845 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1842 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 255:
-#line 967 "dhcp6_parser.yy" // lalr1.cc:919
+#line 969 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hold-reclaimed-time", value);
 }
-#line 1854 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1851 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 256:
-#line 972 "dhcp6_parser.yy" // lalr1.cc:919
+#line 974 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-reclaim-leases", value);
 }
-#line 1863 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1860 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 257:
-#line 977 "dhcp6_parser.yy" // lalr1.cc:919
+#line 979 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-reclaim-time", value);
 }
-#line 1872 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1869 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 258:
-#line 982 "dhcp6_parser.yy" // lalr1.cc:919
+#line 984 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr value(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("unwarned-reclaim-cycles", value);
 }
-#line 1881 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1878 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 259:
-#line 990 "dhcp6_parser.yy" // lalr1.cc:919
+#line 992 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet6", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.SUBNET6);
 }
-#line 1892 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1889 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 260:
-#line 995 "dhcp6_parser.yy" // lalr1.cc:919
+#line 997 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 1901 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1898 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 265:
-#line 1015 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1017 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 1911 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1908 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 266:
-#line 1019 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1021 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Once we reached this place, the subnet parsing is now complete.
     // If we want to, we can implement default values here.
@@ -1933,267 +1930,267 @@ namespace isc { namespace dhcp {
     ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 1937 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1934 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 267:
-#line 1041 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1043 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the subnet6 list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 1947 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1944 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 268:
-#line 1045 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1047 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The subnet subnet6 parameter is required
     ctx.require("subnet", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 1957 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1954 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 291:
-#line 1079 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1081 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1965 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1962 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 292:
-#line 1081 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1083 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr subnet(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr subnet(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("subnet", subnet);
     ctx.leave();
 }
-#line 1975 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1972 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 293:
-#line 1087 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1089 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 1983 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1980 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 294:
-#line 1089 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1091 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr iface(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface", iface);
     ctx.leave();
 }
-#line 1993 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1990 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 295:
-#line 1095 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1097 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2001 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1998 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 296:
-#line 1097 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1099 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr iface(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr iface(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("interface-id", iface);
     ctx.leave();
 }
-#line 2011 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2008 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 297:
-#line 1103 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1105 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2019 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2016 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 298:
-#line 1105 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1107 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr cls(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr cls(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-class", cls);
     ctx.leave();
 }
-#line 2029 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2026 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 299:
-#line 1111 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1113 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("require-client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2040 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2037 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 300:
-#line 1116 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1118 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2049 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2046 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 301:
-#line 1121 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1123 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.RESERVATION_MODE);
 }
-#line 2057 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2054 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 302:
-#line 1123 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1125 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("reservation-mode", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 2066 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2063 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 303:
-#line 1128 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); }
-#line 2072 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1130 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("disabled", ctx.loc2pos(yystack_[0].location))); }
+#line 2069 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 304:
-#line 1129 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); }
-#line 2078 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1131 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("out-of-pool", ctx.loc2pos(yystack_[0].location))); }
+#line 2075 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 305:
-#line 1130 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("global", ctx.loc2pos(yystack_[0].location))); }
-#line 2084 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1132 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("global", ctx.loc2pos(yystack_[0].location))); }
+#line 2081 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 306:
-#line 1131 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); }
-#line 2090 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1133 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("all", ctx.loc2pos(yystack_[0].location))); }
+#line 2087 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 307:
-#line 1134 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1136 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr id(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr id(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("id", id);
 }
-#line 2099 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2096 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 308:
-#line 1139 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1141 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr rc(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr rc(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("rapid-commit", rc);
 }
-#line 2108 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2105 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 309:
-#line 1147 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1149 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("shared-networks", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.SHARED_NETWORK);
 }
-#line 2119 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2116 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 310:
-#line 1152 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1154 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2128 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2125 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 315:
-#line 1167 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1169 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2138 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2135 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 316:
-#line 1171 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1173 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
 }
-#line 2146 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2143 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 336:
-#line 1202 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1204 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-def", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DEF);
 }
-#line 2157 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2154 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 337:
-#line 1207 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1209 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2166 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2163 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 338:
-#line 1215 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1217 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2175 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2172 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 339:
-#line 1218 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1220 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // parsing completed
 }
-#line 2183 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2180 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 344:
-#line 1234 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1236 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2193 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2190 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 345:
-#line 1238 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1240 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The name, code and type option def parameters are required.
     ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -2201,21 +2198,21 @@ namespace isc { namespace dhcp {
     ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 2205 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2202 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 346:
-#line 1249 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1251 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the option-def list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2215 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2212 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 347:
-#line 1253 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1255 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The name, code and type option def parameters are required.
     ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -2223,283 +2220,283 @@ namespace isc { namespace dhcp {
     ctx.require("type", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 2227 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2224 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 363:
-#line 1285 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1287 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr code(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr code(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("code", code);
 }
-#line 2236 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2233 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 365:
-#line 1292 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1294 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2244 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2241 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 366:
-#line 1294 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1296 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("type", prf);
     ctx.leave();
 }
-#line 2254 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2251 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 367:
-#line 1300 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1302 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2262 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2259 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 368:
-#line 1302 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1304 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr rtypes(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr rtypes(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("record-types", rtypes);
     ctx.leave();
 }
-#line 2272 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2269 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 369:
-#line 1308 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1310 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2280 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2277 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 370:
-#line 1310 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1312 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr space(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr space(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("space", space);
     ctx.leave();
 }
-#line 2290 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2287 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 372:
-#line 1318 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1320 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2298 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2295 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 373:
-#line 1320 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1322 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr encap(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr encap(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("encapsulate", encap);
     ctx.leave();
 }
-#line 2308 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2305 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 374:
-#line 1326 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1328 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr array(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr array(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("array", array);
 }
-#line 2317 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2314 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 375:
-#line 1335 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1337 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("option-data", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.OPTION_DATA);
 }
-#line 2328 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2325 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 376:
-#line 1340 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1342 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2337 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2334 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 381:
-#line 1359 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1361 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2347 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2344 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 382:
-#line 1363 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1365 "dhcp6_parser.yy" // lalr1.cc:907
     {
     /// @todo: the code or name parameters are required.
     ctx.stack_.pop_back();
 }
-#line 2356 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2353 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 383:
-#line 1371 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1373 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the option-data list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2366 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2363 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 384:
-#line 1375 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1377 "dhcp6_parser.yy" // lalr1.cc:907
     {
     /// @todo: the code or name parameters are required.
     // parsing completed
 }
-#line 2375 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2372 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 399:
-#line 1408 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1410 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2383 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2380 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 400:
-#line 1410 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1412 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr data(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr data(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("data", data);
     ctx.leave();
 }
-#line 2393 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2390 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 403:
-#line 1420 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1422 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr space(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr space(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("csv-format", space);
 }
-#line 2402 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2399 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 404:
-#line 1425 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1427 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr persist(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr persist(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("always-send", persist);
 }
-#line 2411 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2408 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 405:
-#line 1433 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1435 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pools", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.POOLS);
 }
-#line 2422 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2419 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 406:
-#line 1438 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1440 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2431 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2428 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 411:
-#line 1453 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1455 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2441 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2438 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 412:
-#line 1457 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1459 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The pool parameter is required.
     ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 2451 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2448 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 413:
-#line 1463 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1465 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the pool list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2461 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2458 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 414:
-#line 1467 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1469 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The pool parameter is required.
     ctx.require("pool", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
 }
-#line 2470 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2467 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 424:
-#line 1485 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1487 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2478 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2475 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 425:
-#line 1487 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1489 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr pool(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr pool(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pool", pool);
     ctx.leave();
 }
-#line 2488 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2485 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 426:
-#line 1493 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1495 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2496 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2493 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 427:
-#line 1495 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1497 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr parent = ctx.stack_.back();
-    ElementPtr user_context = yystack_[0].value.as < ElementPtr > ();
+    ElementPtr user_context = yystack_[0].value.as< ElementPtr > ();
     ConstElementPtr old = parent->get("user-context");
 
     // Handle already existing user context
@@ -2519,23 +2516,23 @@ namespace isc { namespace dhcp {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 2523 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2520 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 428:
-#line 1518 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1520 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2531 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2528 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 429:
-#line 1520 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1522 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr parent = ctx.stack_.back();
     ElementPtr user_context(new MapElement(ctx.loc2pos(yystack_[3].location)));
-    ElementPtr comment(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr comment(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     user_context->set("comment", comment);
 
     // Handle already existing user context
@@ -2556,41 +2553,41 @@ namespace isc { namespace dhcp {
     parent->set("user-context", user_context);
     ctx.leave();
 }
-#line 2560 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2557 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 430:
-#line 1548 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1550 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("pd-pools", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.PD_POOLS);
 }
-#line 2571 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2568 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 431:
-#line 1553 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1555 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2580 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2577 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 436:
-#line 1568 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1570 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2590 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2587 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 437:
-#line 1572 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1574 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The prefix, prefix len and delegated len parameters are required.
     ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -2598,21 +2595,21 @@ namespace isc { namespace dhcp {
     ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 2602 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2599 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 438:
-#line 1580 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1582 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the pd-pool list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2612 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2609 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 439:
-#line 1584 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1586 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The prefix, prefix len and delegated len parameters are required.
     ctx.require("prefix", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
@@ -2620,546 +2617,546 @@ namespace isc { namespace dhcp {
     ctx.require("delegated-len", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 2624 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2621 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 453:
-#line 1609 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1611 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2632 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2629 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 454:
-#line 1611 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1613 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("prefix", prf);
     ctx.leave();
 }
-#line 2642 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2639 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 455:
-#line 1617 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1619 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("prefix-len", prf);
 }
-#line 2651 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2648 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 456:
-#line 1622 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1624 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2659 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2656 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 457:
-#line 1624 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1626 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("excluded-prefix", prf);
     ctx.leave();
 }
-#line 2669 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2666 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 458:
-#line 1630 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1632 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr prf(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr prf(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("excluded-prefix-len", prf);
 }
-#line 2678 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2675 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 459:
-#line 1635 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1637 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr deleg(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr deleg(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("delegated-len", deleg);
 }
-#line 2687 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2684 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 460:
-#line 1643 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1645 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("reservations", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.RESERVATIONS);
 }
-#line 2698 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2695 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 461:
-#line 1648 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1650 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2707 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2704 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 466:
-#line 1661 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1663 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2717 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2714 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 467:
-#line 1665 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1667 "dhcp6_parser.yy" // lalr1.cc:907
     {
     /// @todo: an identifier parameter is required.
     ctx.stack_.pop_back();
 }
-#line 2726 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2723 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 468:
-#line 1670 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1672 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the reservations list entry map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 2736 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2733 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 469:
-#line 1674 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1676 "dhcp6_parser.yy" // lalr1.cc:907
     {
     /// @todo: an identifier parameter is required.
     // parsing completed
 }
-#line 2745 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2742 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 485:
-#line 1701 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1703 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-addresses", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2756 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2753 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 486:
-#line 1706 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1708 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2765 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2762 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 487:
-#line 1711 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1713 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("prefixes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2776 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2773 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 488:
-#line 1716 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1718 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2785 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2782 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 489:
-#line 1721 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1723 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2793 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2790 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 490:
-#line 1723 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1725 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr d(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr d(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("duid", d);
     ctx.leave();
 }
-#line 2803 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2800 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 491:
-#line 1729 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1731 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2811 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2808 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 492:
-#line 1731 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1733 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hw-address", hw);
     ctx.leave();
 }
-#line 2821 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2818 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 493:
-#line 1737 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1739 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2829 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2826 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 494:
-#line 1739 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1741 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr host(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr host(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname", host);
     ctx.leave();
 }
-#line 2839 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2836 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 495:
-#line 1745 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1747 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2847 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2844 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 496:
-#line 1747 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1749 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr hw(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr hw(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flex-id", hw);
     ctx.leave();
 }
-#line 2857 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2854 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 497:
-#line 1753 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1755 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr c(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", c);
     ctx.stack_.push_back(c);
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2868 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2865 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 498:
-#line 1758 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1760 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2877 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2874 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 499:
-#line 1766 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1768 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("relay", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.RELAY);
 }
-#line 2888 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2885 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 500:
-#line 1771 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1773 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2897 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2894 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 503:
-#line 1780 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1782 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2905 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2902 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 504:
-#line 1782 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1784 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr addr(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr addr(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ip-address", addr);
     ctx.leave();
 }
-#line 2915 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2912 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 505:
-#line 1791 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1793 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("client-classes", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.CLIENT_CLASSES);
 }
-#line 2926 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2923 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 506:
-#line 1796 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1798 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 2935 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2932 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 509:
-#line 1805 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1807 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 2945 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2942 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 510:
-#line 1809 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1811 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The name client class parameter is required.
     ctx.require("name", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
 }
-#line 2955 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2952 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 523:
-#line 1834 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1836 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 2963 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2960 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 524:
-#line 1836 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1838 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr test(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr test(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("test", test);
     ctx.leave();
 }
-#line 2973 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2970 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 525:
-#line 1842 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1844 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("only-if-required", b);
 }
-#line 2982 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2979 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 526:
-#line 1850 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1852 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-id", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.SERVER_ID);
 }
-#line 2993 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2990 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 527:
-#line 1855 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1857 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The type parameter is required.
     ctx.require("type", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3004 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3001 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 539:
-#line 1877 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1879 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.DUID_TYPE);
 }
-#line 3012 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3009 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 540:
-#line 1879 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1881 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("type", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("type", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3021 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3018 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 541:
-#line 1884 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); }
-#line 3027 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1886 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LLT", ctx.loc2pos(yystack_[0].location))); }
+#line 3024 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 542:
-#line 1885 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); }
-#line 3033 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1887 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("EN", ctx.loc2pos(yystack_[0].location))); }
+#line 3030 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 543:
-#line 1886 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); }
-#line 3039 "dhcp6_parser.cc" // lalr1.cc:919
+#line 1888 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("LL", ctx.loc2pos(yystack_[0].location))); }
+#line 3036 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 544:
-#line 1889 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1891 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr htype(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr htype(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("htype", htype);
 }
-#line 3048 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3045 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 545:
-#line 1894 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1896 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3056 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3053 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 546:
-#line 1896 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1898 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr id(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr id(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("identifier", id);
     ctx.leave();
 }
-#line 3066 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3063 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 547:
-#line 1902 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1904 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("time", time);
 }
-#line 3075 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3072 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 548:
-#line 1907 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1909 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("enterprise-id", time);
 }
-#line 3084 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3081 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 549:
-#line 1914 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1916 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr time(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr time(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp4o6-port", time);
 }
-#line 3093 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3090 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 550:
-#line 1921 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1923 "dhcp6_parser.yy" // lalr1.cc:907
     {
     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 3104 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3101 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 551:
-#line 1926 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1928 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3113 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3110 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 559:
-#line 1942 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1944 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3121 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3118 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 560:
-#line 1944 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1946 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr stype(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr stype(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("socket-type", stype);
     ctx.leave();
 }
-#line 3131 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3128 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 561:
-#line 1950 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1952 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3139 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3136 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 562:
-#line 1952 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1954 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr name(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    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 3149 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3146 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 563:
-#line 1960 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1962 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3157 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3154 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 564:
-#line 1962 "dhcp6_parser.yy" // lalr1.cc:919
+#line 1964 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr qc = yystack_[0].value.as < ElementPtr > ();
+    ElementPtr qc = yystack_[0].value.as< ElementPtr > ();
     ctx.stack_.back()->set("dhcp-queue-control", qc);
 
     // Doing this manually, because dhcp-queue-control
@@ -3193,617 +3190,626 @@ namespace isc { namespace dhcp {
 
     ctx.leave();
 }
-#line 3197 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3194 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 565:
-#line 2000 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2002 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("dhcp-ddns", m);
     ctx.stack_.push_back(m);
     ctx.enter(ctx.DHCP_DDNS);
 }
-#line 3208 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3205 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 566:
-#line 2005 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2007 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[2].location), ctx.loc2pos(yystack_[0].location));
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3219 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3216 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 567:
-#line 2012 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2014 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the dhcp-ddns map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 3229 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3226 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 568:
-#line 2016 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2018 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // The enable updates DHCP DDNS parameter is required.
     ctx.require("enable-updates", ctx.loc2pos(yystack_[3].location), ctx.loc2pos(yystack_[0].location));
     // parsing completed
 }
-#line 3239 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3236 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 589:
-#line 2046 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2048 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("enable-updates", b);
 }
-#line 3248 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3245 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 590:
-#line 2051 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2053 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3256 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3253 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 591:
-#line 2053 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2055 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("qualifying-suffix", s);
     ctx.leave();
 }
-#line 3266 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3263 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 592:
-#line 2059 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2061 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3274 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3271 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 593:
-#line 2061 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2063 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-ip", s);
     ctx.leave();
 }
-#line 3284 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3281 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 594:
-#line 2067 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2069 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("server-port", i);
 }
-#line 3293 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3290 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 595:
-#line 2072 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2074 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3301 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3298 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 596:
-#line 2074 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2076 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sender-ip", s);
     ctx.leave();
 }
-#line 3311 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3308 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 597:
-#line 2080 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2082 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("sender-port", i);
 }
-#line 3320 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3317 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 598:
-#line 2085 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2087 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr i(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr i(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("max-queue-size", i);
 }
-#line 3329 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3326 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 599:
-#line 2090 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2092 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NCR_PROTOCOL);
 }
-#line 3337 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3334 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 600:
-#line 2092 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2094 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("ncr-protocol", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3346 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3343 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 601:
-#line 2098 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
-#line 3352 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2100 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("UDP", ctx.loc2pos(yystack_[0].location))); }
+#line 3349 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 602:
-#line 2099 "dhcp6_parser.yy" // lalr1.cc:919
-    { yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
-#line 3358 "dhcp6_parser.cc" // lalr1.cc:919
+#line 2101 "dhcp6_parser.yy" // lalr1.cc:907
+    { yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("TCP", ctx.loc2pos(yystack_[0].location))); }
+#line 3355 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 603:
-#line 2102 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2104 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NCR_FORMAT);
 }
-#line 3366 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3363 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 604:
-#line 2104 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2106 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr json(new StringElement("JSON", ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("ncr-format", json);
     ctx.leave();
 }
-#line 3376 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3373 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 605:
-#line 2110 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2112 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("override-no-update", b);
 }
-#line 3385 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3382 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 606:
-#line 2115 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2117 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr b(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr b(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("override-client-update", b);
 }
-#line 3394 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3391 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 607:
-#line 2120 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2122 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.REPLACE_CLIENT_NAME);
 }
-#line 3402 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3399 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 608:
-#line 2122 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2124 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("replace-client-name", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3411 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3408 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 609:
-#line 2128 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2130 "dhcp6_parser.yy" // lalr1.cc:907
     {
-      yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location)));
+      yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-present", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3419 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3416 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 610:
-#line 2131 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2133 "dhcp6_parser.yy" // lalr1.cc:907
     {
-      yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location)));
+      yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("never", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3427 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3424 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 611:
-#line 2134 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2136 "dhcp6_parser.yy" // lalr1.cc:907
     {
-      yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location)));
+      yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("always", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3435 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3432 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 612:
-#line 2137 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2139 "dhcp6_parser.yy" // lalr1.cc:907
     {
-      yylhs.value.as < ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location)));
+      yylhs.value.as< ElementPtr > () = ElementPtr(new StringElement("when-not-present", ctx.loc2pos(yystack_[0].location)));
       }
-#line 3443 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3440 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 613:
-#line 2140 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2142 "dhcp6_parser.yy" // lalr1.cc:907
     {
       error(yystack_[0].location, "boolean values for the replace-client-name are "
                 "no longer supported");
       }
-#line 3452 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3449 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 614:
-#line 2146 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2148 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3460 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3457 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 615:
-#line 2148 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2150 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("generated-prefix", s);
     ctx.leave();
 }
-#line 3470 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3467 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 616:
-#line 2154 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2156 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3478 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3475 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 617:
-#line 2156 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2158 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname-char-set", s);
     ctx.leave();
 }
-#line 3488 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3485 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 618:
-#line 2162 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2164 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3496 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3493 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 619:
-#line 2164 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2166 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr s(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr s(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("hostname-char-replacement", s);
     ctx.leave();
 }
-#line 3506 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3503 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 620:
-#line 2172 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2174 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3514 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3511 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 621:
-#line 2174 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2176 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("Dhcp4", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3523 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3520 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 622:
-#line 2179 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2181 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3531 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3528 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 623:
-#line 2181 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2183 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("DhcpDdns", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3540 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3537 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 624:
-#line 2186 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2188 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3548 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3545 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 625:
-#line 2188 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2190 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ctx.stack_.back()->set("Control-agent", yystack_[0].value.as < ElementPtr > ());
+    ctx.stack_.back()->set("Control-agent", yystack_[0].value.as< ElementPtr > ());
     ctx.leave();
 }
-#line 3557 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3554 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 626:
-#line 2195 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2197 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr i(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("config-control", i);
     ctx.stack_.push_back(i);
     ctx.enter(ctx.CONFIG_CONTROL);
 }
-#line 3568 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3565 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 627:
-#line 2200 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2202 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // No config control params are required
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3578 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3575 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 628:
-#line 2206 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2208 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the config-control map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 3588 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3585 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
   case 629:
-#line 2210 "dhcp6_parser.yy" // lalr1.cc:919
+#line 2212 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // No config_control params are required
     // parsing completed
 }
-#line 3597 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3594 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 633:
-#line 2224 "dhcp6_parser.yy" // lalr1.cc:919
+  case 634:
+#line 2227 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new ListElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("config-databases", l);
     ctx.stack_.push_back(l);
     ctx.enter(ctx.CONFIG_DATABASE);
 }
-#line 3608 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3605 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 634:
-#line 2229 "dhcp6_parser.yy" // lalr1.cc:919
+  case 635:
+#line 2232 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3617 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3614 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 635:
-#line 2239 "dhcp6_parser.yy" // lalr1.cc:919
+  case 636:
+#line 2237 "dhcp6_parser.yy" // lalr1.cc:907
+    {
+    ElementPtr value(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ctx.stack_.back()->set("config-fetch-wait-time", value);
+}
+#line 3623 "dhcp6_parser.cc" // lalr1.cc:907
+    break;
+
+  case 637:
+#line 2247 "dhcp6_parser.yy" // lalr1.cc:907
     {
     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 3628 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3634 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 636:
-#line 2244 "dhcp6_parser.yy" // lalr1.cc:919
+  case 638:
+#line 2252 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3637 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3643 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 637:
-#line 2249 "dhcp6_parser.yy" // lalr1.cc:919
+  case 639:
+#line 2257 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // Parse the Logging map
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.push_back(m);
 }
-#line 3647 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3653 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 638:
-#line 2253 "dhcp6_parser.yy" // lalr1.cc:919
+  case 640:
+#line 2261 "dhcp6_parser.yy" // lalr1.cc:907
     {
     // parsing completed
 }
-#line 3655 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3661 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 642:
-#line 2269 "dhcp6_parser.yy" // lalr1.cc:919
+  case 644:
+#line 2277 "dhcp6_parser.yy" // lalr1.cc:907
     {
     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 3666 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3672 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 643:
-#line 2274 "dhcp6_parser.yy" // lalr1.cc:919
+  case 645:
+#line 2282 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3675 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3681 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 646:
-#line 2286 "dhcp6_parser.yy" // lalr1.cc:919
+  case 648:
+#line 2294 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr l(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(l);
     ctx.stack_.push_back(l);
 }
-#line 3685 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3691 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 647:
-#line 2290 "dhcp6_parser.yy" // lalr1.cc:919
+  case 649:
+#line 2298 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
 }
-#line 3693 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3699 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 657:
-#line 2307 "dhcp6_parser.yy" // lalr1.cc:919
+  case 659:
+#line 2315 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr dl(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr dl(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("debuglevel", dl);
 }
-#line 3702 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3708 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 658:
-#line 2312 "dhcp6_parser.yy" // lalr1.cc:919
+  case 660:
+#line 2320 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3710 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3716 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 659:
-#line 2314 "dhcp6_parser.yy" // lalr1.cc:919
+  case 661:
+#line 2322 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("severity", sev);
     ctx.leave();
 }
-#line 3720 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3726 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 660:
-#line 2320 "dhcp6_parser.yy" // lalr1.cc:919
+  case 662:
+#line 2328 "dhcp6_parser.yy" // lalr1.cc:907
     {
     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 3731 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3737 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 661:
-#line 2325 "dhcp6_parser.yy" // lalr1.cc:919
+  case 663:
+#line 2333 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
     ctx.leave();
 }
-#line 3740 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3746 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 664:
-#line 2334 "dhcp6_parser.yy" // lalr1.cc:919
+  case 666:
+#line 2342 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ElementPtr m(new MapElement(ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->add(m);
     ctx.stack_.push_back(m);
 }
-#line 3750 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3756 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 665:
-#line 2338 "dhcp6_parser.yy" // lalr1.cc:919
+  case 667:
+#line 2346 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.stack_.pop_back();
 }
-#line 3758 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3764 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 672:
-#line 2352 "dhcp6_parser.yy" // lalr1.cc:919
+  case 674:
+#line 2360 "dhcp6_parser.yy" // lalr1.cc:907
     {
     ctx.enter(ctx.NO_KEYWORD);
 }
-#line 3766 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3772 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 673:
-#line 2354 "dhcp6_parser.yy" // lalr1.cc:919
+  case 675:
+#line 2362 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr sev(new StringElement(yystack_[0].value.as < std::string > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr sev(new StringElement(yystack_[0].value.as< std::string > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("output", sev);
     ctx.leave();
 }
-#line 3776 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3782 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 674:
-#line 2360 "dhcp6_parser.yy" // lalr1.cc:919
+  case 676:
+#line 2368 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr flush(new BoolElement(yystack_[0].value.as < bool > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr flush(new BoolElement(yystack_[0].value.as< bool > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("flush", flush);
 }
-#line 3785 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3791 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 675:
-#line 2365 "dhcp6_parser.yy" // lalr1.cc:919
+  case 677:
+#line 2373 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr maxsize(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr maxsize(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxsize", maxsize);
 }
-#line 3794 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3800 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
-  case 676:
-#line 2370 "dhcp6_parser.yy" // lalr1.cc:919
+  case 678:
+#line 2378 "dhcp6_parser.yy" // lalr1.cc:907
     {
-    ElementPtr maxver(new IntElement(yystack_[0].value.as < int64_t > (), ctx.loc2pos(yystack_[0].location)));
+    ElementPtr maxver(new IntElement(yystack_[0].value.as< int64_t > (), ctx.loc2pos(yystack_[0].location)));
     ctx.stack_.back()->set("maxver", maxver);
 }
-#line 3803 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3809 "dhcp6_parser.cc" // lalr1.cc:907
     break;
 
 
-#line 3807 "dhcp6_parser.cc" // lalr1.cc:919
+#line 3813 "dhcp6_parser.cc" // lalr1.cc:907
             default:
               break;
             }
@@ -3811,7 +3817,6 @@ namespace isc { namespace dhcp {
 #if YY_EXCEPTIONS
       catch (const syntax_error& yyexc)
         {
-          YYCDEBUG << "Caught exception: " << yyexc.what() << '\n';
           error (yyexc);
           YYERROR;
         }
@@ -3826,7 +3831,6 @@ namespace isc { namespace dhcp {
     }
     goto yynewstate;
 
-
   /*--------------------------------------.
   | yyerrlab -- here on detecting error.  |
   `--------------------------------------*/
@@ -3863,18 +3867,18 @@ namespace isc { namespace dhcp {
   | yyerrorlab -- error raised explicitly by YYERROR.  |
   `---------------------------------------------------*/
   yyerrorlab:
-    /* Pacify compilers when the user code never invokes YYERROR and
-       the label yyerrorlab therefore never appears in user code.  */
-    if (false)
-      YYERROR;
 
+    /* Pacify compilers like GCC when the user code never invokes
+       YYERROR and the label yyerrorlab therefore never appears in user
+       code.  */
+    if (false)
+      goto yyerrorlab;
     /* Do not reclaim the symbols of the rule whose action triggered
        this YYERROR.  */
     yypop_ (yylen);
     yylen = 0;
     goto yyerrlab1;
 
-
   /*-------------------------------------------------------------.
   | yyerrlab1 -- common code for both syntax error and YYERROR.  |
   `-------------------------------------------------------------*/
@@ -3915,26 +3919,16 @@ namespace isc { namespace dhcp {
     }
     goto yynewstate;
 
-
-  /*-------------------------------------.
-  | yyacceptlab -- YYACCEPT comes here.  |
-  `-------------------------------------*/
+    // Accept.
   yyacceptlab:
     yyresult = 0;
     goto yyreturn;
 
-
-  /*-----------------------------------.
-  | yyabortlab -- YYABORT comes here.  |
-  `-----------------------------------*/
+    // Abort.
   yyabortlab:
     yyresult = 1;
     goto yyreturn;
 
-
-  /*-----------------------------------------------------.
-  | yyreturn -- parsing is finished, return the result.  |
-  `-----------------------------------------------------*/
   yyreturn:
     if (!yyla.empty ())
       yy_destroy_ ("Cleanup: discarding lookahead", yyla);
@@ -4073,124 +4067,124 @@ namespace isc { namespace dhcp {
   }
 
 
-  const short Dhcp6Parser::yypact_ninf_ = -833;
+  const short Dhcp6Parser::yypact_ninf_ = -837;
 
   const signed char Dhcp6Parser::yytable_ninf_ = -1;
 
   const short
   Dhcp6Parser::yypact_[] =
   {
-     415,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,    71,    65,    68,    82,
-      83,    90,    98,    99,   116,   151,   163,   200,   230,   236,
-     238,   251,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,    65,    94,    27,    69,    23,   227,   107,    35,
-     167,   233,    73,   268,   -52,   366,   138,   266,  -833,   285,
-     302,   312,   298,   324,  -833,  -833,  -833,  -833,  -833,   335,
-    -833,    37,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,   339,   345,   347,   351,   355,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   357,  -833,  -833,  -833,
-    -833,    54,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   361,  -833,    70,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,   364,
-     365,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,    76,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,   131,  -833,  -833,  -833,  -833,  -833,   367,  -833,   383,
-     387,  -833,  -833,  -833,  -833,  -833,  -833,   132,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,   334,   350,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,   397,  -833,  -833,   405,  -833,
-    -833,  -833,   408,  -833,  -833,   411,   419,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-     422,   436,  -833,  -833,  -833,  -833,   435,   441,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-     159,  -833,  -833,  -833,   442,  -833,  -833,   443,  -833,   444,
-     446,  -833,  -833,   447,   448,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,   177,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-     187,  -833,  -833,  -833,   244,  -833,  -833,  -833,    65,    65,
-    -833,   280,   450,   451,   454,   457,   460,  -833,    27,  -833,
-     461,   462,   463,   464,   465,   466,   271,   297,   299,   300,
-     303,   468,   472,   475,   476,   477,   478,   479,   480,   481,
-     483,   484,   485,   499,   500,   501,   502,   503,   340,   504,
-     505,   508,    69,  -833,   509,   341,    23,  -833,   512,   514,
-     515,   516,   517,   352,   348,   519,   521,   523,   227,  -833,
-     524,   107,  -833,   528,   360,   529,   362,   363,    35,  -833,
-     531,   536,   537,   538,   539,   540,   541,  -833,   167,  -833,
-     542,   545,   377,   548,   549,   550,   379,  -833,    73,   552,
-     381,   382,  -833,   268,   555,   556,   -37,  -833,   386,   561,
-     563,   394,   565,   396,   414,   567,   585,   416,   418,   586,
-     587,   589,   591,   366,  -833,   592,   138,  -833,   595,   266,
-    -833,  -833,  -833,   597,   596,   598,    65,    65,    65,  -833,
-     429,   599,   600,   601,   603,   606,  -833,  -833,  -833,  -833,
-    -833,   431,   607,   608,   609,   610,   445,   178,   611,   614,
-     615,   616,   617,   618,   620,   621,   622,   623,  -833,   625,
-     610,   626,  -833,   629,  -833,  -833,   630,   631,   449,   455,
-     467,  -833,  -833,   629,   469,   632,  -833,   470,  -833,   471,
-    -833,   473,  -833,  -833,  -833,   629,   629,   629,   474,   482,
-     486,   487,  -833,   488,   489,  -833,   490,   491,   492,  -833,
-    -833,   493,  -833,  -833,  -833,   494,    65,  -833,  -833,   495,
-     496,  -833,   497,  -833,  -833,    40,   498,  -833,  -833,   -33,
-     506,   507,   510,  -833,   633,  -833,   636,  -833,    65,    69,
-     138,  -833,  -833,  -833,  -833,   266,    23,   193,   193,   638,
-    -833,   641,   642,   643,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,   644,   -53,    65,   104,   530,   645,   646,   647,
-     204,   134,     8,  -833,   366,  -833,  -833,   649,   650,  -833,
-    -833,  -833,  -833,  -833,   -48,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,   651,
-     638,  -833,   265,   278,   323,   326,  -833,  -833,  -833,  -833,
-     667,   668,   669,   670,   671,  -833,   672,   673,  -833,  -833,
-    -833,   674,   677,   678,  -833,   327,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   330,  -833,   679,   624,
-    -833,  -833,   680,   681,  -833,  -833,   682,   684,  -833,  -833,
-     683,   687,  -833,  -833,   685,   689,  -833,  -833,  -833,   130,
-    -833,  -833,  -833,   688,  -833,  -833,  -833,   153,  -833,  -833,
-    -833,  -833,   338,  -833,  -833,  -833,   168,  -833,  -833,   690,
-     692,  -833,  -833,   691,   695,  -833,   696,   697,   698,   699,
-     700,   701,   342,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,   702,   703,   704,  -833,  -833,  -833,  -833,   349,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,   359,  -833,  -833,  -833,   378,   520,  -833,   693,   706,
-    -833,  -833,   705,   707,  -833,  -833,  -833,   708,  -833,  -833,
-     183,  -833,   709,  -833,  -833,  -833,  -833,   710,   713,   714,
-     715,   546,   547,   551,   553,   554,   717,   557,   558,   718,
-     720,   722,   559,   560,   562,   193,  -833,  -833,   193,  -833,
-     638,   227,  -833,   641,    73,  -833,   642,   268,  -833,   643,
-     388,  -833,   644,   -53,  -833,  -833,   104,  -833,   723,   530,
-    -833,   215,   645,  -833,   167,  -833,   646,   -52,  -833,   647,
-     566,   568,   569,   570,   571,   572,   204,  -833,   726,   731,
-     573,   574,   575,   134,  -833,   732,   733,     8,  -833,  -833,
-    -833,   735,   736,   107,  -833,   649,    35,  -833,   650,   746,
-    -833,   142,   651,  -833,  -833,   124,   578,   579,   580,  -833,
-    -833,  -833,  -833,  -833,   581,  -833,  -833,   582,   583,   584,
-    -833,  -833,  -833,  -833,   390,  -833,   400,  -833,   750,  -833,
-     751,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,   403,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,   588,  -833,  -833,   756,  -833,  -833,
-    -833,  -833,  -833,   754,   760,  -833,  -833,  -833,  -833,  -833,
-     757,  -833,   410,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,   103,   593,  -833,  -833,  -833,  -833,   594,   602,  -833,
-    -833,   605,   413,  -833,   417,  -833,   612,  -833,   764,  -833,
-    -833,  -833,  -833,  -833,   420,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   388,  -833,  -833,   765,
-     619,  -833,   215,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   766,   590,   767,   142,
-    -833,  -833,   634,  -833,  -833,   768,  -833,   637,  -833,  -833,
-     769,  -833,  -833,   272,  -833,    12,   769,  -833,  -833,   770,
-     775,   778,   434,  -833,  -833,  -833,  -833,  -833,  -833,   788,
-     628,   648,   652,    12,  -833,   639,  -833,  -833,  -833,  -833,
-    -833
+     418,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,    57,    65,    64,    66,
+      68,    87,    91,   126,   133,   148,   164,   184,   195,   203,
+     229,   230,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,    65,   -95,    27,    69,    22,   234,    72,    39,
+     196,   188,    41,   262,   -53,   375,    96,   144,  -837,   242,
+     249,   269,   263,   281,  -837,  -837,  -837,  -837,  -837,   307,
+    -837,    94,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,   309,   316,   317,   323,   341,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,   347,  -837,  -837,  -837,
+    -837,   123,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,   353,  -837,   140,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,   357,
+     367,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,   141,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,   178,  -837,  -837,  -837,  -837,  -837,   369,  -837,   385,
+     410,  -837,  -837,  -837,  -837,  -837,  -837,   187,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,   416,   352,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,   417,  -837,  -837,   423,  -837,
+    -837,  -837,   424,  -837,  -837,   422,   390,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+     433,   435,  -837,  -837,  -837,  -837,   434,   440,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+     191,  -837,  -837,  -837,   442,  -837,  -837,   443,  -837,   444,
+     445,  -837,  -837,   446,   448,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,   260,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+     261,  -837,  -837,  -837,   449,   264,  -837,  -837,  -837,  -837,
+      65,    65,  -837,   280,   451,   452,   453,   456,   459,  -837,
+      27,  -837,   462,   463,   464,   465,   466,   467,   297,   298,
+     299,   300,   301,   474,   475,   477,   478,   479,   480,   481,
+     482,   483,   485,   486,   487,   488,   489,   490,   491,   492,
+     322,   494,   495,   509,    69,  -837,   510,   338,    22,  -837,
+     512,   513,   514,   518,   519,   349,   348,   523,   524,   525,
+     234,  -837,   526,    72,  -837,   527,   362,   531,   363,   364,
+      39,  -837,   532,   536,   537,   539,   540,   541,   542,  -837,
+     196,  -837,   543,   544,   378,   546,   551,   552,   381,  -837,
+      41,   553,   382,   383,  -837,   262,   557,   558,   -17,  -837,
+     388,   560,   562,   394,   567,   400,   419,   568,   569,   415,
+     420,   570,   589,   591,   592,   375,  -837,   594,    96,  -837,
+     595,   425,   144,  -837,  -837,  -837,   599,   598,   600,    65,
+      65,    65,  -837,   432,   601,   602,   603,   604,   608,  -837,
+    -837,  -837,  -837,  -837,   441,   609,   611,   612,   613,   447,
+     221,   614,   617,   618,   619,   620,   621,   623,   624,   625,
+     626,  -837,   627,   613,   629,  -837,   632,  -837,  -837,   633,
+     634,   457,   468,   469,  -837,  -837,   632,   470,   638,  -837,
+     472,  -837,   473,  -837,   476,  -837,  -837,  -837,   632,   632,
+     632,   484,   493,   496,   497,  -837,   498,   499,  -837,   500,
+     501,   502,  -837,  -837,   503,  -837,  -837,  -837,   504,    65,
+    -837,  -837,   505,   506,  -837,   507,  -837,  -837,   -98,   508,
+    -837,  -837,    34,   511,   515,   516,  -837,   635,  -837,   636,
+    -837,  -837,    65,    69,    96,  -837,  -837,  -837,  -837,   144,
+      22,   193,   193,   642,  -837,   644,   645,   646,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,   647,   -50,    65,   315,
+     571,   648,   649,   652,   152,   138,   128,  -837,   375,  -837,
+    -837,   653,   654,  -837,  -837,  -837,  -837,  -837,   -49,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,   655,   642,  -837,   267,   278,   279,   320,
+    -837,  -837,  -837,  -837,   659,   660,   661,   662,   664,  -837,
+     665,   678,  -837,  -837,  -837,   679,   680,   682,  -837,   321,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+     332,  -837,   681,   615,  -837,  -837,   685,   622,  -837,  -837,
+     686,   690,  -837,  -837,   688,   692,  -837,  -837,   691,   693,
+    -837,  -837,  -837,   119,  -837,  -837,  -837,   694,  -837,  -837,
+    -837,   166,  -837,  -837,  -837,  -837,   333,  -837,  -837,  -837,
+     176,  -837,  -837,   695,   696,  -837,  -837,   697,   699,  -837,
+     684,   700,   701,   702,   703,   704,   334,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,   705,   706,   707,  -837,
+    -837,  -837,  -837,   335,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,   336,  -837,  -837,  -837,   344,
+     538,  -837,   708,   710,  -837,  -837,   709,   713,  -837,  -837,
+    -837,   711,  -837,  -837,   197,  -837,   712,  -837,  -837,  -837,
+    -837,   716,   717,   718,   719,   455,   521,   549,   548,   554,
+     722,   555,   556,   723,   724,   728,   559,   561,   563,   193,
+    -837,  -837,   193,  -837,   642,   234,  -837,   644,    41,  -837,
+     645,   262,  -837,   646,   389,  -837,   647,   -50,  -837,  -837,
+     315,  -837,   729,   571,  -837,    77,   648,  -837,   196,  -837,
+     649,   -53,  -837,   652,   564,   566,   572,   573,   574,   575,
+     152,  -837,   731,   733,   576,   577,   578,   138,  -837,   734,
+     738,   128,  -837,  -837,  -837,   737,   714,    72,  -837,   653,
+      39,  -837,   654,   740,  -837,    13,   655,  -837,  -837,   398,
+     580,   581,   582,  -837,  -837,  -837,  -837,  -837,   583,  -837,
+    -837,   584,   585,   586,  -837,  -837,  -837,  -837,   345,  -837,
+     351,  -837,   753,  -837,   754,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,   360,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,   590,  -837,
+    -837,   741,  -837,  -837,  -837,  -837,  -837,   755,   743,  -837,
+    -837,  -837,  -837,  -837,   757,  -837,   361,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,   104,   593,  -837,  -837,  -837,
+    -837,   596,   597,  -837,  -837,   605,   380,  -837,   387,  -837,
+     606,  -837,   762,  -837,  -837,  -837,  -837,  -837,   397,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+     389,  -837,  -837,   764,   631,  -837,    77,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+     765,   607,   768,    13,  -837,  -837,   637,  -837,  -837,   769,
+    -837,   640,  -837,  -837,   766,  -837,  -837,   412,  -837,   -18,
+     766,  -837,  -837,   771,   772,   773,   399,  -837,  -837,  -837,
+    -837,  -837,  -837,   774,   639,   650,   651,   -18,  -837,   641,
+    -837,  -837,  -837,  -837,  -837
   };
 
   const unsigned short
@@ -4202,10 +4196,10 @@ namespace isc { namespace dhcp {
        0,     0,     1,    47,    40,    36,    35,    32,    33,    34,
       39,     3,    37,    38,    60,     5,    72,     7,   120,     9,
      267,    11,   413,    13,   438,    15,   468,    17,   338,    19,
-     346,    21,   383,    23,   232,    25,   567,    27,   637,    29,
+     346,    21,   383,    23,   232,    25,   567,    27,   639,    29,
      628,    31,    49,    43,     0,     0,     0,     0,     0,     0,
      470,     0,   348,   385,     0,     0,     0,     0,    51,     0,
-      50,     0,     0,    44,    70,   635,   620,   622,   624,     0,
+      50,     0,     0,    44,    70,   637,   620,   622,   624,     0,
       69,     0,    62,    64,    66,    67,    68,    65,   109,   626,
      118,   132,   134,   136,     0,     0,     0,     0,     0,   116,
      259,   336,   375,   426,   428,   301,   309,   205,   222,   213,
@@ -4230,128 +4224,128 @@ namespace isc { namespace dhcp {
        0,   234,   237,   238,     0,   590,   592,     0,   595,     0,
        0,   599,   603,     0,     0,   607,   614,   616,   618,   588,
      586,   587,     0,   569,   571,   572,   573,   574,   575,   576,
-     577,   578,   579,   580,   581,   582,   583,   584,   585,   642,
-       0,   639,   641,   633,     0,   630,   632,    48,     0,     0,
-      41,     0,     0,     0,     0,     0,     0,    59,     0,    61,
+     577,   578,   579,   580,   581,   582,   583,   584,   585,   644,
+       0,   641,   643,   634,     0,     0,   630,   632,   633,    48,
+       0,     0,    41,     0,     0,     0,     0,     0,     0,    59,
+       0,    61,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    73,     0,     0,     0,   121,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   268,     0,     0,   414,     0,     0,     0,     0,     0,
+       0,   439,     0,     0,     0,     0,     0,     0,     0,   469,
+       0,   339,     0,     0,     0,     0,     0,     0,     0,   347,
+       0,     0,     0,     0,   384,     0,     0,     0,     0,   233,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    73,     0,     0,     0,   121,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   268,
-       0,     0,   414,     0,     0,     0,     0,     0,     0,   439,
-       0,     0,     0,     0,     0,     0,     0,   469,     0,   339,
-       0,     0,     0,     0,     0,     0,     0,   347,     0,     0,
-       0,     0,   384,     0,     0,     0,     0,   233,     0,     0,
+       0,     0,     0,     0,     0,     0,   568,     0,     0,   640,
+       0,     0,     0,   629,    52,    45,     0,     0,     0,     0,
+       0,     0,    63,     0,     0,     0,     0,     0,     0,   111,
+     112,   113,   114,   115,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   568,     0,     0,   638,     0,     0,
-     629,    52,    45,     0,     0,     0,     0,     0,     0,    63,
-       0,     0,     0,     0,     0,     0,   111,   112,   113,   114,
-     115,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   549,     0,
-       0,     0,    75,     0,   131,   123,     0,     0,     0,     0,
-       0,   307,   308,     0,     0,     0,   270,     0,   416,     0,
-     455,     0,   458,   459,   441,     0,     0,     0,     0,     0,
-       0,     0,   473,     0,     0,   363,     0,     0,     0,   374,
-     351,     0,   403,   404,   388,     0,     0,   235,   589,     0,
-       0,   594,     0,   597,   598,     0,     0,   605,   606,     0,
-       0,     0,     0,   570,     0,   640,     0,   631,     0,     0,
-       0,   621,   623,   625,   110,     0,     0,     0,     0,   138,
-     117,   261,   340,   377,    42,   427,   429,   303,   304,   305,
-     306,   302,   311,     0,    49,     0,     0,     0,   462,   226,
-       0,     0,     0,   564,     0,    53,   130,   407,   432,   292,
-     294,   296,   300,   298,     0,   425,   454,   457,   498,   486,
-     488,   490,   492,   494,   496,   366,   180,   370,   368,   373,
-     400,   240,   242,   591,   593,   596,   601,   602,   600,   604,
-     609,   610,   611,   612,   613,   608,   615,   617,   619,     0,
-     138,    46,     0,     0,     0,     0,   166,   172,   174,   176,
-       0,     0,     0,     0,     0,   189,     0,     0,   192,   194,
-     196,     0,     0,     0,   165,     0,   144,   146,   147,   148,
-     149,   150,   151,   152,   153,   154,   155,   158,   159,   160,
-     161,   156,   157,   162,   163,   164,     0,   142,     0,   139,
-     140,   265,     0,   262,   263,   344,     0,   341,   342,   381,
-       0,   378,   379,   315,     0,   312,   313,   211,   212,     0,
-     207,   209,   210,     0,   220,   221,   217,     0,   215,   218,
-     219,   203,     0,   200,   202,   509,     0,   507,   466,     0,
-     463,   464,   230,     0,   227,   228,     0,     0,     0,     0,
-       0,     0,     0,   245,   247,   248,   249,   250,   251,   252,
-     539,   545,     0,     0,     0,   538,   535,   536,   537,     0,
-     528,   530,   533,   531,   532,   534,   559,   561,   558,   556,
-     557,     0,   552,   554,   555,     0,    55,   411,     0,   408,
-     409,   436,     0,   433,   434,   503,   502,     0,   501,   646,
-       0,   644,     0,    71,   636,   627,   119,     0,     0,     0,
+       0,   549,     0,     0,     0,    75,     0,   131,   123,     0,
+       0,     0,     0,     0,   307,   308,     0,     0,     0,   270,
+       0,   416,     0,   455,     0,   458,   459,   441,     0,     0,
+       0,     0,     0,     0,     0,   473,     0,     0,   363,     0,
+       0,     0,   374,   351,     0,   403,   404,   388,     0,     0,
+     235,   589,     0,     0,   594,     0,   597,   598,     0,     0,
+     605,   606,     0,     0,     0,     0,   570,     0,   642,     0,
+     636,   631,     0,     0,     0,   621,   623,   625,   110,     0,
+       0,     0,     0,   138,   117,   261,   340,   377,    42,   427,
+     429,   303,   304,   305,   306,   302,   311,     0,    49,     0,
+       0,     0,   462,   226,     0,     0,     0,   564,     0,    53,
+     130,   407,   432,   292,   294,   296,   300,   298,     0,   425,
+     454,   457,   498,   486,   488,   490,   492,   494,   496,   366,
+     180,   370,   368,   373,   400,   240,   242,   591,   593,   596,
+     601,   602,   600,   604,   609,   610,   611,   612,   613,   608,
+     615,   617,   619,     0,   138,    46,     0,     0,     0,     0,
+     166,   172,   174,   176,     0,     0,     0,     0,     0,   189,
+       0,     0,   192,   194,   196,     0,     0,     0,   165,     0,
+     144,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   158,   159,   160,   161,   156,   157,   162,   163,   164,
+       0,   142,     0,   139,   140,   265,     0,   262,   263,   344,
+       0,   341,   342,   381,     0,   378,   379,   315,     0,   312,
+     313,   211,   212,     0,   207,   209,   210,     0,   220,   221,
+     217,     0,   215,   218,   219,   203,     0,   200,   202,   509,
+       0,   507,   466,     0,   463,   464,   230,     0,   227,   228,
+       0,     0,     0,     0,     0,     0,     0,   245,   247,   248,
+     249,   250,   251,   252,   539,   545,     0,     0,     0,   538,
+     535,   536,   537,     0,   528,   530,   533,   531,   532,   534,
+     559,   561,   558,   556,   557,     0,   552,   554,   555,     0,
+      55,   411,     0,   408,   409,   436,     0,   433,   434,   503,
+     502,     0,   501,   648,     0,   646,     0,    71,   638,   627,
+     119,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   133,   135,     0,   137,
-       0,     0,   260,     0,   348,   337,     0,   385,   376,     0,
-       0,   310,     0,     0,   206,   223,     0,   214,     0,     0,
-     199,   511,     0,   506,   470,   461,     0,     0,   225,     0,
-       0,     0,     0,     0,     0,     0,     0,   244,     0,     0,
-       0,     0,     0,     0,   527,     0,     0,     0,   551,   566,
-      57,     0,    56,     0,   406,     0,     0,   431,     0,     0,
-     500,     0,     0,   643,   634,     0,     0,     0,     0,   178,
-     181,   182,   183,   184,     0,   191,   185,     0,     0,     0,
-     186,   187,   188,   145,     0,   141,     0,   264,     0,   343,
-       0,   380,   335,   330,   332,   323,   324,   319,   320,   321,
-     322,   328,   329,   327,   331,     0,   317,   325,   333,   334,
-     326,   314,   208,   216,     0,   201,   523,     0,   521,   522,
-     518,   519,   520,     0,   512,   513,   515,   516,   517,   508,
-       0,   465,     0,   229,   253,   254,   255,   256,   257,   258,
-     246,     0,     0,   544,   547,   548,   529,     0,     0,   553,
-      54,     0,     0,   410,     0,   435,     0,   660,     0,   658,
-     656,   650,   654,   655,     0,   648,   652,   653,   651,   645,
-     168,   169,   170,   171,   167,   173,   175,   177,   190,   193,
-     195,   197,   143,   266,   345,   382,     0,   316,   204,     0,
-       0,   510,     0,   467,   231,   541,   542,   543,   540,   546,
-     560,   562,    58,   412,   437,   504,     0,     0,     0,     0,
-     647,   318,     0,   525,   514,     0,   657,     0,   649,   524,
-       0,   659,   664,     0,   662,     0,     0,   661,   672,     0,
-       0,     0,     0,   666,   668,   669,   670,   671,   663,     0,
-       0,     0,     0,     0,   665,     0,   674,   675,   676,   667,
-     673
+     133,   135,     0,   137,     0,     0,   260,     0,   348,   337,
+       0,   385,   376,     0,     0,   310,     0,     0,   206,   223,
+       0,   214,     0,     0,   199,   511,     0,   506,   470,   461,
+       0,     0,   225,     0,     0,     0,     0,     0,     0,     0,
+       0,   244,     0,     0,     0,     0,     0,     0,   527,     0,
+       0,     0,   551,   566,    57,     0,    56,     0,   406,     0,
+       0,   431,     0,     0,   500,     0,     0,   645,   635,     0,
+       0,     0,     0,   178,   181,   182,   183,   184,     0,   191,
+     185,     0,     0,     0,   186,   187,   188,   145,     0,   141,
+       0,   264,     0,   343,     0,   380,   335,   330,   332,   323,
+     324,   319,   320,   321,   322,   328,   329,   327,   331,     0,
+     317,   325,   333,   334,   326,   314,   208,   216,     0,   201,
+     523,     0,   521,   522,   518,   519,   520,     0,   512,   513,
+     515,   516,   517,   508,     0,   465,     0,   229,   253,   254,
+     255,   256,   257,   258,   246,     0,     0,   544,   547,   548,
+     529,     0,     0,   553,    54,     0,     0,   410,     0,   435,
+       0,   662,     0,   660,   658,   652,   656,   657,     0,   650,
+     654,   655,   653,   647,   168,   169,   170,   171,   167,   173,
+     175,   177,   190,   193,   195,   197,   143,   266,   345,   382,
+       0,   316,   204,     0,     0,   510,     0,   467,   231,   541,
+     542,   543,   540,   546,   560,   562,    58,   412,   437,   504,
+       0,     0,     0,     0,   649,   318,     0,   525,   514,     0,
+     659,     0,   651,   524,     0,   661,   666,     0,   664,     0,
+       0,   663,   674,     0,     0,     0,     0,   668,   670,   671,
+     672,   673,   665,     0,     0,     0,     0,     0,   667,     0,
+     676,   677,   678,   669,   675
   };
 
   const short
   Dhcp6Parser::yypgoto_[] =
   {
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,    43,  -833,  -457,
-    -833,   192,  -833,  -833,  -833,  -833,   158,  -833,  -451,  -833,
-    -833,  -833,   -74,  -833,  -833,  -833,   426,  -833,  -833,  -833,
-    -833,   222,   311,  -833,  -833,   -62,   -46,   -45,   -43,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   224,   425,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,   155,  -833,   -29,
-    -833,  -572,    -7,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,   -70,  -833,  -605,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,   -35,  -833,  -833,  -833,  -833,
-    -833,   -21,  -592,  -833,  -833,  -833,  -833,   -23,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   -28,  -833,  -833,  -833,
-     -31,   398,  -833,  -833,  -833,  -833,  -833,  -833,  -833,   -34,
-    -833,  -833,  -833,  -833,  -833,  -833,  -832,  -833,  -833,  -833,
-      -9,  -833,  -833,  -833,     4,   438,  -833,  -833,  -831,  -833,
-    -830,  -833,   -36,  -833,   -32,  -833,   -42,  -833,  -833,  -833,
-    -827,  -833,  -833,  -833,  -833,    -5,  -833,  -833,  -178,   780,
-    -833,  -833,  -833,  -833,  -833,     3,  -833,  -833,  -833,    10,
-    -833,   424,  -833,   -76,  -833,  -833,  -833,  -833,  -833,   -69,
-    -833,  -833,  -833,  -833,  -833,   -11,  -833,  -833,  -833,     6,
-    -833,  -833,  -833,     5,  -833,   423,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,   -39,  -833,  -833,
-    -833,   -26,   459,  -833,  -833,   -58,  -833,   -24,  -833,  -833,
-    -833,  -833,  -833,   -40,  -833,  -833,  -833,   -25,   456,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,   -60,  -833,  -833,  -833,
-      -1,  -833,  -833,  -833,     9,  -833,   440,   252,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -824,  -833,  -833,  -833,  -833,  -833,  -833,  -833,    13,
-    -833,  -833,  -833,  -154,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,    -4,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,    -6,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,   269,   421,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,  -833,
-    -833,  -833,  -833,   295,   427,  -833,  -833,  -833,  -833,  -833,
-    -833,   306,   428,  -833,  -833,  -833,   -15,  -833,  -833,  -161,
-    -833,  -833,  -833,  -833,  -833,  -833,  -177,  -833,  -833,  -193,
-    -833,  -833,  -833,  -833,  -833
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,    43,  -837,  -460,
+    -837,   266,  -837,  -837,  -837,  -837,   165,  -837,  -472,  -837,
+    -837,  -837,   -74,  -837,  -837,  -837,   426,  -837,  -837,  -837,
+    -837,   205,   395,  -837,  -837,   -62,   -46,   -45,   -43,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,   186,   421,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,   150,  -837,   -19,
+    -837,  -576,    -7,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,   -70,  -837,  -609,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,   -35,  -837,  -837,  -837,  -837,
+    -837,   -37,  -596,  -837,  -837,  -837,  -837,   -23,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,   -33,  -837,  -837,  -837,
+     -26,   401,  -837,  -837,  -837,  -837,  -837,  -837,  -837,   -44,
+    -837,  -837,  -837,  -837,  -837,  -837,  -836,  -837,  -837,  -837,
+      -9,  -837,  -837,  -837,     1,   438,  -837,  -837,  -835,  -837,
+    -834,  -837,   -36,  -837,   -32,  -837,   -42,  -837,  -837,  -837,
+    -831,  -837,  -837,  -837,  -837,    -6,  -837,  -837,  -179,   781,
+    -837,  -837,  -837,  -837,  -837,     3,  -837,  -837,  -837,     7,
+    -837,   429,  -837,   -76,  -837,  -837,  -837,  -837,  -837,   -69,
+    -837,  -837,  -837,  -837,  -837,   -11,  -837,  -837,  -837,     5,
+    -837,  -837,  -837,     8,  -837,   411,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,   -39,  -837,  -837,
+    -837,   -31,   458,  -837,  -837,   -58,  -837,   -24,  -837,  -837,
+    -837,  -837,  -837,   -40,  -837,  -837,  -837,   -30,   454,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,   -60,  -837,  -837,  -837,
+       2,  -837,  -837,  -837,     9,  -837,   450,   247,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -828,  -837,  -837,  -837,  -837,  -837,  -837,  -837,    12,
+    -837,  -837,  -837,  -157,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,    -5,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,    -8,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,   270,   427,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,  -837,   295,   413,  -837,  -837,  -837,  -837,  -837,
+    -837,  -837,   303,   428,  -837,  -837,  -837,   -16,  -837,  -837,
+    -162,  -837,  -837,  -837,  -837,  -837,  -837,  -177,  -837,  -837,
+    -193,  -837,  -837,  -837,  -837,  -837
   };
 
   const short
@@ -4359,451 +4353,451 @@ namespace isc { namespace dhcp {
   {
       -1,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    88,    41,    42,
-      73,   605,    92,    93,    43,    72,    89,    90,   626,   806,
-     901,   902,   694,    45,    74,   101,   102,   103,   362,    47,
-      75,   141,   142,   143,   370,   144,   145,   146,   147,   148,
-     149,   381,   150,   372,    49,    76,   178,   179,   180,   404,
-     181,   151,   373,   152,   374,   153,   375,   718,   719,   720,
-     848,   695,   696,   697,   827,  1024,   698,   828,   699,   829,
-     700,   830,   701,   702,   441,   703,   704,   705,   706,   707,
-     708,   709,   710,   711,   836,   712,   713,   839,   714,   840,
-     715,   841,   154,   392,   752,   753,   754,   868,   155,   389,
-     739,   740,   741,   742,   156,   391,   747,   748,   749,   750,
-     157,   390,   158,   395,   763,   764,   765,   877,    65,    84,
-     310,   311,   312,   454,   313,   455,   159,   396,   772,   773,
-     774,   775,   776,   777,   778,   779,   160,   382,   722,   723,
-     724,   851,    51,    77,   199,   200,   201,   410,   202,   411,
-     203,   412,   204,   416,   205,   415,   161,   387,   611,   207,
-     208,   162,   388,   734,   735,   736,   860,   955,   956,   163,
-     383,    59,    81,   726,   727,   728,   854,    61,    82,   275,
-     276,   277,   278,   279,   280,   281,   440,   282,   444,   283,
-     443,   284,   285,   445,   286,   164,   384,   730,   731,   732,
-     857,    63,    83,   296,   297,   298,   299,   300,   449,   301,
-     302,   303,   304,   210,   408,   808,   809,   810,   903,    53,
-      78,   221,   222,   223,   420,   165,   385,   166,   386,   213,
-     409,   812,   813,   814,   906,    55,    79,   237,   238,   239,
-     423,   240,   241,   425,   242,   243,   167,   394,   759,   760,
-     761,   874,    57,    80,   255,   256,   257,   258,   431,   259,
-     432,   260,   433,   261,   434,   262,   435,   263,   436,   264,
-     430,   215,   417,   817,   818,   909,   168,   393,   756,   757,
-     871,   973,   974,   975,   976,   977,  1039,   978,   169,   397,
-     789,   790,   791,   888,  1048,   792,   793,   889,   794,   795,
-     170,   171,   399,   801,   802,   803,   895,   804,   896,   172,
-     400,   173,   401,    67,    85,   332,   333,   334,   335,   459,
-     336,   460,   337,   338,   462,   339,   340,   341,   465,   658,
-     342,   466,   343,   344,   345,   469,   665,   346,   470,   347,
-     471,   348,   472,   104,   364,   105,   365,   106,   366,   174,
-     371,    71,    87,   354,   355,   356,   478,   107,   363,    69,
-      86,   350,   351,   352,   475,   820,   821,   911,  1014,  1015,
-    1016,  1017,  1058,  1018,  1056,  1073,  1074,  1075,  1082,  1083,
-    1084,  1089,  1085,  1086,  1087
+      73,   609,    92,    93,    43,    72,    89,    90,   630,   810,
+     905,   906,   698,    45,    74,   101,   102,   103,   364,    47,
+      75,   141,   142,   143,   372,   144,   145,   146,   147,   148,
+     149,   383,   150,   374,    49,    76,   178,   179,   180,   406,
+     181,   151,   375,   152,   376,   153,   377,   722,   723,   724,
+     852,   699,   700,   701,   831,  1028,   702,   832,   703,   833,
+     704,   834,   705,   706,   443,   707,   708,   709,   710,   711,
+     712,   713,   714,   715,   840,   716,   717,   843,   718,   844,
+     719,   845,   154,   394,   756,   757,   758,   872,   155,   391,
+     743,   744,   745,   746,   156,   393,   751,   752,   753,   754,
+     157,   392,   158,   397,   767,   768,   769,   881,    65,    84,
+     310,   311,   312,   456,   313,   457,   159,   398,   776,   777,
+     778,   779,   780,   781,   782,   783,   160,   384,   726,   727,
+     728,   855,    51,    77,   199,   200,   201,   412,   202,   413,
+     203,   414,   204,   418,   205,   417,   161,   389,   615,   207,
+     208,   162,   390,   738,   739,   740,   864,   959,   960,   163,
+     385,    59,    81,   730,   731,   732,   858,    61,    82,   275,
+     276,   277,   278,   279,   280,   281,   442,   282,   446,   283,
+     445,   284,   285,   447,   286,   164,   386,   734,   735,   736,
+     861,    63,    83,   296,   297,   298,   299,   300,   451,   301,
+     302,   303,   304,   210,   410,   812,   813,   814,   907,    53,
+      78,   221,   222,   223,   422,   165,   387,   166,   388,   213,
+     411,   816,   817,   818,   910,    55,    79,   237,   238,   239,
+     425,   240,   241,   427,   242,   243,   167,   396,   763,   764,
+     765,   878,    57,    80,   255,   256,   257,   258,   433,   259,
+     434,   260,   435,   261,   436,   262,   437,   263,   438,   264,
+     432,   215,   419,   821,   822,   913,   168,   395,   760,   761,
+     875,   977,   978,   979,   980,   981,  1043,   982,   169,   399,
+     793,   794,   795,   892,  1052,   796,   797,   893,   798,   799,
+     170,   171,   401,   805,   806,   807,   899,   808,   900,   172,
+     402,   173,   403,    67,    85,   332,   333,   334,   335,   461,
+     336,   462,   337,   338,   464,   339,   340,   341,   467,   662,
+     342,   468,   343,   344,   345,   471,   669,   346,   472,   347,
+     473,   348,   474,   104,   366,   105,   367,   106,   368,   174,
+     373,    71,    87,   355,   356,   357,   480,   358,   107,   365,
+      69,    86,   350,   351,   352,   477,   824,   825,   915,  1018,
+    1019,  1020,  1021,  1062,  1022,  1060,  1077,  1078,  1079,  1086,
+    1087,  1088,  1093,  1089,  1090,  1091
   };
 
   const unsigned short
   Dhcp6Parser::yytable_[] =
   {
      100,   140,   177,   194,   217,   231,   251,   294,   273,   292,
-     309,   329,   274,   293,   295,   195,   786,   214,   182,   211,
-     224,   235,   253,   746,   287,   305,   716,   330,   948,   949,
-     950,   196,   197,   954,   198,   206,   960,    94,   175,   176,
-     368,   737,   218,   232,   245,   369,   219,   233,   604,   307,
-     308,   815,   183,   212,   225,   236,   254,   402,   288,   306,
-      40,   331,   403,   604,   307,   308,   209,   220,   234,   252,
-      33,    32,    34,   406,    35,    44,   123,   124,   407,   418,
-     108,   109,   632,   110,   419,   122,   111,   112,   113,    46,
-      48,   123,   124,   266,   638,   639,   640,    50,   226,   227,
-     228,   229,   230,   123,   124,    52,    54,   660,   661,   662,
-     663,   114,   115,   116,   117,   118,   119,   120,   121,   122,
-     738,    99,   191,    56,   267,   192,   268,   269,   796,   797,
-     270,   271,   272,   863,   421,   428,   864,   123,   124,   422,
-     429,   123,   124,   664,   125,  1020,  1021,  1022,  1023,   126,
-     127,   128,   129,   130,   780,   131,   866,   122,    58,   867,
-     132,  1078,   456,   681,  1079,  1080,  1081,   457,   216,   133,
-      60,   872,   134,    95,   873,   123,   124,   656,   657,   135,
-     473,    99,    96,    97,    98,   474,   912,   136,   137,   913,
-     476,   138,   139,   267,   191,   477,    99,   192,   737,   744,
-      99,   745,   123,   124,   948,   949,   950,    62,    99,   954,
-     123,   124,   960,   676,  1045,  1046,  1047,   122,   677,   678,
-     679,   680,   681,   682,   683,   684,   685,   686,   687,   688,
-     689,   690,   691,   692,   693,   123,   124,    64,    36,    37,
-      38,    39,    99,    66,   267,    68,    99,   479,   781,   782,
-     783,   784,   480,   244,   607,   608,   609,   610,    70,   245,
-     246,   247,   248,   249,   250,   122,   267,    91,   402,   114,
-     115,   116,   117,   823,   746,  1076,   934,   122,  1077,   353,
-      99,   476,   121,   123,   124,   349,   824,   184,   786,   185,
-    1007,   357,  1008,  1009,   100,   123,   124,   186,   187,   188,
-     189,   190,   125,   966,   967,   358,   360,    99,   766,   767,
-     768,   769,   770,   771,   191,    99,   359,   192,   132,   267,
-     289,   268,   269,   290,   291,   193,   479,   361,   140,   406,
-     845,   825,   177,   845,   826,   846,   123,   124,   847,   367,
-      99,   869,   437,   376,   194,   886,   870,   217,   182,   377,
-     887,   378,   893,   438,   231,   379,   195,   894,   214,   380,
-     211,   398,   897,   224,   251,   405,    99,   898,   413,   414,
-     235,   424,   196,   197,   273,   198,   206,   294,   274,   292,
-     253,   473,   183,   293,   295,   218,   899,   426,    99,   219,
-     287,   427,   232,   845,   212,   305,   233,   225,  1032,   329,
-      99,   481,   482,   418,   236,   439,  1036,   209,  1033,   442,
-     220,  1037,   446,   456,   254,   330,   421,   234,  1044,   447,
-     428,  1053,   448,  1059,   288,  1054,   450,   252,  1060,   306,
-     114,   115,   116,   117,   123,   124,   120,  1093,   122,   267,
-     451,    99,  1094,   452,   453,   496,   458,   461,   463,   331,
-     464,   467,   468,   483,   484,   485,   123,   124,   486,   187,
-     188,   487,   190,   125,   488,   490,   491,   492,   493,   494,
-     495,   497,   501,   498,   499,   191,   502,   500,   192,   503,
-     504,   505,   506,   507,   508,   509,   193,   510,   511,   512,
+     309,   329,   274,   293,   295,   195,   790,   214,   182,   211,
+     224,   235,   253,   750,   287,   305,   720,   330,   952,   953,
+     954,   196,   197,   958,   198,   206,   964,    94,   175,   176,
+     660,   661,   218,   232,   245,   741,   219,   233,   608,   307,
+     308,   819,   183,   212,   225,   236,   254,    32,   288,   306,
+      40,   331,   266,   608,   636,   267,   209,   220,   234,   252,
+      33,    44,    34,    46,    35,    48,   642,   643,   644,    91,
+     108,   109,   123,   124,   110,   307,   308,   111,   112,   113,
+     122,   123,   124,   267,    50,   268,   269,   370,    52,   270,
+     271,   272,   371,   226,   227,   228,   229,   230,   123,   124,
+     123,   124,   114,   115,   116,   117,   118,   119,   120,   121,
+     122,    99,   867,   122,   742,   868,   404,   191,   122,   267,
+     192,   405,  1082,    54,   216,  1083,  1084,  1085,   123,   124,
+      56,   123,   124,   408,   420,   125,   123,   124,   409,   421,
+     126,   127,   128,   129,   130,    58,   131,   353,   354,   784,
+     191,   132,  1011,   192,  1012,  1013,   970,   971,   685,   870,
+     133,    60,   871,   134,    95,   664,   665,   666,   667,   876,
+     135,   423,   877,    96,    97,    98,   424,    99,   136,   137,
+     430,    62,   138,   139,   458,   431,    99,   123,   124,   459,
+     916,    99,    64,   917,   952,   953,   954,   123,   124,   958,
+      66,   668,   964,    99,   680,    99,  1049,  1050,  1051,   681,
+     682,   683,   684,   685,   686,   687,   688,   689,   690,   691,
+     692,   693,   694,   695,   696,   697,    68,    70,   121,    36,
+      37,    38,    39,    99,   349,   267,    99,   122,   359,   800,
+     801,    99,   360,   785,   786,   787,   788,   770,   771,   772,
+     773,   774,   775,   475,   478,   123,   124,   482,   476,   479,
+     404,   362,   483,   361,   750,   827,   938,   114,   115,   116,
+     117,   478,   482,   244,   363,   122,   828,   829,   790,   245,
+     246,   247,   248,   249,   250,   184,   100,   185,   611,   612,
+     613,   614,    99,   123,   124,   186,   187,   188,   189,   190,
+     125,   369,    99,   378,   267,   289,   268,   269,   290,   291,
+     379,   380,   191,   408,   849,   192,   132,   381,   830,   850,
+     140,   123,   124,   193,   177,   849,   873,   890,   897,   901,
+     851,   874,   891,   898,   902,   382,   194,   475,   849,   217,
+     182,   400,   903,  1036,   420,   440,   231,   407,   195,  1037,
+     214,   415,   211,  1040,   458,   224,   251,    99,  1041,  1048,
+      99,   416,   235,   426,   196,   197,   273,   198,   206,   294,
+     274,   292,   253,   423,   183,   293,   295,   218,  1057,   428,
+     430,   219,   287,   450,   232,  1058,   212,   305,   233,   225,
+    1063,   329,  1097,   484,   485,  1064,   236,  1098,    99,   209,
+     741,   748,   220,   749,   429,  1080,   254,   330,  1081,   234,
+    1024,  1025,  1026,  1027,   439,   441,   288,   444,   448,   252,
+     449,   306,   114,   115,   116,   117,    99,   452,   120,   453,
+     122,   267,   454,   455,   123,   124,   460,   463,   465,   466,
+     469,   331,   470,   481,   486,   487,   488,   489,   123,   124,
+     490,   187,   188,   491,   190,   125,   493,   494,   495,   496,
+     497,   498,   499,   500,   501,   502,   503,   191,   504,   505,
+     192,   506,   507,   508,   509,   510,   511,   512,   193,   513,
+     514,   515,   516,   517,   518,   519,   520,   521,   522,   523,
      314,   315,   316,   317,   318,   319,   320,   321,   322,   323,
-     324,   325,   326,   513,   514,   515,   516,   517,   519,   520,
-     327,   328,   521,   523,   518,   140,   526,   524,   527,   528,
-     529,   530,   177,   533,   532,   534,   531,   535,   537,   591,
-     592,   593,   539,   541,   540,   545,   542,   543,   182,    99,
-     546,   547,   548,   549,   550,   551,   553,   785,   798,   554,
-     329,   555,   556,   557,   558,   559,   561,   562,   563,   565,
-     566,    99,   568,   787,   799,   569,   330,   570,   571,   572,
-     573,   575,   183,     1,     2,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,   574,   576,
-     579,   580,   577,   581,   578,   582,   584,   788,   800,   586,
-     331,   588,   594,   589,   600,   590,   595,   596,   597,   652,
-     598,   599,   601,   602,   603,   751,   612,    34,   606,   613,
-     614,   615,   629,   617,   616,   618,   619,   850,   630,   620,
-     621,   671,   622,   624,   625,   627,   628,   659,   669,   634,
-     631,   670,   633,   635,   636,   717,   637,   641,   721,   725,
-     729,   733,   755,   758,   762,   642,   807,   811,   819,   643,
-     644,   645,   646,   647,   648,   649,   650,   651,   653,   654,
-     655,   831,   832,   833,   834,   835,   837,   838,   842,   666,
-     667,   843,   844,   668,   853,   849,   852,   856,   855,   858,
-     859,   861,   862,   900,   865,   876,   875,   878,   879,   904,
-     880,   881,   882,   883,   884,   885,   890,   891,   892,   905,
-     908,   907,   623,   522,   915,   914,   910,   916,   917,   918,
-     919,   924,   927,   920,   928,   921,   929,   964,   923,   922,
-     991,   925,   926,   930,   931,   992,   997,   998,   932,  1001,
-     984,  1000,   985,   986,   987,   988,   989,   993,   994,   995,
-    1006,  1025,  1026,  1027,  1028,  1029,  1030,  1031,  1034,  1035,
-    1040,  1038,  1041,  1042,  1066,  1043,  1049,  1050,  1057,  1062,
-    1065,  1067,   743,  1070,  1090,  1051,  1072,   194,  1052,  1091,
-     273,   294,  1092,   292,   274,  1055,   942,   293,   295,   195,
-     947,   214,  1095,   211,   489,  1063,   287,   968,   943,   305,
-     251,   969,   958,   309,  1096,   196,   197,  1069,   198,   206,
-    1071,   672,  1100,   971,   944,   945,   253,   946,   953,   785,
-     675,   935,  1097,   798,   951,   822,  1098,   212,   952,   217,
-     288,   525,   231,   306,   965,   787,   959,  1010,   933,   799,
-     209,  1011,   962,   963,   937,   224,   982,   972,   235,   957,
-     254,   983,   990,  1012,   567,   936,   536,   961,  1061,   939,
-     970,   265,   940,   252,   938,   941,  1003,   218,  1005,   788,
-     232,   219,   560,   800,   233,   981,   564,  1002,   552,   225,
-     538,  1004,   236,   980,   544,   979,   816,  1013,  1064,   996,
-     674,   999,   220,   805,   583,   234,   673,  1019,  1068,  1088,
-    1099,     0,     0,     0,   585,     0,   587,     0,     0,     0,
+     324,   325,   326,   524,   526,   527,   529,   530,   531,   140,
+     327,   328,   532,   533,   534,   535,   177,   536,   537,   538,
+     540,   542,   595,   596,   597,   544,   548,   543,   545,   546,
+     549,   550,   182,   551,   552,   553,   554,   556,   557,    99,
+     559,   789,   802,   558,   329,   560,   561,   564,   562,   565,
+     566,   568,   569,    99,   572,   571,   573,   791,   803,   574,
+     330,   575,   578,   579,   582,   576,   183,     1,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,   580,   583,   577,   584,   585,   581,   587,   589,
+     590,   792,   804,   592,   331,   593,   598,   594,   599,   600,
+     601,   602,   656,   603,   605,   604,   606,   607,   854,   616,
+      34,   610,   617,   618,   619,   857,   621,   620,   622,   623,
+     923,   633,   624,   625,   626,   675,   628,   629,   631,   632,
+     673,   674,   634,   635,   637,   638,   639,   640,   663,   721,
+     641,   725,   729,   733,   737,   759,   762,   755,   645,   766,
+     811,   815,   823,   835,   836,   837,   838,   646,   839,   841,
+     647,   648,   649,   650,   651,   652,   653,   654,   655,   657,
+     658,   659,   842,   846,   847,   670,   848,   853,   884,   671,
+     672,   856,   859,   860,   862,   863,   866,   865,   924,   880,
+     869,   879,   883,   882,   885,   886,   887,   888,   889,   894,
+     895,   896,   904,   909,   908,   911,   912,  1005,   918,   914,
+     919,   920,   921,   922,   925,   926,   928,   931,   932,   927,
+     929,   930,   933,   968,   934,   995,   935,   996,  1001,   988,
+     936,   989,  1002,  1004,  1010,  1044,  1046,   990,   991,   992,
+     993,   997,   998,   999,  1029,  1030,  1031,  1032,  1033,  1034,
+    1035,  1038,  1039,  1045,  1042,  1047,  1061,  1053,  1066,  1069,
+    1054,  1055,  1071,  1076,  1074,  1094,  1095,  1096,  1099,  1056,
+    1059,   194,  1070,   747,   273,   294,   679,   292,   274,   627,
+     946,   293,   295,   195,   951,   214,   492,   211,   676,   525,
+     287,   972,   947,   305,   251,   973,   962,   309,  1067,   196,
+     197,  1073,   198,   206,  1075,  1104,  1100,   975,   948,   949,
+     253,   950,   957,   789,   826,  1101,  1102,   802,   955,   528,
+     966,   212,   956,   217,   288,   939,   231,   306,   969,   791,
+     963,  1014,   937,   803,   209,  1015,   994,   967,   941,   224,
+     987,   976,   235,   961,   254,   986,   940,  1016,   539,   570,
+     965,  1065,   265,   943,   974,   942,   567,   252,   945,   944,
+    1007,   218,  1009,   792,   232,   219,  1006,   804,   233,   563,
+    1008,   541,   985,   225,   547,   820,   236,   984,   983,  1068,
+     555,  1017,  1000,  1003,   678,   591,   220,   677,   809,   234,
+    1023,  1072,   586,  1092,  1103,     0,   588,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   942,     0,     0,     0,   947,     0,   968,     0,
-       0,     0,   969,     0,   943,     0,     0,     0,   958,     0,
-       0,     0,     0,     0,   971,  1010,     0,     0,     0,  1011,
-     944,   945,     0,   946,   953,     0,     0,     0,     0,     0,
-     951,  1012,     0,     0,   952,     0,     0,     0,     0,     0,
-       0,     0,   959,     0,     0,     0,     0,     0,   972,     0,
-       0,     0,     0,     0,     0,   957,     0,     0,     0,     0,
-       0,   970,     0,     0,     0,  1013
+       0,     0,     0,     0,     0,     0,   946,     0,     0,     0,
+     951,     0,   972,     0,     0,     0,   973,     0,   947,     0,
+       0,     0,   962,     0,     0,     0,     0,     0,   975,  1014,
+       0,     0,     0,  1015,   948,   949,     0,   950,   957,     0,
+       0,     0,     0,     0,   955,  1016,     0,     0,   956,     0,
+       0,     0,     0,     0,     0,     0,   963,     0,     0,     0,
+       0,     0,   976,     0,     0,     0,     0,     0,     0,   961,
+       0,     0,     0,     0,     0,   974,     0,     0,     0,  1017
   };
 
   const short
   Dhcp6Parser::yycheck_[] =
   {
       74,    75,    76,    77,    78,    79,    80,    83,    82,    83,
-      84,    85,    82,    83,    83,    77,   621,    77,    76,    77,
-      78,    79,    80,   615,    82,    83,   598,    85,   860,   860,
-     860,    77,    77,   860,    77,    77,   860,    10,    15,    16,
-       3,    94,    78,    79,    92,     8,    78,    79,   505,   101,
-     102,    99,    76,    77,    78,    79,    80,     3,    82,    83,
-      17,    85,     8,   520,   101,   102,    77,    78,    79,    80,
-       5,     0,     7,     3,     9,     7,    68,    69,     8,     3,
-      11,    12,   533,    14,     8,    50,    17,    18,    19,     7,
-       7,    68,    69,    20,   545,   546,   547,     7,    63,    64,
-      65,    66,    67,    68,    69,     7,     7,   140,   141,   142,
-     143,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-     173,   173,    87,     7,    51,    90,    53,    54,   120,   121,
-      57,    58,    59,     3,     3,     3,     6,    68,    69,     8,
-       8,    68,    69,   176,    75,    21,    22,    23,    24,    80,
-      81,    82,    83,    84,    20,    86,     3,    50,     7,     6,
-      91,   149,     3,    29,   152,   153,   154,     8,    61,   100,
-       7,     3,   103,   146,     6,    68,    69,   137,   138,   110,
-       3,   173,   155,   156,   157,     8,     3,   118,   119,     6,
-       3,   122,   123,    51,    87,     8,   173,    90,    94,    95,
-     173,    97,    68,    69,  1036,  1036,  1036,     7,   173,  1036,
-      68,    69,  1036,    20,   111,   112,   113,    50,    25,    26,
+      84,    85,    82,    83,    83,    77,   625,    77,    76,    77,
+      78,    79,    80,   619,    82,    83,   602,    85,   864,   864,
+     864,    77,    77,   864,    77,    77,   864,    10,    16,    17,
+     138,   139,    78,    79,    93,    95,    78,    79,   508,   102,
+     103,   100,    76,    77,    78,    79,    80,     0,    82,    83,
+      17,    85,    21,   523,   536,    52,    77,    78,    79,    80,
+       5,     7,     7,     7,     9,     7,   548,   549,   550,   174,
+      11,    12,    69,    70,    15,   102,   103,    18,    19,    20,
+      51,    69,    70,    52,     7,    54,    55,     3,     7,    58,
+      59,    60,     8,    64,    65,    66,    67,    68,    69,    70,
+      69,    70,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,   174,     3,    51,   174,     6,     3,    88,    51,    52,
+      91,     8,   150,     7,    62,   153,   154,   155,    69,    70,
+       7,    69,    70,     3,     3,    76,    69,    70,     8,     8,
+      81,    82,    83,    84,    85,     7,    87,    13,    14,    21,
+      88,    92,   149,    91,   151,   152,    89,    90,    30,     3,
+     101,     7,     6,   104,   147,   141,   142,   143,   144,     3,
+     111,     3,     6,   156,   157,   158,     8,   174,   119,   120,
+       3,     7,   123,   124,     3,     8,   174,    69,    70,     8,
+       3,   174,     7,     6,  1040,  1040,  1040,    69,    70,  1040,
+       7,   177,  1040,   174,    21,   174,   112,   113,   114,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-      37,    38,    39,    40,    41,    68,    69,     7,   173,   174,
-     175,   176,   173,     7,    51,     7,   173,     3,   114,   115,
-     116,   117,     8,    86,    76,    77,    78,    79,     7,    92,
-      93,    94,    95,    96,    97,    50,    51,   173,     3,    42,
-      43,    44,    45,     8,   866,     3,   848,    50,     6,    13,
-     173,     3,    49,    68,    69,   147,     8,    60,   893,    62,
-     148,     6,   150,   151,   368,    68,    69,    70,    71,    72,
-      73,    74,    75,    88,    89,     3,     8,   173,   104,   105,
-     106,   107,   108,   109,    87,   173,     4,    90,    91,    51,
-      52,    53,    54,    55,    56,    98,     3,     3,   402,     3,
-       3,     8,   406,     3,     8,     8,    68,    69,     8,     4,
-     173,     3,     8,     4,   418,     3,     8,   421,   406,     4,
-       8,     4,     3,     3,   428,     4,   418,     8,   418,     4,
-     418,     4,     3,   421,   438,     4,   173,     8,     4,     4,
-     428,     4,   418,   418,   448,   418,   418,   453,   448,   453,
-     438,     3,   406,   453,   453,   421,     8,     4,   173,   421,
-     448,     4,   428,     3,   418,   453,   428,   421,     8,   473,
-     173,   358,   359,     3,   428,     8,     3,   418,     8,     4,
-     421,     8,     4,     3,   438,   473,     3,   428,     8,     8,
-       3,     8,     3,     3,   448,     8,     4,   438,     8,   453,
-      42,    43,    44,    45,    68,    69,    48,     3,    50,    51,
-       4,   173,     8,     8,     3,   174,     4,     4,     4,   473,
-       4,     4,     4,   173,     4,     4,    68,    69,     4,    71,
-      72,     4,    74,    75,     4,     4,     4,     4,     4,     4,
-       4,   174,     4,   174,   174,    87,     4,   174,    90,     4,
-       4,     4,     4,     4,     4,     4,    98,     4,     4,     4,
-     124,   125,   126,   127,   128,   129,   130,   131,   132,   133,
-     134,   135,   136,     4,     4,     4,     4,     4,     4,     4,
-     144,   145,     4,     4,   174,   589,     4,   176,     4,     4,
-       4,     4,   596,     4,   176,     4,   174,     4,     4,   486,
-     487,   488,     4,     4,   174,     4,   174,   174,   596,   173,
-       4,     4,     4,     4,     4,     4,     4,   621,   622,     4,
-     624,   174,     4,     4,     4,   176,     4,   176,   176,     4,
-       4,   173,   176,   621,   622,     4,   624,     4,   174,     4,
-     174,     4,   596,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   174,     4,
-       4,     4,   176,     4,   176,     4,     4,   621,   622,     4,
-     624,     4,   173,     7,   173,     7,     7,     7,     7,   566,
-       7,     5,     5,     5,     5,    85,     5,     7,   173,     5,
-       5,     5,   173,     5,     7,     5,     5,     3,   173,     7,
-       7,   588,     7,     7,     5,     5,     5,   139,     5,     7,
-     173,     5,   173,   173,   173,     7,   173,   173,     7,     7,
-       7,     7,     7,     7,     7,   173,     7,     7,     7,   173,
-     173,   173,   173,   173,   173,   173,   173,   173,   173,   173,
-     173,     4,     4,     4,     4,     4,     4,     4,     4,   173,
-     173,     4,     4,   173,     3,     6,     6,     3,     6,     6,
-       3,     6,     3,   173,     6,     3,     6,     6,     3,     6,
-       4,     4,     4,     4,     4,     4,     4,     4,     4,     3,
-       3,     6,   520,   402,     4,     6,     8,     4,     4,     4,
-     174,     4,     4,   176,     4,   174,     4,     4,   174,   176,
-       4,   174,   174,   174,   174,     4,     4,     4,   176,     3,
-     174,     6,   174,   174,   174,   174,   174,   174,   174,   174,
-       4,   173,   173,   173,   173,   173,   173,   173,     8,     8,
-       4,   173,     8,     3,   174,     8,   173,   173,     4,     4,
-       4,     4,   614,     5,     4,   173,     7,   851,   173,     4,
-     854,   857,     4,   857,   854,   173,   860,   857,   857,   851,
-     860,   851,     4,   851,   368,   176,   854,   871,   860,   857,
-     874,   871,   860,   877,   176,   851,   851,   173,   851,   851,
-     173,   589,   173,   871,   860,   860,   874,   860,   860,   893,
-     596,   850,   174,   897,   860,   670,   174,   851,   860,   903,
-     854,   406,   906,   857,   869,   893,   860,   911,   845,   897,
-     851,   911,   863,   866,   853,   903,   877,   871,   906,   860,
-     874,   879,   886,   911,   456,   851,   418,   862,  1036,   856,
-     871,    81,   857,   874,   854,   859,   905,   903,   908,   893,
-     906,   903,   448,   897,   906,   876,   453,   903,   438,   903,
-     421,   906,   906,   874,   428,   872,   634,   911,  1042,   893,
-     595,   897,   903,   624,   473,   906,   590,   912,  1059,  1076,
-    1093,    -1,    -1,    -1,   476,    -1,   479,    -1,    -1,    -1,
+      37,    38,    39,    40,    41,    42,     7,     7,    50,   174,
+     175,   176,   177,   174,   148,    52,   174,    51,     6,   121,
+     122,   174,     3,   115,   116,   117,   118,   105,   106,   107,
+     108,   109,   110,     3,     3,    69,    70,     3,     8,     8,
+       3,     8,     8,     4,   870,     8,   852,    43,    44,    45,
+      46,     3,     3,    87,     3,    51,     8,     8,   897,    93,
+      94,    95,    96,    97,    98,    61,   370,    63,    77,    78,
+      79,    80,   174,    69,    70,    71,    72,    73,    74,    75,
+      76,     4,   174,     4,    52,    53,    54,    55,    56,    57,
+       4,     4,    88,     3,     3,    91,    92,     4,     8,     8,
+     404,    69,    70,    99,   408,     3,     3,     3,     3,     3,
+       8,     8,     8,     8,     8,     4,   420,     3,     3,   423,
+     408,     4,     8,     8,     3,     3,   430,     4,   420,     8,
+     420,     4,   420,     3,     3,   423,   440,   174,     8,     8,
+     174,     4,   430,     4,   420,   420,   450,   420,   420,   455,
+     450,   455,   440,     3,   408,   455,   455,   423,     8,     4,
+       3,   423,   450,     3,   430,     8,   420,   455,   430,   423,
+       3,   475,     3,   360,   361,     8,   430,     8,   174,   420,
+      95,    96,   423,    98,     4,     3,   440,   475,     6,   430,
+      22,    23,    24,    25,     8,     8,   450,     4,     4,   440,
+       8,   455,    43,    44,    45,    46,   174,     4,    49,     4,
+      51,    52,     8,     3,    69,    70,     4,     4,     4,     4,
+       4,   475,     4,     4,   174,     4,     4,     4,    69,    70,
+       4,    72,    73,     4,    75,    76,     4,     4,     4,     4,
+       4,     4,   175,   175,   175,   175,   175,    88,     4,     4,
+      91,     4,     4,     4,     4,     4,     4,     4,    99,     4,
+       4,     4,     4,     4,     4,     4,     4,   175,     4,     4,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,     4,     4,   177,     4,     4,     4,   593,
+     145,   146,     4,     4,   175,   177,   600,     4,     4,     4,
+       4,     4,   489,   490,   491,     4,     4,   175,   175,   175,
+       4,     4,   600,     4,     4,     4,     4,     4,     4,   174,
+       4,   625,   626,   175,   628,     4,     4,     4,   177,   177,
+     177,     4,     4,   174,     4,   177,     4,   625,   626,   175,
+     628,     4,     4,     4,     4,   175,   600,   159,   160,   161,
+     162,   163,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,   173,   177,     4,   175,     4,     4,   177,     4,     4,
+     175,   625,   626,     4,   628,     7,   174,     7,     7,     7,
+       7,     7,   569,     5,     5,   174,     5,     5,     3,     5,
+       7,   174,     5,     5,     5,     3,     5,     7,     5,     5,
+     175,   174,     7,     7,     7,   592,     7,     5,     5,     5,
+       5,     5,   174,   174,   174,     7,   174,   174,   140,     7,
+     174,     7,     7,     7,     7,     7,     7,    86,   174,     7,
+       7,     7,     7,     4,     4,     4,     4,   174,     4,     4,
+     174,   174,   174,   174,   174,   174,   174,   174,   174,   174,
+     174,   174,     4,     4,     4,   174,     4,     6,     4,   174,
+     174,     6,     6,     3,     6,     3,     3,     6,   177,     3,
+       6,     6,     3,     6,     4,     4,     4,     4,     4,     4,
+       4,     4,   174,     3,     6,     6,     3,     3,     6,     8,
+       4,     4,     4,     4,   175,   177,     4,     4,     4,   175,
+     175,   175,     4,     4,   175,     4,   175,     4,     4,   175,
+     177,   175,     4,     6,     4,     4,     3,   175,   175,   175,
+     175,   175,   175,   175,   174,   174,   174,   174,   174,   174,
+     174,     8,     8,     8,   174,     8,     4,   174,     4,     4,
+     174,   174,     4,     7,     5,     4,     4,     4,     4,   174,
+     174,   855,   175,   618,   858,   861,   600,   861,   858,   523,
+     864,   861,   861,   855,   864,   855,   370,   855,   593,   404,
+     858,   875,   864,   861,   878,   875,   864,   881,   177,   855,
+     855,   174,   855,   855,   174,   174,   177,   875,   864,   864,
+     878,   864,   864,   897,   674,   175,   175,   901,   864,   408,
+     867,   855,   864,   907,   858,   854,   910,   861,   873,   897,
+     864,   915,   849,   901,   855,   915,   890,   870,   857,   907,
+     883,   875,   910,   864,   878,   881,   855,   915,   420,   458,
+     866,  1040,    81,   860,   875,   858,   455,   878,   863,   861,
+     909,   907,   912,   897,   910,   907,   907,   901,   910,   450,
+     910,   423,   880,   907,   430,   638,   910,   878,   876,  1046,
+     440,   915,   897,   901,   599,   482,   907,   594,   628,   910,
+     916,  1063,   475,  1080,  1097,    -1,   478,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1036,    -1,    -1,    -1,  1036,    -1,  1042,    -1,
-      -1,    -1,  1042,    -1,  1036,    -1,    -1,    -1,  1036,    -1,
-      -1,    -1,    -1,    -1,  1042,  1059,    -1,    -1,    -1,  1059,
-    1036,  1036,    -1,  1036,  1036,    -1,    -1,    -1,    -1,    -1,
-    1036,  1059,    -1,    -1,  1036,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1036,    -1,    -1,    -1,    -1,    -1,  1042,    -1,
-      -1,    -1,    -1,    -1,    -1,  1036,    -1,    -1,    -1,    -1,
-      -1,  1042,    -1,    -1,    -1,  1059
+      -1,    -1,    -1,    -1,    -1,    -1,  1040,    -1,    -1,    -1,
+    1040,    -1,  1046,    -1,    -1,    -1,  1046,    -1,  1040,    -1,
+      -1,    -1,  1040,    -1,    -1,    -1,    -1,    -1,  1046,  1063,
+      -1,    -1,    -1,  1063,  1040,  1040,    -1,  1040,  1040,    -1,
+      -1,    -1,    -1,    -1,  1040,  1063,    -1,    -1,  1040,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1040,    -1,    -1,    -1,
+      -1,    -1,  1046,    -1,    -1,    -1,    -1,    -1,    -1,  1040,
+      -1,    -1,    -1,    -1,    -1,  1046,    -1,    -1,    -1,  1063
   };
 
   const unsigned short
   Dhcp6Parser::yystos_[] =
   {
-       0,   158,   159,   160,   161,   162,   163,   164,   165,   166,
-     167,   168,   169,   170,   171,   172,   178,   179,   180,   181,
-     182,   183,   184,   185,   186,   187,   188,   189,   190,   191,
-     192,   193,     0,     5,     7,     9,   173,   174,   175,   176,
-     194,   195,   196,   201,     7,   210,     7,   216,     7,   231,
-       7,   329,     7,   406,     7,   422,     7,   439,     7,   358,
-       7,   364,     7,   388,     7,   305,     7,   500,     7,   546,
-       7,   538,   202,   197,   211,   217,   232,   330,   407,   423,
-     440,   359,   365,   389,   306,   501,   547,   539,   194,   203,
-     204,   173,   199,   200,    10,   146,   155,   156,   157,   173,
-     209,   212,   213,   214,   530,   532,   534,   544,    11,    12,
-      14,    17,    18,    19,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    68,    69,    75,    80,    81,    82,    83,
-      84,    86,    91,   100,   103,   110,   118,   119,   122,   123,
-     209,   218,   219,   220,   222,   223,   224,   225,   226,   227,
-     229,   238,   240,   242,   279,   285,   291,   297,   299,   313,
-     323,   343,   348,   356,   382,   412,   414,   433,   463,   475,
-     487,   488,   496,   498,   536,    15,    16,   209,   233,   234,
-     235,   237,   412,   414,    60,    62,    70,    71,    72,    73,
-      74,    87,    90,    98,   209,   222,   223,   224,   225,   331,
-     332,   333,   335,   337,   339,   341,   343,   346,   347,   382,
-     400,   412,   414,   416,   433,   458,    61,   209,   339,   341,
-     382,   408,   409,   410,   412,   414,    63,    64,    65,    66,
-      67,   209,   339,   341,   382,   412,   414,   424,   425,   426,
-     428,   429,   431,   432,    86,    92,    93,    94,    95,    96,
-      97,   209,   382,   412,   414,   441,   442,   443,   444,   446,
-     448,   450,   452,   454,   456,   356,    20,    51,    53,    54,
-      57,    58,    59,   209,   260,   366,   367,   368,   369,   370,
-     371,   372,   374,   376,   378,   379,   381,   412,   414,    52,
-      55,    56,   209,   260,   370,   376,   390,   391,   392,   393,
-     394,   396,   397,   398,   399,   412,   414,   101,   102,   209,
-     307,   308,   309,   311,   124,   125,   126,   127,   128,   129,
-     130,   131,   132,   133,   134,   135,   136,   144,   145,   209,
-     412,   414,   502,   503,   504,   505,   507,   509,   510,   512,
-     513,   514,   517,   519,   520,   521,   524,   526,   528,   147,
-     548,   549,   550,    13,   540,   541,   542,     6,     3,     4,
-       8,     3,   215,   545,   531,   533,   535,     4,     3,     8,
-     221,   537,   230,   239,   241,   243,     4,     4,     4,     4,
-       4,   228,   324,   357,   383,   413,   415,   344,   349,   286,
-     298,   292,   280,   464,   434,   300,   314,   476,     4,   489,
-     497,   499,     3,     8,   236,     4,     3,     8,   401,   417,
-     334,   336,   338,     4,     4,   342,   340,   459,     3,     8,
-     411,     3,     8,   427,     4,   430,     4,     4,     3,     8,
-     457,   445,   447,   449,   451,   453,   455,     8,     3,     8,
-     373,   261,     4,   377,   375,   380,     4,     8,     3,   395,
-       4,     4,     8,     3,   310,   312,     3,     8,     4,   506,
-     508,     4,   511,     4,     4,   515,   518,     4,     4,   522,
-     525,   527,   529,     3,     8,   551,     3,     8,   543,     3,
-       8,   194,   194,   173,     4,     4,     4,     4,     4,   213,
-       4,     4,     4,     4,     4,     4,   174,   174,   174,   174,
-     174,     4,     4,     4,     4,     4,     4,     4,     4,     4,
-       4,     4,     4,     4,     4,     4,     4,     4,   174,     4,
-       4,     4,   219,     4,   176,   234,     4,     4,     4,     4,
-       4,   174,   176,     4,     4,     4,   332,     4,   409,     4,
-     174,     4,   174,   174,   425,     4,     4,     4,     4,     4,
-       4,     4,   443,     4,     4,   174,     4,     4,     4,   176,
-     368,     4,   176,   176,   392,     4,     4,   308,   176,     4,
-       4,   174,     4,   174,   174,     4,     4,   176,   176,     4,
-       4,     4,     4,   503,     4,   549,     4,   541,     4,     7,
-       7,   194,   194,   194,   173,     7,     7,     7,     7,     5,
-     173,     5,     5,     5,   196,   198,   173,    76,    77,    78,
-      79,   345,     5,     5,     5,     5,     7,     5,     5,     5,
-       7,     7,     7,   198,     7,     5,   205,     5,     5,   173,
-     173,   173,   205,   173,     7,   173,   173,   173,   205,   205,
-     205,   173,   173,   173,   173,   173,   173,   173,   173,   173,
-     173,   173,   194,   173,   173,   173,   137,   138,   516,   139,
-     140,   141,   142,   143,   176,   523,   173,   173,   173,     5,
-       5,   194,   218,   548,   540,   233,    20,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,   209,   248,   249,   250,   253,   255,
-     257,   259,   260,   262,   263,   264,   265,   266,   267,   268,
-     269,   270,   272,   273,   275,   277,   248,     7,   244,   245,
-     246,     7,   325,   326,   327,     7,   360,   361,   362,     7,
-     384,   385,   386,     7,   350,   351,   352,    94,   173,   287,
-     288,   289,   290,   203,    95,    97,   289,   293,   294,   295,
-     296,    85,   281,   282,   283,     7,   465,   466,     7,   435,
-     436,   437,     7,   301,   302,   303,   104,   105,   106,   107,
-     108,   109,   315,   316,   317,   318,   319,   320,   321,   322,
-      20,   114,   115,   116,   117,   209,   262,   412,   414,   477,
-     478,   479,   482,   483,   485,   486,   120,   121,   209,   412,
-     414,   490,   491,   492,   494,   502,   206,     7,   402,   403,
-     404,     7,   418,   419,   420,    99,   444,   460,   461,     7,
-     552,   553,   244,     8,     8,     8,     8,   251,   254,   256,
-     258,     4,     4,     4,     4,     4,   271,     4,     4,   274,
-     276,   278,     4,     4,     4,     3,     8,     8,   247,     6,
-       3,   328,     6,     3,   363,     6,     3,   387,     6,     3,
-     353,     6,     3,     3,     6,     6,     3,     6,   284,     3,
-       8,   467,     3,     6,   438,     6,     3,   304,     6,     3,
-       4,     4,     4,     4,     4,     4,     3,     8,   480,   484,
-       4,     4,     4,     3,     8,   493,   495,     3,     8,     8,
-     173,   207,   208,   405,     6,     3,   421,     6,     3,   462,
-       8,   554,     3,     6,     6,     4,     4,     4,     4,   174,
-     176,   174,   176,   174,     4,   174,   174,     4,     4,     4,
-     174,   174,   176,   249,   248,   246,   331,   327,   366,   362,
-     390,   386,   209,   222,   223,   224,   225,   260,   323,   335,
-     337,   339,   341,   343,   347,   354,   355,   382,   412,   414,
-     458,   352,   288,   294,     4,   282,    88,    89,   209,   260,
-     382,   412,   414,   468,   469,   470,   471,   472,   474,   466,
-     441,   437,   307,   303,   174,   174,   174,   174,   174,   174,
-     316,     4,     4,   174,   174,   174,   478,     4,     4,   491,
-       6,     3,   408,   404,   424,   420,     4,   148,   150,   151,
-     209,   260,   412,   414,   555,   556,   557,   558,   560,   553,
-      21,    22,    23,    24,   252,   173,   173,   173,   173,   173,
-     173,   173,     8,     8,     8,     8,     3,     8,   173,   473,
-       4,     8,     3,     8,     8,   111,   112,   113,   481,   173,
-     173,   173,   173,     8,     8,   173,   561,     4,   559,     3,
-       8,   355,     4,   176,   470,     4,   174,     4,   556,   173,
-       5,   173,     7,   562,   563,   564,     3,     6,   149,   152,
-     153,   154,   565,   566,   567,   569,   570,   571,   563,   568,
-       4,     4,     4,     3,     8,     4,   176,   174,   174,   566,
-     173
+       0,   159,   160,   161,   162,   163,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,   173,   179,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,   190,   191,   192,
+     193,   194,     0,     5,     7,     9,   174,   175,   176,   177,
+     195,   196,   197,   202,     7,   211,     7,   217,     7,   232,
+       7,   330,     7,   407,     7,   423,     7,   440,     7,   359,
+       7,   365,     7,   389,     7,   306,     7,   501,     7,   548,
+       7,   539,   203,   198,   212,   218,   233,   331,   408,   424,
+     441,   360,   366,   390,   307,   502,   549,   540,   195,   204,
+     205,   174,   200,   201,    10,   147,   156,   157,   158,   174,
+     210,   213,   214,   215,   531,   533,   535,   546,    11,    12,
+      15,    18,    19,    20,    43,    44,    45,    46,    47,    48,
+      49,    50,    51,    69,    70,    76,    81,    82,    83,    84,
+      85,    87,    92,   101,   104,   111,   119,   120,   123,   124,
+     210,   219,   220,   221,   223,   224,   225,   226,   227,   228,
+     230,   239,   241,   243,   280,   286,   292,   298,   300,   314,
+     324,   344,   349,   357,   383,   413,   415,   434,   464,   476,
+     488,   489,   497,   499,   537,    16,    17,   210,   234,   235,
+     236,   238,   413,   415,    61,    63,    71,    72,    73,    74,
+      75,    88,    91,    99,   210,   223,   224,   225,   226,   332,
+     333,   334,   336,   338,   340,   342,   344,   347,   348,   383,
+     401,   413,   415,   417,   434,   459,    62,   210,   340,   342,
+     383,   409,   410,   411,   413,   415,    64,    65,    66,    67,
+      68,   210,   340,   342,   383,   413,   415,   425,   426,   427,
+     429,   430,   432,   433,    87,    93,    94,    95,    96,    97,
+      98,   210,   383,   413,   415,   442,   443,   444,   445,   447,
+     449,   451,   453,   455,   457,   357,    21,    52,    54,    55,
+      58,    59,    60,   210,   261,   367,   368,   369,   370,   371,
+     372,   373,   375,   377,   379,   380,   382,   413,   415,    53,
+      56,    57,   210,   261,   371,   377,   391,   392,   393,   394,
+     395,   397,   398,   399,   400,   413,   415,   102,   103,   210,
+     308,   309,   310,   312,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   145,   146,   210,
+     413,   415,   503,   504,   505,   506,   508,   510,   511,   513,
+     514,   515,   518,   520,   521,   522,   525,   527,   529,   148,
+     550,   551,   552,    13,    14,   541,   542,   543,   545,     6,
+       3,     4,     8,     3,   216,   547,   532,   534,   536,     4,
+       3,     8,   222,   538,   231,   240,   242,   244,     4,     4,
+       4,     4,     4,   229,   325,   358,   384,   414,   416,   345,
+     350,   287,   299,   293,   281,   465,   435,   301,   315,   477,
+       4,   490,   498,   500,     3,     8,   237,     4,     3,     8,
+     402,   418,   335,   337,   339,     4,     4,   343,   341,   460,
+       3,     8,   412,     3,     8,   428,     4,   431,     4,     4,
+       3,     8,   458,   446,   448,   450,   452,   454,   456,     8,
+       3,     8,   374,   262,     4,   378,   376,   381,     4,     8,
+       3,   396,     4,     4,     8,     3,   311,   313,     3,     8,
+       4,   507,   509,     4,   512,     4,     4,   516,   519,     4,
+       4,   523,   526,   528,   530,     3,     8,   553,     3,     8,
+     544,     4,     3,     8,   195,   195,   174,     4,     4,     4,
+       4,     4,   214,     4,     4,     4,     4,     4,     4,   175,
+     175,   175,   175,   175,     4,     4,     4,     4,     4,     4,
+       4,     4,     4,     4,     4,     4,     4,     4,     4,     4,
+       4,   175,     4,     4,     4,   220,     4,   177,   235,     4,
+       4,     4,     4,     4,   175,   177,     4,     4,     4,   333,
+       4,   410,     4,   175,     4,   175,   175,   426,     4,     4,
+       4,     4,     4,     4,     4,   444,     4,     4,   175,     4,
+       4,     4,   177,   369,     4,   177,   177,   393,     4,     4,
+     309,   177,     4,     4,   175,     4,   175,   175,     4,     4,
+     177,   177,     4,     4,     4,     4,   504,     4,   551,     4,
+     175,   542,     4,     7,     7,   195,   195,   195,   174,     7,
+       7,     7,     7,     5,   174,     5,     5,     5,   197,   199,
+     174,    77,    78,    79,    80,   346,     5,     5,     5,     5,
+       7,     5,     5,     5,     7,     7,     7,   199,     7,     5,
+     206,     5,     5,   174,   174,   174,   206,   174,     7,   174,
+     174,   174,   206,   206,   206,   174,   174,   174,   174,   174,
+     174,   174,   174,   174,   174,   174,   195,   174,   174,   174,
+     138,   139,   517,   140,   141,   142,   143,   144,   177,   524,
+     174,   174,   174,     5,     5,   195,   219,   550,   541,   234,
+      21,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,   210,   249,
+     250,   251,   254,   256,   258,   260,   261,   263,   264,   265,
+     266,   267,   268,   269,   270,   271,   273,   274,   276,   278,
+     249,     7,   245,   246,   247,     7,   326,   327,   328,     7,
+     361,   362,   363,     7,   385,   386,   387,     7,   351,   352,
+     353,    95,   174,   288,   289,   290,   291,   204,    96,    98,
+     290,   294,   295,   296,   297,    86,   282,   283,   284,     7,
+     466,   467,     7,   436,   437,   438,     7,   302,   303,   304,
+     105,   106,   107,   108,   109,   110,   316,   317,   318,   319,
+     320,   321,   322,   323,    21,   115,   116,   117,   118,   210,
+     263,   413,   415,   478,   479,   480,   483,   484,   486,   487,
+     121,   122,   210,   413,   415,   491,   492,   493,   495,   503,
+     207,     7,   403,   404,   405,     7,   419,   420,   421,   100,
+     445,   461,   462,     7,   554,   555,   245,     8,     8,     8,
+       8,   252,   255,   257,   259,     4,     4,     4,     4,     4,
+     272,     4,     4,   275,   277,   279,     4,     4,     4,     3,
+       8,     8,   248,     6,     3,   329,     6,     3,   364,     6,
+       3,   388,     6,     3,   354,     6,     3,     3,     6,     6,
+       3,     6,   285,     3,     8,   468,     3,     6,   439,     6,
+       3,   305,     6,     3,     4,     4,     4,     4,     4,     4,
+       3,     8,   481,   485,     4,     4,     4,     3,     8,   494,
+     496,     3,     8,     8,   174,   208,   209,   406,     6,     3,
+     422,     6,     3,   463,     8,   556,     3,     6,     6,     4,
+       4,     4,     4,   175,   177,   175,   177,   175,     4,   175,
+     175,     4,     4,     4,   175,   175,   177,   250,   249,   247,
+     332,   328,   367,   363,   391,   387,   210,   223,   224,   225,
+     226,   261,   324,   336,   338,   340,   342,   344,   348,   355,
+     356,   383,   413,   415,   459,   353,   289,   295,     4,   283,
+      89,    90,   210,   261,   383,   413,   415,   469,   470,   471,
+     472,   473,   475,   467,   442,   438,   308,   304,   175,   175,
+     175,   175,   175,   175,   317,     4,     4,   175,   175,   175,
+     479,     4,     4,   492,     6,     3,   409,   405,   425,   421,
+       4,   149,   151,   152,   210,   261,   413,   415,   557,   558,
+     559,   560,   562,   555,    22,    23,    24,    25,   253,   174,
+     174,   174,   174,   174,   174,   174,     8,     8,     8,     8,
+       3,     8,   174,   474,     4,     8,     3,     8,     8,   112,
+     113,   114,   482,   174,   174,   174,   174,     8,     8,   174,
+     563,     4,   561,     3,     8,   356,     4,   177,   471,     4,
+     175,     4,   558,   174,     5,   174,     7,   564,   565,   566,
+       3,     6,   150,   153,   154,   155,   567,   568,   569,   571,
+     572,   573,   565,   570,     4,     4,     4,     3,     8,     4,
+     177,   175,   175,   568,   174
   };
 
   const unsigned short
   Dhcp6Parser::yyr1_[] =
   {
-       0,   177,   179,   178,   180,   178,   181,   178,   182,   178,
-     183,   178,   184,   178,   185,   178,   186,   178,   187,   178,
-     188,   178,   189,   178,   190,   178,   191,   178,   192,   178,
-     193,   178,   194,   194,   194,   194,   194,   194,   194,   195,
-     197,   196,   198,   199,   199,   200,   200,   202,   201,   203,
-     203,   204,   204,   206,   205,   207,   207,   208,   208,   209,
-     211,   210,   212,   212,   213,   213,   213,   213,   213,   213,
-     215,   214,   217,   216,   218,   218,   219,   219,   219,   219,
-     219,   219,   219,   219,   219,   219,   219,   219,   219,   219,
-     219,   219,   219,   219,   219,   219,   219,   219,   219,   219,
-     219,   219,   219,   219,   219,   219,   219,   219,   219,   221,
-     220,   222,   223,   224,   225,   226,   228,   227,   230,   229,
-     232,   231,   233,   233,   234,   234,   234,   234,   234,   236,
-     235,   237,   239,   238,   241,   240,   243,   242,   244,   244,
-     245,   245,   247,   246,   248,   248,   249,   249,   249,   249,
-     249,   249,   249,   249,   249,   249,   249,   249,   249,   249,
-     249,   249,   249,   249,   249,   249,   251,   250,   252,   252,
-     252,   252,   254,   253,   256,   255,   258,   257,   259,   261,
-     260,   262,   263,   264,   265,   266,   267,   268,   269,   271,
-     270,   272,   274,   273,   276,   275,   278,   277,   280,   279,
-     281,   281,   282,   284,   283,   286,   285,   287,   287,   288,
-     288,   289,   290,   292,   291,   293,   293,   294,   294,   294,
-     295,   296,   298,   297,   300,   299,   301,   301,   302,   302,
-     304,   303,   306,   305,   307,   307,   307,   308,   308,   310,
-     309,   312,   311,   314,   313,   315,   315,   316,   316,   316,
-     316,   316,   316,   317,   318,   319,   320,   321,   322,   324,
-     323,   325,   325,   326,   326,   328,   327,   330,   329,   331,
-     331,   332,   332,   332,   332,   332,   332,   332,   332,   332,
-     332,   332,   332,   332,   332,   332,   332,   332,   332,   332,
-     332,   334,   333,   336,   335,   338,   337,   340,   339,   342,
-     341,   344,   343,   345,   345,   345,   345,   346,   347,   349,
-     348,   350,   350,   351,   351,   353,   352,   354,   354,   355,
-     355,   355,   355,   355,   355,   355,   355,   355,   355,   355,
-     355,   355,   355,   355,   355,   355,   357,   356,   359,   358,
-     360,   360,   361,   361,   363,   362,   365,   364,   366,   366,
-     367,   367,   368,   368,   368,   368,   368,   368,   368,   368,
-     368,   368,   369,   370,   371,   373,   372,   375,   374,   377,
-     376,   378,   380,   379,   381,   383,   382,   384,   384,   385,
-     385,   387,   386,   389,   388,   390,   390,   391,   391,   392,
-     392,   392,   392,   392,   392,   392,   392,   392,   393,   395,
-     394,   396,   397,   398,   399,   401,   400,   402,   402,   403,
-     403,   405,   404,   407,   406,   408,   408,   409,   409,   409,
-     409,   409,   409,   409,   411,   410,   413,   412,   415,   414,
-     417,   416,   418,   418,   419,   419,   421,   420,   423,   422,
-     424,   424,   425,   425,   425,   425,   425,   425,   425,   425,
-     425,   425,   425,   427,   426,   428,   430,   429,   431,   432,
-     434,   433,   435,   435,   436,   436,   438,   437,   440,   439,
-     441,   441,   442,   442,   443,   443,   443,   443,   443,   443,
-     443,   443,   443,   443,   443,   445,   444,   447,   446,   449,
-     448,   451,   450,   453,   452,   455,   454,   457,   456,   459,
-     458,   460,   460,   462,   461,   464,   463,   465,   465,   467,
-     466,   468,   468,   469,   469,   470,   470,   470,   470,   470,
-     470,   470,   471,   473,   472,   474,   476,   475,   477,   477,
-     478,   478,   478,   478,   478,   478,   478,   478,   478,   480,
-     479,   481,   481,   481,   482,   484,   483,   485,   486,   487,
-     489,   488,   490,   490,   491,   491,   491,   491,   491,   493,
-     492,   495,   494,   497,   496,   499,   498,   501,   500,   502,
-     502,   503,   503,   503,   503,   503,   503,   503,   503,   503,
-     503,   503,   503,   503,   503,   503,   503,   503,   503,   504,
-     506,   505,   508,   507,   509,   511,   510,   512,   513,   515,
-     514,   516,   516,   518,   517,   519,   520,   522,   521,   523,
-     523,   523,   523,   523,   525,   524,   527,   526,   529,   528,
-     531,   530,   533,   532,   535,   534,   537,   536,   539,   538,
-     540,   540,   541,   543,   542,   545,   544,   547,   546,   548,
-     548,   549,   551,   550,   552,   552,   554,   553,   555,   555,
-     556,   556,   556,   556,   556,   556,   556,   557,   559,   558,
-     561,   560,   562,   562,   564,   563,   565,   565,   566,   566,
-     566,   566,   568,   567,   569,   570,   571
+       0,   178,   180,   179,   181,   179,   182,   179,   183,   179,
+     184,   179,   185,   179,   186,   179,   187,   179,   188,   179,
+     189,   179,   190,   179,   191,   179,   192,   179,   193,   179,
+     194,   179,   195,   195,   195,   195,   195,   195,   195,   196,
+     198,   197,   199,   200,   200,   201,   201,   203,   202,   204,
+     204,   205,   205,   207,   206,   208,   208,   209,   209,   210,
+     212,   211,   213,   213,   214,   214,   214,   214,   214,   214,
+     216,   215,   218,   217,   219,   219,   220,   220,   220,   220,
+     220,   220,   220,   220,   220,   220,   220,   220,   220,   220,
+     220,   220,   220,   220,   220,   220,   220,   220,   220,   220,
+     220,   220,   220,   220,   220,   220,   220,   220,   220,   222,
+     221,   223,   224,   225,   226,   227,   229,   228,   231,   230,
+     233,   232,   234,   234,   235,   235,   235,   235,   235,   237,
+     236,   238,   240,   239,   242,   241,   244,   243,   245,   245,
+     246,   246,   248,   247,   249,   249,   250,   250,   250,   250,
+     250,   250,   250,   250,   250,   250,   250,   250,   250,   250,
+     250,   250,   250,   250,   250,   250,   252,   251,   253,   253,
+     253,   253,   255,   254,   257,   256,   259,   258,   260,   262,
+     261,   263,   264,   265,   266,   267,   268,   269,   270,   272,
+     271,   273,   275,   274,   277,   276,   279,   278,   281,   280,
+     282,   282,   283,   285,   284,   287,   286,   288,   288,   289,
+     289,   290,   291,   293,   292,   294,   294,   295,   295,   295,
+     296,   297,   299,   298,   301,   300,   302,   302,   303,   303,
+     305,   304,   307,   306,   308,   308,   308,   309,   309,   311,
+     310,   313,   312,   315,   314,   316,   316,   317,   317,   317,
+     317,   317,   317,   318,   319,   320,   321,   322,   323,   325,
+     324,   326,   326,   327,   327,   329,   328,   331,   330,   332,
+     332,   333,   333,   333,   333,   333,   333,   333,   333,   333,
+     333,   333,   333,   333,   333,   333,   333,   333,   333,   333,
+     333,   335,   334,   337,   336,   339,   338,   341,   340,   343,
+     342,   345,   344,   346,   346,   346,   346,   347,   348,   350,
+     349,   351,   351,   352,   352,   354,   353,   355,   355,   356,
+     356,   356,   356,   356,   356,   356,   356,   356,   356,   356,
+     356,   356,   356,   356,   356,   356,   358,   357,   360,   359,
+     361,   361,   362,   362,   364,   363,   366,   365,   367,   367,
+     368,   368,   369,   369,   369,   369,   369,   369,   369,   369,
+     369,   369,   370,   371,   372,   374,   373,   376,   375,   378,
+     377,   379,   381,   380,   382,   384,   383,   385,   385,   386,
+     386,   388,   387,   390,   389,   391,   391,   392,   392,   393,
+     393,   393,   393,   393,   393,   393,   393,   393,   394,   396,
+     395,   397,   398,   399,   400,   402,   401,   403,   403,   404,
+     404,   406,   405,   408,   407,   409,   409,   410,   410,   410,
+     410,   410,   410,   410,   412,   411,   414,   413,   416,   415,
+     418,   417,   419,   419,   420,   420,   422,   421,   424,   423,
+     425,   425,   426,   426,   426,   426,   426,   426,   426,   426,
+     426,   426,   426,   428,   427,   429,   431,   430,   432,   433,
+     435,   434,   436,   436,   437,   437,   439,   438,   441,   440,
+     442,   442,   443,   443,   444,   444,   444,   444,   444,   444,
+     444,   444,   444,   444,   444,   446,   445,   448,   447,   450,
+     449,   452,   451,   454,   453,   456,   455,   458,   457,   460,
+     459,   461,   461,   463,   462,   465,   464,   466,   466,   468,
+     467,   469,   469,   470,   470,   471,   471,   471,   471,   471,
+     471,   471,   472,   474,   473,   475,   477,   476,   478,   478,
+     479,   479,   479,   479,   479,   479,   479,   479,   479,   481,
+     480,   482,   482,   482,   483,   485,   484,   486,   487,   488,
+     490,   489,   491,   491,   492,   492,   492,   492,   492,   494,
+     493,   496,   495,   498,   497,   500,   499,   502,   501,   503,
+     503,   504,   504,   504,   504,   504,   504,   504,   504,   504,
+     504,   504,   504,   504,   504,   504,   504,   504,   504,   505,
+     507,   506,   509,   508,   510,   512,   511,   513,   514,   516,
+     515,   517,   517,   519,   518,   520,   521,   523,   522,   524,
+     524,   524,   524,   524,   526,   525,   528,   527,   530,   529,
+     532,   531,   534,   533,   536,   535,   538,   537,   540,   539,
+     541,   541,   542,   542,   544,   543,   545,   547,   546,   549,
+     548,   550,   550,   551,   553,   552,   554,   554,   556,   555,
+     557,   557,   558,   558,   558,   558,   558,   558,   558,   559,
+     561,   560,   563,   562,   564,   564,   566,   565,   567,   567,
+     568,   568,   568,   568,   570,   569,   571,   572,   573
   };
 
   const unsigned char
@@ -4872,11 +4866,11 @@ namespace isc { namespace dhcp {
        4,     1,     1,     0,     4,     3,     3,     0,     4,     1,
        1,     1,     1,     1,     0,     4,     0,     4,     0,     4,
        0,     4,     0,     4,     0,     4,     0,     6,     0,     4,
-       1,     3,     1,     0,     6,     0,     6,     0,     4,     1,
-       3,     1,     0,     6,     1,     3,     0,     4,     1,     3,
-       1,     1,     1,     1,     1,     1,     1,     3,     0,     4,
-       0,     6,     1,     3,     0,     4,     1,     3,     1,     1,
-       1,     1,     0,     4,     3,     3,     3
+       1,     3,     1,     1,     0,     6,     3,     0,     6,     0,
+       4,     1,     3,     1,     0,     6,     1,     3,     0,     4,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     3,
+       0,     4,     0,     6,     1,     3,     0,     4,     1,     3,
+       1,     1,     1,     1,     0,     4,     3,     3,     3
   };
 
 
@@ -4888,26 +4882,26 @@ namespace isc { namespace dhcp {
   {
   "\"end of file\"", "error", "$undefined", "\",\"", "\":\"", "\"[\"",
   "\"]\"", "\"{\"", "\"}\"", "\"null\"", "\"Dhcp6\"", "\"data-directory\"",
-  "\"config-control\"", "\"config-databases\"", "\"interfaces-config\"",
-  "\"interfaces\"", "\"re-detect\"", "\"lease-database\"",
-  "\"hosts-database\"", "\"hosts-databases\"", "\"type\"", "\"memfile\"",
-  "\"mysql\"", "\"postgresql\"", "\"cql\"", "\"user\"", "\"password\"",
-  "\"host\"", "\"port\"", "\"persist\"", "\"lfc-interval\"",
-  "\"readonly\"", "\"connect-timeout\"", "\"contact-points\"",
-  "\"max-reconnect-tries\"", "\"reconnect-wait-time\"", "\"keyspace\"",
-  "\"consistency\"", "\"serial-consistency\"", "\"request-timeout\"",
-  "\"tcp-keepalive\"", "\"tcp-nodelay\"", "\"preferred-lifetime\"",
-  "\"valid-lifetime\"", "\"renew-timer\"", "\"rebind-timer\"",
-  "\"decline-probation-period\"", "\"server-tag\"", "\"subnet6\"",
-  "\"option-def\"", "\"option-data\"", "\"name\"", "\"data\"", "\"code\"",
-  "\"space\"", "\"csv-format\"", "\"always-send\"", "\"record-types\"",
-  "\"encapsulate\"", "\"array\"", "\"pools\"", "\"pool\"", "\"pd-pools\"",
-  "\"prefix\"", "\"prefix-len\"", "\"excluded-prefix\"",
-  "\"excluded-prefix-len\"", "\"delegated-len\"", "\"user-context\"",
-  "\"comment\"", "\"subnet\"", "\"interface\"", "\"interface-id\"",
-  "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"", "\"disabled\"",
-  "\"out-of-pool\"", "\"global\"", "\"all\"", "\"shared-networks\"",
-  "\"mac-sources\"", "\"relay-supplied-options\"",
+  "\"config-control\"", "\"config-databases\"",
+  "\"config-fetch-wait-time\"", "\"interfaces-config\"", "\"interfaces\"",
+  "\"re-detect\"", "\"lease-database\"", "\"hosts-database\"",
+  "\"hosts-databases\"", "\"type\"", "\"memfile\"", "\"mysql\"",
+  "\"postgresql\"", "\"cql\"", "\"user\"", "\"password\"", "\"host\"",
+  "\"port\"", "\"persist\"", "\"lfc-interval\"", "\"readonly\"",
+  "\"connect-timeout\"", "\"contact-points\"", "\"max-reconnect-tries\"",
+  "\"reconnect-wait-time\"", "\"keyspace\"", "\"consistency\"",
+  "\"serial-consistency\"", "\"request-timeout\"", "\"tcp-keepalive\"",
+  "\"tcp-nodelay\"", "\"preferred-lifetime\"", "\"valid-lifetime\"",
+  "\"renew-timer\"", "\"rebind-timer\"", "\"decline-probation-period\"",
+  "\"server-tag\"", "\"subnet6\"", "\"option-def\"", "\"option-data\"",
+  "\"name\"", "\"data\"", "\"code\"", "\"space\"", "\"csv-format\"",
+  "\"always-send\"", "\"record-types\"", "\"encapsulate\"", "\"array\"",
+  "\"pools\"", "\"pool\"", "\"pd-pools\"", "\"prefix\"", "\"prefix-len\"",
+  "\"excluded-prefix\"", "\"excluded-prefix-len\"", "\"delegated-len\"",
+  "\"user-context\"", "\"comment\"", "\"subnet\"", "\"interface\"",
+  "\"interface-id\"", "\"id\"", "\"rapid-commit\"", "\"reservation-mode\"",
+  "\"disabled\"", "\"out-of-pool\"", "\"global\"", "\"all\"",
+  "\"shared-networks\"", "\"mac-sources\"", "\"relay-supplied-options\"",
   "\"host-reservation-identifiers\"", "\"sanity-checks\"",
   "\"lease-checks\"", "\"client-classes\"", "\"require-client-classes\"",
   "\"test\"", "\"only-if-required\"", "\"client-class\"",
@@ -5021,87 +5015,88 @@ namespace isc { namespace dhcp {
   "dhcp4_json_object", "$@118", "dhcpddns_json_object", "$@119",
   "control_agent_json_object", "$@120", "config_control", "$@121",
   "sub_config_control", "$@122", "config_control_params",
-  "config_control_param", "config_databases", "$@123", "logging_object",
-  "$@124", "sub_logging", "$@125", "logging_params", "logging_param",
-  "loggers", "$@126", "loggers_entries", "logger_entry", "$@127",
-  "logger_params", "logger_param", "debuglevel", "severity", "$@128",
-  "output_options_list", "$@129", "output_options_list_content",
-  "output_entry", "$@130", "output_params_list", "output_params", "output",
-  "$@131", "flush", "maxsize", "maxver", YY_NULLPTR
+  "config_control_param", "config_databases", "$@123",
+  "config_fetch_wait_time", "logging_object", "$@124", "sub_logging",
+  "$@125", "logging_params", "logging_param", "loggers", "$@126",
+  "loggers_entries", "logger_entry", "$@127", "logger_params",
+  "logger_param", "debuglevel", "severity", "$@128", "output_options_list",
+  "$@129", "output_options_list_content", "output_entry", "$@130",
+  "output_params_list", "output_params", "output", "$@131", "flush",
+  "maxsize", "maxver", YY_NULLPTR
   };
 
 #if PARSER6_DEBUG
   const unsigned short
   Dhcp6Parser::yyrline_[] =
   {
-       0,   260,   260,   260,   261,   261,   262,   262,   263,   263,
-     264,   264,   265,   265,   266,   266,   267,   267,   268,   268,
-     269,   269,   270,   270,   271,   271,   272,   272,   273,   273,
-     274,   274,   282,   283,   284,   285,   286,   287,   288,   291,
-     296,   296,   307,   310,   311,   314,   318,   325,   325,   332,
-     333,   336,   340,   347,   347,   354,   355,   358,   362,   373,
-     383,   383,   398,   399,   403,   404,   405,   406,   407,   408,
-     411,   411,   426,   426,   435,   436,   441,   442,   443,   444,
-     445,   446,   447,   448,   449,   450,   451,   452,   453,   454,
-     455,   456,   457,   458,   459,   460,   461,   462,   463,   464,
-     465,   466,   467,   468,   469,   470,   471,   472,   473,   476,
-     476,   484,   489,   494,   499,   504,   509,   509,   517,   517,
-     528,   528,   537,   538,   541,   542,   543,   544,   545,   548,
-     548,   558,   564,   564,   576,   576,   588,   588,   598,   599,
-     602,   603,   606,   606,   616,   617,   620,   621,   622,   623,
-     624,   625,   626,   627,   628,   629,   630,   631,   632,   633,
-     634,   635,   636,   637,   638,   639,   642,   642,   649,   650,
-     651,   652,   655,   655,   663,   663,   671,   671,   679,   684,
-     684,   692,   697,   702,   707,   712,   717,   722,   727,   732,
-     732,   740,   745,   745,   753,   753,   761,   761,   769,   769,
-     779,   780,   782,   784,   784,   802,   802,   812,   813,   816,
-     817,   820,   825,   830,   830,   840,   841,   844,   845,   846,
-     849,   854,   861,   861,   871,   871,   881,   882,   885,   886,
-     889,   889,   899,   899,   909,   910,   911,   914,   915,   918,
-     918,   926,   926,   934,   934,   945,   946,   949,   950,   951,
-     952,   953,   954,   957,   962,   967,   972,   977,   982,   990,
-     990,  1003,  1004,  1007,  1008,  1015,  1015,  1041,  1041,  1052,
-    1053,  1057,  1058,  1059,  1060,  1061,  1062,  1063,  1064,  1065,
-    1066,  1067,  1068,  1069,  1070,  1071,  1072,  1073,  1074,  1075,
-    1076,  1079,  1079,  1087,  1087,  1095,  1095,  1103,  1103,  1111,
-    1111,  1121,  1121,  1128,  1129,  1130,  1131,  1134,  1139,  1147,
-    1147,  1158,  1159,  1163,  1164,  1167,  1167,  1175,  1176,  1179,
-    1180,  1181,  1182,  1183,  1184,  1185,  1186,  1187,  1188,  1189,
-    1190,  1191,  1192,  1193,  1194,  1195,  1202,  1202,  1215,  1215,
-    1224,  1225,  1228,  1229,  1234,  1234,  1249,  1249,  1263,  1264,
-    1267,  1268,  1271,  1272,  1273,  1274,  1275,  1276,  1277,  1278,
-    1279,  1280,  1283,  1285,  1290,  1292,  1292,  1300,  1300,  1308,
-    1308,  1316,  1318,  1318,  1326,  1335,  1335,  1347,  1348,  1353,
-    1354,  1359,  1359,  1371,  1371,  1383,  1384,  1389,  1390,  1395,
-    1396,  1397,  1398,  1399,  1400,  1401,  1402,  1403,  1406,  1408,
-    1408,  1416,  1418,  1420,  1425,  1433,  1433,  1445,  1446,  1449,
-    1450,  1453,  1453,  1463,  1463,  1472,  1473,  1476,  1477,  1478,
-    1479,  1480,  1481,  1482,  1485,  1485,  1493,  1493,  1518,  1518,
-    1548,  1548,  1560,  1561,  1564,  1565,  1568,  1568,  1580,  1580,
-    1592,  1593,  1596,  1597,  1598,  1599,  1600,  1601,  1602,  1603,
-    1604,  1605,  1606,  1609,  1609,  1617,  1622,  1622,  1630,  1635,
-    1643,  1643,  1653,  1654,  1657,  1658,  1661,  1661,  1670,  1670,
-    1679,  1680,  1683,  1684,  1688,  1689,  1690,  1691,  1692,  1693,
-    1694,  1695,  1696,  1697,  1698,  1701,  1701,  1711,  1711,  1721,
-    1721,  1729,  1729,  1737,  1737,  1745,  1745,  1753,  1753,  1766,
-    1766,  1776,  1777,  1780,  1780,  1791,  1791,  1801,  1802,  1805,
-    1805,  1815,  1816,  1819,  1820,  1823,  1824,  1825,  1826,  1827,
-    1828,  1829,  1832,  1834,  1834,  1842,  1850,  1850,  1862,  1863,
-    1866,  1867,  1868,  1869,  1870,  1871,  1872,  1873,  1874,  1877,
-    1877,  1884,  1885,  1886,  1889,  1894,  1894,  1902,  1907,  1914,
-    1921,  1921,  1931,  1932,  1935,  1936,  1937,  1938,  1939,  1942,
-    1942,  1950,  1950,  1960,  1960,  2000,  2000,  2012,  2012,  2022,
-    2023,  2026,  2027,  2028,  2029,  2030,  2031,  2032,  2033,  2034,
-    2035,  2036,  2037,  2038,  2039,  2040,  2041,  2042,  2043,  2046,
-    2051,  2051,  2059,  2059,  2067,  2072,  2072,  2080,  2085,  2090,
-    2090,  2098,  2099,  2102,  2102,  2110,  2115,  2120,  2120,  2128,
-    2131,  2134,  2137,  2140,  2146,  2146,  2154,  2154,  2162,  2162,
-    2172,  2172,  2179,  2179,  2186,  2186,  2195,  2195,  2206,  2206,
-    2216,  2217,  2221,  2224,  2224,  2239,  2239,  2249,  2249,  2260,
-    2261,  2265,  2269,  2269,  2281,  2282,  2286,  2286,  2294,  2295,
-    2298,  2299,  2300,  2301,  2302,  2303,  2304,  2307,  2312,  2312,
-    2320,  2320,  2330,  2331,  2334,  2334,  2342,  2343,  2346,  2347,
-    2348,  2349,  2352,  2352,  2360,  2365,  2370
+       0,   262,   262,   262,   263,   263,   264,   264,   265,   265,
+     266,   266,   267,   267,   268,   268,   269,   269,   270,   270,
+     271,   271,   272,   272,   273,   273,   274,   274,   275,   275,
+     276,   276,   284,   285,   286,   287,   288,   289,   290,   293,
+     298,   298,   309,   312,   313,   316,   320,   327,   327,   334,
+     335,   338,   342,   349,   349,   356,   357,   360,   364,   375,
+     385,   385,   400,   401,   405,   406,   407,   408,   409,   410,
+     413,   413,   428,   428,   437,   438,   443,   444,   445,   446,
+     447,   448,   449,   450,   451,   452,   453,   454,   455,   456,
+     457,   458,   459,   460,   461,   462,   463,   464,   465,   466,
+     467,   468,   469,   470,   471,   472,   473,   474,   475,   478,
+     478,   486,   491,   496,   501,   506,   511,   511,   519,   519,
+     530,   530,   539,   540,   543,   544,   545,   546,   547,   550,
+     550,   560,   566,   566,   578,   578,   590,   590,   600,   601,
+     604,   605,   608,   608,   618,   619,   622,   623,   624,   625,
+     626,   627,   628,   629,   630,   631,   632,   633,   634,   635,
+     636,   637,   638,   639,   640,   641,   644,   644,   651,   652,
+     653,   654,   657,   657,   665,   665,   673,   673,   681,   686,
+     686,   694,   699,   704,   709,   714,   719,   724,   729,   734,
+     734,   742,   747,   747,   755,   755,   763,   763,   771,   771,
+     781,   782,   784,   786,   786,   804,   804,   814,   815,   818,
+     819,   822,   827,   832,   832,   842,   843,   846,   847,   848,
+     851,   856,   863,   863,   873,   873,   883,   884,   887,   888,
+     891,   891,   901,   901,   911,   912,   913,   916,   917,   920,
+     920,   928,   928,   936,   936,   947,   948,   951,   952,   953,
+     954,   955,   956,   959,   964,   969,   974,   979,   984,   992,
+     992,  1005,  1006,  1009,  1010,  1017,  1017,  1043,  1043,  1054,
+    1055,  1059,  1060,  1061,  1062,  1063,  1064,  1065,  1066,  1067,
+    1068,  1069,  1070,  1071,  1072,  1073,  1074,  1075,  1076,  1077,
+    1078,  1081,  1081,  1089,  1089,  1097,  1097,  1105,  1105,  1113,
+    1113,  1123,  1123,  1130,  1131,  1132,  1133,  1136,  1141,  1149,
+    1149,  1160,  1161,  1165,  1166,  1169,  1169,  1177,  1178,  1181,
+    1182,  1183,  1184,  1185,  1186,  1187,  1188,  1189,  1190,  1191,
+    1192,  1193,  1194,  1195,  1196,  1197,  1204,  1204,  1217,  1217,
+    1226,  1227,  1230,  1231,  1236,  1236,  1251,  1251,  1265,  1266,
+    1269,  1270,  1273,  1274,  1275,  1276,  1277,  1278,  1279,  1280,
+    1281,  1282,  1285,  1287,  1292,  1294,  1294,  1302,  1302,  1310,
+    1310,  1318,  1320,  1320,  1328,  1337,  1337,  1349,  1350,  1355,
+    1356,  1361,  1361,  1373,  1373,  1385,  1386,  1391,  1392,  1397,
+    1398,  1399,  1400,  1401,  1402,  1403,  1404,  1405,  1408,  1410,
+    1410,  1418,  1420,  1422,  1427,  1435,  1435,  1447,  1448,  1451,
+    1452,  1455,  1455,  1465,  1465,  1474,  1475,  1478,  1479,  1480,
+    1481,  1482,  1483,  1484,  1487,  1487,  1495,  1495,  1520,  1520,
+    1550,  1550,  1562,  1563,  1566,  1567,  1570,  1570,  1582,  1582,
+    1594,  1595,  1598,  1599,  1600,  1601,  1602,  1603,  1604,  1605,
+    1606,  1607,  1608,  1611,  1611,  1619,  1624,  1624,  1632,  1637,
+    1645,  1645,  1655,  1656,  1659,  1660,  1663,  1663,  1672,  1672,
+    1681,  1682,  1685,  1686,  1690,  1691,  1692,  1693,  1694,  1695,
+    1696,  1697,  1698,  1699,  1700,  1703,  1703,  1713,  1713,  1723,
+    1723,  1731,  1731,  1739,  1739,  1747,  1747,  1755,  1755,  1768,
+    1768,  1778,  1779,  1782,  1782,  1793,  1793,  1803,  1804,  1807,
+    1807,  1817,  1818,  1821,  1822,  1825,  1826,  1827,  1828,  1829,
+    1830,  1831,  1834,  1836,  1836,  1844,  1852,  1852,  1864,  1865,
+    1868,  1869,  1870,  1871,  1872,  1873,  1874,  1875,  1876,  1879,
+    1879,  1886,  1887,  1888,  1891,  1896,  1896,  1904,  1909,  1916,
+    1923,  1923,  1933,  1934,  1937,  1938,  1939,  1940,  1941,  1944,
+    1944,  1952,  1952,  1962,  1962,  2002,  2002,  2014,  2014,  2024,
+    2025,  2028,  2029,  2030,  2031,  2032,  2033,  2034,  2035,  2036,
+    2037,  2038,  2039,  2040,  2041,  2042,  2043,  2044,  2045,  2048,
+    2053,  2053,  2061,  2061,  2069,  2074,  2074,  2082,  2087,  2092,
+    2092,  2100,  2101,  2104,  2104,  2112,  2117,  2122,  2122,  2130,
+    2133,  2136,  2139,  2142,  2148,  2148,  2156,  2156,  2164,  2164,
+    2174,  2174,  2181,  2181,  2188,  2188,  2197,  2197,  2208,  2208,
+    2218,  2219,  2223,  2224,  2227,  2227,  2237,  2247,  2247,  2257,
+    2257,  2268,  2269,  2273,  2277,  2277,  2289,  2290,  2294,  2294,
+    2302,  2303,  2306,  2307,  2308,  2309,  2310,  2311,  2312,  2315,
+    2320,  2320,  2328,  2328,  2338,  2339,  2342,  2342,  2350,  2351,
+    2354,  2355,  2356,  2357,  2360,  2360,  2368,  2373,  2378
   };
 
   // Print the state stack on the debug stream.
@@ -5134,10 +5129,10 @@ namespace isc { namespace dhcp {
 #endif // PARSER6_DEBUG
 
 
-#line 14 "dhcp6_parser.yy" // lalr1.cc:1242
+#line 14 "dhcp6_parser.yy" // lalr1.cc:1218
 } } // isc::dhcp
-#line 5140 "dhcp6_parser.cc" // lalr1.cc:1242
-#line 2375 "dhcp6_parser.yy" // lalr1.cc:1243
+#line 5135 "dhcp6_parser.cc" // lalr1.cc:1218
+#line 2383 "dhcp6_parser.yy" // lalr1.cc:1219
 
 
 void
index b6bf2fc1dba6199d2fc3dc78bfd968ca47ed68df..eff48a601510efe6992fb68da7a2124e83d74530 100644 (file)
@@ -1,8 +1,8 @@
-// A Bison parser, made by GNU Bison 3.3.2.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Skeleton interface for Bison LALR(1) parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@
 #ifndef YY_PARSER6_DHCP6_PARSER_H_INCLUDED
 # define YY_PARSER6_DHCP6_PARSER_H_INCLUDED
 // //                    "%code requires" blocks.
-#line 17 "dhcp6_parser.yy" // lalr1.cc:401
+#line 17 "dhcp6_parser.yy" // lalr1.cc:404
 
 #include <string>
 #include <cc/data.h>
@@ -56,7 +56,7 @@ using namespace isc::dhcp;
 using namespace isc::data;
 using namespace std;
 
-#line 60 "dhcp6_parser.h" // lalr1.cc:401
+#line 60 "dhcp6_parser.h" // lalr1.cc:404
 
 # include <cassert>
 # include <cstdlib> // std::abort
@@ -65,14 +65,8 @@ using namespace std;
 # include <string>
 # include <vector>
 
-#if defined __cplusplus
-# define YY_CPLUSPLUS __cplusplus
-#else
-# define YY_CPLUSPLUS 199711L
-#endif
-
 // Support move semantics when possible.
-#if 201103L <= YY_CPLUSPLUS
+#if defined __cplusplus && 201103L <= __cplusplus
 # define YY_MOVE           std::move
 # define YY_MOVE_OR_COPY   move
 # define YY_MOVE_REF(Type) Type&&
@@ -85,22 +79,6 @@ using namespace std;
 # define YY_RVREF(Type)    const Type&
 # define YY_COPY(Type)     const Type&
 #endif
-
-// Support noexcept when possible.
-#if 201103L <= YY_CPLUSPLUS
-# define YY_NOEXCEPT noexcept
-# define YY_NOTHROW
-#else
-# define YY_NOEXCEPT
-# define YY_NOTHROW throw ()
-#endif
-
-// Support constexpr when possible.
-#if 201703 <= YY_CPLUSPLUS
-# define YY_CONSTEXPR constexpr
-#else
-# define YY_CONSTEXPR
-#endif
 # include "location.hh"
 #include <typeinfo>
 #ifndef YYASSERT
@@ -178,79 +156,193 @@ using namespace std;
 # endif /* ! defined YYDEBUG */
 #endif  /* ! defined PARSER6_DEBUG */
 
-#line 14 "dhcp6_parser.yy" // lalr1.cc:401
+#line 14 "dhcp6_parser.yy" // lalr1.cc:404
 namespace isc { namespace dhcp {
-#line 184 "dhcp6_parser.h" // lalr1.cc:401
+#line 162 "dhcp6_parser.h" // lalr1.cc:404
 
+  /// A stack with random access from its top.
+  template <typename T, typename S = std::vector<T> >
+  class stack
+  {
+  public:
+    // Hide our reversed order.
+    typedef typename S::reverse_iterator iterator;
+    typedef typename S::const_reverse_iterator const_iterator;
+    typedef typename S::size_type size_type;
 
+    stack (size_type n = 200)
+      : seq_ (n)
+    {}
 
-  /// A Bison parser.
-  class Dhcp6Parser
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    T&
+    operator[] (size_type i)
+    {
+      return seq_[size () - 1 - i];
+    }
+
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    T&
+    operator[] (int i)
+    {
+      return operator[] (size_type (i));
+    }
+
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    const T&
+    operator[] (size_type i) const
+    {
+      return seq_[size () - 1 - i];
+    }
+
+    /// Random access.
+    ///
+    /// Index 0 returns the topmost element.
+    const T&
+    operator[] (int i) const
+    {
+      return operator[] (size_type (i));
+    }
+
+    /// Steal the contents of \a t.
+    ///
+    /// Close to move-semantics.
+    void
+    push (YY_MOVE_REF (T) t)
+    {
+      seq_.push_back (T ());
+      operator[](0).move (t);
+    }
+
+    void
+    pop (int n = 1)
+    {
+      for (; 0 < n; --n)
+        seq_.pop_back ();
+    }
+
+    void
+    clear ()
+    {
+      seq_.clear ();
+    }
+
+    size_type
+    size () const
+    {
+      return seq_.size ();
+    }
+
+    const_iterator
+    begin () const
+    {
+      return seq_.rbegin ();
+    }
+
+    const_iterator
+    end () const
+    {
+      return seq_.rend ();
+    }
+
+  private:
+    stack (const stack&);
+    stack& operator= (const stack&);
+    /// The wrapped container.
+    S seq_;
+  };
+
+  /// Present a slice of the top of a stack.
+  template <typename T, typename S = stack<T> >
+  class slice
   {
   public:
-#ifndef PARSER6_STYPE
-  /// A buffer to store and retrieve objects.
+    slice (const S& stack, int range)
+      : stack_ (stack)
+      , range_ (range)
+    {}
+
+    const T&
+    operator[] (int i) const
+    {
+      return stack_[range_ - i];
+    }
+
+  private:
+    const S& stack_;
+    int range_;
+  };
+
+
+
+  /// A char[S] buffer to store and retrieve objects.
   ///
   /// Sort of a variant, but does not keep track of the nature
   /// of the stored data, since that knowledge is available
-  /// via the current parser state.
-  class semantic_type
+  /// via the current state.
+  template <size_t S>
+  struct variant
   {
-  public:
     /// Type of *this.
-    typedef semantic_type self_type;
+    typedef variant<S> self_type;
 
     /// Empty construction.
-    semantic_type () YY_NOEXCEPT
+    variant ()
       : yybuffer_ ()
       , yytypeid_ (YY_NULLPTR)
     {}
 
     /// Construct and fill.
     template <typename T>
-    semantic_type (YY_RVREF (T) t)
+    variant (YY_RVREF (T) t)
       : yytypeid_ (&typeid (T))
     {
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       new (yyas_<T> ()) T (YY_MOVE (t));
     }
 
     /// Destruction, allowed only if empty.
-    ~semantic_type () YY_NOEXCEPT
+    ~variant ()
     {
       YYASSERT (!yytypeid_);
     }
 
-# if 201103L <= YY_CPLUSPLUS
-    /// Instantiate a \a T in here from \a t.
-    template <typename T, typename... U>
-    T&
-    emplace (U&&... u)
-    {
-      YYASSERT (!yytypeid_);
-      YYASSERT (sizeof (T) <= size);
-      yytypeid_ = & typeid (T);
-      return *new (yyas_<T> ()) T (std::forward <U>(u)...);
-    }
-# else
     /// Instantiate an empty \a T in here.
     template <typename T>
     T&
     emplace ()
     {
       YYASSERT (!yytypeid_);
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T ();
     }
 
+# if defined __cplusplus && 201103L <= __cplusplus
+    /// Instantiate a \a T in here from \a t.
+    template <typename T, typename U>
+    T&
+    emplace (U&& u)
+    {
+      YYASSERT (!yytypeid_);
+      YYASSERT (sizeof (T) <= S);
+      yytypeid_ = & typeid (T);
+      return *new (yyas_<T> ()) T (std::forward <U>(u));
+    }
+# else
     /// Instantiate a \a T in here from \a t.
     template <typename T>
     T&
     emplace (const T& t)
     {
       YYASSERT (!yytypeid_);
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       yytypeid_ = & typeid (T);
       return *new (yyas_<T> ()) T (t);
     }
@@ -277,75 +369,75 @@ namespace isc { namespace dhcp {
     /// Accessor to a built \a T.
     template <typename T>
     T&
-    as () YY_NOEXCEPT
+    as ()
     {
       YYASSERT (yytypeid_);
       YYASSERT (*yytypeid_ == typeid (T));
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       return *yyas_<T> ();
     }
 
     /// Const accessor to a built \a T (for %printer).
     template <typename T>
     const T&
-    as () const YY_NOEXCEPT
+    as () const
     {
       YYASSERT (yytypeid_);
       YYASSERT (*yytypeid_ == typeid (T));
-      YYASSERT (sizeof (T) <= size);
+      YYASSERT (sizeof (T) <= S);
       return *yyas_<T> ();
     }
 
-    /// Swap the content with \a that, of same type.
+    /// Swap the content with \a other, of same type.
     ///
     /// Both variants must be built beforehand, because swapping the actual
     /// data requires reading it (with as()), and this is not possible on
     /// unconstructed variants: it would require some dynamic testing, which
     /// should not be the variant's responsibility.
     /// Swapping between built and (possibly) non-built is done with
-    /// self_type::move ().
+    /// variant::move ().
     template <typename T>
     void
-    swap (self_type& that) YY_NOEXCEPT
+    swap (self_type& other)
     {
       YYASSERT (yytypeid_);
-      YYASSERT (*yytypeid_ == *that.yytypeid_);
-      std::swap (as<T> (), that.as<T> ());
+      YYASSERT (*yytypeid_ == *other.yytypeid_);
+      std::swap (as<T> (), other.as<T> ());
     }
 
-    /// Move the content of \a that to this.
+    /// Move the content of \a other to this.
     ///
-    /// Destroys \a that.
+    /// Destroys \a other.
     template <typename T>
     void
-    move (self_type& that)
+    move (self_type& other)
     {
-# if 201103L <= YY_CPLUSPLUS
-      emplace<T> (std::move (that.as<T> ()));
+# if defined __cplusplus && 201103L <= __cplusplus
+      emplace<T> (std::move (other.as<T> ()));
 # else
       emplace<T> ();
-      swap<T> (that);
+      swap<T> (other);
 # endif
-      that.destroy<T> ();
+      other.destroy<T> ();
     }
 
-# if 201103L <= YY_CPLUSPLUS
-    /// Move the content of \a that to this.
+# if defined __cplusplus && 201103L <= __cplusplus
+    /// Move the content of \a other to this.
     template <typename T>
     void
-    move (self_type&& that)
+    move (self_type&& other)
     {
-      emplace<T> (std::move (that.as<T> ()));
-      that.destroy<T> ();
+      emplace<T> (std::move (other.as<T> ()));
+      other.destroy<T> ();
     }
 #endif
 
-    /// Copy the content of \a that to this.
+    /// Copy the content of \a other to this.
     template <typename T>
     void
-    copy (const self_type& that)
+    copy (const self_type& other)
     {
-      emplace<T> (that.as<T> ());
+      emplace<T> (other.as<T> ());
     }
 
     /// Destroy the stored \a T.
@@ -360,12 +452,12 @@ namespace isc { namespace dhcp {
   private:
     /// Prohibit blind copies.
     self_type& operator= (const self_type&);
-    semantic_type (const self_type&);
+    variant (const self_type&);
 
     /// Accessor to raw memory as \a T.
     template <typename T>
     T*
-    yyas_ () YY_NOEXCEPT
+    yyas_ ()
     {
       void *yyp = yybuffer_.yyraw;
       return static_cast<T*> (yyp);
@@ -374,12 +466,30 @@ namespace isc { namespace dhcp {
     /// Const accessor to raw memory as \a T.
     template <typename T>
     const T*
-    yyas_ () const YY_NOEXCEPT
+    yyas_ () const
     {
       const void *yyp = yybuffer_.yyraw;
       return static_cast<const T*> (yyp);
      }
 
+    union
+    {
+      /// Strongest alignment constraints.
+      long double yyalign_me;
+      /// A buffer large enough to store any of the semantic values.
+      char yyraw[S];
+    } yybuffer_;
+
+    /// Whether the content is built: if defined, the name of the stored type.
+    const std::type_info *yytypeid_;
+  };
+
+
+  /// A Bison parser.
+  class Dhcp6Parser
+  {
+  public:
+#ifndef PARSER6_STYPE
     /// An auxiliary type to compute the largest semantic type.
     union union_type
     {
@@ -403,24 +513,10 @@ namespace isc { namespace dhcp {
 
       // "constant string"
       char dummy5[sizeof (std::string)];
-    };
-
-    /// The size of the largest semantic type.
-    enum { size = sizeof (union_type) };
-
-    /// A buffer to store semantic values.
-    union
-    {
-      /// Strongest alignment constraints.
-      long double yyalign_me;
-      /// A buffer large enough to store any of the semantic values.
-      char yyraw[size];
-    } yybuffer_;
-
-    /// Whether the content is built: if defined, the name of the stored type.
-    const std::type_info *yytypeid_;
-  };
+};
 
+    /// Symbol semantic values.
+    typedef variant<sizeof (union_type)> semantic_type;
 #else
     typedef PARSER6_STYPE semantic_type;
 #endif
@@ -430,18 +526,7 @@ namespace isc { namespace dhcp {
     /// Syntax errors thrown from user actions.
     struct syntax_error : std::runtime_error
     {
-      syntax_error (const location_type& l, const std::string& m)
-        : std::runtime_error (m)
-        , location (l)
-      {}
-
-      syntax_error (const syntax_error& s)
-        : std::runtime_error (s.what ())
-        , location (s.location)
-      {}
-
-      ~syntax_error () YY_NOEXCEPT YY_NOTHROW;
-
+      syntax_error (const location_type& l, const std::string& m);
       location_type location;
     };
 
@@ -462,169 +547,170 @@ namespace isc { namespace dhcp {
         TOKEN_DATA_DIRECTORY = 266,
         TOKEN_CONFIG_CONTROL = 267,
         TOKEN_CONFIG_DATABASES = 268,
-        TOKEN_INTERFACES_CONFIG = 269,
-        TOKEN_INTERFACES = 270,
-        TOKEN_RE_DETECT = 271,
-        TOKEN_LEASE_DATABASE = 272,
-        TOKEN_HOSTS_DATABASE = 273,
-        TOKEN_HOSTS_DATABASES = 274,
-        TOKEN_TYPE = 275,
-        TOKEN_MEMFILE = 276,
-        TOKEN_MYSQL = 277,
-        TOKEN_POSTGRESQL = 278,
-        TOKEN_CQL = 279,
-        TOKEN_USER = 280,
-        TOKEN_PASSWORD = 281,
-        TOKEN_HOST = 282,
-        TOKEN_PORT = 283,
-        TOKEN_PERSIST = 284,
-        TOKEN_LFC_INTERVAL = 285,
-        TOKEN_READONLY = 286,
-        TOKEN_CONNECT_TIMEOUT = 287,
-        TOKEN_CONTACT_POINTS = 288,
-        TOKEN_MAX_RECONNECT_TRIES = 289,
-        TOKEN_RECONNECT_WAIT_TIME = 290,
-        TOKEN_KEYSPACE = 291,
-        TOKEN_CONSISTENCY = 292,
-        TOKEN_SERIAL_CONSISTENCY = 293,
-        TOKEN_REQUEST_TIMEOUT = 294,
-        TOKEN_TCP_KEEPALIVE = 295,
-        TOKEN_TCP_NODELAY = 296,
-        TOKEN_PREFERRED_LIFETIME = 297,
-        TOKEN_VALID_LIFETIME = 298,
-        TOKEN_RENEW_TIMER = 299,
-        TOKEN_REBIND_TIMER = 300,
-        TOKEN_DECLINE_PROBATION_PERIOD = 301,
-        TOKEN_SERVER_TAG = 302,
-        TOKEN_SUBNET6 = 303,
-        TOKEN_OPTION_DEF = 304,
-        TOKEN_OPTION_DATA = 305,
-        TOKEN_NAME = 306,
-        TOKEN_DATA = 307,
-        TOKEN_CODE = 308,
-        TOKEN_SPACE = 309,
-        TOKEN_CSV_FORMAT = 310,
-        TOKEN_ALWAYS_SEND = 311,
-        TOKEN_RECORD_TYPES = 312,
-        TOKEN_ENCAPSULATE = 313,
-        TOKEN_ARRAY = 314,
-        TOKEN_POOLS = 315,
-        TOKEN_POOL = 316,
-        TOKEN_PD_POOLS = 317,
-        TOKEN_PREFIX = 318,
-        TOKEN_PREFIX_LEN = 319,
-        TOKEN_EXCLUDED_PREFIX = 320,
-        TOKEN_EXCLUDED_PREFIX_LEN = 321,
-        TOKEN_DELEGATED_LEN = 322,
-        TOKEN_USER_CONTEXT = 323,
-        TOKEN_COMMENT = 324,
-        TOKEN_SUBNET = 325,
-        TOKEN_INTERFACE = 326,
-        TOKEN_INTERFACE_ID = 327,
-        TOKEN_ID = 328,
-        TOKEN_RAPID_COMMIT = 329,
-        TOKEN_RESERVATION_MODE = 330,
-        TOKEN_DISABLED = 331,
-        TOKEN_OUT_OF_POOL = 332,
-        TOKEN_GLOBAL = 333,
-        TOKEN_ALL = 334,
-        TOKEN_SHARED_NETWORKS = 335,
-        TOKEN_MAC_SOURCES = 336,
-        TOKEN_RELAY_SUPPLIED_OPTIONS = 337,
-        TOKEN_HOST_RESERVATION_IDENTIFIERS = 338,
-        TOKEN_SANITY_CHECKS = 339,
-        TOKEN_LEASE_CHECKS = 340,
-        TOKEN_CLIENT_CLASSES = 341,
-        TOKEN_REQUIRE_CLIENT_CLASSES = 342,
-        TOKEN_TEST = 343,
-        TOKEN_ONLY_IF_REQUIRED = 344,
-        TOKEN_CLIENT_CLASS = 345,
-        TOKEN_RESERVATIONS = 346,
-        TOKEN_IP_ADDRESSES = 347,
-        TOKEN_PREFIXES = 348,
-        TOKEN_DUID = 349,
-        TOKEN_HW_ADDRESS = 350,
-        TOKEN_HOSTNAME = 351,
-        TOKEN_FLEX_ID = 352,
-        TOKEN_RELAY = 353,
-        TOKEN_IP_ADDRESS = 354,
-        TOKEN_HOOKS_LIBRARIES = 355,
-        TOKEN_LIBRARY = 356,
-        TOKEN_PARAMETERS = 357,
-        TOKEN_EXPIRED_LEASES_PROCESSING = 358,
-        TOKEN_RECLAIM_TIMER_WAIT_TIME = 359,
-        TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 360,
-        TOKEN_HOLD_RECLAIMED_TIME = 361,
-        TOKEN_MAX_RECLAIM_LEASES = 362,
-        TOKEN_MAX_RECLAIM_TIME = 363,
-        TOKEN_UNWARNED_RECLAIM_CYCLES = 364,
-        TOKEN_SERVER_ID = 365,
-        TOKEN_LLT = 366,
-        TOKEN_EN = 367,
-        TOKEN_LL = 368,
-        TOKEN_IDENTIFIER = 369,
-        TOKEN_HTYPE = 370,
-        TOKEN_TIME = 371,
-        TOKEN_ENTERPRISE_ID = 372,
-        TOKEN_DHCP4O6_PORT = 373,
-        TOKEN_CONTROL_SOCKET = 374,
-        TOKEN_SOCKET_TYPE = 375,
-        TOKEN_SOCKET_NAME = 376,
-        TOKEN_DHCP_QUEUE_CONTROL = 377,
-        TOKEN_DHCP_DDNS = 378,
-        TOKEN_ENABLE_UPDATES = 379,
-        TOKEN_QUALIFYING_SUFFIX = 380,
-        TOKEN_SERVER_IP = 381,
-        TOKEN_SERVER_PORT = 382,
-        TOKEN_SENDER_IP = 383,
-        TOKEN_SENDER_PORT = 384,
-        TOKEN_MAX_QUEUE_SIZE = 385,
-        TOKEN_NCR_PROTOCOL = 386,
-        TOKEN_NCR_FORMAT = 387,
-        TOKEN_OVERRIDE_NO_UPDATE = 388,
-        TOKEN_OVERRIDE_CLIENT_UPDATE = 389,
-        TOKEN_REPLACE_CLIENT_NAME = 390,
-        TOKEN_GENERATED_PREFIX = 391,
-        TOKEN_UDP = 392,
-        TOKEN_TCP = 393,
-        TOKEN_JSON = 394,
-        TOKEN_WHEN_PRESENT = 395,
-        TOKEN_NEVER = 396,
-        TOKEN_ALWAYS = 397,
-        TOKEN_WHEN_NOT_PRESENT = 398,
-        TOKEN_HOSTNAME_CHAR_SET = 399,
-        TOKEN_HOSTNAME_CHAR_REPLACEMENT = 400,
-        TOKEN_LOGGING = 401,
-        TOKEN_LOGGERS = 402,
-        TOKEN_OUTPUT_OPTIONS = 403,
-        TOKEN_OUTPUT = 404,
-        TOKEN_DEBUGLEVEL = 405,
-        TOKEN_SEVERITY = 406,
-        TOKEN_FLUSH = 407,
-        TOKEN_MAXSIZE = 408,
-        TOKEN_MAXVER = 409,
-        TOKEN_DHCP4 = 410,
-        TOKEN_DHCPDDNS = 411,
-        TOKEN_CONTROL_AGENT = 412,
-        TOKEN_TOPLEVEL_JSON = 413,
-        TOKEN_TOPLEVEL_DHCP6 = 414,
-        TOKEN_SUB_DHCP6 = 415,
-        TOKEN_SUB_INTERFACES6 = 416,
-        TOKEN_SUB_SUBNET6 = 417,
-        TOKEN_SUB_POOL6 = 418,
-        TOKEN_SUB_PD_POOL = 419,
-        TOKEN_SUB_RESERVATION = 420,
-        TOKEN_SUB_OPTION_DEFS = 421,
-        TOKEN_SUB_OPTION_DEF = 422,
-        TOKEN_SUB_OPTION_DATA = 423,
-        TOKEN_SUB_HOOKS_LIBRARY = 424,
-        TOKEN_SUB_DHCP_DDNS = 425,
-        TOKEN_SUB_LOGGING = 426,
-        TOKEN_SUB_CONFIG_CONTROL = 427,
-        TOKEN_STRING = 428,
-        TOKEN_INTEGER = 429,
-        TOKEN_FLOAT = 430,
-        TOKEN_BOOLEAN = 431
+        TOKEN_CONFIG_FETCH_WAIT_TIME = 269,
+        TOKEN_INTERFACES_CONFIG = 270,
+        TOKEN_INTERFACES = 271,
+        TOKEN_RE_DETECT = 272,
+        TOKEN_LEASE_DATABASE = 273,
+        TOKEN_HOSTS_DATABASE = 274,
+        TOKEN_HOSTS_DATABASES = 275,
+        TOKEN_TYPE = 276,
+        TOKEN_MEMFILE = 277,
+        TOKEN_MYSQL = 278,
+        TOKEN_POSTGRESQL = 279,
+        TOKEN_CQL = 280,
+        TOKEN_USER = 281,
+        TOKEN_PASSWORD = 282,
+        TOKEN_HOST = 283,
+        TOKEN_PORT = 284,
+        TOKEN_PERSIST = 285,
+        TOKEN_LFC_INTERVAL = 286,
+        TOKEN_READONLY = 287,
+        TOKEN_CONNECT_TIMEOUT = 288,
+        TOKEN_CONTACT_POINTS = 289,
+        TOKEN_MAX_RECONNECT_TRIES = 290,
+        TOKEN_RECONNECT_WAIT_TIME = 291,
+        TOKEN_KEYSPACE = 292,
+        TOKEN_CONSISTENCY = 293,
+        TOKEN_SERIAL_CONSISTENCY = 294,
+        TOKEN_REQUEST_TIMEOUT = 295,
+        TOKEN_TCP_KEEPALIVE = 296,
+        TOKEN_TCP_NODELAY = 297,
+        TOKEN_PREFERRED_LIFETIME = 298,
+        TOKEN_VALID_LIFETIME = 299,
+        TOKEN_RENEW_TIMER = 300,
+        TOKEN_REBIND_TIMER = 301,
+        TOKEN_DECLINE_PROBATION_PERIOD = 302,
+        TOKEN_SERVER_TAG = 303,
+        TOKEN_SUBNET6 = 304,
+        TOKEN_OPTION_DEF = 305,
+        TOKEN_OPTION_DATA = 306,
+        TOKEN_NAME = 307,
+        TOKEN_DATA = 308,
+        TOKEN_CODE = 309,
+        TOKEN_SPACE = 310,
+        TOKEN_CSV_FORMAT = 311,
+        TOKEN_ALWAYS_SEND = 312,
+        TOKEN_RECORD_TYPES = 313,
+        TOKEN_ENCAPSULATE = 314,
+        TOKEN_ARRAY = 315,
+        TOKEN_POOLS = 316,
+        TOKEN_POOL = 317,
+        TOKEN_PD_POOLS = 318,
+        TOKEN_PREFIX = 319,
+        TOKEN_PREFIX_LEN = 320,
+        TOKEN_EXCLUDED_PREFIX = 321,
+        TOKEN_EXCLUDED_PREFIX_LEN = 322,
+        TOKEN_DELEGATED_LEN = 323,
+        TOKEN_USER_CONTEXT = 324,
+        TOKEN_COMMENT = 325,
+        TOKEN_SUBNET = 326,
+        TOKEN_INTERFACE = 327,
+        TOKEN_INTERFACE_ID = 328,
+        TOKEN_ID = 329,
+        TOKEN_RAPID_COMMIT = 330,
+        TOKEN_RESERVATION_MODE = 331,
+        TOKEN_DISABLED = 332,
+        TOKEN_OUT_OF_POOL = 333,
+        TOKEN_GLOBAL = 334,
+        TOKEN_ALL = 335,
+        TOKEN_SHARED_NETWORKS = 336,
+        TOKEN_MAC_SOURCES = 337,
+        TOKEN_RELAY_SUPPLIED_OPTIONS = 338,
+        TOKEN_HOST_RESERVATION_IDENTIFIERS = 339,
+        TOKEN_SANITY_CHECKS = 340,
+        TOKEN_LEASE_CHECKS = 341,
+        TOKEN_CLIENT_CLASSES = 342,
+        TOKEN_REQUIRE_CLIENT_CLASSES = 343,
+        TOKEN_TEST = 344,
+        TOKEN_ONLY_IF_REQUIRED = 345,
+        TOKEN_CLIENT_CLASS = 346,
+        TOKEN_RESERVATIONS = 347,
+        TOKEN_IP_ADDRESSES = 348,
+        TOKEN_PREFIXES = 349,
+        TOKEN_DUID = 350,
+        TOKEN_HW_ADDRESS = 351,
+        TOKEN_HOSTNAME = 352,
+        TOKEN_FLEX_ID = 353,
+        TOKEN_RELAY = 354,
+        TOKEN_IP_ADDRESS = 355,
+        TOKEN_HOOKS_LIBRARIES = 356,
+        TOKEN_LIBRARY = 357,
+        TOKEN_PARAMETERS = 358,
+        TOKEN_EXPIRED_LEASES_PROCESSING = 359,
+        TOKEN_RECLAIM_TIMER_WAIT_TIME = 360,
+        TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME = 361,
+        TOKEN_HOLD_RECLAIMED_TIME = 362,
+        TOKEN_MAX_RECLAIM_LEASES = 363,
+        TOKEN_MAX_RECLAIM_TIME = 364,
+        TOKEN_UNWARNED_RECLAIM_CYCLES = 365,
+        TOKEN_SERVER_ID = 366,
+        TOKEN_LLT = 367,
+        TOKEN_EN = 368,
+        TOKEN_LL = 369,
+        TOKEN_IDENTIFIER = 370,
+        TOKEN_HTYPE = 371,
+        TOKEN_TIME = 372,
+        TOKEN_ENTERPRISE_ID = 373,
+        TOKEN_DHCP4O6_PORT = 374,
+        TOKEN_CONTROL_SOCKET = 375,
+        TOKEN_SOCKET_TYPE = 376,
+        TOKEN_SOCKET_NAME = 377,
+        TOKEN_DHCP_QUEUE_CONTROL = 378,
+        TOKEN_DHCP_DDNS = 379,
+        TOKEN_ENABLE_UPDATES = 380,
+        TOKEN_QUALIFYING_SUFFIX = 381,
+        TOKEN_SERVER_IP = 382,
+        TOKEN_SERVER_PORT = 383,
+        TOKEN_SENDER_IP = 384,
+        TOKEN_SENDER_PORT = 385,
+        TOKEN_MAX_QUEUE_SIZE = 386,
+        TOKEN_NCR_PROTOCOL = 387,
+        TOKEN_NCR_FORMAT = 388,
+        TOKEN_OVERRIDE_NO_UPDATE = 389,
+        TOKEN_OVERRIDE_CLIENT_UPDATE = 390,
+        TOKEN_REPLACE_CLIENT_NAME = 391,
+        TOKEN_GENERATED_PREFIX = 392,
+        TOKEN_UDP = 393,
+        TOKEN_TCP = 394,
+        TOKEN_JSON = 395,
+        TOKEN_WHEN_PRESENT = 396,
+        TOKEN_NEVER = 397,
+        TOKEN_ALWAYS = 398,
+        TOKEN_WHEN_NOT_PRESENT = 399,
+        TOKEN_HOSTNAME_CHAR_SET = 400,
+        TOKEN_HOSTNAME_CHAR_REPLACEMENT = 401,
+        TOKEN_LOGGING = 402,
+        TOKEN_LOGGERS = 403,
+        TOKEN_OUTPUT_OPTIONS = 404,
+        TOKEN_OUTPUT = 405,
+        TOKEN_DEBUGLEVEL = 406,
+        TOKEN_SEVERITY = 407,
+        TOKEN_FLUSH = 408,
+        TOKEN_MAXSIZE = 409,
+        TOKEN_MAXVER = 410,
+        TOKEN_DHCP4 = 411,
+        TOKEN_DHCPDDNS = 412,
+        TOKEN_CONTROL_AGENT = 413,
+        TOKEN_TOPLEVEL_JSON = 414,
+        TOKEN_TOPLEVEL_DHCP6 = 415,
+        TOKEN_SUB_DHCP6 = 416,
+        TOKEN_SUB_INTERFACES6 = 417,
+        TOKEN_SUB_SUBNET6 = 418,
+        TOKEN_SUB_POOL6 = 419,
+        TOKEN_SUB_PD_POOL = 420,
+        TOKEN_SUB_RESERVATION = 421,
+        TOKEN_SUB_OPTION_DEFS = 422,
+        TOKEN_SUB_OPTION_DEF = 423,
+        TOKEN_SUB_OPTION_DATA = 424,
+        TOKEN_SUB_HOOKS_LIBRARY = 425,
+        TOKEN_SUB_DHCP_DDNS = 426,
+        TOKEN_SUB_LOGGING = 427,
+        TOKEN_SUB_CONFIG_CONTROL = 428,
+        TOKEN_STRING = 429,
+        TOKEN_INTEGER = 430,
+        TOKEN_FLOAT = 431,
+        TOKEN_BOOLEAN = 432
       };
     };
 
@@ -653,154 +739,29 @@ namespace isc { namespace dhcp {
       typedef Base super_type;
 
       /// Default constructor.
-      basic_symbol ()
-        : value ()
-        , location ()
-      {}
-
-#if 201103L <= YY_CPLUSPLUS
-      /// Move constructor.
-      basic_symbol (basic_symbol&& that);
-#endif
+      basic_symbol ();
+
+      /// Move or copy constructor.
+      basic_symbol (YY_RVREF (basic_symbol) other);
 
-      /// Copy constructor.
-      basic_symbol (const basic_symbol& that);
 
       /// Constructor for valueless symbols, and symbols from each type.
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, location_type&& l)
-        : Base (t)
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const location_type& l)
-        : Base (t)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, ElementPtr&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const ElementPtr& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, bool&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const bool& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, double&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const double& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, int64_t&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const int64_t& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      basic_symbol (typename Base::kind_type t, std::string&& v, location_type&& l)
-        : Base (t)
-        , value (std::move (v))
-        , location (std::move (l))
-      {}
-#else
-      basic_symbol (typename Base::kind_type t, const std::string& v, const location_type& l)
-        : Base (t)
-        , value (v)
-        , location (l)
-      {}
-#endif
+      basic_symbol (typename Base::kind_type t, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (ElementPtr) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (bool) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (double) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (int64_t) v, YY_RVREF (location_type) l);
+      basic_symbol (typename Base::kind_type t, YY_RVREF (std::string) v, YY_RVREF (location_type) l);
+
 
       /// Destroy the symbol.
-      ~basic_symbol ()
-      {
-        clear ();
-      }
+      ~basic_symbol ();
 
       /// Destroy contents, and record that is empty.
-      void clear ()
-      {
-        // User destructor.
-        symbol_number_type yytype = this->type_get ();
-        basic_symbol<Base>& yysym = *this;
-        (void) yysym;
-        switch (yytype)
-        {
-       default:
-          break;
-        }
-
-        // Type destructor.
-switch (yytype)
-    {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
-        value.template destroy< ElementPtr > ();
-        break;
-
-      case 176: // "boolean"
-        value.template destroy< bool > ();
-        break;
-
-      case 175: // "floating point"
-        value.template destroy< double > ();
-        break;
-
-      case 174: // "integer"
-        value.template destroy< int64_t > ();
-        break;
-
-      case 173: // "constant string"
-        value.template destroy< std::string > ();
-        break;
-
-      default:
-        break;
-    }
-
-        Base::clear ();
-      }
+      void clear ();
 
       /// Whether empty.
-      bool empty () const YY_NOEXCEPT;
+      bool empty () const;
 
       /// Destructive move, \a s is emptied into this.
       void move (basic_symbol& s);
@@ -812,9 +773,9 @@ switch (yytype)
       location_type location;
 
     private:
-#if YY_CPLUSPLUS < 201103L
+#if !defined __cplusplus || __cplusplus < 201103L
       /// Assignment operator.
-      basic_symbol& operator= (const basic_symbol& that);
+      basic_symbol& operator= (const basic_symbol& other);
 #endif
     };
 
@@ -824,13 +785,8 @@ switch (yytype)
       /// Default constructor.
       by_type ();
 
-#if 201103L <= YY_CPLUSPLUS
-      /// Move constructor.
-      by_type (by_type&& that);
-#endif
-
       /// Copy constructor.
-      by_type (const by_type& that);
+      by_type (const by_type& other);
 
       /// The symbol type as needed by the constructor.
       typedef token_type kind_type;
@@ -846,10 +802,10 @@ switch (yytype)
 
       /// The (internal) type number (corresponding to \a type).
       /// \a empty when empty.
-      symbol_number_type type_get () const YY_NOEXCEPT;
+      symbol_number_type type_get () const;
 
       /// The token.
-      token_type token () const YY_NOEXCEPT;
+      token_type token () const;
 
       /// The symbol type.
       /// \a empty_symbol when empty.
@@ -858,81 +814,7 @@ switch (yytype)
     };
 
     /// "External" symbols: returned by the scanner.
-    struct symbol_type : basic_symbol<by_type>
-    {
-      /// Superclass.
-      typedef basic_symbol<by_type> super_type;
-
-      /// Empty symbol.
-      symbol_type () {}
-
-      /// Constructor for valueless symbols, and symbols from each type.
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, location_type l)
-        : super_type(token_type (tok), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_END || tok == token::TOKEN_COMMA || tok == token::TOKEN_COLON || tok == token::TOKEN_LSQUARE_BRACKET || tok == token::TOKEN_RSQUARE_BRACKET || tok == token::TOKEN_LCURLY_BRACKET || tok == token::TOKEN_RCURLY_BRACKET || tok == token::TOKEN_NULL_TYPE || tok == token::TOKEN_DHCP6 || tok == token::TOKEN_DATA_DIRECTORY || tok == token::TOKEN_CONFIG_CONTROL || tok == token::TOKEN_CONFIG_DATABASES || tok == token::TOKEN_INTERFACES_CONFIG || tok == token::TOKEN_INTERFACES || tok == token::TOKEN_RE_DETECT || tok == token::TOKEN_LEASE_DATABASE || tok == token::TOKEN_HOSTS_DATABASE || tok == token::TOKEN_HOSTS_DATABASES || tok == token::TOKEN_TYPE || tok == token::TOKEN_MEMFILE || tok == token::TOKEN_MYSQL || tok == token::TOKEN_POSTGRESQL || tok == token::TOKEN_CQL || tok == token::TOKEN_USER || tok == token::TOKEN_PASSWORD || tok == token::TOKEN_HOST || tok == token::TOKEN_PORT || tok == token::TOKEN_PERSIST || tok == token::TOKEN_LFC_INTERVAL || tok == token::TOKEN_READONLY || tok == token::TOKEN_CONNECT_TIMEOUT || tok == token::TOKEN_CONTACT_POINTS || tok == token::TOKEN_MAX_RECONNECT_TRIES || tok == token::TOKEN_RECONNECT_WAIT_TIME || tok == token::TOKEN_KEYSPACE || tok == token::TOKEN_CONSISTENCY || tok == token::TOKEN_SERIAL_CONSISTENCY || tok == token::TOKEN_REQUEST_TIMEOUT || tok == token::TOKEN_TCP_KEEPALIVE || tok == token::TOKEN_TCP_NODELAY || tok == token::TOKEN_PREFERRED_LIFETIME || tok == token::TOKEN_VALID_LIFETIME || tok == token::TOKEN_RENEW_TIMER || tok == token::TOKEN_REBIND_TIMER || tok == token::TOKEN_DECLINE_PROBATION_PERIOD || tok == token::TOKEN_SERVER_TAG || tok == token::TOKEN_SUBNET6 || tok == token::TOKEN_OPTION_DEF || tok == token::TOKEN_OPTION_DATA || tok == token::TOKEN_NAME || tok == token::TOKEN_DATA || tok == token::TOKEN_CODE || tok == token::TOKEN_SPACE || tok == token::TOKEN_CSV_FORMAT || tok == token::TOKEN_ALWAYS_SEND || tok == token::TOKEN_RECORD_TYPES || tok == token::TOKEN_ENCAPSULATE || tok == token::TOKEN_ARRAY || tok == token::TOKEN_POOLS || tok == token::TOKEN_POOL || tok == token::TOKEN_PD_POOLS || tok == token::TOKEN_PREFIX || tok == token::TOKEN_PREFIX_LEN || tok == token::TOKEN_EXCLUDED_PREFIX || tok == token::TOKEN_EXCLUDED_PREFIX_LEN || tok == token::TOKEN_DELEGATED_LEN || tok == token::TOKEN_USER_CONTEXT || tok == token::TOKEN_COMMENT || tok == token::TOKEN_SUBNET || tok == token::TOKEN_INTERFACE || tok == token::TOKEN_INTERFACE_ID || tok == token::TOKEN_ID || tok == token::TOKEN_RAPID_COMMIT || tok == token::TOKEN_RESERVATION_MODE || tok == token::TOKEN_DISABLED || tok == token::TOKEN_OUT_OF_POOL || tok == token::TOKEN_GLOBAL || tok == token::TOKEN_ALL || tok == token::TOKEN_SHARED_NETWORKS || tok == token::TOKEN_MAC_SOURCES || tok == token::TOKEN_RELAY_SUPPLIED_OPTIONS || tok == token::TOKEN_HOST_RESERVATION_IDENTIFIERS || tok == token::TOKEN_SANITY_CHECKS || tok == token::TOKEN_LEASE_CHECKS || tok == token::TOKEN_CLIENT_CLASSES || tok == token::TOKEN_REQUIRE_CLIENT_CLASSES || tok == token::TOKEN_TEST || tok == token::TOKEN_ONLY_IF_REQUIRED || tok == token::TOKEN_CLIENT_CLASS || tok == token::TOKEN_RESERVATIONS || tok == token::TOKEN_IP_ADDRESSES || tok == token::TOKEN_PREFIXES || tok == token::TOKEN_DUID || tok == token::TOKEN_HW_ADDRESS || tok == token::TOKEN_HOSTNAME || tok == token::TOKEN_FLEX_ID || tok == token::TOKEN_RELAY || tok == token::TOKEN_IP_ADDRESS || tok == token::TOKEN_HOOKS_LIBRARIES || tok == token::TOKEN_LIBRARY || tok == token::TOKEN_PARAMETERS || tok == token::TOKEN_EXPIRED_LEASES_PROCESSING || tok == token::TOKEN_RECLAIM_TIMER_WAIT_TIME || tok == token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME || tok == token::TOKEN_HOLD_RECLAIMED_TIME || tok == token::TOKEN_MAX_RECLAIM_LEASES || tok == token::TOKEN_MAX_RECLAIM_TIME || tok == token::TOKEN_UNWARNED_RECLAIM_CYCLES || tok == token::TOKEN_SERVER_ID || tok == token::TOKEN_LLT || tok == token::TOKEN_EN || tok == token::TOKEN_LL || tok == token::TOKEN_IDENTIFIER || tok == token::TOKEN_HTYPE || tok == token::TOKEN_TIME || tok == token::TOKEN_ENTERPRISE_ID || tok == token::TOKEN_DHCP4O6_PORT || tok == token::TOKEN_CONTROL_SOCKET || tok == token::TOKEN_SOCKET_TYPE || tok == token::TOKEN_SOCKET_NAME || tok == token::TOKEN_DHCP_QUEUE_CONTROL || tok == token::TOKEN_DHCP_DDNS || tok == token::TOKEN_ENABLE_UPDATES || tok == token::TOKEN_QUALIFYING_SUFFIX || tok == token::TOKEN_SERVER_IP || tok == token::TOKEN_SERVER_PORT || tok == token::TOKEN_SENDER_IP || tok == token::TOKEN_SENDER_PORT || tok == token::TOKEN_MAX_QUEUE_SIZE || tok == token::TOKEN_NCR_PROTOCOL || tok == token::TOKEN_NCR_FORMAT || tok == token::TOKEN_OVERRIDE_NO_UPDATE || tok == token::TOKEN_OVERRIDE_CLIENT_UPDATE || tok == token::TOKEN_REPLACE_CLIENT_NAME || tok == token::TOKEN_GENERATED_PREFIX || tok == token::TOKEN_UDP || tok == token::TOKEN_TCP || tok == token::TOKEN_JSON || tok == token::TOKEN_WHEN_PRESENT || tok == token::TOKEN_NEVER || tok == token::TOKEN_ALWAYS || tok == token::TOKEN_WHEN_NOT_PRESENT || tok == token::TOKEN_HOSTNAME_CHAR_SET || tok == token::TOKEN_HOSTNAME_CHAR_REPLACEMENT || tok == token::TOKEN_LOGGING || tok == token::TOKEN_LOGGERS || tok == token::TOKEN_OUTPUT_OPTIONS || tok == token::TOKEN_OUTPUT || tok == token::TOKEN_DEBUGLEVEL || tok == token::TOKEN_SEVERITY || tok == token::TOKEN_FLUSH || tok == token::TOKEN_MAXSIZE || tok == token::TOKEN_MAXVER || tok == token::TOKEN_DHCP4 || tok == token::TOKEN_DHCPDDNS || tok == token::TOKEN_CONTROL_AGENT || tok == token::TOKEN_TOPLEVEL_JSON || tok == token::TOKEN_TOPLEVEL_DHCP6 || tok == token::TOKEN_SUB_DHCP6 || tok == token::TOKEN_SUB_INTERFACES6 || tok == token::TOKEN_SUB_SUBNET6 || tok == token::TOKEN_SUB_POOL6 || tok == token::TOKEN_SUB_PD_POOL || tok == token::TOKEN_SUB_RESERVATION || tok == token::TOKEN_SUB_OPTION_DEFS || tok == token::TOKEN_SUB_OPTION_DEF || tok == token::TOKEN_SUB_OPTION_DATA || tok == token::TOKEN_SUB_HOOKS_LIBRARY || tok == token::TOKEN_SUB_DHCP_DDNS || tok == token::TOKEN_SUB_LOGGING || tok == token::TOKEN_SUB_CONFIG_CONTROL);
-      }
-#else
-      symbol_type (int tok, const location_type& l)
-        : super_type(token_type (tok), l)
-      {
-        YYASSERT (tok == token::TOKEN_END || tok == token::TOKEN_COMMA || tok == token::TOKEN_COLON || tok == token::TOKEN_LSQUARE_BRACKET || tok == token::TOKEN_RSQUARE_BRACKET || tok == token::TOKEN_LCURLY_BRACKET || tok == token::TOKEN_RCURLY_BRACKET || tok == token::TOKEN_NULL_TYPE || tok == token::TOKEN_DHCP6 || tok == token::TOKEN_DATA_DIRECTORY || tok == token::TOKEN_CONFIG_CONTROL || tok == token::TOKEN_CONFIG_DATABASES || tok == token::TOKEN_INTERFACES_CONFIG || tok == token::TOKEN_INTERFACES || tok == token::TOKEN_RE_DETECT || tok == token::TOKEN_LEASE_DATABASE || tok == token::TOKEN_HOSTS_DATABASE || tok == token::TOKEN_HOSTS_DATABASES || tok == token::TOKEN_TYPE || tok == token::TOKEN_MEMFILE || tok == token::TOKEN_MYSQL || tok == token::TOKEN_POSTGRESQL || tok == token::TOKEN_CQL || tok == token::TOKEN_USER || tok == token::TOKEN_PASSWORD || tok == token::TOKEN_HOST || tok == token::TOKEN_PORT || tok == token::TOKEN_PERSIST || tok == token::TOKEN_LFC_INTERVAL || tok == token::TOKEN_READONLY || tok == token::TOKEN_CONNECT_TIMEOUT || tok == token::TOKEN_CONTACT_POINTS || tok == token::TOKEN_MAX_RECONNECT_TRIES || tok == token::TOKEN_RECONNECT_WAIT_TIME || tok == token::TOKEN_KEYSPACE || tok == token::TOKEN_CONSISTENCY || tok == token::TOKEN_SERIAL_CONSISTENCY || tok == token::TOKEN_REQUEST_TIMEOUT || tok == token::TOKEN_TCP_KEEPALIVE || tok == token::TOKEN_TCP_NODELAY || tok == token::TOKEN_PREFERRED_LIFETIME || tok == token::TOKEN_VALID_LIFETIME || tok == token::TOKEN_RENEW_TIMER || tok == token::TOKEN_REBIND_TIMER || tok == token::TOKEN_DECLINE_PROBATION_PERIOD || tok == token::TOKEN_SERVER_TAG || tok == token::TOKEN_SUBNET6 || tok == token::TOKEN_OPTION_DEF || tok == token::TOKEN_OPTION_DATA || tok == token::TOKEN_NAME || tok == token::TOKEN_DATA || tok == token::TOKEN_CODE || tok == token::TOKEN_SPACE || tok == token::TOKEN_CSV_FORMAT || tok == token::TOKEN_ALWAYS_SEND || tok == token::TOKEN_RECORD_TYPES || tok == token::TOKEN_ENCAPSULATE || tok == token::TOKEN_ARRAY || tok == token::TOKEN_POOLS || tok == token::TOKEN_POOL || tok == token::TOKEN_PD_POOLS || tok == token::TOKEN_PREFIX || tok == token::TOKEN_PREFIX_LEN || tok == token::TOKEN_EXCLUDED_PREFIX || tok == token::TOKEN_EXCLUDED_PREFIX_LEN || tok == token::TOKEN_DELEGATED_LEN || tok == token::TOKEN_USER_CONTEXT || tok == token::TOKEN_COMMENT || tok == token::TOKEN_SUBNET || tok == token::TOKEN_INTERFACE || tok == token::TOKEN_INTERFACE_ID || tok == token::TOKEN_ID || tok == token::TOKEN_RAPID_COMMIT || tok == token::TOKEN_RESERVATION_MODE || tok == token::TOKEN_DISABLED || tok == token::TOKEN_OUT_OF_POOL || tok == token::TOKEN_GLOBAL || tok == token::TOKEN_ALL || tok == token::TOKEN_SHARED_NETWORKS || tok == token::TOKEN_MAC_SOURCES || tok == token::TOKEN_RELAY_SUPPLIED_OPTIONS || tok == token::TOKEN_HOST_RESERVATION_IDENTIFIERS || tok == token::TOKEN_SANITY_CHECKS || tok == token::TOKEN_LEASE_CHECKS || tok == token::TOKEN_CLIENT_CLASSES || tok == token::TOKEN_REQUIRE_CLIENT_CLASSES || tok == token::TOKEN_TEST || tok == token::TOKEN_ONLY_IF_REQUIRED || tok == token::TOKEN_CLIENT_CLASS || tok == token::TOKEN_RESERVATIONS || tok == token::TOKEN_IP_ADDRESSES || tok == token::TOKEN_PREFIXES || tok == token::TOKEN_DUID || tok == token::TOKEN_HW_ADDRESS || tok == token::TOKEN_HOSTNAME || tok == token::TOKEN_FLEX_ID || tok == token::TOKEN_RELAY || tok == token::TOKEN_IP_ADDRESS || tok == token::TOKEN_HOOKS_LIBRARIES || tok == token::TOKEN_LIBRARY || tok == token::TOKEN_PARAMETERS || tok == token::TOKEN_EXPIRED_LEASES_PROCESSING || tok == token::TOKEN_RECLAIM_TIMER_WAIT_TIME || tok == token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME || tok == token::TOKEN_HOLD_RECLAIMED_TIME || tok == token::TOKEN_MAX_RECLAIM_LEASES || tok == token::TOKEN_MAX_RECLAIM_TIME || tok == token::TOKEN_UNWARNED_RECLAIM_CYCLES || tok == token::TOKEN_SERVER_ID || tok == token::TOKEN_LLT || tok == token::TOKEN_EN || tok == token::TOKEN_LL || tok == token::TOKEN_IDENTIFIER || tok == token::TOKEN_HTYPE || tok == token::TOKEN_TIME || tok == token::TOKEN_ENTERPRISE_ID || tok == token::TOKEN_DHCP4O6_PORT || tok == token::TOKEN_CONTROL_SOCKET || tok == token::TOKEN_SOCKET_TYPE || tok == token::TOKEN_SOCKET_NAME || tok == token::TOKEN_DHCP_QUEUE_CONTROL || tok == token::TOKEN_DHCP_DDNS || tok == token::TOKEN_ENABLE_UPDATES || tok == token::TOKEN_QUALIFYING_SUFFIX || tok == token::TOKEN_SERVER_IP || tok == token::TOKEN_SERVER_PORT || tok == token::TOKEN_SENDER_IP || tok == token::TOKEN_SENDER_PORT || tok == token::TOKEN_MAX_QUEUE_SIZE || tok == token::TOKEN_NCR_PROTOCOL || tok == token::TOKEN_NCR_FORMAT || tok == token::TOKEN_OVERRIDE_NO_UPDATE || tok == token::TOKEN_OVERRIDE_CLIENT_UPDATE || tok == token::TOKEN_REPLACE_CLIENT_NAME || tok == token::TOKEN_GENERATED_PREFIX || tok == token::TOKEN_UDP || tok == token::TOKEN_TCP || tok == token::TOKEN_JSON || tok == token::TOKEN_WHEN_PRESENT || tok == token::TOKEN_NEVER || tok == token::TOKEN_ALWAYS || tok == token::TOKEN_WHEN_NOT_PRESENT || tok == token::TOKEN_HOSTNAME_CHAR_SET || tok == token::TOKEN_HOSTNAME_CHAR_REPLACEMENT || tok == token::TOKEN_LOGGING || tok == token::TOKEN_LOGGERS || tok == token::TOKEN_OUTPUT_OPTIONS || tok == token::TOKEN_OUTPUT || tok == token::TOKEN_DEBUGLEVEL || tok == token::TOKEN_SEVERITY || tok == token::TOKEN_FLUSH || tok == token::TOKEN_MAXSIZE || tok == token::TOKEN_MAXVER || tok == token::TOKEN_DHCP4 || tok == token::TOKEN_DHCPDDNS || tok == token::TOKEN_CONTROL_AGENT || tok == token::TOKEN_TOPLEVEL_JSON || tok == token::TOKEN_TOPLEVEL_DHCP6 || tok == token::TOKEN_SUB_DHCP6 || tok == token::TOKEN_SUB_INTERFACES6 || tok == token::TOKEN_SUB_SUBNET6 || tok == token::TOKEN_SUB_POOL6 || tok == token::TOKEN_SUB_PD_POOL || tok == token::TOKEN_SUB_RESERVATION || tok == token::TOKEN_SUB_OPTION_DEFS || tok == token::TOKEN_SUB_OPTION_DEF || tok == token::TOKEN_SUB_OPTION_DATA || tok == token::TOKEN_SUB_HOOKS_LIBRARY || tok == token::TOKEN_SUB_DHCP_DDNS || tok == token::TOKEN_SUB_LOGGING || tok == token::TOKEN_SUB_CONFIG_CONTROL);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, bool v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_BOOLEAN);
-      }
-#else
-      symbol_type (int tok, const bool& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_BOOLEAN);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, double v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_FLOAT);
-      }
-#else
-      symbol_type (int tok, const double& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_FLOAT);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, int64_t v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_INTEGER);
-      }
-#else
-      symbol_type (int tok, const int64_t& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_INTEGER);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      symbol_type (int tok, std::string v, location_type l)
-        : super_type(token_type (tok), std::move (v), std::move (l))
-      {
-        YYASSERT (tok == token::TOKEN_STRING);
-      }
-#else
-      symbol_type (int tok, const std::string& v, const location_type& l)
-        : super_type(token_type (tok), v, l)
-      {
-        YYASSERT (tok == token::TOKEN_STRING);
-      }
-#endif
-    };
+    typedef basic_symbol<by_type> symbol_type;
 
     /// Build a parser object.
     Dhcp6Parser (isc::dhcp::Parser6Context& ctx_yyarg);
@@ -968,3231 +850,2479 @@ switch (yytype)
     /// Report a syntax error.
     void error (const syntax_error& err);
 
-    // Implementation of make_symbol for each symbol type.
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_END (location_type l)
-      {
-        return symbol_type (token::TOKEN_END, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_END (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_END, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COMMA (location_type l)
-      {
-        return symbol_type (token::TOKEN_COMMA, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_COMMA (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_COMMA, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COLON (location_type l)
-      {
-        return symbol_type (token::TOKEN_COLON, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_COLON (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_COLON, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LSQUARE_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_LSQUARE_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LSQUARE_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LSQUARE_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RSQUARE_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_RSQUARE_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RSQUARE_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RSQUARE_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LCURLY_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_LCURLY_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LCURLY_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LCURLY_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RCURLY_BRACKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_RCURLY_BRACKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RCURLY_BRACKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RCURLY_BRACKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NULL_TYPE (location_type l)
-      {
-        return symbol_type (token::TOKEN_NULL_TYPE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_NULL_TYPE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_NULL_TYPE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DATA_DIRECTORY (location_type l)
-      {
-        return symbol_type (token::TOKEN_DATA_DIRECTORY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DATA_DIRECTORY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DATA_DIRECTORY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONFIG_CONTROL (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONFIG_CONTROL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONFIG_CONTROL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONFIG_CONTROL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONFIG_DATABASES (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONFIG_DATABASES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONFIG_DATABASES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONFIG_DATABASES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_INTERFACES_CONFIG (location_type l)
-      {
-        return symbol_type (token::TOKEN_INTERFACES_CONFIG, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_INTERFACES_CONFIG (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_INTERFACES_CONFIG, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_INTERFACES (location_type l)
-      {
-        return symbol_type (token::TOKEN_INTERFACES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_INTERFACES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_INTERFACES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RE_DETECT (location_type l)
-      {
-        return symbol_type (token::TOKEN_RE_DETECT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RE_DETECT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RE_DETECT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LEASE_DATABASE (location_type l)
-      {
-        return symbol_type (token::TOKEN_LEASE_DATABASE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LEASE_DATABASE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LEASE_DATABASE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOSTS_DATABASE (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOSTS_DATABASE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOSTS_DATABASE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOSTS_DATABASE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOSTS_DATABASES (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOSTS_DATABASES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOSTS_DATABASES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOSTS_DATABASES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TYPE (location_type l)
-      {
-        return symbol_type (token::TOKEN_TYPE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TYPE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TYPE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MEMFILE (location_type l)
-      {
-        return symbol_type (token::TOKEN_MEMFILE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MEMFILE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MEMFILE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MYSQL (location_type l)
-      {
-        return symbol_type (token::TOKEN_MYSQL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MYSQL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MYSQL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_POSTGRESQL (location_type l)
-      {
-        return symbol_type (token::TOKEN_POSTGRESQL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_POSTGRESQL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_POSTGRESQL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CQL (location_type l)
-      {
-        return symbol_type (token::TOKEN_CQL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CQL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CQL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_USER (location_type l)
-      {
-        return symbol_type (token::TOKEN_USER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_USER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_USER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PASSWORD (location_type l)
-      {
-        return symbol_type (token::TOKEN_PASSWORD, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PASSWORD (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PASSWORD, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOST (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOST, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOST (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOST, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PORT (location_type l)
-      {
-        return symbol_type (token::TOKEN_PORT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PORT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PORT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PERSIST (location_type l)
-      {
-        return symbol_type (token::TOKEN_PERSIST, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PERSIST (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PERSIST, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LFC_INTERVAL (location_type l)
-      {
-        return symbol_type (token::TOKEN_LFC_INTERVAL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LFC_INTERVAL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LFC_INTERVAL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_READONLY (location_type l)
-      {
-        return symbol_type (token::TOKEN_READONLY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_READONLY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_READONLY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONNECT_TIMEOUT (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONNECT_TIMEOUT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONNECT_TIMEOUT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONNECT_TIMEOUT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONTACT_POINTS (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONTACT_POINTS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONTACT_POINTS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONTACT_POINTS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAX_RECONNECT_TRIES (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAX_RECONNECT_TRIES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAX_RECONNECT_TRIES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAX_RECONNECT_TRIES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RECONNECT_WAIT_TIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_RECONNECT_WAIT_TIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RECONNECT_WAIT_TIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RECONNECT_WAIT_TIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_KEYSPACE (location_type l)
-      {
-        return symbol_type (token::TOKEN_KEYSPACE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_KEYSPACE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_KEYSPACE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONSISTENCY (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONSISTENCY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONSISTENCY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONSISTENCY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SERIAL_CONSISTENCY (location_type l)
-      {
-        return symbol_type (token::TOKEN_SERIAL_CONSISTENCY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SERIAL_CONSISTENCY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SERIAL_CONSISTENCY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_REQUEST_TIMEOUT (location_type l)
-      {
-        return symbol_type (token::TOKEN_REQUEST_TIMEOUT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_REQUEST_TIMEOUT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_REQUEST_TIMEOUT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TCP_KEEPALIVE (location_type l)
-      {
-        return symbol_type (token::TOKEN_TCP_KEEPALIVE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TCP_KEEPALIVE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TCP_KEEPALIVE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TCP_NODELAY (location_type l)
-      {
-        return symbol_type (token::TOKEN_TCP_NODELAY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TCP_NODELAY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TCP_NODELAY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PREFERRED_LIFETIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_PREFERRED_LIFETIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PREFERRED_LIFETIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PREFERRED_LIFETIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_VALID_LIFETIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_VALID_LIFETIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_VALID_LIFETIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_VALID_LIFETIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RENEW_TIMER (location_type l)
-      {
-        return symbol_type (token::TOKEN_RENEW_TIMER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RENEW_TIMER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RENEW_TIMER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_REBIND_TIMER (location_type l)
-      {
-        return symbol_type (token::TOKEN_REBIND_TIMER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_REBIND_TIMER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_REBIND_TIMER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DECLINE_PROBATION_PERIOD (location_type l)
-      {
-        return symbol_type (token::TOKEN_DECLINE_PROBATION_PERIOD, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DECLINE_PROBATION_PERIOD (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DECLINE_PROBATION_PERIOD, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SERVER_TAG (location_type l)
-      {
-        return symbol_type (token::TOKEN_SERVER_TAG, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SERVER_TAG (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SERVER_TAG, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUBNET6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUBNET6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUBNET6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUBNET6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OPTION_DEF (location_type l)
-      {
-        return symbol_type (token::TOKEN_OPTION_DEF, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OPTION_DEF (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OPTION_DEF, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OPTION_DATA (location_type l)
-      {
-        return symbol_type (token::TOKEN_OPTION_DATA, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OPTION_DATA (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OPTION_DATA, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NAME (location_type l)
-      {
-        return symbol_type (token::TOKEN_NAME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_NAME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_NAME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DATA (location_type l)
-      {
-        return symbol_type (token::TOKEN_DATA, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DATA (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DATA, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CODE (location_type l)
-      {
-        return symbol_type (token::TOKEN_CODE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CODE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CODE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SPACE (location_type l)
-      {
-        return symbol_type (token::TOKEN_SPACE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SPACE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SPACE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CSV_FORMAT (location_type l)
-      {
-        return symbol_type (token::TOKEN_CSV_FORMAT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CSV_FORMAT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CSV_FORMAT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ALWAYS_SEND (location_type l)
-      {
-        return symbol_type (token::TOKEN_ALWAYS_SEND, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ALWAYS_SEND (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ALWAYS_SEND, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RECORD_TYPES (location_type l)
-      {
-        return symbol_type (token::TOKEN_RECORD_TYPES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RECORD_TYPES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RECORD_TYPES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ENCAPSULATE (location_type l)
-      {
-        return symbol_type (token::TOKEN_ENCAPSULATE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ENCAPSULATE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ENCAPSULATE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ARRAY (location_type l)
-      {
-        return symbol_type (token::TOKEN_ARRAY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ARRAY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ARRAY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_POOLS (location_type l)
-      {
-        return symbol_type (token::TOKEN_POOLS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_POOLS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_POOLS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_POOL (location_type l)
-      {
-        return symbol_type (token::TOKEN_POOL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_POOL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_POOL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PD_POOLS (location_type l)
-      {
-        return symbol_type (token::TOKEN_PD_POOLS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PD_POOLS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PD_POOLS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PREFIX (location_type l)
-      {
-        return symbol_type (token::TOKEN_PREFIX, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PREFIX (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PREFIX, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PREFIX_LEN (location_type l)
-      {
-        return symbol_type (token::TOKEN_PREFIX_LEN, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PREFIX_LEN (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PREFIX_LEN, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_EXCLUDED_PREFIX (location_type l)
-      {
-        return symbol_type (token::TOKEN_EXCLUDED_PREFIX, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_EXCLUDED_PREFIX (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_EXCLUDED_PREFIX, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_EXCLUDED_PREFIX_LEN (location_type l)
-      {
-        return symbol_type (token::TOKEN_EXCLUDED_PREFIX_LEN, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_EXCLUDED_PREFIX_LEN (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_EXCLUDED_PREFIX_LEN, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DELEGATED_LEN (location_type l)
-      {
-        return symbol_type (token::TOKEN_DELEGATED_LEN, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DELEGATED_LEN (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DELEGATED_LEN, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_USER_CONTEXT (location_type l)
-      {
-        return symbol_type (token::TOKEN_USER_CONTEXT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_USER_CONTEXT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_USER_CONTEXT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_COMMENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_COMMENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_COMMENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_COMMENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUBNET (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUBNET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUBNET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUBNET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_INTERFACE (location_type l)
-      {
-        return symbol_type (token::TOKEN_INTERFACE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_INTERFACE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_INTERFACE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_INTERFACE_ID (location_type l)
-      {
-        return symbol_type (token::TOKEN_INTERFACE_ID, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_INTERFACE_ID (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_INTERFACE_ID, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ID (location_type l)
-      {
-        return symbol_type (token::TOKEN_ID, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ID (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ID, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RAPID_COMMIT (location_type l)
-      {
-        return symbol_type (token::TOKEN_RAPID_COMMIT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RAPID_COMMIT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RAPID_COMMIT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RESERVATION_MODE (location_type l)
-      {
-        return symbol_type (token::TOKEN_RESERVATION_MODE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RESERVATION_MODE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RESERVATION_MODE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DISABLED (location_type l)
-      {
-        return symbol_type (token::TOKEN_DISABLED, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DISABLED (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DISABLED, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OUT_OF_POOL (location_type l)
-      {
-        return symbol_type (token::TOKEN_OUT_OF_POOL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OUT_OF_POOL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OUT_OF_POOL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_GLOBAL (location_type l)
-      {
-        return symbol_type (token::TOKEN_GLOBAL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_GLOBAL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_GLOBAL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ALL (location_type l)
-      {
-        return symbol_type (token::TOKEN_ALL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ALL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ALL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SHARED_NETWORKS (location_type l)
-      {
-        return symbol_type (token::TOKEN_SHARED_NETWORKS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SHARED_NETWORKS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SHARED_NETWORKS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAC_SOURCES (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAC_SOURCES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAC_SOURCES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAC_SOURCES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RELAY_SUPPLIED_OPTIONS (location_type l)
-      {
-        return symbol_type (token::TOKEN_RELAY_SUPPLIED_OPTIONS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RELAY_SUPPLIED_OPTIONS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RELAY_SUPPLIED_OPTIONS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOST_RESERVATION_IDENTIFIERS (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOST_RESERVATION_IDENTIFIERS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOST_RESERVATION_IDENTIFIERS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOST_RESERVATION_IDENTIFIERS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SANITY_CHECKS (location_type l)
-      {
-        return symbol_type (token::TOKEN_SANITY_CHECKS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SANITY_CHECKS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SANITY_CHECKS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LEASE_CHECKS (location_type l)
-      {
-        return symbol_type (token::TOKEN_LEASE_CHECKS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LEASE_CHECKS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LEASE_CHECKS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CLIENT_CLASSES (location_type l)
-      {
-        return symbol_type (token::TOKEN_CLIENT_CLASSES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CLIENT_CLASSES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CLIENT_CLASSES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_REQUIRE_CLIENT_CLASSES (location_type l)
-      {
-        return symbol_type (token::TOKEN_REQUIRE_CLIENT_CLASSES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_REQUIRE_CLIENT_CLASSES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_REQUIRE_CLIENT_CLASSES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TEST (location_type l)
-      {
-        return symbol_type (token::TOKEN_TEST, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TEST (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TEST, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ONLY_IF_REQUIRED (location_type l)
-      {
-        return symbol_type (token::TOKEN_ONLY_IF_REQUIRED, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ONLY_IF_REQUIRED (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ONLY_IF_REQUIRED, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CLIENT_CLASS (location_type l)
-      {
-        return symbol_type (token::TOKEN_CLIENT_CLASS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CLIENT_CLASS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CLIENT_CLASS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RESERVATIONS (location_type l)
-      {
-        return symbol_type (token::TOKEN_RESERVATIONS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RESERVATIONS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RESERVATIONS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_IP_ADDRESSES (location_type l)
-      {
-        return symbol_type (token::TOKEN_IP_ADDRESSES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_IP_ADDRESSES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_IP_ADDRESSES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PREFIXES (location_type l)
-      {
-        return symbol_type (token::TOKEN_PREFIXES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PREFIXES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PREFIXES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DUID (location_type l)
-      {
-        return symbol_type (token::TOKEN_DUID, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DUID (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DUID, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HW_ADDRESS (location_type l)
-      {
-        return symbol_type (token::TOKEN_HW_ADDRESS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HW_ADDRESS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HW_ADDRESS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOSTNAME (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOSTNAME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOSTNAME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOSTNAME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FLEX_ID (location_type l)
-      {
-        return symbol_type (token::TOKEN_FLEX_ID, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_FLEX_ID (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_FLEX_ID, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RELAY (location_type l)
-      {
-        return symbol_type (token::TOKEN_RELAY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RELAY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RELAY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_IP_ADDRESS (location_type l)
-      {
-        return symbol_type (token::TOKEN_IP_ADDRESS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_IP_ADDRESS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_IP_ADDRESS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOOKS_LIBRARIES (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOOKS_LIBRARIES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOOKS_LIBRARIES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOOKS_LIBRARIES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LIBRARY (location_type l)
-      {
-        return symbol_type (token::TOKEN_LIBRARY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LIBRARY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LIBRARY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_PARAMETERS (location_type l)
-      {
-        return symbol_type (token::TOKEN_PARAMETERS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_PARAMETERS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_PARAMETERS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_EXPIRED_LEASES_PROCESSING (location_type l)
-      {
-        return symbol_type (token::TOKEN_EXPIRED_LEASES_PROCESSING, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_EXPIRED_LEASES_PROCESSING (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_EXPIRED_LEASES_PROCESSING, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_RECLAIM_TIMER_WAIT_TIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_RECLAIM_TIMER_WAIT_TIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_RECLAIM_TIMER_WAIT_TIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_RECLAIM_TIMER_WAIT_TIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOLD_RECLAIMED_TIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOLD_RECLAIMED_TIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOLD_RECLAIMED_TIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOLD_RECLAIMED_TIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAX_RECLAIM_LEASES (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAX_RECLAIM_LEASES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAX_RECLAIM_LEASES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAX_RECLAIM_LEASES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAX_RECLAIM_TIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAX_RECLAIM_TIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAX_RECLAIM_TIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAX_RECLAIM_TIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_UNWARNED_RECLAIM_CYCLES (location_type l)
-      {
-        return symbol_type (token::TOKEN_UNWARNED_RECLAIM_CYCLES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_UNWARNED_RECLAIM_CYCLES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_UNWARNED_RECLAIM_CYCLES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SERVER_ID (location_type l)
-      {
-        return symbol_type (token::TOKEN_SERVER_ID, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SERVER_ID (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SERVER_ID, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LLT (location_type l)
-      {
-        return symbol_type (token::TOKEN_LLT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LLT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LLT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_EN (location_type l)
-      {
-        return symbol_type (token::TOKEN_EN, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_EN (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_EN, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LL (location_type l)
-      {
-        return symbol_type (token::TOKEN_LL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_IDENTIFIER (location_type l)
-      {
-        return symbol_type (token::TOKEN_IDENTIFIER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_IDENTIFIER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_IDENTIFIER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HTYPE (location_type l)
-      {
-        return symbol_type (token::TOKEN_HTYPE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HTYPE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HTYPE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TIME (location_type l)
-      {
-        return symbol_type (token::TOKEN_TIME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TIME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TIME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ENTERPRISE_ID (location_type l)
-      {
-        return symbol_type (token::TOKEN_ENTERPRISE_ID, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ENTERPRISE_ID (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ENTERPRISE_ID, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP4O6_PORT (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP4O6_PORT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP4O6_PORT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP4O6_PORT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONTROL_SOCKET (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_SOCKET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONTROL_SOCKET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_SOCKET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SOCKET_TYPE (location_type l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_TYPE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SOCKET_TYPE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_TYPE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SOCKET_NAME (location_type l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_NAME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SOCKET_NAME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SOCKET_NAME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP_QUEUE_CONTROL (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP_QUEUE_CONTROL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP_QUEUE_CONTROL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP_QUEUE_CONTROL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP_DDNS (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP_DDNS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP_DDNS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP_DDNS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ENABLE_UPDATES (location_type l)
-      {
-        return symbol_type (token::TOKEN_ENABLE_UPDATES, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ENABLE_UPDATES (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ENABLE_UPDATES, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_QUALIFYING_SUFFIX (location_type l)
-      {
-        return symbol_type (token::TOKEN_QUALIFYING_SUFFIX, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_QUALIFYING_SUFFIX (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_QUALIFYING_SUFFIX, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SERVER_IP (location_type l)
-      {
-        return symbol_type (token::TOKEN_SERVER_IP, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SERVER_IP (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SERVER_IP, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SERVER_PORT (location_type l)
-      {
-        return symbol_type (token::TOKEN_SERVER_PORT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SERVER_PORT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SERVER_PORT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SENDER_IP (location_type l)
-      {
-        return symbol_type (token::TOKEN_SENDER_IP, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SENDER_IP (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SENDER_IP, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SENDER_PORT (location_type l)
-      {
-        return symbol_type (token::TOKEN_SENDER_PORT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SENDER_PORT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SENDER_PORT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAX_QUEUE_SIZE (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAX_QUEUE_SIZE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAX_QUEUE_SIZE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAX_QUEUE_SIZE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NCR_PROTOCOL (location_type l)
-      {
-        return symbol_type (token::TOKEN_NCR_PROTOCOL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_NCR_PROTOCOL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_NCR_PROTOCOL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NCR_FORMAT (location_type l)
-      {
-        return symbol_type (token::TOKEN_NCR_FORMAT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_NCR_FORMAT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_NCR_FORMAT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OVERRIDE_NO_UPDATE (location_type l)
-      {
-        return symbol_type (token::TOKEN_OVERRIDE_NO_UPDATE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OVERRIDE_NO_UPDATE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OVERRIDE_NO_UPDATE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OVERRIDE_CLIENT_UPDATE (location_type l)
-      {
-        return symbol_type (token::TOKEN_OVERRIDE_CLIENT_UPDATE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OVERRIDE_CLIENT_UPDATE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OVERRIDE_CLIENT_UPDATE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_REPLACE_CLIENT_NAME (location_type l)
-      {
-        return symbol_type (token::TOKEN_REPLACE_CLIENT_NAME, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_REPLACE_CLIENT_NAME (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_REPLACE_CLIENT_NAME, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_GENERATED_PREFIX (location_type l)
-      {
-        return symbol_type (token::TOKEN_GENERATED_PREFIX, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_GENERATED_PREFIX (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_GENERATED_PREFIX, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_UDP (location_type l)
-      {
-        return symbol_type (token::TOKEN_UDP, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_UDP (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_UDP, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TCP (location_type l)
-      {
-        return symbol_type (token::TOKEN_TCP, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TCP (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TCP, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_JSON (location_type l)
-      {
-        return symbol_type (token::TOKEN_JSON, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_JSON (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_JSON, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_WHEN_PRESENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_WHEN_PRESENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_WHEN_PRESENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_WHEN_PRESENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_NEVER (location_type l)
-      {
-        return symbol_type (token::TOKEN_NEVER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_NEVER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_NEVER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_ALWAYS (location_type l)
-      {
-        return symbol_type (token::TOKEN_ALWAYS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_ALWAYS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_ALWAYS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_WHEN_NOT_PRESENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_WHEN_NOT_PRESENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_WHEN_NOT_PRESENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_WHEN_NOT_PRESENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOSTNAME_CHAR_SET (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOSTNAME_CHAR_SET, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOSTNAME_CHAR_SET (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOSTNAME_CHAR_SET, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_HOSTNAME_CHAR_REPLACEMENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_HOSTNAME_CHAR_REPLACEMENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_HOSTNAME_CHAR_REPLACEMENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_HOSTNAME_CHAR_REPLACEMENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LOGGING (location_type l)
-      {
-        return symbol_type (token::TOKEN_LOGGING, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LOGGING (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LOGGING, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_LOGGERS (location_type l)
-      {
-        return symbol_type (token::TOKEN_LOGGERS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_LOGGERS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_LOGGERS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OUTPUT_OPTIONS (location_type l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT_OPTIONS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OUTPUT_OPTIONS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT_OPTIONS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_OUTPUT (location_type l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_OUTPUT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_OUTPUT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DEBUGLEVEL (location_type l)
-      {
-        return symbol_type (token::TOKEN_DEBUGLEVEL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DEBUGLEVEL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DEBUGLEVEL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SEVERITY (location_type l)
-      {
-        return symbol_type (token::TOKEN_SEVERITY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SEVERITY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SEVERITY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FLUSH (location_type l)
-      {
-        return symbol_type (token::TOKEN_FLUSH, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_FLUSH (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_FLUSH, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAXSIZE (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAXSIZE, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAXSIZE (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAXSIZE, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_MAXVER (location_type l)
-      {
-        return symbol_type (token::TOKEN_MAXVER, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_MAXVER (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_MAXVER, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCP4 (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCP4, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCP4 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCP4, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_DHCPDDNS (location_type l)
-      {
-        return symbol_type (token::TOKEN_DHCPDDNS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_DHCPDDNS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_DHCPDDNS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_CONTROL_AGENT (location_type l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_AGENT, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_CONTROL_AGENT (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_CONTROL_AGENT, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TOPLEVEL_JSON (location_type l)
-      {
-        return symbol_type (token::TOKEN_TOPLEVEL_JSON, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TOPLEVEL_JSON (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TOPLEVEL_JSON, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_TOPLEVEL_DHCP6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_TOPLEVEL_DHCP6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_TOPLEVEL_DHCP6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_TOPLEVEL_DHCP6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_DHCP6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_DHCP6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_DHCP6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_DHCP6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_INTERFACES6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_INTERFACES6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_INTERFACES6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_INTERFACES6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_SUBNET6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_SUBNET6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_SUBNET6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_SUBNET6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_POOL6 (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_POOL6, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_POOL6 (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_POOL6, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_PD_POOL (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_PD_POOL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_PD_POOL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_PD_POOL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_RESERVATION (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_RESERVATION, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_RESERVATION (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_RESERVATION, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_OPTION_DEFS (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_OPTION_DEFS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_OPTION_DEFS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_OPTION_DEFS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_OPTION_DEF (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_OPTION_DEF, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_OPTION_DEF (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_OPTION_DEF, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_OPTION_DATA (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_OPTION_DATA, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_OPTION_DATA (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_OPTION_DATA, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_HOOKS_LIBRARY (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_HOOKS_LIBRARY, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_HOOKS_LIBRARY (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_HOOKS_LIBRARY, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_DHCP_DDNS (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_DHCP_DDNS, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_DHCP_DDNS (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_DHCP_DDNS, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_LOGGING (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_LOGGING, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_LOGGING (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_LOGGING, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_SUB_CONFIG_CONTROL (location_type l)
-      {
-        return symbol_type (token::TOKEN_SUB_CONFIG_CONTROL, std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_SUB_CONFIG_CONTROL (const location_type& l)
-      {
-        return symbol_type (token::TOKEN_SUB_CONFIG_CONTROL, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_STRING (std::string v, location_type l)
-      {
-        return symbol_type (token::TOKEN_STRING, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_STRING (const std::string& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_STRING, v, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_INTEGER (int64_t v, location_type l)
-      {
-        return symbol_type (token::TOKEN_INTEGER, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_INTEGER (const int64_t& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_INTEGER, v, l);
-      }
-#endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_FLOAT (double v, location_type l)
-      {
-        return symbol_type (token::TOKEN_FLOAT, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_FLOAT (const double& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_FLOAT, v, l);
-      }
+    // Symbol constructors declarations.
+    static
+    symbol_type
+    make_END (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_COMMA (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_COLON (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LSQUARE_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RSQUARE_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LCURLY_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RCURLY_BRACKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_NULL_TYPE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DATA_DIRECTORY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONFIG_CONTROL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONFIG_DATABASES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONFIG_FETCH_WAIT_TIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_INTERFACES_CONFIG (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_INTERFACES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RE_DETECT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LEASE_DATABASE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOSTS_DATABASE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOSTS_DATABASES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TYPE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MEMFILE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MYSQL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_POSTGRESQL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CQL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_USER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PASSWORD (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOST (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PORT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PERSIST (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LFC_INTERVAL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_READONLY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONNECT_TIMEOUT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONTACT_POINTS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAX_RECONNECT_TRIES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RECONNECT_WAIT_TIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_KEYSPACE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONSISTENCY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SERIAL_CONSISTENCY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_REQUEST_TIMEOUT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TCP_KEEPALIVE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TCP_NODELAY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PREFERRED_LIFETIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_VALID_LIFETIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RENEW_TIMER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_REBIND_TIMER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DECLINE_PROBATION_PERIOD (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SERVER_TAG (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUBNET6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OPTION_DEF (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OPTION_DATA (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_NAME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DATA (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CODE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SPACE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CSV_FORMAT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ALWAYS_SEND (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RECORD_TYPES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ENCAPSULATE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ARRAY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_POOLS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_POOL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PD_POOLS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PREFIX (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PREFIX_LEN (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_EXCLUDED_PREFIX (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_EXCLUDED_PREFIX_LEN (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DELEGATED_LEN (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_USER_CONTEXT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_COMMENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUBNET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_INTERFACE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_INTERFACE_ID (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ID (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RAPID_COMMIT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RESERVATION_MODE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DISABLED (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OUT_OF_POOL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_GLOBAL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ALL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SHARED_NETWORKS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAC_SOURCES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RELAY_SUPPLIED_OPTIONS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOST_RESERVATION_IDENTIFIERS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SANITY_CHECKS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LEASE_CHECKS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CLIENT_CLASSES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_REQUIRE_CLIENT_CLASSES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TEST (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ONLY_IF_REQUIRED (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CLIENT_CLASS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RESERVATIONS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_IP_ADDRESSES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PREFIXES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DUID (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HW_ADDRESS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOSTNAME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_FLEX_ID (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RELAY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_IP_ADDRESS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOOKS_LIBRARIES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LIBRARY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_PARAMETERS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_EXPIRED_LEASES_PROCESSING (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_RECLAIM_TIMER_WAIT_TIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOLD_RECLAIMED_TIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAX_RECLAIM_LEASES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAX_RECLAIM_TIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_UNWARNED_RECLAIM_CYCLES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SERVER_ID (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LLT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_EN (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_IDENTIFIER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HTYPE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TIME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ENTERPRISE_ID (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP4O6_PORT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONTROL_SOCKET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SOCKET_TYPE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SOCKET_NAME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP_QUEUE_CONTROL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP_DDNS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ENABLE_UPDATES (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_QUALIFYING_SUFFIX (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SERVER_IP (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SERVER_PORT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SENDER_IP (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SENDER_PORT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAX_QUEUE_SIZE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_NCR_PROTOCOL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_NCR_FORMAT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OVERRIDE_NO_UPDATE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OVERRIDE_CLIENT_UPDATE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_REPLACE_CLIENT_NAME (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_GENERATED_PREFIX (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_UDP (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TCP (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_JSON (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_WHEN_PRESENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_NEVER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_ALWAYS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_WHEN_NOT_PRESENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOSTNAME_CHAR_SET (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_HOSTNAME_CHAR_REPLACEMENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LOGGING (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_LOGGERS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OUTPUT_OPTIONS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_OUTPUT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DEBUGLEVEL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SEVERITY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_FLUSH (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAXSIZE (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_MAXVER (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCP4 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_DHCPDDNS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_CONTROL_AGENT (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TOPLEVEL_JSON (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_TOPLEVEL_DHCP6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_DHCP6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_INTERFACES6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_SUBNET6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_POOL6 (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_PD_POOL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_RESERVATION (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_OPTION_DEFS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_OPTION_DEF (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_OPTION_DATA (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_HOOKS_LIBRARY (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_DHCP_DDNS (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_LOGGING (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_SUB_CONFIG_CONTROL (YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_STRING (YY_COPY (std::string) v, YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_INTEGER (YY_COPY (int64_t) v, YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_FLOAT (YY_COPY (double) v, YY_COPY (location_type) l);
+
+    static
+    symbol_type
+    make_BOOLEAN (YY_COPY (bool) v, YY_COPY (location_type) l);
+
+
+
+  private:
+    /// This class is not copyable.
+    Dhcp6Parser (const Dhcp6Parser&);
+    Dhcp6Parser& operator= (const Dhcp6Parser&);
+
+    /// State numbers.
+    typedef int state_type;
+
+    /// Generate an error message.
+    /// \param yystate   the state where the error occurred.
+    /// \param yyla      the lookahead token.
+    virtual std::string yysyntax_error_ (state_type yystate,
+                                         const symbol_type& yyla) const;
+
+    /// Compute post-reduction state.
+    /// \param yystate   the current state
+    /// \param yysym     the nonterminal to push on the stack
+    state_type yy_lr_goto_state_ (state_type yystate, int yysym);
+
+    /// Whether the given \c yypact_ value indicates a defaulted state.
+    /// \param yyvalue   the value to check
+    static bool yy_pact_value_is_default_ (int yyvalue);
+
+    /// Whether the given \c yytable_ value indicates a syntax error.
+    /// \param yyvalue   the value to check
+    static bool yy_table_value_is_error_ (int yyvalue);
+
+    static const short yypact_ninf_;
+    static const signed char yytable_ninf_;
+
+    /// Convert a scanner token number \a t to a symbol number.
+    static token_number_type yytranslate_ (token_type t);
+
+    // Tables.
+  // YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+  // STATE-NUM.
+  static const short yypact_[];
+
+  // YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+  // Performed when YYTABLE does not specify something else to do.  Zero
+  // means the default is an error.
+  static const unsigned short yydefact_[];
+
+  // YYPGOTO[NTERM-NUM].
+  static const short yypgoto_[];
+
+  // YYDEFGOTO[NTERM-NUM].
+  static const short yydefgoto_[];
+
+  // YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+  // positive, shift that token.  If negative, reduce the rule whose
+  // number is the opposite.  If YYTABLE_NINF, syntax error.
+  static const unsigned short yytable_[];
+
+  static const short yycheck_[];
+
+  // YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+  // symbol of state STATE-NUM.
+  static const unsigned short yystos_[];
+
+  // YYR1[YYN] -- Symbol number of symbol that rule YYN derives.
+  static const unsigned short yyr1_[];
+
+  // YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.
+  static const unsigned char yyr2_[];
+
+
+    /// Convert the symbol name \a n to a form suitable for a diagnostic.
+    static std::string yytnamerr_ (const char *n);
+
+
+    /// For a symbol, its name in clear.
+    static const char* const yytname_[];
+#if PARSER6_DEBUG
+  // YYRLINE[YYN] -- Source line where rule number YYN was defined.
+  static const unsigned short yyrline_[];
+    /// Report on the debug stream that the rule \a r is going to be reduced.
+    virtual void yy_reduce_print_ (int r);
+    /// Print the state stack on the debug stream.
+    virtual void yystack_print_ ();
+
+    /// Debugging level.
+    int yydebug_;
+    /// Debug stream.
+    std::ostream* yycdebug_;
+
+    /// \brief Display a symbol type, value and location.
+    /// \param yyo    The output stream.
+    /// \param yysym  The symbol.
+    template <typename Base>
+    void yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const;
 #endif
-#if 201103L <= YY_CPLUSPLUS
-      static
-      symbol_type
-      make_BOOLEAN (bool v, location_type l)
-      {
-        return symbol_type (token::TOKEN_BOOLEAN, std::move (v), std::move (l));
-      }
-#else
-      static
-      symbol_type
-      make_BOOLEAN (const bool& v, const location_type& l)
-      {
-        return symbol_type (token::TOKEN_BOOLEAN, v, l);
-      }
+
+    /// \brief Reclaim the memory associated to a symbol.
+    /// \param yymsg     Why this token is reclaimed.
+    ///                  If null, print nothing.
+    /// \param yysym     The symbol.
+    template <typename Base>
+    void yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const;
+
+  private:
+    /// Type access provider for state based symbols.
+    struct by_state
+    {
+      /// Default constructor.
+      by_state ();
+
+      /// The symbol type as needed by the constructor.
+      typedef state_type kind_type;
+
+      /// Constructor.
+      by_state (kind_type s);
+
+      /// Copy constructor.
+      by_state (const by_state& other);
+
+      /// Record that this symbol is empty.
+      void clear ();
+
+      /// Steal the symbol type from \a that.
+      void move (by_state& that);
+
+      /// The (internal) type number (corresponding to \a state).
+      /// \a empty_symbol when empty.
+      symbol_number_type type_get () const;
+
+      /// The state number used to denote an empty symbol.
+      enum { empty_state = -1 };
+
+      /// The state.
+      /// \a empty when empty.
+      state_type state;
+    };
+
+    /// "Internal" symbol: element of the stack.
+    struct stack_symbol_type : basic_symbol<by_state>
+    {
+      /// Superclass.
+      typedef basic_symbol<by_state> super_type;
+      /// Construct an empty symbol.
+      stack_symbol_type ();
+      /// Move or copy construction.
+      stack_symbol_type (YY_RVREF (stack_symbol_type) that);
+      /// Steal the contents from \a sym to build this.
+      stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) sym);
+#if !defined __cplusplus || __cplusplus < 201103L
+      /// Assignment, needed by push_back by some old implementations.
+      /// Moves the contents of that.
+      stack_symbol_type& operator= (stack_symbol_type& that);
 #endif
+    };
+
+    /// Stack type.
+    typedef stack<stack_symbol_type> stack_type;
+
+    /// The stack.
+    stack_type yystack_;
+
+    /// Push a new state on the stack.
+    /// \param m    a debug message to display
+    ///             if null, no trace is output.
+    /// \param sym  the symbol
+    /// \warning the contents of \a s.value is stolen.
+    void yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym);
+
+    /// Push a new look ahead token on the state on the stack.
+    /// \param m    a debug message to display
+    ///             if null, no trace is output.
+    /// \param s    the state
+    /// \param sym  the symbol (for its value and location).
+    /// \warning the contents of \a sym.value is stolen.
+    void yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym);
+
+    /// Pop \a n symbols from the stack.
+    void yypop_ (int n = 1);
+
+    /// Constants.
+    enum
+    {
+      yyeof_ = 0,
+      yylast_ = 1039,     ///< Last index in yytable_.
+      yynnts_ = 396,  ///< Number of nonterminal symbols.
+      yyfinal_ = 32, ///< Termination state number.
+      yyterror_ = 1,
+      yyerrcode_ = 256,
+      yyntokens_ = 178  ///< Number of tokens.
+    };
+
+
+    // User arguments.
+    isc::dhcp::Parser6Context& ctx;
+  };
+
+  // Symbol number corresponding to token number t.
+  inline
+  Dhcp6Parser::token_number_type
+  Dhcp6Parser::yytranslate_ (token_type t)
+  {
+    static
+    const token_number_type
+    translate_table[] =
+    {
+     0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      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,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
+     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177
+    };
+    const unsigned user_token_number_max_ = 432;
+    const token_number_type undef_token_ = 2;
+
+    if (static_cast<int> (t) <= yyeof_)
+      return yyeof_;
+    else if (static_cast<unsigned> (t) <= user_token_number_max_)
+      return translate_table[t];
+    else
+      return undef_token_;
+  }
+
+  inline
+  Dhcp6Parser::syntax_error::syntax_error (const location_type& l, const std::string& m)
+    : std::runtime_error (m)
+    , location (l)
+  {}
+
+  // basic_symbol.
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol ()
+    : value ()
+    , location ()
+  {}
+
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol (YY_RVREF (basic_symbol) other)
+    : Base (YY_MOVE (other))
+    , value ()
+    , location (YY_MOVE (other.location))
+  {
+    switch (other.type_get ())
+    {
+      case 195: // value
+      case 199: // map_value
+      case 253: // db_type
+      case 346: // hr_mode
+      case 482: // duid_type
+      case 517: // ncr_protocol_value
+      case 524: // replace_client_name_value
+        value.YY_MOVE_OR_COPY< ElementPtr > (YY_MOVE (other.value));
+        break;
+
+      case 177: // "boolean"
+        value.YY_MOVE_OR_COPY< bool > (YY_MOVE (other.value));
+        break;
+
+      case 176: // "floating point"
+        value.YY_MOVE_OR_COPY< double > (YY_MOVE (other.value));
+        break;
+
+      case 175: // "integer"
+        value.YY_MOVE_OR_COPY< int64_t > (YY_MOVE (other.value));
+        break;
+
+      case 174: // "constant string"
+        value.YY_MOVE_OR_COPY< std::string > (YY_MOVE (other.value));
+        break;
+
+      default:
+        break;
+    }
+
+  }
+
+
+  // Implementation of basic_symbol constructor for each type.
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (location_type) l)
+    : Base (t)
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (ElementPtr) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (bool) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (double) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (int64_t) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::basic_symbol (typename Base::kind_type t, YY_RVREF (std::string) v, YY_RVREF (location_type) l)
+    : Base (t)
+    , value (YY_MOVE (v))
+    , location (YY_MOVE (l))
+  {}
+
+
+
+  template <typename Base>
+  Dhcp6Parser::basic_symbol<Base>::~basic_symbol ()
+  {
+    clear ();
+  }
+
+  template <typename Base>
+  void
+  Dhcp6Parser::basic_symbol<Base>::clear ()
+  {
+    // User destructor.
+    symbol_number_type yytype = this->type_get ();
+    basic_symbol<Base>& yysym = *this;
+    (void) yysym;
+    switch (yytype)
+    {
+   default:
+      break;
+    }
+
+    // Type destructor.
+  switch (yytype)
+    {
+      case 195: // value
+      case 199: // map_value
+      case 253: // db_type
+      case 346: // hr_mode
+      case 482: // duid_type
+      case 517: // ncr_protocol_value
+      case 524: // replace_client_name_value
+        value.template destroy< ElementPtr > ();
+        break;
+
+      case 177: // "boolean"
+        value.template destroy< bool > ();
+        break;
+
+      case 176: // "floating point"
+        value.template destroy< double > ();
+        break;
+
+      case 175: // "integer"
+        value.template destroy< int64_t > ();
+        break;
+
+      case 174: // "constant string"
+        value.template destroy< std::string > ();
+        break;
+
+      default:
+        break;
+    }
+
+    Base::clear ();
+  }
+
+  template <typename Base>
+  bool
+  Dhcp6Parser::basic_symbol<Base>::empty () const
+  {
+    return Base::type_get () == empty_symbol;
+  }
+
+  template <typename Base>
+  void
+  Dhcp6Parser::basic_symbol<Base>::move (basic_symbol& s)
+  {
+    super_type::move (s);
+    switch (this->type_get ())
+    {
+      case 195: // value
+      case 199: // map_value
+      case 253: // db_type
+      case 346: // hr_mode
+      case 482: // duid_type
+      case 517: // ncr_protocol_value
+      case 524: // replace_client_name_value
+        value.move< ElementPtr > (YY_MOVE (s.value));
+        break;
+
+      case 177: // "boolean"
+        value.move< bool > (YY_MOVE (s.value));
+        break;
+
+      case 176: // "floating point"
+        value.move< double > (YY_MOVE (s.value));
+        break;
+
+      case 175: // "integer"
+        value.move< int64_t > (YY_MOVE (s.value));
+        break;
+
+      case 174: // "constant string"
+        value.move< std::string > (YY_MOVE (s.value));
+        break;
+
+      default:
+        break;
+    }
+
+    location = YY_MOVE (s.location);
+  }
+
+  // by_type.
+  inline
+  Dhcp6Parser::by_type::by_type ()
+    : type (empty_symbol)
+  {}
+
+  inline
+  Dhcp6Parser::by_type::by_type (const by_type& other)
+    : type (other.type)
+  {}
+
+  inline
+  Dhcp6Parser::by_type::by_type (token_type t)
+    : type (yytranslate_ (t))
+  {}
+
+  inline
+  void
+  Dhcp6Parser::by_type::clear ()
+  {
+    type = empty_symbol;
+  }
+
+  inline
+  void
+  Dhcp6Parser::by_type::move (by_type& that)
+  {
+    type = that.type;
+    that.clear ();
+  }
+
+  inline
+  int
+  Dhcp6Parser::by_type::type_get () const
+  {
+    return type;
+  }
+
+  inline
+  Dhcp6Parser::token_type
+  Dhcp6Parser::by_type::token () const
+  {
+    // YYTOKNUM[NUM] -- (External) token number corresponding to the
+    // (internal) symbol number NUM (which must be that of a token).  */
+    static
+    const unsigned short
+    yytoken_number_[] =
+    {
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     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,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
+     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
+     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
+     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
+     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
+     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
+     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
+     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
+     425,   426,   427,   428,   429,   430,   431,   432
+    };
+    return static_cast<token_type> (yytoken_number_[type]);
+  }
+
+  // Implementation of make_symbol for each symbol type.
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_END (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_END, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_COMMA (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_COMMA, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_COLON (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_COLON, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LSQUARE_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LSQUARE_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RSQUARE_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RSQUARE_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LCURLY_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LCURLY_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RCURLY_BRACKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RCURLY_BRACKET, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_NULL_TYPE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_NULL_TYPE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DHCP6 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP6, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DATA_DIRECTORY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DATA_DIRECTORY, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONFIG_CONTROL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONFIG_CONTROL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONFIG_DATABASES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONFIG_DATABASES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONFIG_FETCH_WAIT_TIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONFIG_FETCH_WAIT_TIME, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_INTERFACES_CONFIG (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_INTERFACES_CONFIG, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_INTERFACES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_INTERFACES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RE_DETECT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RE_DETECT, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LEASE_DATABASE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LEASE_DATABASE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOSTS_DATABASE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOSTS_DATABASE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOSTS_DATABASES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOSTS_DATABASES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TYPE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_TYPE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MEMFILE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MEMFILE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MYSQL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MYSQL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_POSTGRESQL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_POSTGRESQL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CQL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CQL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_USER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_USER, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PASSWORD (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PASSWORD, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOST (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOST, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PORT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PORT, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PERSIST (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PERSIST, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LFC_INTERVAL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LFC_INTERVAL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_READONLY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_READONLY, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONNECT_TIMEOUT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONNECT_TIMEOUT, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONTACT_POINTS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONTACT_POINTS, YY_MOVE (l));
+  }
 
-  private:
-    /// This class is not copyable.
-    Dhcp6Parser (const Dhcp6Parser&);
-    Dhcp6Parser& operator= (const Dhcp6Parser&);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MAX_RECONNECT_TRIES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAX_RECONNECT_TRIES, YY_MOVE (l));
+  }
 
-    /// State numbers.
-    typedef int state_type;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RECONNECT_WAIT_TIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RECONNECT_WAIT_TIME, YY_MOVE (l));
+  }
 
-    /// Generate an error message.
-    /// \param yystate   the state where the error occurred.
-    /// \param yyla      the lookahead token.
-    virtual std::string yysyntax_error_ (state_type yystate,
-                                         const symbol_type& yyla) const;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_KEYSPACE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_KEYSPACE, YY_MOVE (l));
+  }
 
-    /// Compute post-reduction state.
-    /// \param yystate   the current state
-    /// \param yysym     the nonterminal to push on the stack
-    state_type yy_lr_goto_state_ (state_type yystate, int yysym);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONSISTENCY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONSISTENCY, YY_MOVE (l));
+  }
 
-    /// Whether the given \c yypact_ value indicates a defaulted state.
-    /// \param yyvalue   the value to check
-    static bool yy_pact_value_is_default_ (int yyvalue);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SERIAL_CONSISTENCY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SERIAL_CONSISTENCY, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_REQUEST_TIMEOUT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_REQUEST_TIMEOUT, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TCP_KEEPALIVE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_TCP_KEEPALIVE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TCP_NODELAY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_TCP_NODELAY, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PREFERRED_LIFETIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PREFERRED_LIFETIME, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_VALID_LIFETIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_VALID_LIFETIME, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RENEW_TIMER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RENEW_TIMER, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_REBIND_TIMER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_REBIND_TIMER, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DECLINE_PROBATION_PERIOD (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DECLINE_PROBATION_PERIOD, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SERVER_TAG (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SERVER_TAG, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUBNET6 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUBNET6, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_OPTION_DEF (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OPTION_DEF, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_OPTION_DATA (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OPTION_DATA, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_NAME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_NAME, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DATA (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DATA, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CODE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CODE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SPACE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SPACE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CSV_FORMAT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CSV_FORMAT, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ALWAYS_SEND (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ALWAYS_SEND, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RECORD_TYPES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RECORD_TYPES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ENCAPSULATE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ENCAPSULATE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ARRAY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ARRAY, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_POOLS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_POOLS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_POOL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_POOL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PD_POOLS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PD_POOLS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PREFIX (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PREFIX, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PREFIX_LEN (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PREFIX_LEN, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_EXCLUDED_PREFIX (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_EXCLUDED_PREFIX, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_EXCLUDED_PREFIX_LEN (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_EXCLUDED_PREFIX_LEN, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DELEGATED_LEN (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DELEGATED_LEN, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_USER_CONTEXT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_USER_CONTEXT, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_COMMENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_COMMENT, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUBNET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUBNET, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_INTERFACE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_INTERFACE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_INTERFACE_ID (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_INTERFACE_ID, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ID (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ID, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RAPID_COMMIT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RAPID_COMMIT, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RESERVATION_MODE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RESERVATION_MODE, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DISABLED (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DISABLED, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_OUT_OF_POOL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OUT_OF_POOL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_GLOBAL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_GLOBAL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ALL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ALL, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SHARED_NETWORKS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SHARED_NETWORKS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MAC_SOURCES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAC_SOURCES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RELAY_SUPPLIED_OPTIONS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RELAY_SUPPLIED_OPTIONS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOST_RESERVATION_IDENTIFIERS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOST_RESERVATION_IDENTIFIERS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SANITY_CHECKS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SANITY_CHECKS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LEASE_CHECKS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LEASE_CHECKS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CLIENT_CLASSES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CLIENT_CLASSES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_REQUIRE_CLIENT_CLASSES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_REQUIRE_CLIENT_CLASSES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TEST (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_TEST, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ONLY_IF_REQUIRED (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ONLY_IF_REQUIRED, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CLIENT_CLASS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CLIENT_CLASS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RESERVATIONS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RESERVATIONS, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_IP_ADDRESSES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_IP_ADDRESSES, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PREFIXES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PREFIXES, YY_MOVE (l));
+  }
 
-    /// Whether the given \c yytable_ value indicates a syntax error.
-    /// \param yyvalue   the value to check
-    static bool yy_table_value_is_error_ (int yyvalue);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DUID (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DUID, YY_MOVE (l));
+  }
 
-    static const short yypact_ninf_;
-    static const signed char yytable_ninf_;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HW_ADDRESS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HW_ADDRESS, YY_MOVE (l));
+  }
 
-    /// Convert a scanner token number \a t to a symbol number.
-    static token_number_type yytranslate_ (token_type t);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOSTNAME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOSTNAME, YY_MOVE (l));
+  }
 
-    // Tables.
-  // YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-  // STATE-NUM.
-  static const short yypact_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_FLEX_ID (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_FLEX_ID, YY_MOVE (l));
+  }
 
-  // YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
-  // Performed when YYTABLE does not specify something else to do.  Zero
-  // means the default is an error.
-  static const unsigned short yydefact_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RELAY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RELAY, YY_MOVE (l));
+  }
 
-  // YYPGOTO[NTERM-NUM].
-  static const short yypgoto_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_IP_ADDRESS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_IP_ADDRESS, YY_MOVE (l));
+  }
 
-  // YYDEFGOTO[NTERM-NUM].
-  static const short yydefgoto_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOOKS_LIBRARIES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOOKS_LIBRARIES, YY_MOVE (l));
+  }
 
-  // YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
-  // positive, shift that token.  If negative, reduce the rule whose
-  // number is the opposite.  If YYTABLE_NINF, syntax error.
-  static const unsigned short yytable_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LIBRARY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LIBRARY, YY_MOVE (l));
+  }
 
-  static const short yycheck_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_PARAMETERS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_PARAMETERS, YY_MOVE (l));
+  }
 
-  // YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-  // symbol of state STATE-NUM.
-  static const unsigned short yystos_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_EXPIRED_LEASES_PROCESSING (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_EXPIRED_LEASES_PROCESSING, YY_MOVE (l));
+  }
 
-  // YYR1[YYN] -- Symbol number of symbol that rule YYN derives.
-  static const unsigned short yyr1_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_RECLAIM_TIMER_WAIT_TIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_RECLAIM_TIMER_WAIT_TIME, YY_MOVE (l));
+  }
 
-  // YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.
-  static const unsigned char yyr2_[];
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_FLUSH_RECLAIMED_TIMER_WAIT_TIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_FLUSH_RECLAIMED_TIMER_WAIT_TIME, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOLD_RECLAIMED_TIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOLD_RECLAIMED_TIME, YY_MOVE (l));
+  }
 
-    /// Convert the symbol name \a n to a form suitable for a diagnostic.
-    static std::string yytnamerr_ (const char *n);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MAX_RECLAIM_LEASES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAX_RECLAIM_LEASES, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MAX_RECLAIM_TIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAX_RECLAIM_TIME, YY_MOVE (l));
+  }
 
-    /// For a symbol, its name in clear.
-    static const char* const yytname_[];
-#if PARSER6_DEBUG
-  // YYRLINE[YYN] -- Source line where rule number YYN was defined.
-  static const unsigned short yyrline_[];
-    /// Report on the debug stream that the rule \a r is going to be reduced.
-    virtual void yy_reduce_print_ (int r);
-    /// Print the state stack on the debug stream.
-    virtual void yystack_print_ ();
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_UNWARNED_RECLAIM_CYCLES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_UNWARNED_RECLAIM_CYCLES, YY_MOVE (l));
+  }
 
-    /// Debugging level.
-    int yydebug_;
-    /// Debug stream.
-    std::ostream* yycdebug_;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SERVER_ID (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SERVER_ID, YY_MOVE (l));
+  }
 
-    /// \brief Display a symbol type, value and location.
-    /// \param yyo    The output stream.
-    /// \param yysym  The symbol.
-    template <typename Base>
-    void yy_print_ (std::ostream& yyo, const basic_symbol<Base>& yysym) const;
-#endif
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LLT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LLT, YY_MOVE (l));
+  }
 
-    /// \brief Reclaim the memory associated to a symbol.
-    /// \param yymsg     Why this token is reclaimed.
-    ///                  If null, print nothing.
-    /// \param yysym     The symbol.
-    template <typename Base>
-    void yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_EN (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_EN, YY_MOVE (l));
+  }
 
-  private:
-    /// Type access provider for state based symbols.
-    struct by_state
-    {
-      /// Default constructor.
-      by_state () YY_NOEXCEPT;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LL, YY_MOVE (l));
+  }
 
-      /// The symbol type as needed by the constructor.
-      typedef state_type kind_type;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_IDENTIFIER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_IDENTIFIER, YY_MOVE (l));
+  }
 
-      /// Constructor.
-      by_state (kind_type s) YY_NOEXCEPT;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HTYPE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HTYPE, YY_MOVE (l));
+  }
 
-      /// Copy constructor.
-      by_state (const by_state& that) YY_NOEXCEPT;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TIME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_TIME, YY_MOVE (l));
+  }
 
-      /// Record that this symbol is empty.
-      void clear () YY_NOEXCEPT;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ENTERPRISE_ID (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ENTERPRISE_ID, YY_MOVE (l));
+  }
 
-      /// Steal the symbol type from \a that.
-      void move (by_state& that);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DHCP4O6_PORT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP4O6_PORT, YY_MOVE (l));
+  }
 
-      /// The (internal) type number (corresponding to \a state).
-      /// \a empty_symbol when empty.
-      symbol_number_type type_get () const YY_NOEXCEPT;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONTROL_SOCKET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONTROL_SOCKET, YY_MOVE (l));
+  }
 
-      /// The state number used to denote an empty symbol.
-      enum { empty_state = -1 };
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SOCKET_TYPE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SOCKET_TYPE, YY_MOVE (l));
+  }
 
-      /// The state.
-      /// \a empty when empty.
-      state_type state;
-    };
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SOCKET_NAME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SOCKET_NAME, YY_MOVE (l));
+  }
 
-    /// "Internal" symbol: element of the stack.
-    struct stack_symbol_type : basic_symbol<by_state>
-    {
-      /// Superclass.
-      typedef basic_symbol<by_state> super_type;
-      /// Construct an empty symbol.
-      stack_symbol_type ();
-      /// Move or copy construction.
-      stack_symbol_type (YY_RVREF (stack_symbol_type) that);
-      /// Steal the contents from \a sym to build this.
-      stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) sym);
-#if YY_CPLUSPLUS < 201103L
-      /// Assignment, needed by push_back by some old implementations.
-      /// Moves the contents of that.
-      stack_symbol_type& operator= (stack_symbol_type& that);
-#endif
-    };
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DHCP_QUEUE_CONTROL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP_QUEUE_CONTROL, YY_MOVE (l));
+  }
 
-    /// A stack with random access from its top.
-    template <typename T, typename S = std::vector<T> >
-    class stack
-    {
-    public:
-      // Hide our reversed order.
-      typedef typename S::reverse_iterator iterator;
-      typedef typename S::const_reverse_iterator const_iterator;
-      typedef typename S::size_type size_type;
-
-      stack (size_type n = 200)
-        : seq_ (n)
-      {}
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      T&
-      operator[] (size_type i)
-      {
-        return seq_[size () - 1 - i];
-      }
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      T&
-      operator[] (int i)
-      {
-        return operator[] (size_type (i));
-      }
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      const T&
-      operator[] (size_type i) const
-      {
-        return seq_[size () - 1 - i];
-      }
-
-      /// Random access.
-      ///
-      /// Index 0 returns the topmost element.
-      const T&
-      operator[] (int i) const
-      {
-        return operator[] (size_type (i));
-      }
-
-      /// Steal the contents of \a t.
-      ///
-      /// Close to move-semantics.
-      void
-      push (YY_MOVE_REF (T) t)
-      {
-        seq_.push_back (T ());
-        operator[] (0).move (t);
-      }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DHCP_DDNS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP_DDNS, YY_MOVE (l));
+  }
 
-      /// Pop elements from the stack.
-      void
-      pop (int n = 1) YY_NOEXCEPT
-      {
-        for (; 0 < n; --n)
-          seq_.pop_back ();
-      }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ENABLE_UPDATES (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ENABLE_UPDATES, YY_MOVE (l));
+  }
 
-      /// Pop all elements from the stack.
-      void
-      clear () YY_NOEXCEPT
-      {
-        seq_.clear ();
-      }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_QUALIFYING_SUFFIX (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_QUALIFYING_SUFFIX, YY_MOVE (l));
+  }
 
-      /// Number of elements on the stack.
-      size_type
-      size () const YY_NOEXCEPT
-      {
-        return seq_.size ();
-      }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SERVER_IP (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SERVER_IP, YY_MOVE (l));
+  }
 
-      /// Iterator on top of the stack (going downwards).
-      const_iterator
-      begin () const YY_NOEXCEPT
-      {
-        return seq_.rbegin ();
-      }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SERVER_PORT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SERVER_PORT, YY_MOVE (l));
+  }
 
-      /// Bottom of the stack.
-      const_iterator
-      end () const YY_NOEXCEPT
-      {
-        return seq_.rend ();
-      }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SENDER_IP (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SENDER_IP, YY_MOVE (l));
+  }
 
-      /// Present a slice of the top of a stack.
-      class slice
-      {
-      public:
-        slice (const stack& stack, int range)
-          : stack_ (stack)
-          , range_ (range)
-        {}
-
-        const T&
-        operator[] (int i) const
-        {
-          return stack_[range_ - i];
-        }
-
-      private:
-        const stack& stack_;
-        int range_;
-      };
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SENDER_PORT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SENDER_PORT, YY_MOVE (l));
+  }
 
-    private:
-      stack (const stack&);
-      stack& operator= (const stack&);
-      /// The wrapped container.
-      S seq_;
-    };
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MAX_QUEUE_SIZE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAX_QUEUE_SIZE, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_NCR_PROTOCOL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_NCR_PROTOCOL, YY_MOVE (l));
+  }
 
-    /// Stack type.
-    typedef stack<stack_symbol_type> stack_type;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_NCR_FORMAT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_NCR_FORMAT, YY_MOVE (l));
+  }
 
-    /// The stack.
-    stack_type yystack_;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_OVERRIDE_NO_UPDATE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OVERRIDE_NO_UPDATE, YY_MOVE (l));
+  }
 
-    /// Push a new state on the stack.
-    /// \param m    a debug message to display
-    ///             if null, no trace is output.
-    /// \param sym  the symbol
-    /// \warning the contents of \a s.value is stolen.
-    void yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_OVERRIDE_CLIENT_UPDATE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OVERRIDE_CLIENT_UPDATE, YY_MOVE (l));
+  }
 
-    /// Push a new look ahead token on the state on the stack.
-    /// \param m    a debug message to display
-    ///             if null, no trace is output.
-    /// \param s    the state
-    /// \param sym  the symbol (for its value and location).
-    /// \warning the contents of \a sym.value is stolen.
-    void yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_REPLACE_CLIENT_NAME (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_REPLACE_CLIENT_NAME, YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_GENERATED_PREFIX (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_GENERATED_PREFIX, YY_MOVE (l));
+  }
 
-    /// Pop \a n symbols from the stack.
-    void yypop_ (int n = 1);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_UDP (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_UDP, YY_MOVE (l));
+  }
 
-    /// Constants.
-    enum
-    {
-      yyeof_ = 0,
-      yylast_ = 1035,     ///< Last index in yytable_.
-      yynnts_ = 395,  ///< Number of nonterminal symbols.
-      yyfinal_ = 32, ///< Termination state number.
-      yyterror_ = 1,
-      yyerrcode_ = 256,
-      yyntokens_ = 177  ///< Number of tokens.
-    };
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TCP (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_TCP, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_JSON (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_JSON, YY_MOVE (l));
+  }
 
-    // User arguments.
-    isc::dhcp::Parser6Context& ctx;
-  };
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_WHEN_PRESENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_WHEN_PRESENT, YY_MOVE (l));
+  }
 
   inline
-  Dhcp6Parser::token_number_type
-  Dhcp6Parser::yytranslate_ (token_type t)
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_NEVER (YY_COPY (location_type) l)
   {
-    // YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to
-    // TOKEN-NUM as returned by yylex.
-    static
-    const token_number_type
-    translate_table[] =
-    {
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      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,    46,    47,    48,    49,    50,    51,    52,    53,    54,
-      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
-     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
-     115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152,   153,   154,
-     155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
-     165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
-     175,   176
-    };
-    const unsigned user_token_number_max_ = 431;
-    const token_number_type undef_token_ = 2;
+    return symbol_type (token::TOKEN_NEVER, YY_MOVE (l));
+  }
 
-    if (static_cast<int> (t) <= yyeof_)
-      return yyeof_;
-    else if (static_cast<unsigned> (t) <= user_token_number_max_)
-      return translate_table[t];
-    else
-      return undef_token_;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_ALWAYS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_ALWAYS, YY_MOVE (l));
   }
 
-  // basic_symbol.
-#if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  Dhcp6Parser::basic_symbol<Base>::basic_symbol (basic_symbol&& that)
-    : Base (std::move (that))
-    , value ()
-    , location (std::move (that.location))
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_WHEN_NOT_PRESENT (YY_COPY (location_type) l)
   {
-    switch (this->type_get ())
-    {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
-        value.move< ElementPtr > (std::move (that.value));
-        break;
+    return symbol_type (token::TOKEN_WHEN_NOT_PRESENT, YY_MOVE (l));
+  }
 
-      case 176: // "boolean"
-        value.move< bool > (std::move (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOSTNAME_CHAR_SET (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOSTNAME_CHAR_SET, YY_MOVE (l));
+  }
 
-      case 175: // "floating point"
-        value.move< double > (std::move (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_HOSTNAME_CHAR_REPLACEMENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_HOSTNAME_CHAR_REPLACEMENT, YY_MOVE (l));
+  }
 
-      case 174: // "integer"
-        value.move< int64_t > (std::move (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LOGGING (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LOGGING, YY_MOVE (l));
+  }
 
-      case 173: // "constant string"
-        value.move< std::string > (std::move (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_LOGGERS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_LOGGERS, YY_MOVE (l));
+  }
 
-      default:
-        break;
-    }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_OUTPUT_OPTIONS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OUTPUT_OPTIONS, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_OUTPUT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_OUTPUT, YY_MOVE (l));
   }
-#endif
 
-  template <typename Base>
-  Dhcp6Parser::basic_symbol<Base>::basic_symbol (const basic_symbol& that)
-    : Base (that)
-    , value ()
-    , location (that.location)
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DEBUGLEVEL (YY_COPY (location_type) l)
   {
-    switch (this->type_get ())
-    {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
-        value.copy< ElementPtr > (YY_MOVE (that.value));
-        break;
+    return symbol_type (token::TOKEN_DEBUGLEVEL, YY_MOVE (l));
+  }
 
-      case 176: // "boolean"
-        value.copy< bool > (YY_MOVE (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SEVERITY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SEVERITY, YY_MOVE (l));
+  }
 
-      case 175: // "floating point"
-        value.copy< double > (YY_MOVE (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_FLUSH (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_FLUSH, YY_MOVE (l));
+  }
 
-      case 174: // "integer"
-        value.copy< int64_t > (YY_MOVE (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MAXSIZE (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAXSIZE, YY_MOVE (l));
+  }
 
-      case 173: // "constant string"
-        value.copy< std::string > (YY_MOVE (that.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_MAXVER (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_MAXVER, YY_MOVE (l));
+  }
 
-      default:
-        break;
-    }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DHCP4 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCP4, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_DHCPDDNS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_DHCPDDNS, YY_MOVE (l));
   }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_CONTROL_AGENT (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_CONTROL_AGENT, YY_MOVE (l));
+  }
 
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TOPLEVEL_JSON (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_TOPLEVEL_JSON, YY_MOVE (l));
+  }
 
-  template <typename Base>
-  bool
-  Dhcp6Parser::basic_symbol<Base>::empty () const YY_NOEXCEPT
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_TOPLEVEL_DHCP6 (YY_COPY (location_type) l)
   {
-    return Base::type_get () == empty_symbol;
+    return symbol_type (token::TOKEN_TOPLEVEL_DHCP6, YY_MOVE (l));
   }
 
-  template <typename Base>
-  void
-  Dhcp6Parser::basic_symbol<Base>::move (basic_symbol& s)
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_DHCP6 (YY_COPY (location_type) l)
   {
-    super_type::move (s);
-    switch (this->type_get ())
-    {
-      case 194: // value
-      case 198: // map_value
-      case 252: // db_type
-      case 345: // hr_mode
-      case 481: // duid_type
-      case 516: // ncr_protocol_value
-      case 523: // replace_client_name_value
-        value.move< ElementPtr > (YY_MOVE (s.value));
-        break;
+    return symbol_type (token::TOKEN_SUB_DHCP6, YY_MOVE (l));
+  }
 
-      case 176: // "boolean"
-        value.move< bool > (YY_MOVE (s.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_INTERFACES6 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_INTERFACES6, YY_MOVE (l));
+  }
 
-      case 175: // "floating point"
-        value.move< double > (YY_MOVE (s.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_SUBNET6 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_SUBNET6, YY_MOVE (l));
+  }
 
-      case 174: // "integer"
-        value.move< int64_t > (YY_MOVE (s.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_POOL6 (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_POOL6, YY_MOVE (l));
+  }
 
-      case 173: // "constant string"
-        value.move< std::string > (YY_MOVE (s.value));
-        break;
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_PD_POOL (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_PD_POOL, YY_MOVE (l));
+  }
 
-      default:
-        break;
-    }
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_RESERVATION (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_RESERVATION, YY_MOVE (l));
+  }
 
-    location = YY_MOVE (s.location);
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_OPTION_DEFS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_OPTION_DEFS, YY_MOVE (l));
   }
 
-  // by_type.
   inline
-  Dhcp6Parser::by_type::by_type ()
-    : type (empty_symbol)
-  {}
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_OPTION_DEF (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_OPTION_DEF, YY_MOVE (l));
+  }
 
-#if 201103L <= YY_CPLUSPLUS
   inline
-  Dhcp6Parser::by_type::by_type (by_type&& that)
-    : type (that.type)
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_OPTION_DATA (YY_COPY (location_type) l)
   {
-    that.clear ();
+    return symbol_type (token::TOKEN_SUB_OPTION_DATA, YY_MOVE (l));
   }
-#endif
 
   inline
-  Dhcp6Parser::by_type::by_type (const by_type& that)
-    : type (that.type)
-  {}
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_HOOKS_LIBRARY (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_HOOKS_LIBRARY, YY_MOVE (l));
+  }
 
   inline
-  Dhcp6Parser::by_type::by_type (token_type t)
-    : type (yytranslate_ (t))
-  {}
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_DHCP_DDNS (YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_SUB_DHCP_DDNS, YY_MOVE (l));
+  }
 
   inline
-  void
-  Dhcp6Parser::by_type::clear ()
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_LOGGING (YY_COPY (location_type) l)
   {
-    type = empty_symbol;
+    return symbol_type (token::TOKEN_SUB_LOGGING, YY_MOVE (l));
   }
 
   inline
-  void
-  Dhcp6Parser::by_type::move (by_type& that)
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_SUB_CONFIG_CONTROL (YY_COPY (location_type) l)
   {
-    type = that.type;
-    that.clear ();
+    return symbol_type (token::TOKEN_SUB_CONFIG_CONTROL, YY_MOVE (l));
   }
 
   inline
-  int
-  Dhcp6Parser::by_type::type_get () const YY_NOEXCEPT
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_STRING (YY_COPY (std::string) v, YY_COPY (location_type) l)
   {
-    return type;
+    return symbol_type (token::TOKEN_STRING, YY_MOVE (v), YY_MOVE (l));
   }
 
   inline
-  Dhcp6Parser::token_type
-  Dhcp6Parser::by_type::token () const YY_NOEXCEPT
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_INTEGER (YY_COPY (int64_t) v, YY_COPY (location_type) l)
   {
-    // YYTOKNUM[NUM] -- (External) token number corresponding to the
-    // (internal) symbol number NUM (which must be that of a token).  */
-    static
-    const unsigned short
-    yytoken_number_[] =
-    {
-       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     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,   301,   302,   303,   304,
-     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
-     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
-     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
-     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
-     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
-     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
-     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
-     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
-     395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
-     405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
-     415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
-     425,   426,   427,   428,   429,   430,   431
-    };
-    return token_type (yytoken_number_[type]);
+    return symbol_type (token::TOKEN_INTEGER, YY_MOVE (v), YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_FLOAT (YY_COPY (double) v, YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_FLOAT, YY_MOVE (v), YY_MOVE (l));
+  }
+
+  inline
+  Dhcp6Parser::symbol_type
+  Dhcp6Parser::make_BOOLEAN (YY_COPY (bool) v, YY_COPY (location_type) l)
+  {
+    return symbol_type (token::TOKEN_BOOLEAN, YY_MOVE (v), YY_MOVE (l));
   }
 
-#line 14 "dhcp6_parser.yy" // lalr1.cc:401
+
+#line 14 "dhcp6_parser.yy" // lalr1.cc:404
 } } // isc::dhcp
-#line 4196 "dhcp6_parser.h" // lalr1.cc:401
+#line 3326 "dhcp6_parser.h" // lalr1.cc:404
 
 
 
index e1aabb6d491a05ec216620c14edcd5079a27d394..bd321f3d99aaf6e559b08488411cc4ca5836997e 100644 (file)
@@ -53,6 +53,8 @@ using namespace std;
   DATA_DIRECTORY "data-directory"
   CONFIG_CONTROL "config-control"
   CONFIG_DATABASES "config-databases"
+  CONFIG_FETCH_WAIT_TIME "config-fetch-wait-time"
+
   INTERFACES_CONFIG "interfaces-config"
   INTERFACES "interfaces"
   RE_DETECT "re-detect"
@@ -2219,6 +2221,7 @@ config_control_params: config_control_param
 
 // This defines a list of allowed parameters for each subnet.
 config_control_param: config_databases
+                    | config_fetch_wait_time
                     ;
 
 config_databases: CONFIG_DATABASES {
@@ -2231,6 +2234,11 @@ config_databases: CONFIG_DATABASES {
     ctx.leave();
 };
 
+config_fetch_wait_time: CONFIG_FETCH_WAIT_TIME COLON INTEGER {
+    ElementPtr value(new IntElement($3, ctx.loc2pos(@3)));
+    ctx.stack_.back()->set("config-fetch-wait-time", value);
+};
+
 // --- logging entry -----------------------------------------
 
 // This defines the top level "Logging" object. It parses
index f2b6f723910fdbaa73473d92e8aadd85961ff690..fba6cfbbe51604b2c0d609a98103d9682e971e84 100644 (file)
@@ -183,9 +183,8 @@ Dhcpv6Srv::Dhcpv6Srv(uint16_t server_port, uint16_t client_port)
     : io_service_(new IOService()), server_port_(server_port),
       client_port_(client_port), serverid_(), shutdown_(true),
       alloc_engine_(), name_change_reqs_(),
-      network_state_(new NetworkState(NetworkState::DHCPv6))
-{
-
+      network_state_(new NetworkState(NetworkState::DHCPv6)),
+      cb_control_(new CBControlDHCPv6()) {
     LOG_DEBUG(dhcp6_logger, DBG_DHCP6_START, DHCP6_OPEN_SOCKET)
         .arg(server_port);
 
index 36b54ee8c47794d18043b5ced396d2e5150d6364..1e0670cc6ec2390df59894e3de0c47d44f514b51 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2018 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2019 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -18,6 +18,7 @@
 #include <dhcp/pkt6.h>
 #include <dhcpsrv/alloc_engine.h>
 #include <dhcpsrv/callout_handle_store.h>
+#include <dhcpsrv/cb_ctl_dhcp6.h>
 #include <dhcpsrv/cfg_option.h>
 #include <dhcpsrv/d2_client_mgr.h>
 #include <dhcpsrv/network_state.h>
@@ -88,6 +89,14 @@ public:
     /// @brief Destructor. Used during DHCPv6 service shutdown.
     virtual ~Dhcpv6Srv();
 
+    /// @brief Checks if the server is running in unit test mode.
+    ///
+    /// @return true if the server is running in unit test mode,
+    /// false otherwise.
+    bool inTestMode() const {
+        return (server_port_ == 0);
+    }
+
     /// @brief Returns pointer to the IO service used by the server.
     asiolink::IOServicePtr& getIOService() {
         return (io_service_);
@@ -98,6 +107,15 @@ public:
         return (network_state_);
     }
 
+    /// @brief Returns an object which controls access to the configuration
+    /// backends.
+    ///
+    /// @return Pointer to the instance of the object which controls
+    /// access to the configuration backends.
+    CBControlDHCPv6Ptr getCBControl() const {
+        return (cb_control_);
+    }
+
     /// @brief returns Kea version on stdout and exit.
     /// redeclaration/redefinition. @ref isc::process::Daemon::getVersion()
     static std::string getVersion(bool extended);
@@ -998,6 +1016,8 @@ protected:
     /// disabled subnet/network scopes.
     NetworkStatePtr network_state_;
 
+    /// @brief Controls access to the configuration backends.
+    CBControlDHCPv6Ptr cb_control_;
 };
 
 }; // namespace isc::dhcp
index d714a15212a3054a53ae2c0c7f87901c3b83f028..eb359592019a830b35e0dbcdb84a6695e9246ee0 100644 (file)
@@ -16,6 +16,7 @@
 #include <dhcp6/dhcp6_log.h>
 #include <dhcp6/dhcp6_srv.h>
 #include <dhcp/iface_mgr.h>
+#include <dhcpsrv/cb_ctl_dhcp4.h>
 #include <dhcpsrv/cfg_option.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/db_type.h>
@@ -419,6 +420,7 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
     if (!check_only) {
         TimerMgr::instance()->unregisterTimers();
         server.discardPackets();
+        server.getCBControl()->reset();
     }
 
     // Revert any runtime option definitions configured so far and not committed.
@@ -444,9 +446,10 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
     // the parsers.  It is declared outside the loop so in case of error, the
     // name of the failing parser can be retrieved within the "catch" clause.
     ConfigPair config_pair;
+    SrvConfigPtr srv_config;
     try {
-
-        SrvConfigPtr srv_config = CfgMgr::instance().getStagingCfg();
+        // Get the staging configuration.
+        srv_config = CfgMgr::instance().getStagingCfg();
 
         // Preserve all scalar global parameters
         srv_config->extractConfiguredGlobals(config_set);
@@ -739,6 +742,10 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
             const HooksConfig& libraries =
                 CfgMgr::instance().getStagingCfg()->getHooksConfig();
             libraries.loadLibraries();
+
+            // If there are config backends, fetch and merge into staging config
+            server.getCBControl()->databaseConfigFetch(srv_config,
+                                                       CBControlDHCPv6::FetchMode::FETCH_ALL);
         }
         catch (const isc::Exception& ex) {
             LOG_ERROR(dhcp6_logger, DHCP6_PARSER_COMMIT_FAIL).arg(ex.what());
index b0807122313fb46514a616904e66cf8b9665eb1c..94d877060d091c514c72e697e42ab50e7d49b4f4 100644 (file)
@@ -1,9 +1,8 @@
-// Generated 201903231444
-// A Bison parser, made by GNU Bison 3.3.2.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Locations for Bison parsers in C++
 
-// Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
+// Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
 
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
index bc115ead3e7efb8cb93b83ccf1721b8054360e5a..22ef35f744d2e26eb583a751ca8d621cf4b3a5bd 100644 (file)
@@ -1,5 +1,4 @@
-// Generated 201903231444
-// A Bison parser, made by GNU Bison 3.3.2.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Starting with Bison 3.2, this file is useless: the structure it
 // used to define is now defined in "location.hh".
index 67018271155e52c12fe789d82edcf251a830f042..81e152d836b96a78a0b6b5cd75d1557e8601f5d0 100644 (file)
@@ -1,5 +1,4 @@
-// Generated 201903231444
-// A Bison parser, made by GNU Bison 3.3.2.
+// A Bison parser, made by GNU Bison 3.2.1.
 
 // Starting with Bison 3.2, this file is useless: the structure it
 // used to define is now defined with the parser itself.
diff --git a/src/bin/dhcp6/tests/config_backend_unittest.cc b/src/bin/dhcp6/tests/config_backend_unittest.cc
new file mode 100644 (file)
index 0000000..3875818
--- /dev/null
@@ -0,0 +1,510 @@
+// Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <arpa/inet.h>
+#include <gtest/gtest.h>
+
+#include <database/backend_selector.h>
+#include <dhcp/tests/iface_mgr_test_config.h>
+#include <dhcp6/dhcp6_srv.h>
+#include <dhcp6/ctrl_dhcp6_srv.h>
+#include <dhcp6/json_config_parser.h>
+#include <dhcpsrv/subnet.h>
+#include <dhcpsrv/cfgmgr.h>
+#include <dhcpsrv/cfg_subnets6.h>
+#include <dhcpsrv/testutils/generic_backend_unittest.h>
+#include <dhcpsrv/testutils/test_config_backend_dhcp6.h>
+
+#include "dhcp6_test_utils.h"
+#include "get_config_unittest.h"
+
+#include <boost/foreach.hpp>
+#include <boost/scoped_ptr.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <limits.h>
+
+using namespace isc::asiolink;
+using namespace isc::config;
+using namespace isc::data;
+using namespace isc::dhcp;
+using namespace isc::dhcp::test;
+using namespace isc::db;
+using namespace std;
+
+namespace {
+
+/// @brief Test fixture for testing external configuration merging
+class Dhcp6CBTest : public GenericBackendTest {
+protected:
+    /// @brief Pre test set up
+    /// Called prior to each test.  It creates two configuration backends
+    /// that differ by host name ("db1" and "db2"). It then registers
+    /// a backend factory that will return them rather than create
+    /// new instances. The backends need to pre-exist so they can be
+    /// populated prior to calling server configure.  It uses
+    /// TestConfigBackend instances but with a type of "memfile" to pass
+    /// parsing.  Doing it all here allows us to use ASSERTs if we feel like
+    /// it.
+    virtual void SetUp() {
+        DatabaseConnection::ParameterMap params;
+        params[std::string("type")] = std::string("memfile");
+        params[std::string("host")] = std::string("db1");
+        db1_.reset(new TestConfigBackendDHCPv6(params));
+
+        params[std::string("host")] = std::string("db2");
+        db2_.reset(new TestConfigBackendDHCPv6(params));
+
+        ConfigBackendDHCPv6Mgr::instance().registerBackendFactory("memfile",
+            [this](const DatabaseConnection::ParameterMap& params)
+                -> ConfigBackendDHCPv6Ptr {
+                    auto host = params.find("host");
+                    if (host != params.end()) {
+                        if (host->second == "db1") {
+                            return (db1_);
+                        } else if (host->second == "db2") {
+                            return (db2_);
+                        }
+                    }
+
+                    // Apparently we're looking for one that does not prexist.
+                    return (TestConfigBackendDHCPv6Ptr(new TestConfigBackendDHCPv6(params)));
+                });
+    }
+
+    /// @brief Clean up after each test
+    virtual void TearDown() {
+        // Unregister the factory to be tidy.
+        ConfigBackendDHCPv6Mgr::instance().unregisterBackendFactory("memfile");
+    }
+
+public:
+
+    /// Constructor
+    Dhcp6CBTest()
+    : rcode_(-1), db1_selector("db1"), db2_selector("db1")   {
+        // Open port 0 means to not do anything at all. We don't want to
+        // deal with sockets here, just check if configuration handling
+        // is sane.
+        srv_.reset(new ControlledDhcpv6Srv(0));
+
+        // Create fresh context.
+        resetConfiguration();
+    }
+
+    /// Destructor
+    virtual ~Dhcp6CBTest() {
+        resetConfiguration();
+    };
+
+    /// @brief Reset configuration singletons.
+    void resetConfiguration() {
+        CfgMgr::instance().clear();
+        ConfigBackendDHCPv6Mgr::destroy();
+    }
+
+    /// @brief Convenience method for running configuration
+    ///
+    /// This method does not throw, but signals errors using gtest macros.
+    ///
+    /// @param config text to be parsed as JSON
+    /// @param expected_code expected code (see cc/command_interpreter.h)
+    /// @param exp_error expected text error (check skipped if empty)
+    void configure(std::string config, int expected_code,
+                   std::string exp_error = "") {
+        ConstElementPtr json;
+        try {
+            json = parseDHCP6(config, true);
+        } catch(const std::exception& ex) {
+            ADD_FAILURE() << "parseDHCP6 failed: " << ex.what();
+        }
+
+        ConstElementPtr status;
+        ASSERT_NO_THROW(status = configureDhcp6Server(*srv_, json));
+        ASSERT_TRUE(status);
+
+        int rcode;
+        ConstElementPtr comment = parseAnswer(rcode, status);
+        ASSERT_EQ(expected_code, rcode) << " comment: "
+                    << comment->stringValue();
+
+        string text;
+        ASSERT_NO_THROW(text = comment->stringValue());
+
+        if (expected_code != rcode) {
+            std::cout << "Reported status: " << text << std::endl;
+        }
+
+        if ((rcode != 0)) {
+            if (!exp_error.empty()) {
+                ASSERT_EQ(exp_error, text);
+            }
+        }
+    }
+
+    boost::scoped_ptr<Dhcpv6Srv> srv_;  ///< DHCP6 server under test
+    int rcode_;                         ///< Return code from element parsing
+    ConstElementPtr comment_;           ///< Reason for parse fail
+
+    BackendSelector db1_selector; ///< BackendSelector by host for first config backend
+    BackendSelector db2_selector; ///< BackendSelector by host for second config backend
+
+    TestConfigBackendDHCPv6Ptr db1_; ///< First configuration backend instance
+    TestConfigBackendDHCPv6Ptr db2_; ///< Second configuration backend instance
+};
+
+// This test verifies that externally configured globals are
+// merged correctly into staging configuration.
+TEST_F(Dhcp6CBTest, mergeGlobals) {
+    string base_config =
+        "{ \n"
+        "    \"interfaces-config\": { \n"
+        "        \"interfaces\": [\"*\" ] \n"
+        "    }, \n"
+        "    \"echo-client-id\": false, \n"
+        "    \"decline-probation-period\": 7000, \n"
+        "    \"valid-lifetime\": 1000, \n"
+        "    \"rebind-timer\": 800, \n"
+        "    \"server-hostname\": \"overwrite.me.com\", \n"
+        "    \"config-control\": { \n"
+        "       \"config-databases\": [ { \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db1\" \n"
+        "           },{ \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db2\" \n"
+        "           } \n"
+        "       ] \n"
+        "   } \n"
+        "} \n";
+
+    extractConfig(base_config);
+
+    // Make some globals:
+    StampedValuePtr server_hostname(new StampedValue("server-hostname", "isc.example.org"));
+    StampedValuePtr decline_period(new StampedValue("decline-probation-period", Element::create(86400)));
+    StampedValuePtr calc_tee_times(new StampedValue("calculate-tee-times", Element::create(bool(false))));
+    StampedValuePtr t2_percent(new StampedValue("t2-percent", Element::create(0.75)));
+    StampedValuePtr renew_timer(new StampedValue("renew-timer", Element::create(500)));
+
+    // Let's add all of the globals to the second backend.  This will verify
+    // we find them there.
+    db2_->createUpdateGlobalParameter6(ServerSelector::ALL(), server_hostname);
+    db2_->createUpdateGlobalParameter6(ServerSelector::ALL(), decline_period);
+    db2_->createUpdateGlobalParameter6(ServerSelector::ALL(), calc_tee_times);
+    db2_->createUpdateGlobalParameter6(ServerSelector::ALL(), t2_percent);
+    db2_->createUpdateGlobalParameter6(ServerSelector::ALL(), renew_timer);
+
+    // Should parse and merge without error.
+    ASSERT_NO_FATAL_FAILURE(configure(base_config, CONTROL_RESULT_SUCCESS, ""));
+
+    // Verify the composite staging is correct.  (Remember that
+    // CfgMgr::instance().commit() hasn't been called)
+    SrvConfigPtr staging_cfg = CfgMgr::instance().getStagingCfg();
+
+    // echo-client-id is set explicitly in the original config, meanwhile
+    // the backend config does not set it, so the explicit value wins.
+    EXPECT_FALSE(staging_cfg->getEchoClientId());
+
+    // decline-probation-period is an explicit member that should come
+    // from the backend.
+    EXPECT_EQ(86400, staging_cfg->getDeclinePeriod());
+
+    // Verify that the implicit globals from JSON are there.
+    ASSERT_NO_FATAL_FAILURE(checkConfiguredGlobal(staging_cfg, "valid-lifetime",
+                                                  Element::create(1000)));
+    ASSERT_NO_FATAL_FAILURE(checkConfiguredGlobal(staging_cfg, "rebind-timer",
+                                                  Element::create(800)));
+
+    // Verify that the implicit globals from the backend are there.
+    ASSERT_NO_FATAL_FAILURE(checkConfiguredGlobal(staging_cfg, server_hostname));
+    ASSERT_NO_FATAL_FAILURE(checkConfiguredGlobal(staging_cfg, calc_tee_times));
+    ASSERT_NO_FATAL_FAILURE(checkConfiguredGlobal(staging_cfg, t2_percent));
+    ASSERT_NO_FATAL_FAILURE(checkConfiguredGlobal(staging_cfg, renew_timer));
+}
+
+#if 0
+// This test verifies that externally configured option definitions
+// merged correctly into staging configuration.
+TEST_F(Dhcp6CBTest, mergeOptionDefs) {
+    string base_config =
+        "{ \n"
+        "    \"option-def\": [ { \n"
+        "        \"name\": \"one\", \n"
+        "        \"code\": 1, \n"
+        "        \"type\": \"ipv6-address\", \n"
+        "        \"space\": \"isc\" \n"
+        "     }, \n"
+        "     { \n"
+        "        \"name\": \"two\", \n"
+        "        \"code\": 2, \n"
+        "        \"type\": \"string\", \n"
+        "        \"space\": \"isc\" \n"
+        "     } \n"
+        "   ], \n"
+        "    \"config-control\": { \n"
+        "       \"config-databases\": [ { \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db1\" \n"
+        "           },{ \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db2\" \n"
+        "           } \n"
+        "       ] \n"
+        "   } \n"
+        "} \n";
+
+    extractConfig(base_config);
+
+    // Create option one replacement and add it to first backend.
+    OptionDefinitionPtr def;
+    def.reset(new OptionDefinition("one", 101, "uint16"));
+    def->setOptionSpaceName("isc");
+    db1_->createUpdateOptionDef6(ServerSelector::ALL(), def);
+
+    // Create option three and add it to first backend.
+    def.reset(new OptionDefinition("three", 3, "string"));
+    def->setOptionSpaceName("isc");
+    db1_->createUpdateOptionDef6(ServerSelector::ALL(), def);
+
+    // Create option four and add it to second backend.
+    def.reset(new OptionDefinition("four", 4, "string"));
+    def->setOptionSpaceName("isc");
+    db2_->createUpdateOptionDef6(ServerSelector::ALL(), def);
+
+    // Should parse and merge without error.
+    ASSERT_NO_FATAL_FAILURE(configure(base_config, CONTROL_RESULT_SUCCESS, ""));
+
+    // Verify the composite staging is correct.
+    SrvConfigPtr staging_cfg = CfgMgr::instance().getStagingCfg();
+    ConstCfgOptionDefPtr option_defs = staging_cfg->getCfgOptionDef();
+
+    // Definition "one" from first backend should be there.
+    OptionDefinitionPtr found_def = option_defs->get("isc", "one");
+    ASSERT_TRUE(found_def);
+    EXPECT_EQ(101, found_def->getCode());
+    EXPECT_EQ(OptionDataType::OPT_UINT16_TYPE, found_def->getType());
+
+    // Definition "two" from JSON config should be there.
+    found_def = option_defs->get("isc", "two");
+    ASSERT_TRUE(found_def);
+    EXPECT_EQ(2, found_def->getCode());
+
+    // Definition "three" from first backend should be there.
+    found_def = option_defs->get("isc", "three");
+    ASSERT_TRUE(found_def);
+    EXPECT_EQ(3, found_def->getCode());
+
+    // Definition "four" from first backend should not be there.
+    found_def = option_defs->get("isc", "four");
+    ASSERT_FALSE(found_def);
+}
+
+// This test verifies that externally configured options
+// merged correctly into staging configuration.
+TEST_F(Dhcp6CBTest, mergeOptions) {
+    string base_config =
+        "{ \n"
+        "    \"option-data\": [ { \n"
+        "        \"name\": \"dhcp-message\", \n"
+        "        \"data\": \"0A0B0C0D\", \n"
+        "        \"csv-format\": false \n"
+        "     },{ \n" 
+        "        \"name\": \"host-name\", \n"
+        "        \"data\": \"old.example.com\", \n"
+        "        \"csv-format\": true \n"
+        "     } \n"
+        "    ], \n"
+        "    \"config-control\": { \n"
+        "       \"config-databases\": [ { \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db1\" \n"
+        "           },{ \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db2\" \n"
+        "           } \n"
+        "       ] \n"
+        "   } \n"
+        "} \n";
+
+    extractConfig(base_config);
+
+    OptionDescriptorPtr opt;
+
+    // Add host-name to the first backend.
+    opt.reset(new OptionDescriptor(
+              createOption<OptionString>(Option::V6, DHO_HOST_NAME,
+                                         true, false, "new.example.com")));
+    opt->space_name_ = DHCP6_OPTION_SPACE;
+    db1_->createUpdateOption6(ServerSelector::ALL(), opt);
+
+    // Add boot-file-name to the first backend.
+    opt.reset(new OptionDescriptor(
+              createOption<OptionString>(Option::V6, DHO_BOOT_FILE_NAME,
+                                         true, false, "my-boot-file")));
+    opt->space_name_ = DHCP6_OPTION_SPACE;
+    db1_->createUpdateOption6(ServerSelector::ALL(), opt);
+
+    // Add boot-file-name to the second backend.
+    opt.reset(new OptionDescriptor(
+              createOption<OptionString>(Option::V6, DHO_BOOT_FILE_NAME,
+                                         true, false, "your-boot-file")));
+    opt->space_name_ = DHCP6_OPTION_SPACE;
+    db2_->createUpdateOption6(ServerSelector::ALL(), opt);
+
+    // Should parse and merge without error.
+    ASSERT_NO_FATAL_FAILURE(configure(base_config, CONTROL_RESULT_SUCCESS, ""));
+
+    // Verify the composite staging is correct.
+    SrvConfigPtr staging_cfg = CfgMgr::instance().getStagingCfg();
+
+    // Option definition from JSON should be there.
+    CfgOptionPtr options = staging_cfg->getCfgOption();
+
+    // dhcp-message should come from the original config.
+    OptionDescriptor found_opt = options->get("dhcp6", DHO_DHCP_MESSAGE);
+    ASSERT_TRUE(found_opt.option_);
+    EXPECT_EQ("0x0A0B0C0D", found_opt.option_->toHexString());
+
+    // host-name should come from the first back end, 
+    // (overwriting the original).
+    found_opt = options->get("dhcp6", DHO_HOST_NAME);
+    ASSERT_TRUE(found_opt.option_);
+    EXPECT_EQ("new.example.com", found_opt.option_->toString());
+
+    // booth-file-name should come from the first back end.
+    found_opt = options->get("dhcp6", DHO_BOOT_FILE_NAME);
+    ASSERT_TRUE(found_opt.option_);
+    EXPECT_EQ("my-boot-file", found_opt.option_->toString());
+}
+
+// This test verifies that externally configured shared-networks are
+// merged correctly into staging configuration.
+TEST_F(Dhcp6CBTest, mergeSharedNetworks) {
+    string base_config =
+        "{ \n"
+        "    \"interfaces-config\": { \n"
+        "        \"interfaces\": [\"*\" ] \n"
+        "    }, \n"
+        "    \"valid-lifetime\": 4000, \n"
+        "    \"config-control\": { \n"
+        "       \"config-databases\": [ { \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db1\" \n"
+        "           },{ \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db2\" \n"
+        "           } \n"
+        "       ] \n"
+        "   }, \n"
+        "   \"shared-networks\": [ { \n"
+        "       \"name\": \"two\" \n"
+        "   }] \n"
+        "} \n";
+
+    extractConfig(base_config);
+
+    // Make a few networks
+    SharedNetwork6Ptr network1(new SharedNetwork6("one"));
+    SharedNetwork6Ptr network3(new SharedNetwork6("three"));
+
+    // Add network1 to db1 and network3 to db2
+    db1_->createUpdateSharedNetwork6(ServerSelector::ALL(), network1);
+    db2_->createUpdateSharedNetwork6(ServerSelector::ALL(), network3);
+
+    // Should parse and merge without error.
+    ASSERT_NO_FATAL_FAILURE(configure(base_config, CONTROL_RESULT_SUCCESS, ""));
+
+    // Verify the composite staging is correct.  (Remember that
+    // CfgMgr::instance().commit() hasn't been called)
+    SrvConfigPtr staging_cfg = CfgMgr::instance().getStagingCfg();
+
+    CfgSharedNetworks4Ptr networks = staging_cfg->getCfgSharedNetworks4();
+    SharedNetwork6Ptr staged_network;
+
+    // SharedNetwork One should have been added from db1 config
+    staged_network = networks->getByName("one");
+    ASSERT_TRUE(staged_network);
+
+    // Subnet2 should have come from the json config
+    staged_network = networks->getByName("two");
+    ASSERT_TRUE(staged_network);
+
+    // Subnet3, which is in db2 should not have been merged.
+    // We queried db1 first and the query returned data. In
+    // other words, we iterate over the backends, asking for
+    // data.  We use the first data, we find.
+    staged_network = networks->getByName("three");
+    ASSERT_FALSE(staged_network);
+}
+
+// This test verifies that externally configured subnets are
+// merged correctly into staging configuration.
+TEST_F(Dhcp6CBTest, mergeSubnets) {
+    string base_config =
+        "{ \n"
+        "    \"interfaces-config\": { \n"
+        "        \"interfaces\": [\"*\" ] \n"
+        "    }, \n"
+        "    \"valid-lifetime\": 4000, \n"
+        "    \"config-control\": { \n"
+        "       \"config-databases\": [ { \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db1\" \n"
+        "           },{ \n"
+        "               \"type\": \"memfile\", \n"
+        "               \"host\": \"db2\" \n"
+        "           } \n"
+        "       ] \n"
+        "   }, \n"
+        "   \"subnet6\": [ \n"
+        "   { \n"
+        "       \"id\": 2,\n"
+        "       \"subnet\": \"192.0.3.0/24\" \n"
+        "   } ]\n"
+        "} \n";
+
+    extractConfig(base_config);
+
+    // Make a few subnets
+    Subnet6Ptr subnet1(new Subnet6(IOAddress("192.0.2.0"), 26, 1, 2, 3, SubnetID(1)));
+    Subnet6Ptr subnet3(new Subnet6(IOAddress("192.0.4.0"), 26, 1, 2, 3, SubnetID(3)));
+
+    // Add subnet1 to db1 and subnet3 to db2
+    db1_->createUpdateSubnet6(ServerSelector::ALL(), subnet1);
+    db2_->createUpdateSubnet6(ServerSelector::ALL(), subnet3);
+
+    // Should parse and merge without error.
+    configure(base_config, CONTROL_RESULT_SUCCESS, "");
+
+    // Verify the composite staging is correct.  (Remember that
+    // CfgMgr::instance().commit() hasn't been called)
+
+    SrvConfigPtr staging_cfg = CfgMgr::instance().getStagingCfg();
+
+    CfgSubnets6Ptr subnets = staging_cfg->getCfgSubnets6();
+    Subnet6Ptr staged_subnet;
+
+    // Subnet1 should have been added from db1 config
+    staged_subnet = subnets->getSubnet(1);
+    ASSERT_TRUE(staged_subnet);
+
+    // Subnet2 should have come from the json config
+    staged_subnet = subnets->getSubnet(2);
+    ASSERT_TRUE(staged_subnet);
+
+    // Subnet3, which is in db2 should not have been merged, since it is
+    // first found, first used?
+    staged_subnet = subnets->getSubnet(3);
+    ASSERT_FALSE(staged_subnet);
+}
+#endif
+
+}
index 733ad794be63515244b409645d512915853f16c7..e8a0d46319af10a3fd8391ea26d88de69b0714fd 100644 (file)
@@ -25,6 +25,7 @@
 #include <dhcpsrv/subnet.h>
 #include <dhcpsrv/subnet_selector.h>
 #include <dhcpsrv/testutils/config_result_check.h>
+#include <dhcpsrv/testutils/test_config_backend_dhcp6.h>
 #include <hooks/hooks_manager.h>
 #include <process/config_ctl_info.h>
 
@@ -242,6 +243,7 @@ const char* PARSER_CONFIGS[] = {
     "    \"rebind-timer\": 2000, \n"
     "    \"renew-timer\": 1000, \n"
     "    \"config-control\": { \n"
+    "       \"config-fetch-wait-time\": 10, \n"
     "       \"config-databases\": [ { \n"
     "               \"type\": \"mysql\", \n"
     "               \"name\": \"keatest1\", \n"
@@ -6990,7 +6992,12 @@ TEST_F(Dhcp6ParserTest, globalReservations) {
 // This test verifies that configuration control info gets populated.
 TEST_F(Dhcp6ParserTest, configControlInfo) {
     string config = PARSER_CONFIGS[8];
-    extractConfig(config);
+
+    // Should be able to register a backend factory for "mysql".
+    ASSERT_TRUE(TestConfigBackendDHCPv6::
+                registerBackendType(ConfigBackendDHCPv6Mgr::instance(),
+                                    "mysql"));
+
     configure(config, CONTROL_RESULT_SUCCESS, "");
 
     // Make sure the config control info is there.
@@ -7009,6 +7016,10 @@ TEST_F(Dhcp6ParserTest, configControlInfo) {
               dblist.front().getAccessString());
     EXPECT_EQ("name=keatest2 password=keatest type=mysql user=keatest",
               dblist.back().getAccessString());
+
+    // Verify that the config-fetch-wait-time is correct.
+    EXPECT_FALSE(info->getConfigFetchWaitTime().unspecified());
+    EXPECT_EQ(10, info->getConfigFetchWaitTime().get());
 }
 
 // Check whether it is possible to configure server-tag
index abb8f461b4a99cd9e175a13cb50741bc988d2b67..8d45fd2d962588ae48b0cc7c65fa17838d518e0e 100644 (file)
@@ -1829,32 +1829,6 @@ const char* EXTRACTED_CONFIGS[] = {
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 58
-"{\n"
-"        \"config-control\": {\n"
-"            \"config-databases\": [\n"
-"                {\n"
-"                    \"name\": \"keatest1\",\n"
-"                    \"password\": \"keatest\",\n"
-"                    \"type\": \"mysql\",\n"
-"                    \"user\": \"keatest\"\n"
-"                },\n"
-"                {\n"
-"                    \"name\": \"keatest2\",\n"
-"                    \"password\": \"keatest\",\n"
-"                    \"type\": \"mysql\",\n"
-"                    \"user\": \"keatest\"\n"
-"                }\n"
-"            ]\n"
-"        },\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"renew-timer\": 1000,\n"
-"        \"valid-lifetime\": 4000\n"
 "    }\n"
 };
 
@@ -7717,86 +7691,6 @@ const char* UNPARSED_CONFIGS[] = {
 "            }\n"
 "        ],\n"
 "        \"valid-lifetime\": 4000\n"
-"    }\n",
-    // CONFIGURATION 58
-"{\n"
-"        \"config-control\": {\n"
-"            \"config-databases\": [\n"
-"                {\n"
-"                    \"name\": \"keatest1\",\n"
-"                    \"password\": \"keatest\",\n"
-"                    \"type\": \"mysql\",\n"
-"                    \"user\": \"keatest\"\n"
-"                },\n"
-"                {\n"
-"                    \"name\": \"keatest2\",\n"
-"                    \"password\": \"keatest\",\n"
-"                    \"type\": \"mysql\",\n"
-"                    \"user\": \"keatest\"\n"
-"                }\n"
-"            ]\n"
-"        },\n"
-"        \"decline-probation-period\": 86400,\n"
-"        \"dhcp-ddns\": {\n"
-"            \"enable-updates\": false,\n"
-"            \"generated-prefix\": \"myhost\",\n"
-"            \"hostname-char-replacement\": \"\",\n"
-"            \"hostname-char-set\": \"\",\n"
-"            \"max-queue-size\": 1024,\n"
-"            \"ncr-format\": \"JSON\",\n"
-"            \"ncr-protocol\": \"UDP\",\n"
-"            \"override-client-update\": false,\n"
-"            \"override-no-update\": false,\n"
-"            \"qualifying-suffix\": \"\",\n"
-"            \"replace-client-name\": \"never\",\n"
-"            \"sender-ip\": \"0.0.0.0\",\n"
-"            \"sender-port\": 0,\n"
-"            \"server-ip\": \"127.0.0.1\",\n"
-"            \"server-port\": 53001\n"
-"        },\n"
-"        \"dhcp-queue-control\": {\n"
-"            \"capacity\": 500,\n"
-"            \"enable-queue\": false,\n"
-"            \"queue-type\": \"kea-ring6\"\n"
-"        },\n"
-"        \"dhcp4o6-port\": 0,\n"
-"        \"expired-leases-processing\": {\n"
-"            \"flush-reclaimed-timer-wait-time\": 25,\n"
-"            \"hold-reclaimed-time\": 3600,\n"
-"            \"max-reclaim-leases\": 100,\n"
-"            \"max-reclaim-time\": 250,\n"
-"            \"reclaim-timer-wait-time\": 10,\n"
-"            \"unwarned-reclaim-cycles\": 5\n"
-"        },\n"
-"        \"hooks-libraries\": [ ],\n"
-"        \"host-reservation-identifiers\": [ \"hw-address\", \"duid\" ],\n"
-"        \"interfaces-config\": {\n"
-"            \"interfaces\": [ \"*\" ],\n"
-"            \"re-detect\": false\n"
-"        },\n"
-"        \"lease-database\": {\n"
-"            \"type\": \"memfile\"\n"
-"        },\n"
-"        \"mac-sources\": [ \"any\" ],\n"
-"        \"option-data\": [ ],\n"
-"        \"option-def\": [ ],\n"
-"        \"rebind-timer\": 2000,\n"
-"        \"relay-supplied-options\": [ \"65\" ],\n"
-"        \"renew-timer\": 1000,\n"
-"        \"sanity-checks\": {\n"
-"            \"lease-checks\": \"warn\"\n"
-"        },\n"
-"        \"server-id\": {\n"
-"            \"enterprise-id\": 0,\n"
-"            \"htype\": 0,\n"
-"            \"identifier\": \"\",\n"
-"            \"persist\": true,\n"
-"            \"time\": 0,\n"
-"            \"type\": \"LLT\"\n"
-"        },\n"
-"        \"shared-networks\": [ ],\n"
-"        \"subnet6\": [ ],\n"
-"        \"valid-lifetime\": 4000\n"
 "    }\n"
 };
 
index ff7bbba5ce58ff51e64e32f9c097b3dc856773d4..d13c1ea03a45f61bbba00bf2ed3aea97ebbb8169 100644 (file)
 #include <dhcp6/ctrl_dhcp6_srv.h>
 #include <dhcp6/parser_context.h>
 #include <dhcp6/tests/dhcp6_test_utils.h>
+#include <dhcpsrv/cb_ctl_dhcp4.h>
 #include <dhcpsrv/cfgmgr.h>
 #include <dhcpsrv/lease.h>
 #include <dhcpsrv/lease_mgr_factory.h>
+#include <process/config_base.h>
 
 #ifdef HAVE_MYSQL
 #include <mysql/testutils/mysql_schema.h>
 #include <log/logger_support.h>
 #include <util/stopwatch.h>
 
+#include <boost/pointer_cast.hpp>
 #include <boost/scoped_ptr.hpp>
 #include <gtest/gtest.h>
 
+#include <functional>
 #include <fstream>
 #include <iostream>
 #include <sstream>
@@ -51,10 +55,100 @@ using namespace isc::hooks;
 
 namespace {
 
+/// @brief Test implementation of the @c CBControlDHCPv6.
+///
+/// This implementation is installed on the test server instance. It
+/// overrides the implementation of the @c databaseConfigFetch function
+/// to verify arguments passed to this function and throw an exception
+/// when desired in the negative test scenarios. It doesn't do the
+/// actual configuration fetch as this is tested elswhere and would
+/// require setting up a database configuration backend.
+class TestCBControlDHCPv6 : public CBControlDHCPv6 {
+public:
+
+    /// @brief Constructor.
+    TestCBControlDHCPv6()
+        : CBControlDHCPv6(), db_config_fetch_calls_(0),
+          enable_check_fetch_mode_(false), enable_throw_(false) {
+    }
+
+    /// @brief Stub implementation of the "fetch" function.
+    ///
+    /// It checks if the @c fetch_updates_only is set to true when it
+    /// is a later than first invocation of the function. It also
+    /// throws an exception when desired by a test, to verify that the
+    /// server gracefully handles such exception.
+    ///
+    /// @param fetch_mode value indicating if the method is called upon the
+    /// server start up or it is called to fetch configuration updates.
+    ///
+    /// @throw Unexpected when configured to do so.
+    virtual void databaseConfigFetch(const process::ConfigPtr&,
+                                     const FetchMode& fetch_mode) {
+        ++db_config_fetch_calls_;
+
+        if (enable_check_fetch_mode_) {
+            if ((db_config_fetch_calls_ <= 1) && (fetch_mode == FetchMode::FETCH_UPDATE)) {
+                ADD_FAILURE() << "databaseConfigFetch was called with the value "
+                    "of fetch_mode=FetchMode::FETCH_UPDATE upon the server configuration";
+
+            } else if ((db_config_fetch_calls_ > 1) && (fetch_mode == FetchMode::FETCH_ALL)) {
+                ADD_FAILURE() << "databaseConfigFetch was called with the value "
+                    "of fetch_mode=FetchMode::FETCH_ALL during fetching the updates";
+            }
+        }
+
+        if (enable_throw_) {
+            isc_throw(Unexpected, "testing if exceptions are corectly handled");
+        }
+    }
+
+    /// @brief Returns number of invocations of the @c databaseConfigFetch.
+    size_t getDatabaseConfigFetchCalls() const {
+        return (db_config_fetch_calls_);
+    }
+
+    /// @brief Enables checking of the @c fetch_mode value.
+    void enableCheckFetchMode() {
+        enable_check_fetch_mode_ = true;
+    }
+
+    /// @brief Enables the object to throw from @c databaseConfigFetch.
+    void enableThrow() {
+        enable_throw_ = true;
+    }
+
+private:
+
+    /// @brief Counter holding number of invocations of the @c databaseConfigFetch.
+    size_t db_config_fetch_calls_;
+
+    /// @brief Boolean flag indicated if the value of the @c fetch_mode
+    /// should be verified.
+    bool enable_check_fetch_mode_;
+
+    /// @brief Boolean flag indicating if the @c databaseConfigFetch should
+    /// throw.
+    bool enable_throw_;
+};
+
+/// @brief Shared pointer to the @c TestCBControlDHCPv6.
+typedef boost::shared_ptr<TestCBControlDHCPv6> TestCBControlDHCPv6Ptr;
+
+/// @brief "Naked" DHCPv6 server.
+///
+/// Exposes internal fields and installs stub implementation of the
+/// @c CBControlDHCPv6 object.
 class NakedControlledDhcpv6Srv: public ControlledDhcpv6Srv {
-    // "Naked" DHCPv6 server, exposes internal fields
 public:
-    NakedControlledDhcpv6Srv():ControlledDhcpv6Srv(0) { }
+    /// @brief Constructor.
+    NakedControlledDhcpv6Srv()
+        : ControlledDhcpv6Srv(0) {
+        // We're replacing the @c CBControlDHCPv6 instance with our
+        // stub implementation used in tests.
+        cb_control_.reset(new TestCBControlDHCPv6());
+    }
+
     using ControlledDhcpv6Srv::signal_handler_;
 };
 
@@ -85,15 +179,105 @@ public:
     ///
     /// @param io_service Pointer to the IO service to be ran.
     /// @param timeout_ms Amount of time after which the method returns.
-    void runTimersWithTimeout(const IOServicePtr& io_service, const long timeout_ms) {
+    /// @param cond Pointer to the function which if returns true it
+    /// stops the IO service and causes the function to return.
+    void runTimersWithTimeout(const IOServicePtr& io_service, const long timeout_ms,
+                              std::function<bool()> cond = std::function<bool()>()) {
         IntervalTimer timer(*io_service);
-        timer.setup([&io_service]() {
+        bool stopped = false;
+        timer.setup([&io_service, &stopped]() {
             io_service->stop();
+            stopped = true;
         }, timeout_ms, IntervalTimer::ONE_SHOT);
-        io_service->run();
+
+        // Run as long as the timeout hasn't occurred and the interrupting
+        // condition is not specified or not met.
+        while (!stopped && (!cond || !cond())) {
+            io_service->run_one();
+        }
         io_service->get_io_service().reset();
     }
 
+    /// @brief This test verifies that the timer used to fetch the configuration
+    /// updates from the database works as expected.
+    void testConfigBackendTimer(const int config_wait_fetch_time,
+                                const bool throw_during_fetch = false) {
+        std::ostringstream config;
+        config <<
+            "{ \"Dhcp6\": {"
+            "\"interfaces-config\": {"
+            "    \"interfaces\": [ ]"
+            "},"
+            "\"lease-database\": {"
+            "     \"type\": \"memfile\","
+            "     \"persist\": false"
+            "},"
+            "\"config-control\": {"
+            "     \"config-fetch-wait-time\": " << config_wait_fetch_time <<
+            "},"
+            "\"rebind-timer\": 2000, "
+            "\"renew-timer\": 1000, \n"
+            "\"subnet6\": [ ],"
+            "\"valid-lifetime\": 4000 }"
+            "}";
+        writeFile(TEST_FILE, config.str());
+
+        // Create an instance of the server and initialize it.
+        boost::scoped_ptr<NakedControlledDhcpv6Srv> srv;
+        ASSERT_NO_THROW(srv.reset(new NakedControlledDhcpv6Srv()));
+        ASSERT_NO_THROW(srv->init(TEST_FILE));
+
+        // Get the CBControlDHCPv6 object belonging to this server.
+        auto cb_control = boost::dynamic_pointer_cast<TestCBControlDHCPv6>(srv->getCBControl());
+
+        // Verify that the parameter passed to the databaseConfigFetch has an
+        // expected value.
+        cb_control->enableCheckFetchMode();
+
+        // Instruct our stub implementation of the CBControlDHCPv6 to throw as a
+        // result of fetch if desired.
+        if (throw_during_fetch) {
+            cb_control->enableThrow();
+        }
+
+        // So far there should be exactly one attempt to fetch the configuration
+        // from the backend. That's the attempt made upon startup.
+        EXPECT_EQ(1, cb_control->getDatabaseConfigFetchCalls());
+
+
+        if ((config_wait_fetch_time > 0) && (!throw_during_fetch)) {
+            // If we're configured to run the timer, we expect that it was
+            // invoked at least 3 times. This is sufficient to verify that
+            // the timer was scheduled and that the timer continued to run
+            // even when an exception occurred during fetch (that's why it
+            // is 3 not 2).
+            ASSERT_NO_THROW(runTimersWithTimeout(srv->getIOService(), 500,
+                [cb_control]() {
+                    // Interrupt the timers poll if we have recorded at
+                    // least 3 attempts to fetch the updates.
+                    return (cb_control->getDatabaseConfigFetchCalls() >= 3);
+                }));
+            EXPECT_GE(cb_control->getDatabaseConfigFetchCalls(), 3);
+
+        } else {
+            ASSERT_NO_THROW(runTimersWithTimeout(srv->getIOService(), 500));
+
+            if (throw_during_fetch) {
+                // If we're simulating the failure condition the number
+                // of consecutive failures should not exceed 10. Therefore
+                // the number of recorded fetches should be 12. One at
+                // startup, 10 failures and one that causes the timer
+                // to stop.
+                EXPECT_EQ(12, cb_control->getDatabaseConfigFetchCalls());
+
+            } else {
+                // If the server is not configured to schedule the timer,
+                // we should still have one fetch attempt recorded.
+                EXPECT_EQ(1, cb_control->getDatabaseConfigFetchCalls());
+            }
+        }
+    }
+
     static const char* TEST_FILE;
     static const char* TEST_INCLUDE;
 };
@@ -635,6 +819,29 @@ TEST_F(JSONFileBackendTest, defaultLeaseDbBackend) {
     EXPECT_NO_THROW(static_cast<void>(LeaseMgrFactory::instance()));
 }
 
+
+// This test verifies that the timer triggering configuration updates
+// is invoked according to the configured value of the
+// config-fetch-wait-time.
+TEST_F(JSONFileBackendTest, configBackendTimer) {
+    testConfigBackendTimer(1);
+}
+
+// This test verifies that the timer for triggering configuration updates
+// is not invoked when the value of the config-fetch-wait-time is set
+// to 0.
+TEST_F(JSONFileBackendTest, configBackendTimerDisabled) {
+    testConfigBackendTimer(0);
+}
+
+// This test verifies that the server will gracefully handle exceptions
+// thrown from the CBControlDHCPv6::databaseConfigFetch, i.e. will
+// reschedule the timer.
+TEST_F(JSONFileBackendTest, configBackendTimerWithThrow) {
+    // The true value instructs the test to throw during the fetch.
+    testConfigBackendTimer(1, true);
+}
+
 // Starting tests which require MySQL backend availability. Those tests
 // will not be executed if Kea has been compiled without the
 // --with-mysql.
index 4c862958ffe9e27ad26ec279bfcc009b9bd3e71c..ab5b8003339ab0dcace1a5fe5c96ca5c0c57dad6 100644 (file)
@@ -68,6 +68,7 @@ libkea_dhcpsrv_la_SOURCES += cache_host_data_source.h
 libkea_dhcpsrv_la_SOURCES += callout_handle_store.h
 libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp.h
 libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp4.cc cb_ctl_dhcp4.h
+libkea_dhcpsrv_la_SOURCES += cb_ctl_dhcp6.cc cb_ctl_dhcp6.h
 libkea_dhcpsrv_la_SOURCES += cfg_4o6.cc cfg_4o6.h
 libkea_dhcpsrv_la_SOURCES += cfg_consistency.cc cfg_consistency.h
 libkea_dhcpsrv_la_SOURCES += cfg_db_access.cc cfg_db_access.h
diff --git a/src/lib/dhcpsrv/cb_ctl_dhcp6.cc b/src/lib/dhcpsrv/cb_ctl_dhcp6.cc
new file mode 100644 (file)
index 0000000..b379e80
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+#include <dhcpsrv/cb_ctl_dhcp6.h>
+#include <dhcpsrv/cfgmgr.h>
+#include <dhcpsrv/dhcpsrv_log.h>
+
+using namespace isc::data;
+using namespace isc::process;
+
+namespace isc {
+namespace dhcp {
+
+void
+CBControlDHCPv6::databaseConfigApply(const db::BackendSelector& backend_selector,
+                                     const db::ServerSelector& server_selector,
+                                     const boost::posix_time::ptime& lb_modification_time,
+                                     const db::AuditEntryCollection& audit_entries) {
+    // Create the external config into which we'll fetch backend config data.
+    SrvConfigPtr external_cfg = CfgMgr::instance().createExternalCfg();
+
+    // First let's fetch the globals and add them to external config.
+    if (fetchConfigElement(audit_entries, "dhcp6_global_parameter")) {
+        data::StampedValueCollection globals;
+        globals = getMgr().getPool()->getModifiedGlobalParameters6(backend_selector, server_selector,
+                                                                   lb_modification_time);
+        addGlobalsToConfig(external_cfg, globals);
+    }
+
+    // Now we fetch the option definitions and add them.
+    if (fetchConfigElement(audit_entries, "dhcp6_option_def")) {
+        OptionDefContainer option_defs =
+            getMgr().getPool()->getModifiedOptionDefs6(backend_selector, server_selector,
+                                                       lb_modification_time);
+        for (auto option_def = option_defs.begin(); option_def != option_defs.end(); ++option_def) {
+            external_cfg->getCfgOptionDef()->add((*option_def), (*option_def)->getOptionSpaceName());
+        }
+    }
+
+    // Next fetch the options. They are returned as a container of OptionDescriptors.
+    if (fetchConfigElement(audit_entries, "dhcp6_options")) {
+        OptionContainer options = getMgr().getPool()->getModifiedOptions6(backend_selector,
+                                                                          server_selector,
+                                                                          lb_modification_time);
+        for (auto option = options.begin(); option != options.end(); ++option) {
+            external_cfg->getCfgOption()->add((*option), (*option).space_name_);
+        }
+    }
+
+    // Now fetch the shared networks.
+    if (fetchConfigElement(audit_entries, "dhcp6_shared_network")) {
+        SharedNetwork6Collection networks =
+            getMgr().getPool()->getModifiedSharedNetworks6(backend_selector, server_selector,
+                                                           lb_modification_time);
+        for (auto network = networks.begin(); network != networks.end(); ++network) {
+            external_cfg->getCfgSharedNetworks6()->add((*network));
+        }
+    }
+
+    // Next we fetch subnets.
+    if (fetchConfigElement(audit_entries, "dhcp6_subnet")) {
+        Subnet6Collection subnets = getMgr().getPool()->getModifiedSubnets6(backend_selector,
+                                                                            server_selector,
+                                                                            lb_modification_time);
+        for (auto subnet = subnets.begin(); subnet != subnets.end(); ++subnet) {
+            external_cfg->getCfgSubnets6()->add((*subnet));
+        }
+    }
+
+    if (audit_entries.empty()) {
+        CfgMgr::instance().mergeIntoStagingCfg(external_cfg->getSequence());
+
+    } else {
+        CfgMgr::instance().mergeIntoCurrentCfg(external_cfg->getSequence());
+    }
+    LOG_INFO(dhcpsrv_logger, DHCPSRV_CFGMGR_CONFIG6_MERGED);
+}
+
+
+} // end of namespace isc::dhcp
+} // end of namespace isc
diff --git a/src/lib/dhcpsrv/cb_ctl_dhcp6.h b/src/lib/dhcpsrv/cb_ctl_dhcp6.h
new file mode 100644 (file)
index 0000000..4817556
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef CB_CTL_DHCP6_H
+#define CB_CTL_DHCP6_H
+
+#include <dhcpsrv/cb_ctl_dhcp.h>
+#include <dhcpsrv/config_backend_dhcp6_mgr.h>
+#include <dhcpsrv/srv_config.h>
+
+namespace isc {
+namespace dhcp {
+
+/// @brief Implementation of the mechanisms to control the use of
+/// the Configuration Backends by the DHCPv6 server.
+///
+/// It implements fetching and merging DHCPv6 server configuration from
+/// the database into the staging or current configuration.
+///
+/// @tparam ConfigBackendMgrType Type of the Config Backend Manager used
+/// by the server implementing this class. For example, for the DHCPv6
+/// server it will be @c ConfigBackendDHCPv6Mgr.
+class CBControlDHCPv6 : public CBControlDHCP<ConfigBackendDHCPv6Mgr> {
+protected:
+
+    /// @brief DHCPv6 server specific method to fetch and apply back end
+    /// configuration into the local configuration.
+    ///
+    /// @param backend_selector Backend selector.
+    /// @param server_selector Server selector.
+    /// @param lb_modification_time Lower bound modification time for the
+    /// configuration elements to be fetched.
+    /// @param audit_entries Audit entries fetched from the database since
+    /// the last configuration update. This collection is empty if there
+    /// were no updates.
+    virtual void databaseConfigApply(const db::BackendSelector& backend_selector,
+                                     const db::ServerSelector& server_selector,
+                                     const boost::posix_time::ptime& lb_modification_time,
+                                     const db::AuditEntryCollection& audit_entries);
+};
+
+typedef boost::shared_ptr<CBControlDHCPv6> CBControlDHCPv6Ptr;
+
+} // end of namespace isc::dhcp
+} // end of namespace isc
+
+#endif // CB_CTL_DHCP6_H
index 0b33bf120ef399138d83aba5c2dc673cef27e672..a45a3b988ed9e8b300d8ee3fb6fc391fe1f1118d 100644 (file)
@@ -1,4 +1,4 @@
-// File created from ../../../src/lib/dhcpsrv/dhcpsrv_messages.mes on Tue Mar 19 2019 10:19
+// File created from ../../../src/lib/dhcpsrv/dhcpsrv_messages.mes on Tue Mar 26 2019 13:08
 
 #include <cstddef>
 #include <log/message_types.h>
@@ -14,6 +14,7 @@ extern const isc::log::MessageID DHCPSRV_CFGMGR_ALL_IFACES_ACTIVE = "DHCPSRV_CFG
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CFG_DHCP_DDNS = "DHCPSRV_CFGMGR_CFG_DHCP_DDNS";
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CLEAR_ACTIVE_IFACES = "DHCPSRV_CFGMGR_CLEAR_ACTIVE_IFACES";
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CONFIG4_MERGED = "DHCPSRV_CFGMGR_CONFIG4_MERGED";
+extern const isc::log::MessageID DHCPSRV_CFGMGR_CONFIG6_MERGED = "DHCPSRV_CFGMGR_CONFIG6_MERGED";
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CONFIGURE_SERVERID = "DHCPSRV_CFGMGR_CONFIGURE_SERVERID";
 extern const isc::log::MessageID DHCPSRV_CFGMGR_DEL_SUBNET4 = "DHCPSRV_CFGMGR_DEL_SUBNET4";
 extern const isc::log::MessageID DHCPSRV_CFGMGR_DEL_SUBNET6 = "DHCPSRV_CFGMGR_DEL_SUBNET6";
@@ -245,6 +246,7 @@ const char* values[] = {
     "DHCPSRV_CFGMGR_CFG_DHCP_DDNS", "Setting DHCP-DDNS configuration to: %1",
     "DHCPSRV_CFGMGR_CLEAR_ACTIVE_IFACES", "stop listening on all interfaces",
     "DHCPSRV_CFGMGR_CONFIG4_MERGED", "Configuration backend data has been merged.",
+    "DHCPSRV_CFGMGR_CONFIG6_MERGED", "Configuration backend data has been merged.",
     "DHCPSRV_CFGMGR_CONFIGURE_SERVERID", "server configuration includes specification of a server identifier",
     "DHCPSRV_CFGMGR_DEL_SUBNET4", "IPv4 subnet %1 removed",
     "DHCPSRV_CFGMGR_DEL_SUBNET6", "IPv6 subnet %1 removed",
index b9bc9550293fb8f9adfaac493c837d503efb05a6..3a421e3dd119ee02ac49ecbf7579d9ee71f5cb0d 100644 (file)
@@ -1,4 +1,4 @@
-// File created from ../../../src/lib/dhcpsrv/dhcpsrv_messages.mes on Tue Mar 19 2019 10:19
+// File created from ../../../src/lib/dhcpsrv/dhcpsrv_messages.mes on Tue Mar 26 2019 13:08
 
 #ifndef DHCPSRV_MESSAGES_H
 #define DHCPSRV_MESSAGES_H
@@ -15,6 +15,7 @@ extern const isc::log::MessageID DHCPSRV_CFGMGR_ALL_IFACES_ACTIVE;
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CFG_DHCP_DDNS;
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CLEAR_ACTIVE_IFACES;
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CONFIG4_MERGED;
+extern const isc::log::MessageID DHCPSRV_CFGMGR_CONFIG6_MERGED;
 extern const isc::log::MessageID DHCPSRV_CFGMGR_CONFIGURE_SERVERID;
 extern const isc::log::MessageID DHCPSRV_CFGMGR_DEL_SUBNET4;
 extern const isc::log::MessageID DHCPSRV_CFGMGR_DEL_SUBNET6;
index 56a500a5a7b4cf396339ef2a07e3578faa06ab40..810d695f217b2d58ea55c28dc57d092645bca2e5 100644 (file)
@@ -36,6 +36,11 @@ This is an informational message emitted when the DHCPv4 server has
 successfully merged configuration data retrieved from its configuration
 backends into the current configuration.
 
+% DHCPSRV_CFGMGR_CONFIG6_MERGED Configuration backend data has been merged.
+This is an informational message emitted when the DHCPv6 server has
+successfully merged configuration data retrieved from its configuration
+backends into the current configuration.
+
 % DHCPSRV_CFGMGR_CONFIGURE_SERVERID server configuration includes specification of a server identifier
 This warning message is issued when the server specified configuration of
 a server identifier. If this new configuration overrides an existing