Commit d12b6f4a authored by Francis Dupont's avatar Francis Dupont

[master] Finished merge of trac5061 (database port and Cassandra fixes)

parents 9d3c7922 e7fcce77
1219. [func] marcin
1220. [func] parisioa, fdupont, tomek
DHCPv4 and DHCPv6 parsers have updated to accept database port
parameter. The parameter for Cassandra is now called
"contact-points" (was "contact_points" previously).
(Trac #5061, git xxx)
1219. [func] marcin
Control Agent uses libkea-http to process commands over
the RESTful interface.
(Trac #5107, git 88ce715926a46b6b3832630116fc7782adc46c7b)
......
......@@ -13,6 +13,7 @@ nobase_dist_doc_DATA += examples/ddns/sample1.json
nobase_dist_doc_DATA += examples/ddns/template.json
nobase_dist_doc_DATA += examples/kea4/advanced.json
nobase_dist_doc_DATA += examples/kea4/backends.json
nobase_dist_doc_DATA += examples/kea4/cassandra.json
nobase_dist_doc_DATA += examples/kea4/classify.json
nobase_dist_doc_DATA += examples/kea4/dhcpv4-over-dhcpv6.json
nobase_dist_doc_DATA += examples/kea4/hooks.json
......@@ -26,6 +27,7 @@ nobase_dist_doc_DATA += examples/kea4/single-subnet.json
nobase_dist_doc_DATA += examples/kea4/with-ddns.json
nobase_dist_doc_DATA += examples/kea6/advanced.json
nobase_dist_doc_DATA += examples/kea6/backends.json
nobase_dist_doc_DATA += examples/kea6/cassandra.json
nobase_dist_doc_DATA += examples/kea6/classify.json
nobase_dist_doc_DATA += examples/kea6/dhcpv4-over-dhcpv6.json
nobase_dist_doc_DATA += examples/kea6/duid.json
......
......@@ -22,6 +22,7 @@
# dependencies or services running.
# "lease-database": {
# "type": "memfile",
# "persist": true,
# "lfc-interval": 3600
# },
......@@ -36,6 +37,7 @@
# "type": "mysql",
# "name": "keatest",
# "host": "localhost",
# "port": 3306,
# "user": "keatest",
# "password": "secret1",
# "connect-timeout": 3
......@@ -52,21 +54,24 @@
# "type": "pgsql",
# "name": "keatest",
# "host": "localhost",
# "port": 5432,
# "user": "keatest",
# "password": "secret1"
# "password": "secret1",
# "connect-timeout": 3
# },
# 4. CQL (Cassandra) backend. Leases will be stored in Cassandra database. Make
# sure it is up, running and properly initialized. See kea-admin documentation
# for details on how to initialize the database. The only strictly required
# parameters are type, keyspace and contact_points. At least one contact point
# parameters are type, keyspace and contact-points. At least one contact point
# must be specified, but more than one is required for redundancy. Make sure
# you specify the contact points without spaces. Kea must be compiled with
# --with-cql option to use this backend.
# "lease-database": {
# "type": "cql",
# "keyspace": "keatest",
# "contact_points": "192.0.2.1,192.0.2.2,192.0.2.3"
# "contact-points": "192.0.2.1,192.0.2.2,192.0.2.3",
# "port": 9042
# },
# Addresses will be assigned with a lifetime of 4000 seconds.
......
// This is an example configuration file for the DHCPv4 server in Kea.
// It is a basic scenario with one IPv4 subnet configured. It demonstrates
// how to configure Kea to use CQL (Cassandra) backend
{ "Dhcp4":
{
// Kea is told to listen on ethX interface only.
"interfaces-config": {
"interfaces": [ "ethX" ]
},
// 4. CQL (Cassandra) backend. Leases will be stored in Cassandra database. Make
// sure it is up, running and properly initialized. See kea-admin documentation
// for details on how to initialize the database. The only strictly required
// parameters are type, keyspace and contact-points. At least one contact point
// must be specified, but more than one is required for redundancy. Make sure
// you specify the contact points without spaces. Kea must be compiled with
// --with-cql option to use this backend.
"lease-database": {
"type": "cql",
"keyspace": "keatest",
"contact-points": "192.0.2.1,192.0.2.2,192.0.2.3",
"port": 9042
},
// Addresses will be assigned with a lifetime of 4000 seconds.
"valid-lifetime": 4000,
// Renew and rebind timers are commented out. This implies that options
// 58 and 59 will not be sent to the client. In this case it is up to
// the client to pick the timer values according to RFC2131. Uncomment the
// timers to send these options to the client.
// "renew-timer": 1000,
// "rebind-timer": 2000,
// The following list defines subnets. We have only one subnet
// here. We tell Kea that it is directly available over local interface.
"subnet4": [
{
"pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ],
"subnet": "192.0.2.0/24",
"interface": "ethX"
}
]
},
// The following configures logging. It assumes that messages with at least
// informational level (info, warn, error and fatal) should be logged to stdout.
"Logging": {
"loggers": [
{
"name": "kea-dhcp4",
"output_options": [
{
"output": "stdout"
}
],
"severity": "INFO"
}
]
}
}
......@@ -58,7 +58,8 @@
"name": "kea",
"user": "kea",
"password": "kea",
"host": "localhost"
"host": "localhost",
"port": 3306
},
# Define a subnet with a single pool of dynamic addresses. Addresses from
......
......@@ -21,7 +21,9 @@
# This is the easiest backend to use as it does not require any extra
# dependencies or services running.
"lease-database": {
"type": "memfile"
"type": "memfile",
"persist": true,
"lfc-interval": 3600
},
# 2. MySQL backend. Leases will be stored in MySQL database. Make sure it
......@@ -35,6 +37,7 @@
# "type": "mysql",
# "name": "keatest",
# "host": "localhost",
# "port": 3306,
# "user": "keatest",
# "password": "secret1",
# "connect-timeout": 3
......@@ -51,21 +54,24 @@
# "type": "pgsql",
# "name": "keatest",
# "host": "localhost",
# "port": 5432,
# "user": "keatest",
# "password": "secret1"
# "password": "secret1",
# "connect-timeout": 3
# },
# 4. CQL (Cassandra) backend. Leases will be stored in Cassandra database. Make
# sure it is up, running and properly initialized. See kea-admin documentation
# for details on how to initialize the database. The only strictly required
# parameters are type, keyspace and contact_points. At least one contact point
# parameters are type, keyspace and contact-points. At least one contact point
# must be specified, but more than one is required for redundancy. Make sure
# you specify the contact points without spaces. Kea must be compiled with
# --with-cql option to use this backend.
# "lease-database": {
# "type": "cql",
# "keyspace": "keatest",
# "contact_points": "192.0.2.1,192.0.2.2,192.0.2.3"
# "contact-points": "192.0.2.1,192.0.2.2,192.0.2.3",
# "port": 9042
# },
# Addresses will be assigned with preferred and valid lifetimes
......
// This is an example configuration file for the DHCPv6 server in Kea.
// It is a basic scenario with one IPv6 subnet configured. It demonstrates
// how to configure Kea to use CQL (Cassandra) backend.
{ "Dhcp6":
{
// Kea is told to listen on ethX interface only.
"interfaces-config": {
"interfaces": [ "ethX" ]
},
// CQL (Cassandra) backend. Leases will be stored in Cassandra database. Make
// sure it is up, running and properly initialized. See kea-admin documentation
// for details on how to initialize the database. The only strictly required
// parameters are type, keyspace and contact-points. At least one contact point
// must be specified, but more than one is required for redundancy. Make sure
// you specify the contact points without spaces. Kea must be compiled with
// --with-cql option to use this backend.
"lease-database": {
"type": "cql",
"keyspace": "keatest",
"contact-points": "192.0.2.1,192.0.2.2,192.0.2.3",
"port": 9042
},
// Addresses will be assigned with preferred and valid lifetimes
// being 3000 and 4000, respectively. Client is told to start
// renewing after 1000 seconds. If the server does not respond
// after 2000 seconds since the lease was granted, client is supposed
// to start REBIND procedure (emergency renewal that allows switching
// to a different server).
"preferred-lifetime": 3000,
"valid-lifetime": 4000,
"renew-timer": 1000,
"rebind-timer": 2000,
// The following list defines subnets. Each subnet consists of at
// least subnet and pool entries.
"subnet6": [
{
"pools": [ { "pool": "2001:db8:1::/80" } ],
"subnet": "2001:db8:1::/64",
"interface": "ethX"
}
]
},
// The following configures logging. It assumes that messages with at least
// informational level (info, warn, error and fatal) should be logged to stdout.
"Logging": {
"loggers": [
{
"name": "kea-dhcp6",
"output_options": [
{
"output": "stdout"
}
],
"debuglevel": 0,
"severity": "INFO"
}
]
}
}
......@@ -47,6 +47,7 @@
"user": "kea",
"password": "kea",
"host": "localhost",
"port": 3306,
"readonly": true
},
......
......@@ -459,6 +459,11 @@ be followed by a comma and another object definition.</para>
the DHCPv4 server. In this case, set the value to the empty string:
<screen>
"Dhcp4": { "lease-database": { <userinput>"host" : ""</userinput>, ... }, ... }
</screen>
Should the database use a port different than default, it may be
specified as well:
<screen>
"Dhcp4": { "lease-database": { <userinput>"port" : 12345</userinput>, ... }, ... }
</screen>
Should the database be located on a different system, you may need to specify a longer interval
for the connection timeout:
......@@ -468,6 +473,17 @@ be followed by a comma and another object definition.</para>
The default value of five seconds should be more than adequate for local connections.
If a timeout is given though, it should be an integer greater than zero.
</para>
<para>
Note that host parameter is used by MySQL and PostgreSQL
backends. Cassandra has a concept of contact points that could be
used to contact the cluster, instead of a single IP or
hostname. It takes a list of comma separated IP addresses. This may be specified as:
<screen>
"Dhcp4": { "lease-database": { <userinput>"contact-points" : "192.0.2.1,192.0.2.2"</userinput>, ... }, ... }
</screen>
</para>
<para>Finally, the credentials of the account under which the server will
access the database should be set:
<screen>
......@@ -527,6 +543,12 @@ If a timeout is given though, it should be an integer greater than zero.
<screen>
"Dhcp4": { "hosts-database": { <userinput>"host" : ""</userinput>, ... }, ... }
</screen>
Should the database use a port different than default, it may be
specified as well:
<screen>
"Dhcp4": { "hosts-database": { <userinput>"port" : 12345</userinput>, ... }, ... }
</screen>
</para>
<para>Finally, the credentials of the account under which the server will
access the database should be set:
......
......@@ -454,6 +454,11 @@ be followed by a comma and another object definition.</para>
the DHCPv6 server. In this case, set the value to the empty string:
<screen>
"Dhcp6": { "lease-database": { <userinput>"host" : ""</userinput>, ... }, ... }
</screen>
Should the database use a port different than default, it may be
specified as well:
<screen>
"Dhcp4": { "lease-database": { <userinput>"port" : 12345</userinput>, ... }, ... }
</screen>
Should the database be located on a different system, you may need to specify a longer interval
for the connection timeout:
......@@ -463,6 +468,17 @@ be followed by a comma and another object definition.</para>
The default value of five seconds should be more than adequate for local connections.
If a timeout is given though, it should be an integer greater than zero.
</para>
<para>
Note that host parameter is used by MySQL and PostgreSQL
backends. Cassandra has a concept of contact points that could be
used to contact the cluster, instead of a single IP or
hostname. It takes a list of comma separated IP addresses. This may be specified as:
<screen>
"Dhcp4": { "lease-database": { <userinput>"contact-points" : "192.0.2.1,192.0.2.2"</userinput>, ... }, ... }
</screen>
</para>
<para>Finally, the credentials of the account under which the server will
access the database should be set:
<screen>
......@@ -521,6 +537,9 @@ If a timeout is given though, it should be an integer greater than zero.
the DHCPv6 server. In this case, set the value to the empty string:
<screen>
"Dhcp6": { "hosts-database": { <userinput>"host" : ""</userinput>, ... }, ... }
</screen>
<screen>
"Dhcp4": { "hosts-database": { <userinput>"port" : 12345</userinput>, ... }, ... }
</screen>
</para>
<para>Finally, the credentials of the account under which the server will
......
......@@ -524,8 +524,8 @@ static void yynoreturn yy_fatal_error ( const char* msg );
/* %% [3.0] code to copy yytext_ptr to parser4_text[] 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 141
#define YY_END_OF_BUFFER 142
#define YY_NUM_RULES 144
#define YY_END_OF_BUFFER 145
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
......@@ -533,135 +533,138 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
static const flex_int16_t yy_accept[1161] =
static const flex_int16_t yy_accept[1184] =
{ 0,
134, 134, 0, 0, 0, 0, 0, 0, 0, 0,
142, 140, 10, 11, 140, 1, 134, 131, 134, 134,
140, 133, 132, 140, 140, 140, 140, 140, 127, 128,
140, 140, 140, 129, 130, 5, 5, 5, 140, 140,
140, 10, 11, 0, 0, 123, 0, 0, 0, 0,
137, 137, 0, 0, 0, 0, 0, 0, 0, 0,
145, 143, 10, 11, 143, 1, 137, 134, 137, 137,
143, 136, 135, 143, 143, 143, 143, 143, 130, 131,
143, 143, 143, 132, 133, 5, 5, 5, 143, 143,
143, 10, 11, 0, 0, 126, 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, 134, 134,
0, 133, 134, 3, 2, 6, 0, 134, 0, 0,
0, 0, 0, 0, 4, 0, 0, 9, 0, 124,
0, 0, 0, 0, 0, 0, 0, 0, 1, 137,
137, 0, 136, 137, 3, 2, 6, 0, 137, 0,
0, 0, 0, 0, 0, 4, 0, 0, 9, 0,
127, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 129, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 126, 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, 2, 0,
0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
0, 0, 0, 0, 8, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 125, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
128, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 47, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 50, 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,
139, 137, 0, 136, 135, 0, 0, 0, 0, 0,
0, 0, 0, 0, 105, 0, 104, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 25, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 142, 140, 0, 139, 138, 0,
0, 0, 0, 0, 0, 0, 0, 0, 108, 0,
107, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 25, 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, 15, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 16, 0, 0, 0, 138,
135, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106, 0, 0, 108, 0, 0, 0, 0, 0, 0,
0, 0, 50, 0, 0, 0, 40, 0, 0, 0,
0, 62, 0, 0, 0, 0, 0, 0, 0, 0,
28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 39, 0, 0, 0,
0, 0, 0, 0, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 15, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 16, 0, 0, 0, 141, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 109, 0, 0, 111,
0, 0, 0, 0, 0, 0, 0, 0, 53, 0,
0, 0, 0, 43, 0, 0, 0, 0, 65, 0,
0, 0, 0, 0, 0, 0, 0, 28, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 42, 0, 0, 0, 0, 0,
0, 0, 0, 0, 45, 0, 29, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 60, 21, 0, 26, 0,
0, 0, 0, 0, 0, 0, 12, 113, 0, 110,
0, 109, 0, 0, 0, 0, 71, 0, 0, 0,
0, 0, 0, 0, 63, 21, 0, 26, 0, 0,
0, 0, 0, 0, 0, 12, 116, 0, 113, 0,
112, 0, 0, 0, 0, 74, 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,
23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41, 0, 0, 0, 0, 0, 0, 0, 72, 0,
0, 0, 0, 0, 0, 0, 67, 0, 0, 0,
0, 7, 0, 0, 111, 0, 0, 0, 0, 0,
0, 23, 0, 0, 0, 0, 0, 0, 0, 0,
0, 44, 0, 0, 0, 0, 0, 0, 0, 75,
0, 0, 0, 0, 0, 0, 0, 70, 0, 0,
0, 0, 7, 0, 0, 114, 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, 55, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 44, 0,
0, 0, 0, 0, 0, 0, 52, 0, 0, 0,
0, 58, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 47, 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, 76,
53, 0, 0, 0, 22, 0, 0, 0, 0, 0,
0, 0, 0, 29, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 36, 0, 0, 0, 0, 0, 114, 0,
0, 0, 0, 0, 79, 56, 0, 0, 0, 22,
0, 0, 0, 0, 0, 0, 0, 0, 30, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 39, 0, 0,
0, 0, 0, 117, 0, 0, 0, 0, 0, 0,
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, 27, 0, 0, 0, 20, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 57, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 64, 0, 0, 0, 0, 0, 88,
69, 0, 0, 0, 0, 33, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 27,
0, 0, 0, 20, 0, 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, 45, 0, 0, 0, 0, 0, 0,
67, 0, 0, 0, 0, 0, 0, 91, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 48, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
93, 0, 0, 91, 0, 0, 0, 0, 0, 0,
0, 117, 0, 0, 0, 0, 0, 65, 0, 0,
0, 68, 56, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 63, 0, 17, 0,
73, 0, 0, 0, 0, 0, 97, 0, 0, 0,
37, 0, 0, 0, 75, 24, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 96, 0,
0, 94, 0, 0, 0, 0, 0, 0, 0, 120,
0, 0, 0, 0, 0, 68, 0, 0, 0, 0,
71, 59, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 66, 0, 17, 0, 76,
0, 0, 0, 0, 0, 100, 0, 0, 0, 40,
0, 0, 0, 78, 24, 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, 70, 0, 0, 0,
0, 0, 0, 0, 0, 0, 73, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 120, 38, 0, 0, 0, 0, 0, 0,
0, 0, 33, 0, 0, 0, 94, 0, 92, 87,
86, 0, 0, 0, 0, 0, 107, 0, 0, 0,
59, 0, 0, 0, 0, 0, 84, 0, 0, 0,
0, 0, 0, 0, 0, 0, 46, 0, 0, 30,
0, 0, 0, 0, 96, 0, 0, 0, 0, 48,
34, 0, 69, 0, 0, 61, 0, 0, 43, 0,
115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 123, 41, 0, 0, 0, 0, 0, 0,
0, 0, 36, 0, 0, 0, 97, 0, 95, 90,
89, 0, 0, 0, 0, 0, 110, 0, 0, 0,
62, 0, 0, 0, 0, 0, 0, 87, 0, 0,
0, 0, 0, 0, 0, 0, 0, 49, 0, 0,
31, 0, 0, 0, 0, 99, 0, 0, 0, 0,
51, 37, 0, 72, 0, 0, 64, 0, 0, 46,
0, 118, 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,
122, 58, 0, 85, 0, 0, 118, 89, 0, 0,
0, 0, 0, 0, 19, 0, 18, 0, 95, 0,
0, 54, 0, 0, 0, 0, 0, 0, 0, 0,
32, 0, 0, 0, 0, 31, 0, 0, 0, 0,
0, 0, 74, 0, 0, 119, 0, 0, 0, 0,
0, 0, 0, 0, 121, 0, 116, 112, 0, 0,
0, 14, 0, 0, 103, 0, 0, 0, 0, 82,
0, 0, 0, 0, 0, 49, 0, 0, 0, 0,
0, 0, 0, 0, 13, 0, 0, 0, 90, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 81,
0, 100, 0, 0, 0, 99, 98, 0, 0, 0,
80, 0, 0, 0, 102, 0, 0, 0, 0, 0,
0, 0, 125, 61, 0, 34, 88, 0, 0, 121,
92, 0, 0, 0, 0, 0, 0, 19, 0, 18,
0, 98, 0, 0, 57, 0, 0, 0, 0, 0,
0, 0, 0, 35, 0, 0, 0, 0, 32, 0,
0, 0, 0, 0, 0, 77, 0, 0, 122, 0,
0, 0, 0, 0, 0, 0, 0, 124, 0, 119,
115, 0