Commit 90fd7ebf authored by Thomas Markwalder's avatar Thomas Markwalder
Browse files

[#42] Implemented PacketQueueMgr class

New files:
    src/lib/dhcp/packet_queue_mgr.h
    src/lib/dhcp/packet_queue_mgr4.cc
    src/lib/dhcp/packet_queue_mgr4.h
    src/lib/dhcp/packet_queue_mgr6.cc
    src/lib/dhcp/packet_queue_mgr6.h
    src/lib/dhcp/tests/packet_queue_mgr4_unittest.cc
    src/lib/dhcp/tests/packet_queue_mgr6_unittest.cc
    src/lib/dhcp/tests/packet_queue_testutils.h

src/bin/dhcp4/ctrl_dhcp4_srv.cc
    Cleaned up packet queue config block

src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/tests/config_parser_unittest.cc
    added queue-type

src/bin/dhcp4/dhcp4_messages.mes
    added DHCP4_CONFIG_PACKET_QUEUE message

src/lib/dhcp/Makefile.am
    packet_queue_mgr.h
    packet_queue_mgr4.cc packet_queue_mgr4.h
    packet_queue_mgr6.cc packet_queue_mgr6.h

src/lib/dhcp/iface_mgr.*
    Replaced packet queue members with PQM members
    Added PQM instantion to IfaceMgr ctor

src/lib/dhcp/packet_queue.h
    added getInfo,getInfoStr

src/lib/dhcp/tests/Makefile.am
    packet_queue_mgr4_unittest.cc
    packet_queue_mgr6_unittest.cc

src/lib/dhcpsrv/parsers/queue_control_parser.cc
    added queue-type
parent 036d249f
......@@ -634,20 +634,24 @@ ControlledDhcpv4Srv::processConfig(isc::data::ConstElementPtr config) {
return (isc::config::createAnswer(1, err.str()));
}
// Configure packet queue
try {
// @todo Consider making this a function and consider whether
// it should check for old gc != null and new gc null before
// calling setPacketQueueControl(). Or if we should even
// call it when it's null?
// Still grappling with what to if there is a custom queue
// loaded. Could have a flag in the control that means
// using custom impl, in which case we don't make the call
// at all. ... I dunno
ConstQueueControlPtr qc;
qc = CfgMgr::instance().getStagingCfg()->getQueueControlInfo();
IfaceMgr::instance().setPacketQueueControl4(qc);
qc = IfaceMgr::instance().getPacketQueueControl4();
std::cout << "TKM using capacity: " << qc->getCapacity() << std::endl;
if (!qc) {
// For right now, we are maually constructing the default
// This probably needs to be built into the PQM?
QueueControl default_qc;
default_qc.setQueueType("kea-ring4");
default_qc.setCapacity(500);
PacketQueueMgr4::instance().createPacketQueue(default_qc);
} else {
PacketQueueMgr4::instance().createPacketQueue(*qc);
}
LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CONFIG_PACKET_QUEUE)
.arg(PacketQueueMgr4::instance().getPacketQueue()->getInfoStr());
} catch (const std::exception& ex) {
err << "Error setting packet queue controls after server reconfiguration: "
<< ex.what();
......
......@@ -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 176
#define YY_END_OF_BUFFER 177
#define YY_NUM_RULES 177
#define YY_END_OF_BUFFER 178
/* 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[1474] =
static const flex_int16_t yy_accept[1479] =
{ 0,
169, 169, 0, 0, 0, 0, 0, 0, 0, 0,
177, 175, 10, 11, 175, 1, 169, 166, 169, 169,
175, 168, 167, 175, 175, 175, 175, 175, 162, 163,
175, 175, 175, 164, 165, 5, 5, 5, 175, 175,
175, 10, 11, 0, 0, 158, 0, 0, 0, 0,
170, 170, 0, 0, 0, 0, 0, 0, 0, 0,
178, 176, 10, 11, 176, 1, 170, 167, 170, 170,
176, 169, 168, 176, 176, 176, 176, 176, 163, 164,
176, 176, 176, 165, 166, 5, 5, 5, 176, 176,
176, 10, 11, 0, 0, 159, 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, 1,
169, 169, 0, 168, 169, 3, 2, 6, 0, 169,
170, 170, 0, 169, 170, 3, 2, 6, 0, 170,
0, 0, 0, 0, 0, 0, 4, 0, 0, 9,
0, 159, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 161, 0, 0, 0,
0, 160, 0, 0, 0, 0, 0, 0, 0, 0,
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, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
......@@ -724,7 +724,7 @@ static const flex_int16_t yy_accept[1474] =
0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 160, 0, 0, 0, 0, 0, 0, 0, 0,
0, 161, 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, 67, 0, 0, 0, 0, 0, 0,
......@@ -732,10 +732,10 @@ static const flex_int16_t yy_accept[1474] =
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, 174, 172,
0, 171, 170, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 175, 173,
0, 172, 171, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 139, 0, 138, 0, 0, 73, 0,
0, 0, 0, 140, 0, 139, 0, 0, 73, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
......@@ -744,10 +744,10 @@ static const flex_int16_t yy_accept[1474] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 17, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 18, 0, 0, 0, 0, 173,
0, 0, 0, 0, 18, 0, 0, 0, 0, 174,
170, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 140, 0, 0, 142, 0, 0, 0, 0, 0,
171, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 141, 0, 0, 143, 0, 0, 0, 0, 0,
0, 0, 0, 74, 0, 0, 0, 0, 0, 0,
59, 0, 0, 0, 0, 0, 91, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 37, 0, 0,
......@@ -759,7 +759,7 @@ static const flex_int16_t yy_accept[1474] =
0, 0, 0, 0, 0, 0, 0, 0, 88, 30,
0, 0, 35, 0, 0, 0, 0, 0, 0, 0,
0, 12, 147, 0, 144, 0, 143, 0, 0, 0,
0, 12, 148, 0, 145, 0, 144, 0, 0, 0,
101, 0, 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,
......@@ -770,7 +770,7 @@ static const flex_int16_t yy_accept[1474] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 97, 0, 0, 0, 0, 0, 0, 0, 7,
0, 0, 145, 0, 0, 0, 0, 0, 0, 0,
0, 0, 146, 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, 72, 0, 0, 0, 0, 0, 0, 0,
......@@ -779,91 +779,91 @@ static const flex_int16_t yy_accept[1474] =
79, 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, 65, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 76,
0, 0, 0, 0, 0, 0, 0, 0, 0, 64,
0, 0, 0, 0, 0, 0, 0, 0, 65, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 95, 0, 0, 0,
76, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64, 0, 0, 0, 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,
0, 107, 77, 0, 0, 0, 0, 82, 31, 0,
0, 0, 107, 77, 0, 0, 0, 0, 82, 31,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 39, 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, 54, 0, 0,
0, 0, 0, 0, 0, 0, 0, 148, 0, 0,
0, 0, 0, 120, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 69, 0,
0, 0, 0, 0, 0, 0, 0, 0, 96, 0,
0, 0, 0, 0, 42, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 54,
0, 0, 0, 0, 0, 0, 0, 0, 0, 149,
0, 0, 0, 0, 0, 121, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 36, 0, 0, 0, 0, 29, 0,
69, 0, 0, 0, 0, 0, 0, 0, 0, 0,
96, 0, 0, 0, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 84, 0, 0, 0,
0, 0, 0, 0, 0, 36, 0, 0, 0, 0,
0, 29, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 84,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 93, 0, 0, 0,
0, 0, 0, 0, 0, 121, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 93,
0, 0, 0, 0, 0, 0, 0, 0, 122, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 23, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 126, 0, 0,
124, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 152, 0, 0, 0, 0, 0, 0,
94, 0, 0, 0, 0, 0, 0, 98, 80, 0,
0, 0, 0, 66, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 92, 22, 0, 103, 0, 0, 0,
0, 0, 0, 0, 0, 130, 0, 0, 0, 0,
56, 0, 0, 0, 0, 0, 106, 33, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 23,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 53, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 60,
0, 127, 0, 0, 125, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 153, 0, 0,
0, 0, 0, 0, 94, 0, 0, 0, 0, 0,
0, 98, 80, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 92, 22, 0,
103, 0, 0, 0, 0, 0, 0, 0, 0, 131,
0, 0, 0, 0, 56, 0, 0, 0, 0, 0,
106, 33, 0, 0, 120, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 53,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 100, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 60, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 100, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 155, 0, 57, 71, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 50, 0, 0, 0, 0,
0, 0, 0, 127, 0, 125, 0, 118, 117, 0,
46, 0, 21, 0, 0, 0, 0, 0, 141, 0,
0, 87, 0, 0, 0, 0, 0, 0, 0, 0,
115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 104, 15, 0, 40, 0, 0, 0, 0,
0, 129, 0, 0, 0, 0, 0, 0, 0, 51,
0, 0, 99, 0, 0, 0, 0, 90, 0, 0,
0, 0, 0, 0, 63, 0, 150, 0, 149, 0,
0, 0, 0, 0, 0, 0, 156, 0, 57, 71,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50, 0, 0, 0, 0, 0, 0, 0, 128, 0,
126, 0, 118, 117, 0, 46, 0, 21, 0, 0,
0, 0, 0, 142, 0, 0, 87, 0, 0, 0,
0, 0, 0, 0, 0, 115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 104, 15, 0,
40, 0, 0, 0, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 51, 0, 0, 99, 0, 0,
0, 0, 90, 0, 0, 0, 0, 0, 0, 63,
0, 151, 0, 150, 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, 119, 0, 0, 0, 0, 0, 0,
0, 14, 0, 0, 45, 0, 0, 0, 0, 0,
157, 85, 27, 0, 0, 47, 116, 0, 0, 153,
122, 0, 0, 0, 0, 0, 0, 0, 0, 25,
0, 0, 24, 0, 128, 0, 0, 0, 0, 0,
78, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 49, 0, 0, 0, 0, 41,
0, 0, 0, 0, 0, 0, 105, 0, 0, 0,
26, 0, 154, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 44, 0, 0, 20, 156, 55,
0, 151, 146, 0, 28, 0, 16, 0, 0, 135,
0, 0, 0, 0, 0, 0, 113, 0, 89, 0,
0, 0, 0, 0, 0, 0, 0, 68, 0, 0,
0, 0, 0, 0, 0, 0, 136, 13, 0, 0,
0, 0, 0, 123, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 112, 0, 19, 0,
132, 0, 0, 0, 0, 0, 131, 0, 0, 0,
111, 0, 0, 48, 0, 0, 43, 134, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 119, 0,
0, 0, 0, 0, 0, 0, 14, 0, 0, 45,
0, 0, 0, 0, 0, 158, 85, 27, 0, 0,
47, 116, 0, 0, 154, 123, 0, 0, 0, 0,
0, 0, 0, 0, 25, 0, 0, 24, 0, 129,
0, 0, 0, 0, 0, 78, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 49,
0, 0, 0, 0, 41, 0, 0, 0, 0, 0,
0, 105, 0, 0, 0, 26, 0, 155, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 44,
0, 0, 20, 157, 55, 0, 152, 147, 0, 28,
0, 16, 0, 0, 136, 0, 0, 0, 0, 0,
0, 113, 0, 89, 0, 0, 0, 0, 0, 0,
0, 0, 68, 0, 0, 0, 0, 0, 0, 0,
0, 137, 13, 0, 0, 0, 0, 0, 124, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 112, 0, 19, 0, 133, 0, 0, 0, 0,
0, 132, 0, 0, 0, 111, 0, 0, 48, 0,
0, 43, 135, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 133, 0, 86, 0, 0, 0, 0,
0, 0, 109, 114, 52, 0, 0, 0, 0, 108,
0, 0, 137, 0, 0, 0, 0, 0, 75, 0,
0, 110, 0
0, 0, 0, 0, 0, 0, 0, 0, 134, 0,
86, 0, 0, 0, 0, 0, 0, 109, 114, 52,
0, 0, 0, 0, 108, 0, 0, 138, 0, 0,
0, 0, 0, 75, 0, 0, 110, 0
} ;
static const YY_CHAR yy_ec[256] =
......@@ -910,349 +910,349 @@ static const YY_CHAR yy_meta[72] =
3
} ;
static const flex_int16_t yy_base[1486] =
static const flex_int16_t yy_base[1491] =
{ 0,
0, 70, 19, 29, 41, 49, 52, 58, 87, 95,
1836, 1837, 32, 1832, 141, 0, 201, 1837, 206, 88,
11, 213, 1837, 1814, 114, 25, 2, 6, 1837, 1837,
73, 11, 17, 1837, 1837, 1837, 104, 1820, 1775, 0,
1812, 107, 1827, 217, 247, 1837, 1771, 185, 1770, 1776,
93, 58, 1768, 91, 211, 195, 14, 273, 195, 1767,
193, 195, 217, 294, 76, 68, 231, 1776, 268, 221,
296, 282, 275, 1759, 188, 304, 312, 304, 1778, 0,
356, 362, 374, 380, 383, 1837, 0, 1837, 386, 397,
212, 295, 216, 298, 314, 293, 1837, 1775, 1814, 1837,
326, 1837, 373, 1803, 316, 1761, 1771, 336, 202, 1766,
319, 361, 339, 374, 239, 1809, 0, 424, 369, 1753,
1755, 1753, 1750, 1758, 369, 1754, 1743, 1744, 76, 1760,
1743, 1752, 1752, 371, 1743, 379, 1744, 1742, 396, 1788,
1792, 1734, 1785, 1727, 1750, 1747, 1747, 1741, 356, 1734,
1727, 1732, 1726, 392, 1737, 1730, 1721, 1720, 1734, 380,
1720, 394, 416, 1714, 421, 405, 425, 1735, 1732, 1733,
1731, 442, 1713, 1715, 443, 1707, 1724, 1716, 0, 429,
424, 396, 443, 455, 460, 1715, 1837, 0, 1758, 467,
1705, 1708, 453, 459, 1716, 469, 1759, 470, 1758, 462,
1757, 1837, 506, 1756, 479, 1717, 1697, 1715, 1712, 1709,
1708, 1699, 449, 1748, 1742, 1708, 1687, 1695, 1690, 1704,
1700, 1688, 1700, 1700, 1691, 1675, 1679, 1692, 1694, 1691,
1683, 1673, 1691, 1837, 1686, 1689, 1670, 1669, 1719, 1668,
1678, 1681, 482, 1677, 1665, 1676, 1712, 1659, 1715, 1652,
1667, 498, 1657, 1673, 1654, 1653, 1659, 1650, 1649, 1656,
1646, 1703, 1661, 1660, 1654, 77, 1661, 1656, 1648, 1638,
1653, 1652, 1647, 1651, 1632, 1648, 1634, 1640, 1647, 1635,
224, 1628, 1642, 1683, 1644, 348, 1635, 478, 1837, 1837,
488, 1837, 1837, 1622, 0, 445, 457, 1624, 518, 489,
1678, 1631, 502, 1837, 1676, 1837, 1670, 550, 1837, 499,
1612, 1668, 1632, 1613, 1619, 1669, 1626, 1621, 1624, 480,
1837, 1622, 1664, 1619, 1616, 534, 1622, 1660, 1654, 1609,
1604, 1601, 1650, 1609, 1598, 1614, 1646, 1594, 550, 1608,
1593, 1606, 1593, 1603, 1598, 1605, 1600, 1596, 479, 1594,
1597, 1592, 1588, 1636, 499, 1630, 1837, 1629, 1581, 1580,
1579, 1572, 1574, 1578, 1567, 1580, 498, 1625, 1580, 1577,
1580, 1837, 1579, 1568, 1568, 1580, 520, 1555, 1556, 1577,
530, 1559, 1608, 1555, 1569, 1568, 1554, 1566, 1565, 1564,
1563, 505, 1604, 1603, 1837, 1547, 1546, 573, 1559, 1837,
1837, 1558, 0, 1547, 1539, 546, 1544, 1595, 1594, 1552,
1592, 1837, 1540, 1590, 1837, 556, 602, 549, 1589, 1545,
1541, 1540, 1528, 1837, 1533, 1539, 1542, 1541, 1528, 1527,
1837, 1529, 1526, 219, 1524, 1526, 1837, 1534, 1531, 1516,
1529, 1524, 579, 1531, 1519, 1512, 1561, 1837, 1510, 1526,
1558, 1521, 1518, 1519, 1521, 1553, 1506, 1501, 1500, 1549,
1495, 1510, 1488, 1495, 1500, 1548, 1837, 1495, 1491, 1489,
1498, 1492, 1499, 1483, 1483, 1493, 1496, 1485, 1480, 1837,
1535, 1837, 1479, 1490, 1527, 1474, 1479, 1488, 1482, 1476,
1485, 1525, 1519, 1483, 1466, 1466, 1461, 1481, 1456, 1462,
1461, 1469, 1473, 1456, 1512, 1454, 1468, 1457, 1837, 1837,
1457, 1455, 1837, 1466, 1500, 1462, 0, 1446, 1463, 1501,
1451, 1837, 1837, 1448, 1837, 1454, 1837, 556, 558, 594,
1837, 1451, 1439, 1438, 1489, 1436, 1487, 1434, 1433, 1440,
1433, 1445, 1444, 1444, 1432, 1473, 1440, 1432, 1475, 1421,
1437, 1436, 1837, 1421, 1418, 1474, 1431, 1423, 1429, 1420,
1428, 1413, 1429, 1411, 1425, 522, 1407, 1401, 1406, 1421,
1418, 1419, 1416, 1457, 1414, 1837, 1400, 1402, 1411, 1409,
1446, 1445, 1398, 586, 1407, 1390, 1391, 1388, 1837, 1402,
1381, 1402, 1399, 1391, 1434, 1388, 1395, 1431, 1837, 1378,
1392, 1376, 1390, 1393, 1374, 1424, 1423, 1422, 1369, 1420,
1419, 1837, 14, 1381, 1381, 1379, 1362, 1367, 1369, 1837,
1375, 1365, 1837, 1410, 1358, 1413, 558, 584, 558, 1363,
1349, 1405, 584, 1409, 555, 1403, 1402, 1401, 1355, 1345,
1398, 1351, 1361, 1395, 1358, 1352, 1339, 1347, 1390, 1394,
1351, 1350, 1837, 1351, 1344, 1333, 1346, 1349, 1344, 1345,
1342, 1341, 1337, 1343, 1338, 1379, 1378, 1328, 1318, 548,
1375, 1837, 1374, 1323, 1315, 1316, 1365, 1328, 1315, 1326,
1837, 1314, 1323, 1322, 1322, 1362, 1305, 1314, 1307, 1318,
1295, 1299, 1350, 1314, 1296, 1306, 1346, 1345, 1344, 1291,
1342, 1306, 579, 582, 1283, 1293, 580, 1837, 1343, 1289,
1299, 1299, 1282, 1287, 1291, 1281, 1293, 1296, 1333, 1837,
1327, 601, 2, 20, 90, 319, 312, 444, 499, 1837,
512, 545, 541, 563, 577, 596, 594, 585, 590, 599,
595, 649, 608, 598, 614, 604, 1837, 614, 614, 607,
619, 617, 660, 604, 606, 621, 608, 666, 625, 611,
614, 1837, 1837, 624, 629, 634, 622, 1837, 1837, 636,
623, 617, 622, 640, 627, 675, 628, 678, 629, 685,
1837, 632, 636, 637, 632, 690, 645, 635, 636, 632,
645, 656, 640, 658, 653, 654, 656, 649, 651, 652,
652, 654, 669, 708, 667, 672, 649, 1837, 674, 664,
709, 669, 659, 674, 675, 662, 676, 1837, 695, 703,
683, 673, 720, 1837, 685, 689, 728, 678, 673, 685,
680, 681, 677, 686, 681, 737, 696, 687, 1837, 689,
700, 685, 701, 695, 741, 709, 694, 695, 1837, 711,
714, 697, 754, 699, 1837, 716, 719, 699, 717, 755,
715, 711, 706, 724, 723, 724, 710, 725, 717, 724,
714, 732, 717, 1837, 725, 731, 719, 777, 1837, 728,
733, 775, 728, 740, 735, 739, 737, 735, 737, 747,
790, 736, 736, 793, 739, 751, 1837, 739, 747, 745,
750, 762, 746, 751, 761, 762, 767, 806, 765, 781,
787, 760, 771, 762, 814, 759, 1837, 759, 779, 768,
773, 780, 821, 822, 771, 1837, 767, 770, 769, 789,
786, 791, 792, 778, 786, 795, 775, 790, 798, 839,
1837, 840, 841, 794, 804, 806, 795, 791, 798, 807,
850, 799, 797, 799, 816, 855, 807, 806, 812, 810,
808, 861, 862, 858, 809, 1837, 823, 816, 807, 826,
814, 824, 821, 826, 822, 835, 835, 1837, 819, 820,
1837, 821, 879, 820, 839, 840, 838, 823, 844, 843,
827, 832, 850, 1837, 840, 873, 864, 836, 895, 858,
1837, 841, 843, 860, 858, 850, 854, 1837, 1837, 864,
899, 848, 901, 850, 908, 853, 864, 856, 862, 858,
876, 878, 879, 1837, 1837, 878, 1837, 863, 864, 884,
874, 867, 879, 921, 887, 1837, 879, 929, 872, 931,
1837, 932, 876, 882, 889, 931, 1837, 1837, 881, 886,
884, 898, 903, 886, 943, 902, 903, 904, 942, 896,
901, 950, 900, 952, 1837, 901, 954, 955, 897, 957,
918, 959, 903, 915, 920, 906, 936, 965, 925, 1837,
917, 968, 917, 932, 919, 915, 931, 936, 918, 976,
931, 936, 1837, 937, 930, 939, 940, 937, 927, 930,
930, 935, 988, 989, 934, 991, 988, 931, 946, 939,
997, 1837, 953, 1837, 1837, 958, 950, 960, 946, 947,
957, 1007, 953, 963, 1011, 1837, 961, 961, 963, 965,
1016, 959, 962, 1837, 981, 1837, 965, 1837, 1837, 979,
1837, 973, 1837, 1023, 974, 1025, 1026, 1008, 1837, 986,
987, 1837, 975, 983, 977, 976, 979, 979, 980, 976,
1837, 998, 984, 985, 1000, 1000, 1003, 1003, 1000, 1042,
1006, 998, 1837, 1837, 1009, 1837, 1006, 1011, 1012, 1009,
1051, 1837, 1002, 1003, 1003, 1009, 1008, 1019, 1063, 1837,
1059, 1008, 1837, 1009, 1009, 1011, 1017, 1837, 1019, 1071,
1022, 1025, 1074, 1037, 1837, 1034, 1837, 1031, 1837, 1054,
1074, 1080, 1081, 1082, 1041, 1027, 1085, 1086, 1041, 1035,
1089, 1090, 1086, 1051, 1047, 1089, 1039, 1044, 1042, 1099,
1057, 1101, 1061, 1103, 1066, 1056, 1050, 1066, 1066, 1110,
1054, 1071, 1070, 1837, 1054, 1110, 1111, 1060, 1113, 1078,
1079, 1837, 1079, 1066, 1837, 1077, 1124, 1084, 1097, 1084,
1837, 1837, 1837, 1072, 1129, 1837, 1837, 1078, 1089, 1837,
1837, 1079, 1128, 1073, 1078, 1136, 1086, 1096, 1097, 1837,
1140, 1095, 1837, 1142, 1837, 1087, 1102, 1090, 1105, 1109,
1837, 1143, 1111, 1104, 1113, 1095, 1102, 1156, 1117, 1116,
1159, 1160, 1161, 1112, 1837, 1163, 1164, 1111, 1166, 1837,
1116, 1168, 1114, 1113, 1171, 1126, 1837, 1168, 1121, 1118,
1837, 1132, 1837, 1135, 1178, 1133, 1180, 1141, 1124, 1126,
1123, 1139, 1140, 1149, 1837, 1139, 1189, 1837, 1837, 1837,
1185, 1837, 1837, 1150, 1837, 1187, 1837, 1141, 1148, 1837,
1145, 1150, 1148, 1198, 1199, 1144, 1837, 1159, 1837, 1160,
1150, 1162, 1205, 1149, 1157, 1158, 1171, 1837, 1170, 1160,
1159, 1173, 1164, 1173, 1175, 1179, 1837, 1837, 1218, 1163,
1220, 1180, 1222, 1837, 1218, 1182, 1183, 1170, 1165, 1228,
1187, 1188, 1189, 1232, 1191, 1194, 1837, 1235, 1837, 1198,
1837, 1180, 1238, 1239, 1184, 1201, 1837, 1187, 1187, 1189,
1837, 1194, 1204, 1837, 1190, 1202, 1837, 1837, 1207, 1201,
1205, 1196, 1248, 1197, 1205, 1214, 1207, 1202, 1217, 1208,
1215, 1202, 1217, 1222, 1265, 1224, 1267, 1212, 1228, 1219,
1233, 1229, 1222, 1837, 1274, 1837, 1275, 1276, 1233, 1232,
1233, 1223, 1837, 1837, 1837, 1281, 1225, 1241, 1284, 1837,
1280, 1231, 1837, 1230, 1232, 1243, 1290, 1241, 1837, 1250,
1293, 1837, 1837, 1299, 1304, 1309, 1314, 1319, 1324, 1329,
1332, 1306, 1311, 1313, 1326
1841, 1842, 32, 1837, 141, 0, 201, 1842, 206, 88,
11, 213, 1842, 1819, 114, 25, 2, 6, 1842, 1842,
73, 11, 17, 1842, 1842, 1842, 104, 1825, 1780, 0,
1817, 107, 1832, 217, 247, 1842, 1776, 185, 1775, 1781,
93, 58, 1773, 91, 211, 195, 14, 273, 195, 1772,
193, 195, 217, 294, 76, 68, 231, 1781, 268, 221,
296, 282, 275, 1764, 188, 304, 312, 304, 1783, 0,
356, 362, 374, 380, 383, 1842, 0, 1842, 386, 397,
212, 295, 216, 298, 314, 293, 1842, 1780, 1819, 1842,
326, 1842, 373, 1808, 316, 1766, 1776, 336, 202, 1771,
319, 361, 339, 374, 239, 1814, 0, 424, 369, 1758,
1760, 1758, 1755, 1763, 369, 1759, 1748, 1749, 76, 1765,
1748, 1757, 1757, 371, 1748, 379, 1749, 1747, 396, 1793,
1797, 1739, 1790, 1732, 1755, 1752, 1752, 1746, 356, 1739,
1732, 1737, 1731, 392, 1742, 1735, 1726, 1725, 1739, 380,
1725, 394, 416, 1719, 421, 405, 425, 1740, 1737, 1738,
1736, 442, 1718, 1720, 443, 1712, 1729, 1721, 0, 429,
424, 396, 443, 455, 460, 1720, 1842, 0, 1763, 467,
1710, 1713, 453, 459, 1721, 469, 1764, 470, 1763, 462,