1593. [bug] marcin
Fixed a bug in the Kea Control Agent which caused a sporadic crash
- after a tiemout while sending the HTTP response to the controlling
+ after a timeout while sending the HTTP response to the controlling
client.
(Gitlab #491,!363, git ff204dfe4dd80702f8bb2edf83f8486e019a7e04)
--template '{file}:{line}: check_fail: {message} ({severity},{id})' \
src
-# this is a shortcut that builds only documentation dependecies and documentation itself
+# this is a shortcut that builds only documentation dependencies and documentation itself
docs:
$(MAKE) -C doc/sphinx
AC_MSG_RESULT(no))
usable_regex=
-AC_MSG_CHECKING(for usuable C++11 regex)
+AC_MSG_CHECKING(for usable C++11 regex)
AC_TRY_RUN([
#include <regex>
#include <iostream>
# Older log4cplus versions (1.2.0) don't have the initializer.h header that
# would allow explicit initialization. Newer versions (2.0.4 for sure, possibly
# older as well) have it and it's recommended to use it. We detect whether
-# it's present or not and do explicit initalization if possible.
+# it's present or not and do explicit initialization if possible.
CPPFLAGS_SAVED=$CPPFLAGS
CPPFLAGS="$LOG4CPLUS_INCLUDES $CPPFLAGS"
LIBS_SAVED="$LIBS"
};
@endcode
-DHCPv6 Factory implemenation:
+DHCPv6 Factory implementation:
@code
const std::string QUEUE_TYPE = "Your-Q6";
// By default, Kea ignores requests by clients for unknown IP addresses,
// because other non-cooperating DHCP servers could reside on the same
// network (RFC 2131). This parameter is defined globally, but can be
- // overriden on a subnet level
+ // overridden on a subnet level
"authoritative": false,
// The following list defines subnets. Each subnet consists of at
"match-client-id": false,
// Global value of the next server address set in 'siaddr' field.
- // The global value may be overriden in lower level configuration
+ // The global value may be overridden in lower level configuration
// scopes.
"next-server": "192.0.2.123",
"match-client-id": false,
// Global value of the next server address set in 'siaddr' field.
- // The global value may be overriden in lower level configuration
+ // The global value may be overridden in lower level configuration
// scopes.
"next-server": "192.0.2.123",
},
// A single encapsulating space can be used. An option containing any
- // option from said space will now be unpacked succesfully by Kea.
+ // option from said space will now be unpacked successfully by Kea.
{
"array": false,
"code": 232,
// This is an example configuration of the Kea DHCPv4 server. It uses High
// Availability hooks library and Lease Commands hooks library to enable
-// High Availibility function for the DHCP server. Note that almost exactly
+// High Availability function for the DHCP server. Note that almost exactly
// the same configuration must be used on the second server (partner).
// The only difference is that "this-server-name" must be set to "server2"
// on this other server. Also, the interface configuration depends on the
// By default, Kea ignores requests by clients for unknown IP addresses,
// because other non-cooperating DHCP servers could reside on the same
// network (RFC 2131). This parameter is defined globally, but can be
- // overriden on a subnet level
+ // overridden on a subnet level
"authoritative": false,
// The following list defines subnets. Each subnet consists of at
},
// A single encapsulating space can be used. An option containing any
- // option from said space will now be unpacked succesfully by Kea.
+ // option from said space will now be unpacked successfully by Kea.
{
"array": false,
"code": 12321,
// This is an example configuration of the Kea DHCPv6 server. It uses High
// Availability hooks library and Lease Commands hooks library to enable
-// High Availibility function for the DHCP server. Note that almost exactly
+// High Availability function for the DHCP server. Note that almost exactly
// the same configuration must be used on the second server (partner).
// The only difference is that "this-server-name" must be set to "server1"
// on this other server. Also, the interface configuration depends on the
::
- cqslh -k keyspace-name -f path-to-kea/share/kea/scripts/cql/dhcpdb_create.cql
+ cqlsh -k keyspace-name -f path-to-kea/share/kea/scripts/cql/dhcpdb_create.cql
(path-to-kea is the location where Kea is installed.)
- ``backup`` - normal operation of the backup server. In this state it
receives lease updates from the active servers.
-- ``comunication-recovery`` - an active server running in load-balancing
+- ``communication-recovery`` - an active server running in load-balancing
mode may transition to this state when it experiences communication
issues with a partner server over the control channel. This is an
intermediate state between the ``load-balancing`` and ``partner-down``
The ha-reset Command
--------------------
-This command causes the server to reset its High Availibility state machine
+This command causes the server to reset its High Availability state machine
by transitioning it to the waiting state. A partner in the
``communication-recovery`` state may send this command to cause the server
to synchronize its lease database. The database synchronization is required
entity classify--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="115" x="639.5" y="448.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="95" x="649.5" y="471.7344">Classify query</text><!--MD5=[92aee3b8b080bbd52e01e7cb395370c4]
entity pkt4_receive--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="159" x="454.5" y="545.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="139" x="464.5" y="568.7344">Callout pkt4_receive</text><path d="M648.5,550.6992 L648.5,559.1992 L613.59,563.1992 L648.5,567.1992 L648.5,576.0098 A0,0 0 0 0 648.5,576.0098 L701.5,576.0098 A0,0 0 0 0 701.5,576.0098 L701.5,560.6992 L691.5,550.6992 L648.5,550.6992 A0,0 0 0 0 648.5,550.6992 " fill="#FBFB77" filter="url(#f1u1c8b25aigi3)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M691.5,550.6992 L691.5,560.6992 L701.5,560.6992 L691.5,550.6992 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="32" x="654.5" y="568.2676">hook</text><!--MD5=[7aeeef4718a003ce2e7ad9bcbdf71ad9]
entity drop_class--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="141" x="243.5" y="658.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="121" x="253.5" y="681.7344">Check DROP class</text><!--MD5=[a52533196b9ad0f42d77bd2c5acf5304]
-entity same_client--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="333" x="147.5" y="755.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="313" x="157.5" y="778.7344">Avoid same client race in multi-threade mode</text><path d="M587.5,760.6992 L587.5,769.1992 L480.63,773.1992 L587.5,777.1992 L587.5,786.0098 A0,0 0 0 0 587.5,786.0098 L790.5,786.0098 A0,0 0 0 0 790.5,786.0098 L790.5,770.6992 L780.5,760.6992 L587.5,760.6992 A0,0 0 0 0 587.5,760.6992 " fill="#FBFB77" filter="url(#f1u1c8b25aigi3)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M780.5,760.6992 L780.5,770.6992 L790.5,770.6992 L780.5,760.6992 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="182" x="593.5" y="778.2676">postpone processing or drop</text><!--MD5=[a8af8e48f2cc558a0fee70431885f908]
+entity same_client--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="333" x="147.5" y="755.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="313" x="157.5" y="778.7344">Avoid same client race in multi-threaded mode</text><path d="M587.5,760.6992 L587.5,769.1992 L480.63,773.1992 L587.5,777.1992 L587.5,786.0098 A0,0 0 0 0 587.5,786.0098 L790.5,786.0098 A0,0 0 0 0 790.5,786.0098 L790.5,770.6992 L780.5,760.6992 L587.5,760.6992 A0,0 0 0 0 587.5,760.6992 " fill="#FBFB77" filter="url(#f1u1c8b25aigi3)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M780.5,760.6992 L780.5,770.6992 L790.5,770.6992 L780.5,760.6992 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="182" x="593.5" y="778.2676">postpone processing or drop</text><!--MD5=[a8af8e48f2cc558a0fee70431885f908]
entity lease4_committed--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="197" x="1045.5" y="1098.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="177" x="1055.5" y="1121.7344">Callout lease4_committed</text><path d="M1277.5,1103.6992 L1277.5,1112.1992 L1242.75,1116.1992 L1277.5,1120.1992 L1277.5,1129.0098 A0,0 0 0 0 1277.5,1129.0098 L1330.5,1129.0098 A0,0 0 0 0 1330.5,1129.0098 L1330.5,1113.6992 L1320.5,1103.6992 L1277.5,1103.6992 A0,0 0 0 0 1277.5,1103.6992 " fill="#FBFB77" filter="url(#f1u1c8b25aigi3)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1320.5,1103.6992 L1320.5,1113.6992 L1330.5,1113.6992 L1320.5,1103.6992 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="32" x="1283.5" y="1121.2676">hook</text><!--MD5=[8e18f13991ca58e5a79e0b81ed56b9db]
entity park--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="50" x="1119" y="1211.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="30" x="1129" y="1234.7344">Park</text><!--MD5=[145fde1089ff11319f35031b66a8b2bf]
entity pkt4_send--><rect fill="#FEFECE" filter="url(#f1u1c8b25aigi3)" height="36.4883" style="stroke: #A80036; stroke-width: 1.5;" width="144" x="943" y="1324.1992"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="124" x="953" y="1347.7344">Callout pkt4_send</text><!--MD5=[62d5b04920c444814fafa1dbf06b35cd]
agent "Check DROP class" as drop_class
-agent "Avoid same client race in multi-threade mode" as same_client
+agent "Avoid same client race in multi-threaded mode" as same_client
note right : postpone processing or drop
rectangle "Process Query on its Message Type" as process {
agent "Check DROP class" as drop_class
-agent "Avoid same client race in multi-threade mode" as same_client
+agent "Avoid same client race in multi-threaded mode" as same_client
note right : postpone processing or drop
rectangle "Process Query on its Message Type" as process {
link findClientLease to addressReserved--><path d="M1490.37,64.2992 C1540.43,84.5092 1623.49,118.0392 1675.64,139.0792 " fill="none" id="findClientLease->addressReserved" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1680.59,141.0792,1673.7456,133.9973,1675.9546,139.205,1670.7468,141.414,1680.59,141.0792" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="178" x="1602" y="107.7676">has requested address (hint)</text><!--MD5=[3ed98210a29f20764b03cb44cfd671eb]
link findClientLease to hasAddressReservation--><path d="M1405.79,64.2992 C1355.91,84.5092 1273.15,118.0392 1221.19,139.0792 " fill="none" id="findClientLease->hasAddressReservation" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1216.26,141.0792,1226.1032,141.414,1220.8954,139.205,1223.1044,133.9973,1216.26,141.0792" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="172" x="1328" y="107.7676">no requested address (hint)</text><!--MD5=[0f8169b991248aaf1e86d3e126ee7fc7]
link addressReserved to check_hint--><path d="M1706.14,177.5692 C1690.855,193.3142 1667.81,217.0567 1648.3475,237.1092 C1645.9147,239.6158 1643.5379,242.0647 1641.2391,244.4331 C1640.0898,245.6173 1638.96,246.7814 1637.8525,247.9225 " fill="none" id="addressReserved->check_hint" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1637.8525,247.9225,1646.991,244.2501,1641.3348,244.3346,1641.2503,238.6783,1637.8525,247.9225" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="162" x="1675" y="220.7676">no conflicting reservation</text><!--MD5=[afeb447a9f6636bece5d73dd5d09cefa]
-link addressReserved to no_lease--><path d="M1831.12,176.2492 C1928.35,193.8192 2056,226.1192 2056,274.5592 C2056,274.5592 2056,274.5592 2056,2110.8592 C2056,2245.5392 1894.72,2159.4592 1764,2191.8592 C1729.14,2200.4992 1639.9,2219.7792 1576.62,2233.2992 " fill="none" id="addressReserved->no_lease" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1571.73,2234.3392,1581.3655,2236.3781,1576.6205,2233.2984,1579.7002,2228.5534,1571.73,2234.3392" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="225" x="2057" y="1213.0676">revervation owned by another client</text><!--MD5=[961d5a31619e7d456669487d013a1899]
+link addressReserved to no_lease--><path d="M1831.12,176.2492 C1928.35,193.8192 2056,226.1192 2056,274.5592 C2056,274.5592 2056,274.5592 2056,2110.8592 C2056,2245.5392 1894.72,2159.4592 1764,2191.8592 C1729.14,2200.4992 1639.9,2219.7792 1576.62,2233.2992 " fill="none" id="addressReserved->no_lease" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1571.73,2234.3392,1581.3655,2236.3781,1576.6205,2233.2984,1579.7002,2228.5534,1571.73,2234.3392" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="225" x="2057" y="1213.0676">reservation owned by another client</text><!--MD5=[961d5a31619e7d456669487d013a1899]
link hasAddressReservation to update_hint--><path d="M1236.29,159.1992 C1276.08,159.1992 1328.68,159.1992 1374.83,159.1992 " fill="none" id="hasAddressReservation->update_hint" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1379.85,159.1992,1370.85,155.1992,1374.85,159.1992,1370.85,163.1992,1379.85,159.1992" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="107" x="1254.5" y="152.7676">has a reservation</text><!--MD5=[05586e2e35799af932c772159165fde5]
link update_hint to check_hint--><path d="M1480.56,177.2992 C1481.87,191.3892 1485.77,211.1092 1497,224.1992 C1501.4688,229.4105 1506.5789,234.1017 1512.105,238.322 C1514.868,240.4322 1517.735,242.4246 1520.6778,244.3054 C1522.1492,245.2458 1523.6395,246.1583 1525.1453,247.0437 C1525.5217,247.2651 1525.8991,247.4847 1526.2774,247.7027 C1526.4666,247.8117 1526.656,247.9202 1526.8456,248.0284 " fill="none" id="update_hint->check_hint" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1526.8456,248.0284,1521.0095,240.0949,1522.5024,245.5512,1517.046,247.044,1526.8456,248.0284" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="157" x="1498" y="220.7676">request reserved address</text><!--MD5=[f5740591afdec92972eb12364704fbda]
link hasAddressReservation to check_done--><path d="M1111.78,160.2292 C968.42,161.9792 627,176.4492 627,274.5592 C627,274.5592 627,274.5592 627,585.9192 C627,614.8842 626.03,647.4017 625.045,672.958 C624.7987,679.347 624.5516,685.301 624.3184,690.6556 C624.3038,690.9903 624.2893,691.3226 624.2748,691.6526 " fill="none" id="hasAddressReservation->check_done" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="624.2748,691.6526,628.6651,682.8364,624.4938,686.6574,620.6728,682.486,624.2748,691.6526" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="90" x="628" y="418.4876">no reservation</text><!--MD5=[05b1cca34cf1798b13fb9b06f5ca5f3a]
findClientLease - -> addressReserved : has requested address (hint)
findClientLease - -> hasAddressReservation : no requested address (hint)
addressReserved - -> check_hint : no conflicting reservation
-addressReserved - -> no_lease : revervation owned by another client
+addressReserved - -> no_lease : reservation owned by another client
hasAddressReservation -> update_hint : has a reservation
update_hint - -> check_hint : request reserved address
hasAddressReservation - -> check_done : no reservation
findClientLease --> addressReserved : has requested address (hint)
findClientLease --> hasAddressReservation : no requested address (hint)
addressReserved --> check_hint : no conflicting reservation
-addressReserved --> no_lease : revervation owned by another client
+addressReserved --> no_lease : reservation owned by another client
hasAddressReservation -> update_hint : has a reservation
update_hint --> check_hint : request reserved address
hasAddressReservation --> check_done : no reservation
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="2560px" preserveAspectRatio="none" style="width:1579px;height:2560px;" version="1.1" viewBox="0 0 1579 2560" width="1579px" zoomAndPan="magnify"><defs><filter height="300%" id="f1aicqcofdeklm" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="316" x="630.5" y="27.4023">requestLease4 algorithm (Kea 1.8.0)</text><ellipse cx="631.3125" cy="41.1992" fill="#000000" filter="url(#f1aicqcofdeklm)" rx="10" ry="10" style="stroke: none; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="148" x="557.3125" y="71.1992"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="128" x="567.3125" y="92.8008">get lease for the client</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="584.8125,125.332,677.8125,125.332,689.8125,137.332,677.8125,149.332,584.8125,149.332,572.8125,137.332,584.8125,125.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="584.8125" y="141.4893">reserved address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="554.8125" y="135.0117">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="689.8125" y="135.0117">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="229,159.332,329,159.332,341,171.332,329,183.332,229,183.332,217,171.332,229,159.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="229" y="175.4893">requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="203" y="169.0117">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="341" y="169.0117">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="250" x="11" y="193.332"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="230" x="21" y="214.9336">requested address = reserved address</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="368.5" y="241.8096"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="378.5" y="263.4111">return no lease</text><ellipse cx="422" cy="321.9424" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="422" cy="321.9424" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="293,193.332,551,193.332,563,205.332,551,217.332,293,217.332,281,205.332,293,193.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="426" y="227.9668">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="258" x="293" y="209.4893">requested address is reserved for another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="563" y="203.0117">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,363.4199,291,375.4199,279,387.4199,267,375.4199,279,363.4199" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="225.5" y="519.375"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="235.5" y="540.9766">return no lease</text><ellipse cx="279" cy="599.5078" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="279" cy="599.5078" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="186.5,470.8975,371.5,470.8975,383.5,482.8975,371.5,494.8975,186.5,494.8975,174.5,482.8975,186.5,470.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="505.5322">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="186.5" y="487.0547">active and owned by another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="383.5" y="480.5771">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="204.5,422.4199,353.5,422.4199,365.5,434.4199,353.5,446.4199,204.5,446.4199,192.5,434.4199,204.5,422.4199" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="457.0547">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="204.5" y="438.5771">lease for requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="365.5" y="432.0996">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,665.4629,291,677.4629,279,689.4629,267,677.4629,279,665.4629" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="225.5" y="869.8955"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="235.5" y="891.4971">return no lease</text><ellipse cx="279" cy="950.0283" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="279" cy="950.0283" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="263.5,821.418,294.5,821.418,306.5,833.418,294.5,845.418,263.5,845.418,251.5,833.418,263.5,821.418" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="856.0527">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="31" x="263.5" y="837.5752">active</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="306.5" y="831.0977">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="204.5,772.9404,353.5,772.9404,365.5,784.9404,353.5,796.9404,204.5,796.9404,192.5,784.9404,204.5,772.9404" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="807.5752">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="204.5" y="789.0977">lease for requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="365.5" y="782.6201">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,1015.9834,291,1027.9834,279,1039.9834,267,1027.9834,279,1015.9834" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="225.5" y="1123.4609"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="235.5" y="1145.0625">return no lease</text><ellipse cx="279" cy="1197.6045" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="279" cy="1197.6045" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="187.5,1074.9834,370.5,1074.9834,382.5,1086.9834,370.5,1098.9834,187.5,1098.9834,175.5,1086.9834,187.5,1074.9834" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="283" y="1109.6182">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="183" x="187.5" y="1091.1406">requested address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="382.5" y="1084.6631">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="170.5,724.4629,387.5,724.4629,399.5,736.4629,387.5,748.4629,170.5,748.4629,158.5,736.4629,170.5,724.4629" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="283" y="759.0977">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="217" x="170.5" y="740.6201">requested address == reserved address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="399.5" y="734.1426">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,1259.082,291,1271.082,279,1283.082,267,1271.082,279,1259.082" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="933.625,159.332,1033.625,159.332,1045.625,171.332,1033.625,183.332,933.625,183.332,921.625,171.332,933.625,159.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="933.625" y="175.4893">requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="903.625" y="169.0117">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1045.625" y="169.0117">no</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="702.5" y="241.8096"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="712.5" y="263.4111">return no lease</text><ellipse cx="756" cy="321.9424" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="756" cy="321.9424" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="627,193.332,885,193.332,897,205.332,885,217.332,627,217.332,615,205.332,627,193.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="760" y="227.9668">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="258" x="627" y="209.4893">requested address is reserved for another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="897" y="203.0117">no</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="702.5" y="489.375"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="712.5" y="510.9766">return no lease</text><ellipse cx="756" cy="569.5078" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="756" cy="569.5078" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="663.5,440.8975,848.5,440.8975,860.5,452.8975,848.5,464.8975,663.5,464.8975,651.5,452.8975,663.5,440.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="760" y="475.5322">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="663.5" y="457.0547">active and owned by another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="860.5" y="450.5771">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="681.5,392.4199,830.5,392.4199,842.5,404.4199,830.5,416.4199,681.5,416.4199,669.5,404.4199,681.5,392.4199" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="760" y="427.0547">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="681.5" y="408.5771">lease for requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="842.5" y="402.0996">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="756,635.4629,768,647.4629,756,659.4629,744,647.4629,756,635.4629" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="702.5" y="742.9404"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="712.5" y="764.542">return no lease</text><ellipse cx="756" cy="823.0732" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="756" cy="823.0732" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="664.5,694.4629,847.5,694.4629,859.5,706.4629,847.5,718.4629,664.5,718.4629,652.5,706.4629,664.5,694.4629" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="760" y="729.0977">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="183" x="664.5" y="710.6201">requested address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="859.5" y="704.1426">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="1133.25" y="289.8096"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="136" x="1143.25" y="311.4111">pick candidate address</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1160.75,449.8975,1261.75,449.8975,1273.75,461.8975,1261.75,473.8975,1160.75,473.8975,1148.75,461.8975,1160.75,449.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="101" x="1160.75" y="466.0547">lease for candidate</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1134.75" y="459.5771">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1273.75" y="459.5771">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="182" x="993" y="483.8975"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="162" x="1003" y="505.499">create and return new lease</text><ellipse cx="1084" cy="564.0303" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1084" cy="564.0303" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="1266" y="532.375"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="1276" y="553.9766">reclaim expired lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="164" x="1256.5" y="601.5078"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="144" x="1266.5" y="623.1094">update lease information</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="138" x="1269.5" y="670.6406"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="118" x="1279.5" y="692.2422">callout lease4_select</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1302,739.7734,1375,739.7734,1387,751.7734,1375,763.7734,1302,763.7734,1290,751.7734,1302,739.7734" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="1302" y="755.9307">callout return</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="22" x="1268" y="749.4531">SKIP</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="57" x="1387" y="749.4531">CONTINUE</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="1215" y="773.7734"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="1225" y="795.375">return no lease</text><ellipse cx="1268.5" cy="853.9063" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1268.5" cy="853.9063" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="1361" y="773.7734"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="1371" y="795.375">update lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="133" x="1342" y="842.9063"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="113" x="1352" y="864.5078">return reused lease</text><ellipse cx="1408.5" cy="923.0391" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1408.5" cy="923.0391" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1318,483.8975,1359,483.8975,1371,495.8975,1359,507.8975,1318,507.8975,1306,495.8975,1318,483.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1342.5" y="518.5322">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="41" x="1318" y="500.0547">expired</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1371" y="493.5771">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1115.25,401.4199,1307.25,401.4199,1319.25,413.4199,1307.25,425.4199,1115.25,425.4199,1103.25,413.4199,1115.25,401.4199" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1215.25" y="436.0547">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="1115.25" y="417.5771">candidate is used by another thread</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1319.25" y="411.0996">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1211.25,1000.9941,1223.25,1012.9941,1211.25,1024.9941,1199.25,1012.9941,1211.25,1000.9941" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1106.25,352.9424,1316.25,352.9424,1328.25,364.9424,1316.25,376.9424,1106.25,376.9424,1094.25,364.9424,1106.25,352.9424" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1215.25" y="387.5771">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="210" x="1106.25" y="369.0996">candidate is reserved for another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1328.25" y="362.6221">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1211.25,1049.4717,1223.25,1061.4717,1211.25,1073.4717,1199.25,1061.4717,1211.25,1049.4717" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1129.75,241.8096,1292.75,241.8096,1304.75,253.8096,1292.75,265.8096,1129.75,265.8096,1117.75,253.8096,1129.75,241.8096" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="163" x="1129.75" y="257.9668">iterate over pools and subnect</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="132" x="1145.25" y="1132.4717"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="112" x="1155.25" y="1154.0732">maximum attempts</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="1157.75" y="1195.6152"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="1167.75" y="1217.2168">return no lease</text><ellipse cx="1211.25" cy="1271.2705" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1211.25" cy="1271.2705" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1090.75,193.332,1331.75,193.332,1343.75,205.332,1331.75,217.332,1090.75,217.332,1078.75,205.332,1090.75,193.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1215.25" y="227.9668">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="241" x="1090.75" y="209.4893">client lease and lease address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1343.75" y="203.0117">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="983.625,1311.082,995.625,1323.082,983.625,1335.082,971.625,1323.082,983.625,1311.082" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,1341.082,643.3125,1353.082,631.3125,1365.082,619.3125,1353.082,631.3125,1341.082" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="164" x="549.3125" y="1530.5146"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="144" x="559.3125" y="1552.1162">update lease information</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="558.8125" y="1633.125"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="568.8125" y="1654.7266">reclaim expired lease</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="585.8125,1584.6475,676.8125,1584.6475,688.8125,1596.6475,676.8125,1608.6475,585.8125,1608.6475,573.8125,1596.6475,585.8125,1584.6475" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1619.2822">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="91" x="585.8125" y="1600.8047">old lease expired</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="688.8125" y="1594.3271">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,1687.2578,643.3125,1699.2578,631.3125,1711.2578,619.3125,1699.2578,631.3125,1687.2578" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="140" x="561.3125" y="1731.2578"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="120" x="571.3125" y="1752.8594">callout lease4_renew</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="594.8125,1785.3906,667.8125,1785.3906,679.8125,1797.3906,667.8125,1809.3906,594.8125,1809.3906,582.8125,1797.3906,594.8125,1785.3906" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="594.8125" y="1801.5479">callout return</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="22" x="560.8125" y="1795.0703">SKIP</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="57" x="679.8125" y="1795.0703">CONTINUE</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="468.3125" y="1819.3906"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="478.3125" y="1840.9922">return old client lease</text><ellipse cx="540.8125" cy="1884.5234" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="540.8125" cy="1884.5234" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="674.3125" y="1819.3906"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="684.3125" y="1840.9922">update lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="177" x="633.3125" y="1873.5234"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="157" x="643.3125" y="1895.125">return renewed client lease</text><ellipse cx="721.8125" cy="1938.6563" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="721.8125" cy="1938.6563" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="470.8125,1482.0371,791.8125,1482.0371,803.8125,1494.0371,791.8125,1506.0371,470.8125,1506.0371,458.8125,1494.0371,470.8125,1482.0371" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1516.6719">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="321" x="470.8125" y="1498.1943">has reserved address or client lease address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="803.8125" y="1491.7168">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="449.3125,1433.5596,813.3125,1433.5596,825.3125,1445.5596,813.3125,1457.5596,449.3125,1457.5596,437.3125,1445.5596,449.3125,1433.5596" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1468.1943">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="364" x="449.3125" y="1449.7168">no requested address or requested address == client lease address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="825.3125" y="1443.2393">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,1991.6563,643.3125,2003.6563,631.3125,2015.6563,619.3125,2003.6563,631.3125,1991.6563" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="601.8125,1385.082,660.8125,1385.082,672.8125,1397.082,660.8125,1409.082,601.8125,1409.082,589.8125,1397.082,601.8125,1385.082" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1419.7168">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="59" x="601.8125" y="1401.2393">client lease</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="672.8125" y="1394.7617">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,2035.6563,643.3125,2047.6563,631.3125,2059.6563,619.3125,2047.6563,631.3125,2035.6563" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="206" x="528.3125" y="2079.6563"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="186" x="538.3125" y="2101.2578">get lease for requested address</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="589.3125,2133.7891,673.3125,2133.7891,685.3125,2145.7891,673.3125,2157.7891,589.3125,2157.7891,577.3125,2145.7891,589.3125,2133.7891" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="84" x="589.3125" y="2149.9463">requested lease</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="559.3125" y="2143.4688">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="685.3125" y="2143.4688">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="425.3125,2167.7891,466.3125,2167.7891,478.3125,2179.7891,466.3125,2191.7891,425.3125,2191.7891,413.3125,2179.7891,425.3125,2167.7891" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="41" x="425.3125" y="2183.9463">expired</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="399.3125" y="2177.4688">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="478.3125" y="2177.4688">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="288.8125" y="2201.7891"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="298.8125" y="2223.3906">return no lease</text><ellipse cx="342.3125" cy="2281.9219" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="342.3125" cy="2281.9219" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="476.8125" y="2201.7891"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="486.8125" y="2223.3906">reclaim expired lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="164" x="467.3125" y="2270.9219"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="144" x="477.3125" y="2292.5234">update lease information</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="138" x="480.3125" y="2325.0547"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="118" x="490.3125" y="2346.6563">callout lease4_select</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="512.8125,2379.1875,585.8125,2379.1875,597.8125,2391.1875,585.8125,2403.1875,512.8125,2403.1875,500.8125,2391.1875,512.8125,2379.1875" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="512.8125" y="2395.3447">callout return</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="22" x="478.8125" y="2388.8672">SKIP</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="57" x="597.8125" y="2388.8672">CONTINUE</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="425.8125" y="2413.1875"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="435.8125" y="2434.7891">return no lease</text><ellipse cx="479.3125" cy="2478.3203" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="479.3125" cy="2478.3203" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="571.8125" y="2413.1875"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="581.8125" y="2434.7891">update lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="133" x="552.8125" y="2467.3203"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="113" x="562.8125" y="2488.9219">return reused lease</text><ellipse cx="619.3125" cy="2532.4531" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="619.3125" cy="2532.4531" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="182" x="725.8125" y="2167.7891"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="162" x="735.8125" y="2189.3906">create and return new lease</text><ellipse cx="816.8125" cy="2247.9219" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="816.8125" cy="2247.9219" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="51.1992" y2="71.1992"/><polygon fill="#A80036" points="627.3125,61.1992,631.3125,71.1992,635.3125,61.1992,631.3125,65.1992" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="422" x2="422" y1="275.9424" y2="310.9424"/><polygon fill="#A80036" points="418,300.9424,422,310.9424,426,300.9424,422,304.9424" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="422" x2="422" y1="217.332" y2="241.8096"/><polygon fill="#A80036" points="418,231.8096,422,241.8096,426,231.8096,422,235.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="563" x2="575" y1="205.332" y2="205.332"/><polygon fill="#A80036" points="571,283.376,575,293.376,579,283.376,575,287.376" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="575" x2="575" y1="205.332" y2="375.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="575" x2="291" y1="375.4199" y2="375.4199"/><polygon fill="#A80036" points="301,371.4199,291,375.4199,301,379.4199,297,375.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="217" x2="136" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="136" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="132,183.332,136,193.332,140,183.332,136,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="341" x2="422" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="422" x2="422" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="418,183.332,422,193.332,426,183.332,422,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="136" y1="227.4648" y2="375.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="267" y1="375.4199" y2="375.4199"/><polygon fill="#A80036" points="257,371.4199,267,375.4199,257,379.4199,261,375.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="553.5078" y2="588.5078"/><polygon fill="#A80036" points="275,578.5078,279,588.5078,283,578.5078,279,582.5078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="494.8975" y2="519.375"/><polygon fill="#A80036" points="275,509.375,279,519.375,283,509.375,279,513.375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="383.5" x2="395.5" y1="482.8975" y2="482.8975"/><polygon fill="#A80036" points="391.5,551.9414,395.5,561.9414,399.5,551.9414,395.5,555.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="395.5" x2="395.5" y1="482.8975" y2="640.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="395.5" x2="279" y1="640.9854" y2="640.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="640.9854" y2="665.4629"/><polygon fill="#A80036" points="275,655.4629,279,665.4629,283,655.4629,279,659.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="446.4199" y2="470.8975"/><polygon fill="#A80036" points="275,460.8975,279,470.8975,283,460.8975,279,464.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="365.5" x2="405.5" y1="434.4199" y2="434.4199"/><polygon fill="#A80036" points="401.5,545.9414,405.5,555.9414,409.5,545.9414,405.5,549.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="405.5" x2="405.5" y1="434.4199" y2="677.4629"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="405.5" x2="291" y1="677.4629" y2="677.4629"/><polygon fill="#A80036" points="301,673.4629,291,677.4629,301,681.4629,297,677.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="387.4199" y2="422.4199"/><polygon fill="#A80036" points="275,412.4199,279,422.4199,283,412.4199,279,416.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="904.0283" y2="939.0283"/><polygon fill="#A80036" points="275,929.0283,279,939.0283,283,929.0283,279,933.0283" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="845.418" y2="869.8955"/><polygon fill="#A80036" points="275,859.8955,279,869.8955,283,859.8955,279,863.8955" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="306.5" x2="342.5" y1="833.418" y2="833.418"/><polygon fill="#A80036" points="338.5,902.4619,342.5,912.4619,346.5,902.4619,342.5,906.4619" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.5" x2="342.5" y1="833.418" y2="991.5059"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.5" x2="279" y1="991.5059" y2="991.5059"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="991.5059" y2="1015.9834"/><polygon fill="#A80036" points="275,1005.9834,279,1015.9834,283,1005.9834,279,1009.9834" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="796.9404" y2="821.418"/><polygon fill="#A80036" points="275,811.418,279,821.418,283,811.418,279,815.418" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="365.5" x2="377.5" y1="784.9404" y2="784.9404"/><polygon fill="#A80036" points="373.5,896.4619,377.5,906.4619,381.5,896.4619,377.5,900.4619" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="377.5" x2="377.5" y1="784.9404" y2="1027.9834"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="377.5" x2="291" y1="1027.9834" y2="1027.9834"/><polygon fill="#A80036" points="301,1023.9834,291,1027.9834,301,1031.9834,297,1027.9834" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1157.5938" y2="1186.6045"/><polygon fill="#A80036" points="275,1176.6045,279,1186.6045,283,1176.6045,279,1180.6045" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1098.9834" y2="1123.4609"/><polygon fill="#A80036" points="275,1113.4609,279,1123.4609,283,1113.4609,279,1117.4609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="382.5" x2="394.5" y1="1086.9834" y2="1086.9834"/><polygon fill="#A80036" points="390.5,1156.0273,394.5,1166.0273,398.5,1156.0273,394.5,1160.0273" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="394.5" x2="394.5" y1="1086.9834" y2="1239.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="394.5" x2="279" y1="1239.082" y2="1239.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1239.082" y2="1259.082"/><polygon fill="#A80036" points="275,1249.082,279,1259.082,283,1249.082,279,1253.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1039.9834" y2="1074.9834"/><polygon fill="#A80036" points="275,1064.9834,279,1074.9834,283,1064.9834,279,1068.9834" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="748.4629" y2="772.9404"/><polygon fill="#A80036" points="275,762.9404,279,772.9404,283,762.9404,279,766.9404" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="399.5" x2="411.5" y1="736.4629" y2="736.4629"/><polygon fill="#A80036" points="407.5,999.0059,411.5,1009.0059,415.5,999.0059,411.5,1003.0059" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="411.5" x2="411.5" y1="736.4629" y2="1271.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="411.5" x2="291" y1="1271.082" y2="1271.082"/><polygon fill="#A80036" points="301,1267.082,291,1271.082,301,1275.082,297,1271.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="689.4629" y2="724.4629"/><polygon fill="#A80036" points="275,714.4629,279,724.4629,283,714.4629,279,718.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="275.9424" y2="310.9424"/><polygon fill="#A80036" points="752,300.9424,756,310.9424,760,300.9424,756,304.9424" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="217.332" y2="241.8096"/><polygon fill="#A80036" points="752,231.8096,756,241.8096,760,231.8096,756,235.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="897" x2="909" y1="205.332" y2="205.332"/><polygon fill="#A80036" points="905,274.376,909,284.376,913,274.376,909,278.376" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="909" x2="909" y1="205.332" y2="357.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="909" x2="756" y1="357.4199" y2="357.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="357.4199" y2="392.4199"/><polygon fill="#A80036" points="752,382.4199,756,392.4199,760,382.4199,756,386.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="523.5078" y2="558.5078"/><polygon fill="#A80036" points="752,548.5078,756,558.5078,760,548.5078,756,552.5078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="464.8975" y2="489.375"/><polygon fill="#A80036" points="752,479.375,756,489.375,760,479.375,756,483.375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="860.5" x2="872.5" y1="452.8975" y2="452.8975"/><polygon fill="#A80036" points="868.5,521.9414,872.5,531.9414,876.5,521.9414,872.5,525.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="872.5" x2="872.5" y1="452.8975" y2="610.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="872.5" x2="756" y1="610.9854" y2="610.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="610.9854" y2="635.4629"/><polygon fill="#A80036" points="752,625.4629,756,635.4629,760,625.4629,756,629.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="416.4199" y2="440.8975"/><polygon fill="#A80036" points="752,430.8975,756,440.8975,760,430.8975,756,434.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="842.5" x2="882.5" y1="404.4199" y2="404.4199"/><polygon fill="#A80036" points="878.5,515.9414,882.5,525.9414,886.5,515.9414,882.5,519.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="882.5" x2="882.5" y1="404.4199" y2="647.4629"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="882.5" x2="768" y1="647.4629" y2="647.4629"/><polygon fill="#A80036" points="778,643.4629,768,647.4629,778,651.4629,774,647.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="777.0732" y2="812.0732"/><polygon fill="#A80036" points="752,802.0732,756,812.0732,760,802.0732,756,806.0732" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="718.4629" y2="742.9404"/><polygon fill="#A80036" points="752,732.9404,756,742.9404,760,732.9404,756,736.9404" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="859.5" x2="871.5" y1="706.4629" y2="706.4629"/><polygon fill="#A80036" points="867.5,1013.8389,871.5,1023.8389,875.5,1013.8389,871.5,1017.8389" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="871.5" x2="871.5" y1="706.4629" y2="1323.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="871.5" x2="971.625" y1="1323.082" y2="1323.082"/><polygon fill="#A80036" points="961.625,1319.082,971.625,1323.082,961.625,1327.082,965.625,1323.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="659.4629" y2="694.4629"/><polygon fill="#A80036" points="752,684.4629,756,694.4629,760,684.4629,756,688.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1084" x2="1084" y1="518.0303" y2="553.0303"/><polygon fill="#A80036" points="1080,543.0303,1084,553.0303,1088,543.0303,1084,547.0303" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="566.5078" y2="601.5078"/><polygon fill="#A80036" points="1334.5,591.5078,1338.5,601.5078,1342.5,591.5078,1338.5,595.5078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="635.6406" y2="670.6406"/><polygon fill="#A80036" points="1334.5,660.6406,1338.5,670.6406,1342.5,660.6406,1338.5,664.6406" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1268.5" x2="1268.5" y1="807.9063" y2="842.9063"/><polygon fill="#A80036" points="1264.5,832.9063,1268.5,842.9063,1272.5,832.9063,1268.5,836.9063" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1408.5" x2="1408.5" y1="807.9063" y2="842.9063"/><polygon fill="#A80036" points="1404.5,832.9063,1408.5,842.9063,1412.5,832.9063,1408.5,836.9063" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1408.5" x2="1408.5" y1="877.0391" y2="912.0391"/><polygon fill="#A80036" points="1404.5,902.0391,1408.5,912.0391,1412.5,902.0391,1408.5,906.0391" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1290" x2="1268.5" y1="751.7734" y2="751.7734"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1268.5" x2="1268.5" y1="751.7734" y2="773.7734"/><polygon fill="#A80036" points="1264.5,763.7734,1268.5,773.7734,1272.5,763.7734,1268.5,767.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1387" x2="1408.5" y1="751.7734" y2="751.7734"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1408.5" x2="1408.5" y1="751.7734" y2="773.7734"/><polygon fill="#A80036" points="1404.5,763.7734,1408.5,773.7734,1412.5,763.7734,1408.5,767.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="704.7734" y2="739.7734"/><polygon fill="#A80036" points="1334.5,729.7734,1338.5,739.7734,1342.5,729.7734,1338.5,733.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="507.8975" y2="532.375"/><polygon fill="#A80036" points="1334.5,522.375,1338.5,532.375,1342.5,522.375,1338.5,526.375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1371" x2="1489" y1="495.8975" y2="495.8975"/><polygon fill="#A80036" points="1485,726.207,1489,736.207,1493,726.207,1489,730.207" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1489" x2="1489" y1="495.8975" y2="976.5166"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1489" x2="1211.25" y1="976.5166" y2="976.5166"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="976.5166" y2="1000.9941"/><polygon fill="#A80036" points="1207.25,990.9941,1211.25,1000.9941,1215.25,990.9941,1211.25,994.9941" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1148.75" x2="1084" y1="461.8975" y2="461.8975"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1084" x2="1084" y1="461.8975" y2="483.8975"/><polygon fill="#A80036" points="1080,473.8975,1084,483.8975,1088,473.8975,1084,477.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1273.75" x2="1338.5" y1="461.8975" y2="461.8975"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="461.8975" y2="483.8975"/><polygon fill="#A80036" points="1334.5,473.8975,1338.5,483.8975,1342.5,473.8975,1338.5,477.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="425.4199" y2="449.8975"/><polygon fill="#A80036" points="1207.25,439.8975,1211.25,449.8975,1215.25,439.8975,1211.25,443.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1319.25" x2="1507" y1="413.4199" y2="413.4199"/><polygon fill="#A80036" points="1503,703.207,1507,713.207,1511,703.207,1507,707.207" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1507" x2="1507" y1="413.4199" y2="1012.9941"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1507" x2="1223.25" y1="1012.9941" y2="1012.9941"/><polygon fill="#A80036" points="1233.25,1008.9941,1223.25,1012.9941,1233.25,1016.9941,1229.25,1012.9941" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="376.9424" y2="401.4199"/><polygon fill="#A80036" points="1207.25,391.4199,1211.25,401.4199,1215.25,391.4199,1211.25,395.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1328.25" x2="1525" y1="364.9424" y2="364.9424"/><polygon fill="#A80036" points="1521,703.207,1525,713.207,1529,703.207,1525,707.207" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1525" x2="1525" y1="364.9424" y2="1061.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1525" x2="1223.25" y1="1061.4717" y2="1061.4717"/><polygon fill="#A80036" points="1233.25,1057.4717,1223.25,1061.4717,1233.25,1065.4717,1229.25,1061.4717" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1024.9941" y2="1049.4717"/><polygon fill="#A80036" points="1207.25,1039.4717,1211.25,1049.4717,1215.25,1039.4717,1211.25,1043.4717" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="323.9424" y2="352.9424"/><polygon fill="#A80036" points="1207.25,342.9424,1211.25,352.9424,1215.25,342.9424,1211.25,346.9424" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="265.8096" y2="289.8096"/><polygon fill="#A80036" points="1207.25,279.8096,1211.25,289.8096,1215.25,279.8096,1211.25,283.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1073.4717" y2="1085.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1543" y1="1085.4717" y2="1085.4717"/><polygon fill="#A80036" points="1539,676.6406,1543,666.6406,1547,676.6406,1543,672.6406" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1543" x2="1543" y1="253.8096" y2="1085.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1543" x2="1304.75" y1="253.8096" y2="253.8096"/><polygon fill="#A80036" points="1314.75,249.8096,1304.75,253.8096,1314.75,257.8096,1310.75,253.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1117.75" x2="951" y1="253.8096" y2="253.8096"/><polygon fill="#A80036" points="947,662.6406,951,672.6406,955,662.6406,951,666.6406" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="951" x2="951" y1="253.8096" y2="1097.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="951" x2="1211.25" y1="1097.4717" y2="1097.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1097.4717" y2="1132.4717"/><polygon fill="#A80036" points="1207.25,1122.4717,1211.25,1132.4717,1215.25,1122.4717,1211.25,1126.4717" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1166.6045" y2="1195.6152"/><polygon fill="#A80036" points="1207.25,1185.6152,1211.25,1195.6152,1215.25,1185.6152,1211.25,1189.6152" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1229.748" y2="1260.2705"/><polygon fill="#A80036" points="1207.25,1250.2705,1211.25,1260.2705,1215.25,1250.2705,1211.25,1254.2705" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="217.332" y2="241.8096"/><polygon fill="#A80036" points="1207.25,231.8096,1211.25,241.8096,1215.25,231.8096,1211.25,235.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1343.75" x2="1553" y1="205.332" y2="205.332"/><polygon fill="#A80036" points="1549,760.2734,1553,770.2734,1557,760.2734,1553,764.2734" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1553" x2="1553" y1="205.332" y2="1323.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1553" x2="995.625" y1="1323.082" y2="1323.082"/><polygon fill="#A80036" points="1005.625,1319.082,995.625,1323.082,1005.625,1327.082,1001.625,1323.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="921.625" x2="756" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="752,183.332,756,193.332,760,183.332,756,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1045.625" x2="1211.25" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="1207.25,183.332,1211.25,193.332,1215.25,183.332,1211.25,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="572.8125" x2="279" y1="137.332" y2="137.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="137.332" y2="159.332"/><polygon fill="#A80036" points="275,149.332,279,159.332,283,149.332,279,153.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="689.8125" x2="983.625" y1="137.332" y2="137.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.625" x2="983.625" y1="137.332" y2="159.332"/><polygon fill="#A80036" points="979.625,149.332,983.625,159.332,987.625,149.332,983.625,153.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1283.082" y2="1353.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="619.3125" y1="1353.082" y2="1353.082"/><polygon fill="#A80036" points="609.3125,1349.082,619.3125,1353.082,609.3125,1357.082,613.3125,1353.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.625" x2="983.625" y1="1335.082" y2="1353.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.625" x2="643.3125" y1="1353.082" y2="1353.082"/><polygon fill="#A80036" points="653.3125,1349.082,643.3125,1353.082,653.3125,1357.082,649.3125,1353.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="105.332" y2="125.332"/><polygon fill="#A80036" points="627.3125,115.332,631.3125,125.332,635.3125,115.332,631.3125,119.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1608.6475" y2="1633.125"/><polygon fill="#A80036" points="627.3125,1623.125,631.3125,1633.125,635.3125,1623.125,631.3125,1627.125" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="688.8125" x2="713.8125" y1="1596.6475" y2="1596.6475"/><polygon fill="#A80036" points="709.8125,1640.1914,713.8125,1650.1914,717.8125,1640.1914,713.8125,1644.1914" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="713.8125" x2="713.8125" y1="1596.6475" y2="1699.2578"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="713.8125" x2="643.3125" y1="1699.2578" y2="1699.2578"/><polygon fill="#A80036" points="653.3125,1695.2578,643.3125,1699.2578,653.3125,1703.2578,649.3125,1699.2578" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1667.2578" y2="1687.2578"/><polygon fill="#A80036" points="627.3125,1677.2578,631.3125,1687.2578,635.3125,1677.2578,631.3125,1681.2578" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1564.6475" y2="1584.6475"/><polygon fill="#A80036" points="627.3125,1574.6475,631.3125,1584.6475,635.3125,1574.6475,631.3125,1578.6475" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1711.2578" y2="1731.2578"/><polygon fill="#A80036" points="627.3125,1721.2578,631.3125,1731.2578,635.3125,1721.2578,631.3125,1725.2578" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="540.8125" x2="540.8125" y1="1853.5234" y2="1873.5234"/><polygon fill="#A80036" points="536.8125,1863.5234,540.8125,1873.5234,544.8125,1863.5234,540.8125,1867.5234" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="721.8125" x2="721.8125" y1="1853.5234" y2="1873.5234"/><polygon fill="#A80036" points="717.8125,1863.5234,721.8125,1873.5234,725.8125,1863.5234,721.8125,1867.5234" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="721.8125" x2="721.8125" y1="1907.6563" y2="1927.6563"/><polygon fill="#A80036" points="717.8125,1917.6563,721.8125,1927.6563,725.8125,1917.6563,721.8125,1921.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="582.8125" x2="540.8125" y1="1797.3906" y2="1797.3906"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="540.8125" x2="540.8125" y1="1797.3906" y2="1819.3906"/><polygon fill="#A80036" points="536.8125,1809.3906,540.8125,1819.3906,544.8125,1809.3906,540.8125,1813.3906" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="679.8125" x2="721.8125" y1="1797.3906" y2="1797.3906"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="721.8125" x2="721.8125" y1="1797.3906" y2="1819.3906"/><polygon fill="#A80036" points="717.8125,1809.3906,721.8125,1819.3906,725.8125,1809.3906,721.8125,1813.3906" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1765.3906" y2="1785.3906"/><polygon fill="#A80036" points="627.3125,1775.3906,631.3125,1785.3906,635.3125,1775.3906,631.3125,1779.3906" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1506.0371" y2="1530.5146"/><polygon fill="#A80036" points="627.3125,1520.5146,631.3125,1530.5146,635.3125,1520.5146,631.3125,1524.5146" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="803.8125" x2="830.3125" y1="1494.0371" y2="1494.0371"/><polygon fill="#A80036" points="826.3125,1735.3467,830.3125,1745.3467,834.3125,1735.3467,830.3125,1739.3467" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="830.3125" x2="830.3125" y1="1494.0371" y2="1971.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="830.3125" x2="631.3125" y1="1971.6563" y2="1971.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1971.6563" y2="1991.6563"/><polygon fill="#A80036" points="627.3125,1981.6563,631.3125,1991.6563,635.3125,1981.6563,631.3125,1985.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1457.5596" y2="1482.0371"/><polygon fill="#A80036" points="627.3125,1472.0371,631.3125,1482.0371,635.3125,1472.0371,631.3125,1476.0371" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="825.3125" x2="852.3125" y1="1445.5596" y2="1445.5596"/><polygon fill="#A80036" points="848.3125,1729.3467,852.3125,1739.3467,856.3125,1729.3467,852.3125,1733.3467" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="852.3125" x2="852.3125" y1="1445.5596" y2="2003.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="852.3125" x2="643.3125" y1="2003.6563" y2="2003.6563"/><polygon fill="#A80036" points="653.3125,1999.6563,643.3125,2003.6563,653.3125,2007.6563,649.3125,2003.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1409.082" y2="1433.5596"/><polygon fill="#A80036" points="627.3125,1423.5596,631.3125,1433.5596,635.3125,1423.5596,631.3125,1427.5596" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="672.8125" x2="874.3125" y1="1397.082" y2="1397.082"/><polygon fill="#A80036" points="870.3125,1729.3467,874.3125,1739.3467,878.3125,1729.3467,874.3125,1733.3467" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="874.3125" x2="874.3125" y1="1397.082" y2="2047.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="874.3125" x2="643.3125" y1="2047.6563" y2="2047.6563"/><polygon fill="#A80036" points="653.3125,2043.6563,643.3125,2047.6563,653.3125,2051.6563,649.3125,2047.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="2015.6563" y2="2035.6563"/><polygon fill="#A80036" points="627.3125,2025.6563,631.3125,2035.6563,635.3125,2025.6563,631.3125,2029.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1365.082" y2="1385.082"/><polygon fill="#A80036" points="627.3125,1375.082,631.3125,1385.082,635.3125,1375.082,631.3125,1379.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="2059.6563" y2="2079.6563"/><polygon fill="#A80036" points="627.3125,2069.6563,631.3125,2079.6563,635.3125,2069.6563,631.3125,2073.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.3125" x2="342.3125" y1="2235.9219" y2="2270.9219"/><polygon fill="#A80036" points="338.3125,2260.9219,342.3125,2270.9219,346.3125,2260.9219,342.3125,2264.9219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2235.9219" y2="2270.9219"/><polygon fill="#A80036" points="545.3125,2260.9219,549.3125,2270.9219,553.3125,2260.9219,549.3125,2264.9219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2305.0547" y2="2325.0547"/><polygon fill="#A80036" points="545.3125,2315.0547,549.3125,2325.0547,553.3125,2315.0547,549.3125,2319.0547" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="479.3125" x2="479.3125" y1="2447.3203" y2="2467.3203"/><polygon fill="#A80036" points="475.3125,2457.3203,479.3125,2467.3203,483.3125,2457.3203,479.3125,2461.3203" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="619.3125" x2="619.3125" y1="2447.3203" y2="2467.3203"/><polygon fill="#A80036" points="615.3125,2457.3203,619.3125,2467.3203,623.3125,2457.3203,619.3125,2461.3203" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="619.3125" x2="619.3125" y1="2501.4531" y2="2521.4531"/><polygon fill="#A80036" points="615.3125,2511.4531,619.3125,2521.4531,623.3125,2511.4531,619.3125,2515.4531" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="500.8125" x2="479.3125" y1="2391.1875" y2="2391.1875"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="479.3125" x2="479.3125" y1="2391.1875" y2="2413.1875"/><polygon fill="#A80036" points="475.3125,2403.1875,479.3125,2413.1875,483.3125,2403.1875,479.3125,2407.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="597.8125" x2="619.3125" y1="2391.1875" y2="2391.1875"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="619.3125" x2="619.3125" y1="2391.1875" y2="2413.1875"/><polygon fill="#A80036" points="615.3125,2403.1875,619.3125,2413.1875,623.3125,2403.1875,619.3125,2407.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2359.1875" y2="2379.1875"/><polygon fill="#A80036" points="545.3125,2369.1875,549.3125,2379.1875,553.3125,2369.1875,549.3125,2373.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="413.3125" x2="342.3125" y1="2179.7891" y2="2179.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.3125" x2="342.3125" y1="2179.7891" y2="2201.7891"/><polygon fill="#A80036" points="338.3125,2191.7891,342.3125,2201.7891,346.3125,2191.7891,342.3125,2195.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="478.3125" x2="549.3125" y1="2179.7891" y2="2179.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2179.7891" y2="2201.7891"/><polygon fill="#A80036" points="545.3125,2191.7891,549.3125,2201.7891,553.3125,2191.7891,549.3125,2195.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="816.8125" x2="816.8125" y1="2201.9219" y2="2236.9219"/><polygon fill="#A80036" points="812.8125,2226.9219,816.8125,2236.9219,820.8125,2226.9219,816.8125,2230.9219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="577.3125" x2="445.8125" y1="2145.7891" y2="2145.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="445.8125" x2="445.8125" y1="2145.7891" y2="2167.7891"/><polygon fill="#A80036" points="441.8125,2157.7891,445.8125,2167.7891,449.8125,2157.7891,445.8125,2161.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="685.3125" x2="816.8125" y1="2145.7891" y2="2145.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="816.8125" x2="816.8125" y1="2145.7891" y2="2167.7891"/><polygon fill="#A80036" points="812.8125,2157.7891,816.8125,2167.7891,820.8125,2157.7891,816.8125,2161.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="2113.7891" y2="2133.7891"/><polygon fill="#A80036" points="627.3125,2123.7891,631.3125,2133.7891,635.3125,2123.7891,631.3125,2127.7891" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[afafd38710d9a052946de087a4cad58a]
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="2560px" preserveAspectRatio="none" style="width:1579px;height:2560px;" version="1.1" viewBox="0 0 1579 2560" width="1579px" zoomAndPan="magnify"><defs><filter height="300%" id="f1aicqcofdeklm" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="316" x="630.5" y="27.4023">requestLease4 algorithm (Kea 1.8.0)</text><ellipse cx="631.3125" cy="41.1992" fill="#000000" filter="url(#f1aicqcofdeklm)" rx="10" ry="10" style="stroke: none; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="148" x="557.3125" y="71.1992"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="128" x="567.3125" y="92.8008">get lease for the client</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="584.8125,125.332,677.8125,125.332,689.8125,137.332,677.8125,149.332,584.8125,149.332,572.8125,137.332,584.8125,125.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="584.8125" y="141.4893">reserved address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="554.8125" y="135.0117">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="689.8125" y="135.0117">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="229,159.332,329,159.332,341,171.332,329,183.332,229,183.332,217,171.332,229,159.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="229" y="175.4893">requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="203" y="169.0117">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="341" y="169.0117">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="250" x="11" y="193.332"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="230" x="21" y="214.9336">requested address = reserved address</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="368.5" y="241.8096"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="378.5" y="263.4111">return no lease</text><ellipse cx="422" cy="321.9424" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="422" cy="321.9424" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="293,193.332,551,193.332,563,205.332,551,217.332,293,217.332,281,205.332,293,193.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="426" y="227.9668">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="258" x="293" y="209.4893">requested address is reserved for another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="563" y="203.0117">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,363.4199,291,375.4199,279,387.4199,267,375.4199,279,363.4199" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="225.5" y="519.375"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="235.5" y="540.9766">return no lease</text><ellipse cx="279" cy="599.5078" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="279" cy="599.5078" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="186.5,470.8975,371.5,470.8975,383.5,482.8975,371.5,494.8975,186.5,494.8975,174.5,482.8975,186.5,470.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="505.5322">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="186.5" y="487.0547">active and owned by another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="383.5" y="480.5771">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="204.5,422.4199,353.5,422.4199,365.5,434.4199,353.5,446.4199,204.5,446.4199,192.5,434.4199,204.5,422.4199" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="457.0547">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="204.5" y="438.5771">lease for requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="365.5" y="432.0996">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,665.4629,291,677.4629,279,689.4629,267,677.4629,279,665.4629" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="225.5" y="869.8955"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="235.5" y="891.4971">return no lease</text><ellipse cx="279" cy="950.0283" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="279" cy="950.0283" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="263.5,821.418,294.5,821.418,306.5,833.418,294.5,845.418,263.5,845.418,251.5,833.418,263.5,821.418" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="856.0527">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="31" x="263.5" y="837.5752">active</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="306.5" y="831.0977">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="204.5,772.9404,353.5,772.9404,365.5,784.9404,353.5,796.9404,204.5,796.9404,192.5,784.9404,204.5,772.9404" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="283" y="807.5752">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="204.5" y="789.0977">lease for requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="365.5" y="782.6201">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,1015.9834,291,1027.9834,279,1039.9834,267,1027.9834,279,1015.9834" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="225.5" y="1123.4609"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="235.5" y="1145.0625">return no lease</text><ellipse cx="279" cy="1197.6045" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="279" cy="1197.6045" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="187.5,1074.9834,370.5,1074.9834,382.5,1086.9834,370.5,1098.9834,187.5,1098.9834,175.5,1086.9834,187.5,1074.9834" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="283" y="1109.6182">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="183" x="187.5" y="1091.1406">requested address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="382.5" y="1084.6631">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="170.5,724.4629,387.5,724.4629,399.5,736.4629,387.5,748.4629,170.5,748.4629,158.5,736.4629,170.5,724.4629" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="283" y="759.0977">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="217" x="170.5" y="740.6201">requested address == reserved address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="399.5" y="734.1426">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="279,1259.082,291,1271.082,279,1283.082,267,1271.082,279,1259.082" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="933.625,159.332,1033.625,159.332,1045.625,171.332,1033.625,183.332,933.625,183.332,921.625,171.332,933.625,159.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="933.625" y="175.4893">requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="903.625" y="169.0117">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1045.625" y="169.0117">no</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="702.5" y="241.8096"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="712.5" y="263.4111">return no lease</text><ellipse cx="756" cy="321.9424" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="756" cy="321.9424" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="627,193.332,885,193.332,897,205.332,885,217.332,627,217.332,615,205.332,627,193.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="760" y="227.9668">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="258" x="627" y="209.4893">requested address is reserved for another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="897" y="203.0117">no</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="702.5" y="489.375"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="712.5" y="510.9766">return no lease</text><ellipse cx="756" cy="569.5078" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="756" cy="569.5078" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="663.5,440.8975,848.5,440.8975,860.5,452.8975,848.5,464.8975,663.5,464.8975,651.5,452.8975,663.5,440.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="760" y="475.5322">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="185" x="663.5" y="457.0547">active and owned by another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="860.5" y="450.5771">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="681.5,392.4199,830.5,392.4199,842.5,404.4199,830.5,416.4199,681.5,416.4199,669.5,404.4199,681.5,392.4199" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="760" y="427.0547">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="681.5" y="408.5771">lease for requested address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="842.5" y="402.0996">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="756,635.4629,768,647.4629,756,659.4629,744,647.4629,756,635.4629" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="702.5" y="742.9404"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="712.5" y="764.542">return no lease</text><ellipse cx="756" cy="823.0732" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="756" cy="823.0732" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="664.5,694.4629,847.5,694.4629,859.5,706.4629,847.5,718.4629,664.5,718.4629,652.5,706.4629,664.5,694.4629" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="760" y="729.0977">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="183" x="664.5" y="710.6201">requested address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="859.5" y="704.1426">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="1133.25" y="289.8096"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="136" x="1143.25" y="311.4111">pick candidate address</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1160.75,449.8975,1261.75,449.8975,1273.75,461.8975,1261.75,473.8975,1160.75,473.8975,1148.75,461.8975,1160.75,449.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="101" x="1160.75" y="466.0547">lease for candidate</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1134.75" y="459.5771">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1273.75" y="459.5771">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="182" x="993" y="483.8975"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="162" x="1003" y="505.499">create and return new lease</text><ellipse cx="1084" cy="564.0303" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1084" cy="564.0303" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="1266" y="532.375"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="1276" y="553.9766">reclaim expired lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="164" x="1256.5" y="601.5078"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="144" x="1266.5" y="623.1094">update lease information</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="138" x="1269.5" y="670.6406"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="118" x="1279.5" y="692.2422">callout lease4_select</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1302,739.7734,1375,739.7734,1387,751.7734,1375,763.7734,1302,763.7734,1290,751.7734,1302,739.7734" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="1302" y="755.9307">callout return</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="22" x="1268" y="749.4531">SKIP</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="57" x="1387" y="749.4531">CONTINUE</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="1215" y="773.7734"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="1225" y="795.375">return no lease</text><ellipse cx="1268.5" cy="853.9063" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1268.5" cy="853.9063" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="1361" y="773.7734"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="1371" y="795.375">update lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="133" x="1342" y="842.9063"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="113" x="1352" y="864.5078">return reused lease</text><ellipse cx="1408.5" cy="923.0391" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1408.5" cy="923.0391" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1318,483.8975,1359,483.8975,1371,495.8975,1359,507.8975,1318,507.8975,1306,495.8975,1318,483.8975" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1342.5" y="518.5322">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="41" x="1318" y="500.0547">expired</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1371" y="493.5771">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1115.25,401.4199,1307.25,401.4199,1319.25,413.4199,1307.25,425.4199,1115.25,425.4199,1103.25,413.4199,1115.25,401.4199" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1215.25" y="436.0547">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="1115.25" y="417.5771">candidate is used by another thread</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1319.25" y="411.0996">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1211.25,1000.9941,1223.25,1012.9941,1211.25,1024.9941,1199.25,1012.9941,1211.25,1000.9941" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1106.25,352.9424,1316.25,352.9424,1328.25,364.9424,1316.25,376.9424,1106.25,376.9424,1094.25,364.9424,1106.25,352.9424" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1215.25" y="387.5771">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="210" x="1106.25" y="369.0996">candidate is reserved for another client</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1328.25" y="362.6221">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1211.25,1049.4717,1223.25,1061.4717,1211.25,1073.4717,1199.25,1061.4717,1211.25,1049.4717" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1129.75,241.8096,1292.75,241.8096,1304.75,253.8096,1292.75,265.8096,1129.75,265.8096,1117.75,253.8096,1129.75,241.8096" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="163" x="1129.75" y="257.9668">iterate over pools and subnets</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="132" x="1145.25" y="1132.4717"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="112" x="1155.25" y="1154.0732">maximum attempts</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="1157.75" y="1195.6152"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="1167.75" y="1217.2168">return no lease</text><ellipse cx="1211.25" cy="1271.2705" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="1211.25" cy="1271.2705" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="1090.75,193.332,1331.75,193.332,1343.75,205.332,1331.75,217.332,1090.75,217.332,1078.75,205.332,1090.75,193.332" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="1215.25" y="227.9668">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="241" x="1090.75" y="209.4893">client lease and lease address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="1343.75" y="203.0117">yes</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="983.625,1311.082,995.625,1323.082,983.625,1335.082,971.625,1323.082,983.625,1311.082" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,1341.082,643.3125,1353.082,631.3125,1365.082,619.3125,1353.082,631.3125,1341.082" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="164" x="549.3125" y="1530.5146"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="144" x="559.3125" y="1552.1162">update lease information</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="558.8125" y="1633.125"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="568.8125" y="1654.7266">reclaim expired lease</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="585.8125,1584.6475,676.8125,1584.6475,688.8125,1596.6475,676.8125,1608.6475,585.8125,1608.6475,573.8125,1596.6475,585.8125,1584.6475" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1619.2822">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="91" x="585.8125" y="1600.8047">old lease expired</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="688.8125" y="1594.3271">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,1687.2578,643.3125,1699.2578,631.3125,1711.2578,619.3125,1699.2578,631.3125,1687.2578" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="140" x="561.3125" y="1731.2578"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="120" x="571.3125" y="1752.8594">callout lease4_renew</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="594.8125,1785.3906,667.8125,1785.3906,679.8125,1797.3906,667.8125,1809.3906,594.8125,1809.3906,582.8125,1797.3906,594.8125,1785.3906" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="594.8125" y="1801.5479">callout return</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="22" x="560.8125" y="1795.0703">SKIP</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="57" x="679.8125" y="1795.0703">CONTINUE</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="468.3125" y="1819.3906"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="478.3125" y="1840.9922">return old client lease</text><ellipse cx="540.8125" cy="1884.5234" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="540.8125" cy="1884.5234" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="674.3125" y="1819.3906"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="684.3125" y="1840.9922">update lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="177" x="633.3125" y="1873.5234"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="157" x="643.3125" y="1895.125">return renewed client lease</text><ellipse cx="721.8125" cy="1938.6563" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="721.8125" cy="1938.6563" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="470.8125,1482.0371,791.8125,1482.0371,803.8125,1494.0371,791.8125,1506.0371,470.8125,1506.0371,458.8125,1494.0371,470.8125,1482.0371" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1516.6719">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="321" x="470.8125" y="1498.1943">has reserved address or client lease address in allowed pool</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="803.8125" y="1491.7168">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="449.3125,1433.5596,813.3125,1433.5596,825.3125,1445.5596,813.3125,1457.5596,449.3125,1457.5596,437.3125,1445.5596,449.3125,1433.5596" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1468.1943">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="364" x="449.3125" y="1449.7168">no requested address or requested address == client lease address</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="825.3125" y="1443.2393">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,1991.6563,643.3125,2003.6563,631.3125,2015.6563,619.3125,2003.6563,631.3125,1991.6563" style="stroke: #A80036; stroke-width: 1.5;"/><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="601.8125,1385.082,660.8125,1385.082,672.8125,1397.082,660.8125,1409.082,601.8125,1409.082,589.8125,1397.082,601.8125,1385.082" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="635.3125" y="1419.7168">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="59" x="601.8125" y="1401.2393">client lease</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="672.8125" y="1394.7617">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="631.3125,2035.6563,643.3125,2047.6563,631.3125,2059.6563,619.3125,2047.6563,631.3125,2035.6563" style="stroke: #A80036; stroke-width: 1.5;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="206" x="528.3125" y="2079.6563"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="186" x="538.3125" y="2101.2578">get lease for requested address</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="589.3125,2133.7891,673.3125,2133.7891,685.3125,2145.7891,673.3125,2157.7891,589.3125,2157.7891,577.3125,2145.7891,589.3125,2133.7891" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="84" x="589.3125" y="2149.9463">requested lease</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="559.3125" y="2143.4688">yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="685.3125" y="2143.4688">no</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="425.3125,2167.7891,466.3125,2167.7891,478.3125,2179.7891,466.3125,2191.7891,425.3125,2191.7891,413.3125,2179.7891,425.3125,2167.7891" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="41" x="425.3125" y="2183.9463">expired</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="14" x="399.3125" y="2177.4688">no</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="18" x="478.3125" y="2177.4688">yes</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="288.8125" y="2201.7891"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="298.8125" y="2223.3906">return no lease</text><ellipse cx="342.3125" cy="2281.9219" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="342.3125" cy="2281.9219" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="476.8125" y="2201.7891"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="125" x="486.8125" y="2223.3906">reclaim expired lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="164" x="467.3125" y="2270.9219"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="144" x="477.3125" y="2292.5234">update lease information</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="138" x="480.3125" y="2325.0547"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="118" x="490.3125" y="2346.6563">callout lease4_select</text><polygon fill="#FEFECE" filter="url(#f1aicqcofdeklm)" points="512.8125,2379.1875,585.8125,2379.1875,597.8125,2391.1875,585.8125,2403.1875,512.8125,2403.1875,500.8125,2391.1875,512.8125,2379.1875" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="73" x="512.8125" y="2395.3447">callout return</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="22" x="478.8125" y="2388.8672">SKIP</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="57" x="597.8125" y="2388.8672">CONTINUE</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="107" x="425.8125" y="2413.1875"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="87" x="435.8125" y="2434.7891">return no lease</text><ellipse cx="479.3125" cy="2478.3203" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="479.3125" cy="2478.3203" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="95" x="571.8125" y="2413.1875"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="581.8125" y="2434.7891">update lease</text><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="133" x="552.8125" y="2467.3203"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="113" x="562.8125" y="2488.9219">return reused lease</text><ellipse cx="619.3125" cy="2532.4531" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="619.3125" cy="2532.4531" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><rect fill="#FEFECE" filter="url(#f1aicqcofdeklm)" height="34.1328" rx="12.5" ry="12.5" style="stroke: #A80036; stroke-width: 1.5;" width="182" x="725.8125" y="2167.7891"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="162" x="735.8125" y="2189.3906">create and return new lease</text><ellipse cx="816.8125" cy="2247.9219" fill="#FFFFFF" filter="url(#f1aicqcofdeklm)" rx="11" ry="11" style="stroke: #000000; stroke-width: 1.0;"/><ellipse cx="816.8125" cy="2247.9219" fill="#000000" rx="6" ry="6" style="stroke: #7F7F7F; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="51.1992" y2="71.1992"/><polygon fill="#A80036" points="627.3125,61.1992,631.3125,71.1992,635.3125,61.1992,631.3125,65.1992" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="422" x2="422" y1="275.9424" y2="310.9424"/><polygon fill="#A80036" points="418,300.9424,422,310.9424,426,300.9424,422,304.9424" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="422" x2="422" y1="217.332" y2="241.8096"/><polygon fill="#A80036" points="418,231.8096,422,241.8096,426,231.8096,422,235.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="563" x2="575" y1="205.332" y2="205.332"/><polygon fill="#A80036" points="571,283.376,575,293.376,579,283.376,575,287.376" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="575" x2="575" y1="205.332" y2="375.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="575" x2="291" y1="375.4199" y2="375.4199"/><polygon fill="#A80036" points="301,371.4199,291,375.4199,301,379.4199,297,375.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="217" x2="136" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="136" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="132,183.332,136,193.332,140,183.332,136,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="341" x2="422" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="422" x2="422" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="418,183.332,422,193.332,426,183.332,422,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="136" y1="227.4648" y2="375.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="267" y1="375.4199" y2="375.4199"/><polygon fill="#A80036" points="257,371.4199,267,375.4199,257,379.4199,261,375.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="553.5078" y2="588.5078"/><polygon fill="#A80036" points="275,578.5078,279,588.5078,283,578.5078,279,582.5078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="494.8975" y2="519.375"/><polygon fill="#A80036" points="275,509.375,279,519.375,283,509.375,279,513.375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="383.5" x2="395.5" y1="482.8975" y2="482.8975"/><polygon fill="#A80036" points="391.5,551.9414,395.5,561.9414,399.5,551.9414,395.5,555.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="395.5" x2="395.5" y1="482.8975" y2="640.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="395.5" x2="279" y1="640.9854" y2="640.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="640.9854" y2="665.4629"/><polygon fill="#A80036" points="275,655.4629,279,665.4629,283,655.4629,279,659.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="446.4199" y2="470.8975"/><polygon fill="#A80036" points="275,460.8975,279,470.8975,283,460.8975,279,464.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="365.5" x2="405.5" y1="434.4199" y2="434.4199"/><polygon fill="#A80036" points="401.5,545.9414,405.5,555.9414,409.5,545.9414,405.5,549.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="405.5" x2="405.5" y1="434.4199" y2="677.4629"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="405.5" x2="291" y1="677.4629" y2="677.4629"/><polygon fill="#A80036" points="301,673.4629,291,677.4629,301,681.4629,297,677.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="387.4199" y2="422.4199"/><polygon fill="#A80036" points="275,412.4199,279,422.4199,283,412.4199,279,416.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="904.0283" y2="939.0283"/><polygon fill="#A80036" points="275,929.0283,279,939.0283,283,929.0283,279,933.0283" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="845.418" y2="869.8955"/><polygon fill="#A80036" points="275,859.8955,279,869.8955,283,859.8955,279,863.8955" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="306.5" x2="342.5" y1="833.418" y2="833.418"/><polygon fill="#A80036" points="338.5,902.4619,342.5,912.4619,346.5,902.4619,342.5,906.4619" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.5" x2="342.5" y1="833.418" y2="991.5059"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.5" x2="279" y1="991.5059" y2="991.5059"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="991.5059" y2="1015.9834"/><polygon fill="#A80036" points="275,1005.9834,279,1015.9834,283,1005.9834,279,1009.9834" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="796.9404" y2="821.418"/><polygon fill="#A80036" points="275,811.418,279,821.418,283,811.418,279,815.418" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="365.5" x2="377.5" y1="784.9404" y2="784.9404"/><polygon fill="#A80036" points="373.5,896.4619,377.5,906.4619,381.5,896.4619,377.5,900.4619" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="377.5" x2="377.5" y1="784.9404" y2="1027.9834"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="377.5" x2="291" y1="1027.9834" y2="1027.9834"/><polygon fill="#A80036" points="301,1023.9834,291,1027.9834,301,1031.9834,297,1027.9834" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1157.5938" y2="1186.6045"/><polygon fill="#A80036" points="275,1176.6045,279,1186.6045,283,1176.6045,279,1180.6045" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1098.9834" y2="1123.4609"/><polygon fill="#A80036" points="275,1113.4609,279,1123.4609,283,1113.4609,279,1117.4609" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="382.5" x2="394.5" y1="1086.9834" y2="1086.9834"/><polygon fill="#A80036" points="390.5,1156.0273,394.5,1166.0273,398.5,1156.0273,394.5,1160.0273" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="394.5" x2="394.5" y1="1086.9834" y2="1239.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="394.5" x2="279" y1="1239.082" y2="1239.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1239.082" y2="1259.082"/><polygon fill="#A80036" points="275,1249.082,279,1259.082,283,1249.082,279,1253.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1039.9834" y2="1074.9834"/><polygon fill="#A80036" points="275,1064.9834,279,1074.9834,283,1064.9834,279,1068.9834" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="748.4629" y2="772.9404"/><polygon fill="#A80036" points="275,762.9404,279,772.9404,283,762.9404,279,766.9404" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="399.5" x2="411.5" y1="736.4629" y2="736.4629"/><polygon fill="#A80036" points="407.5,999.0059,411.5,1009.0059,415.5,999.0059,411.5,1003.0059" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="411.5" x2="411.5" y1="736.4629" y2="1271.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="411.5" x2="291" y1="1271.082" y2="1271.082"/><polygon fill="#A80036" points="301,1267.082,291,1271.082,301,1275.082,297,1271.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="689.4629" y2="724.4629"/><polygon fill="#A80036" points="275,714.4629,279,724.4629,283,714.4629,279,718.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="275.9424" y2="310.9424"/><polygon fill="#A80036" points="752,300.9424,756,310.9424,760,300.9424,756,304.9424" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="217.332" y2="241.8096"/><polygon fill="#A80036" points="752,231.8096,756,241.8096,760,231.8096,756,235.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="897" x2="909" y1="205.332" y2="205.332"/><polygon fill="#A80036" points="905,274.376,909,284.376,913,274.376,909,278.376" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="909" x2="909" y1="205.332" y2="357.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="909" x2="756" y1="357.4199" y2="357.4199"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="357.4199" y2="392.4199"/><polygon fill="#A80036" points="752,382.4199,756,392.4199,760,382.4199,756,386.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="523.5078" y2="558.5078"/><polygon fill="#A80036" points="752,548.5078,756,558.5078,760,548.5078,756,552.5078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="464.8975" y2="489.375"/><polygon fill="#A80036" points="752,479.375,756,489.375,760,479.375,756,483.375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="860.5" x2="872.5" y1="452.8975" y2="452.8975"/><polygon fill="#A80036" points="868.5,521.9414,872.5,531.9414,876.5,521.9414,872.5,525.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="872.5" x2="872.5" y1="452.8975" y2="610.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="872.5" x2="756" y1="610.9854" y2="610.9854"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="610.9854" y2="635.4629"/><polygon fill="#A80036" points="752,625.4629,756,635.4629,760,625.4629,756,629.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="416.4199" y2="440.8975"/><polygon fill="#A80036" points="752,430.8975,756,440.8975,760,430.8975,756,434.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="842.5" x2="882.5" y1="404.4199" y2="404.4199"/><polygon fill="#A80036" points="878.5,515.9414,882.5,525.9414,886.5,515.9414,882.5,519.9414" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="882.5" x2="882.5" y1="404.4199" y2="647.4629"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="882.5" x2="768" y1="647.4629" y2="647.4629"/><polygon fill="#A80036" points="778,643.4629,768,647.4629,778,651.4629,774,647.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="777.0732" y2="812.0732"/><polygon fill="#A80036" points="752,802.0732,756,812.0732,760,802.0732,756,806.0732" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="718.4629" y2="742.9404"/><polygon fill="#A80036" points="752,732.9404,756,742.9404,760,732.9404,756,736.9404" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="859.5" x2="871.5" y1="706.4629" y2="706.4629"/><polygon fill="#A80036" points="867.5,1013.8389,871.5,1023.8389,875.5,1013.8389,871.5,1017.8389" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="871.5" x2="871.5" y1="706.4629" y2="1323.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="871.5" x2="971.625" y1="1323.082" y2="1323.082"/><polygon fill="#A80036" points="961.625,1319.082,971.625,1323.082,961.625,1327.082,965.625,1323.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="659.4629" y2="694.4629"/><polygon fill="#A80036" points="752,684.4629,756,694.4629,760,684.4629,756,688.4629" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1084" x2="1084" y1="518.0303" y2="553.0303"/><polygon fill="#A80036" points="1080,543.0303,1084,553.0303,1088,543.0303,1084,547.0303" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="566.5078" y2="601.5078"/><polygon fill="#A80036" points="1334.5,591.5078,1338.5,601.5078,1342.5,591.5078,1338.5,595.5078" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="635.6406" y2="670.6406"/><polygon fill="#A80036" points="1334.5,660.6406,1338.5,670.6406,1342.5,660.6406,1338.5,664.6406" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1268.5" x2="1268.5" y1="807.9063" y2="842.9063"/><polygon fill="#A80036" points="1264.5,832.9063,1268.5,842.9063,1272.5,832.9063,1268.5,836.9063" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1408.5" x2="1408.5" y1="807.9063" y2="842.9063"/><polygon fill="#A80036" points="1404.5,832.9063,1408.5,842.9063,1412.5,832.9063,1408.5,836.9063" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1408.5" x2="1408.5" y1="877.0391" y2="912.0391"/><polygon fill="#A80036" points="1404.5,902.0391,1408.5,912.0391,1412.5,902.0391,1408.5,906.0391" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1290" x2="1268.5" y1="751.7734" y2="751.7734"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1268.5" x2="1268.5" y1="751.7734" y2="773.7734"/><polygon fill="#A80036" points="1264.5,763.7734,1268.5,773.7734,1272.5,763.7734,1268.5,767.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1387" x2="1408.5" y1="751.7734" y2="751.7734"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1408.5" x2="1408.5" y1="751.7734" y2="773.7734"/><polygon fill="#A80036" points="1404.5,763.7734,1408.5,773.7734,1412.5,763.7734,1408.5,767.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="704.7734" y2="739.7734"/><polygon fill="#A80036" points="1334.5,729.7734,1338.5,739.7734,1342.5,729.7734,1338.5,733.7734" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="507.8975" y2="532.375"/><polygon fill="#A80036" points="1334.5,522.375,1338.5,532.375,1342.5,522.375,1338.5,526.375" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1371" x2="1489" y1="495.8975" y2="495.8975"/><polygon fill="#A80036" points="1485,726.207,1489,736.207,1493,726.207,1489,730.207" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1489" x2="1489" y1="495.8975" y2="976.5166"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1489" x2="1211.25" y1="976.5166" y2="976.5166"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="976.5166" y2="1000.9941"/><polygon fill="#A80036" points="1207.25,990.9941,1211.25,1000.9941,1215.25,990.9941,1211.25,994.9941" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1148.75" x2="1084" y1="461.8975" y2="461.8975"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1084" x2="1084" y1="461.8975" y2="483.8975"/><polygon fill="#A80036" points="1080,473.8975,1084,483.8975,1088,473.8975,1084,477.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1273.75" x2="1338.5" y1="461.8975" y2="461.8975"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1338.5" x2="1338.5" y1="461.8975" y2="483.8975"/><polygon fill="#A80036" points="1334.5,473.8975,1338.5,483.8975,1342.5,473.8975,1338.5,477.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="425.4199" y2="449.8975"/><polygon fill="#A80036" points="1207.25,439.8975,1211.25,449.8975,1215.25,439.8975,1211.25,443.8975" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1319.25" x2="1507" y1="413.4199" y2="413.4199"/><polygon fill="#A80036" points="1503,703.207,1507,713.207,1511,703.207,1507,707.207" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1507" x2="1507" y1="413.4199" y2="1012.9941"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1507" x2="1223.25" y1="1012.9941" y2="1012.9941"/><polygon fill="#A80036" points="1233.25,1008.9941,1223.25,1012.9941,1233.25,1016.9941,1229.25,1012.9941" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="376.9424" y2="401.4199"/><polygon fill="#A80036" points="1207.25,391.4199,1211.25,401.4199,1215.25,391.4199,1211.25,395.4199" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1328.25" x2="1525" y1="364.9424" y2="364.9424"/><polygon fill="#A80036" points="1521,703.207,1525,713.207,1529,703.207,1525,707.207" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1525" x2="1525" y1="364.9424" y2="1061.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1525" x2="1223.25" y1="1061.4717" y2="1061.4717"/><polygon fill="#A80036" points="1233.25,1057.4717,1223.25,1061.4717,1233.25,1065.4717,1229.25,1061.4717" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1024.9941" y2="1049.4717"/><polygon fill="#A80036" points="1207.25,1039.4717,1211.25,1049.4717,1215.25,1039.4717,1211.25,1043.4717" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="323.9424" y2="352.9424"/><polygon fill="#A80036" points="1207.25,342.9424,1211.25,352.9424,1215.25,342.9424,1211.25,346.9424" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="265.8096" y2="289.8096"/><polygon fill="#A80036" points="1207.25,279.8096,1211.25,289.8096,1215.25,279.8096,1211.25,283.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1073.4717" y2="1085.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1543" y1="1085.4717" y2="1085.4717"/><polygon fill="#A80036" points="1539,676.6406,1543,666.6406,1547,676.6406,1543,672.6406" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1543" x2="1543" y1="253.8096" y2="1085.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1543" x2="1304.75" y1="253.8096" y2="253.8096"/><polygon fill="#A80036" points="1314.75,249.8096,1304.75,253.8096,1314.75,257.8096,1310.75,253.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1117.75" x2="951" y1="253.8096" y2="253.8096"/><polygon fill="#A80036" points="947,662.6406,951,672.6406,955,662.6406,951,666.6406" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="951" x2="951" y1="253.8096" y2="1097.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="951" x2="1211.25" y1="1097.4717" y2="1097.4717"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1097.4717" y2="1132.4717"/><polygon fill="#A80036" points="1207.25,1122.4717,1211.25,1132.4717,1215.25,1122.4717,1211.25,1126.4717" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1166.6045" y2="1195.6152"/><polygon fill="#A80036" points="1207.25,1185.6152,1211.25,1195.6152,1215.25,1185.6152,1211.25,1189.6152" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="1229.748" y2="1260.2705"/><polygon fill="#A80036" points="1207.25,1250.2705,1211.25,1260.2705,1215.25,1250.2705,1211.25,1254.2705" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="217.332" y2="241.8096"/><polygon fill="#A80036" points="1207.25,231.8096,1211.25,241.8096,1215.25,231.8096,1211.25,235.8096" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1343.75" x2="1553" y1="205.332" y2="205.332"/><polygon fill="#A80036" points="1549,760.2734,1553,770.2734,1557,760.2734,1553,764.2734" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1553" x2="1553" y1="205.332" y2="1323.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1553" x2="995.625" y1="1323.082" y2="1323.082"/><polygon fill="#A80036" points="1005.625,1319.082,995.625,1323.082,1005.625,1327.082,1001.625,1323.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="921.625" x2="756" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="756" x2="756" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="752,183.332,756,193.332,760,183.332,756,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1045.625" x2="1211.25" y1="171.332" y2="171.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1211.25" x2="1211.25" y1="171.332" y2="193.332"/><polygon fill="#A80036" points="1207.25,183.332,1211.25,193.332,1215.25,183.332,1211.25,187.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="572.8125" x2="279" y1="137.332" y2="137.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="137.332" y2="159.332"/><polygon fill="#A80036" points="275,149.332,279,159.332,283,149.332,279,153.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="689.8125" x2="983.625" y1="137.332" y2="137.332"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.625" x2="983.625" y1="137.332" y2="159.332"/><polygon fill="#A80036" points="979.625,149.332,983.625,159.332,987.625,149.332,983.625,153.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="279" y1="1283.082" y2="1353.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="279" x2="619.3125" y1="1353.082" y2="1353.082"/><polygon fill="#A80036" points="609.3125,1349.082,619.3125,1353.082,609.3125,1357.082,613.3125,1353.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.625" x2="983.625" y1="1335.082" y2="1353.082"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.625" x2="643.3125" y1="1353.082" y2="1353.082"/><polygon fill="#A80036" points="653.3125,1349.082,643.3125,1353.082,653.3125,1357.082,649.3125,1353.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="105.332" y2="125.332"/><polygon fill="#A80036" points="627.3125,115.332,631.3125,125.332,635.3125,115.332,631.3125,119.332" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1608.6475" y2="1633.125"/><polygon fill="#A80036" points="627.3125,1623.125,631.3125,1633.125,635.3125,1623.125,631.3125,1627.125" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="688.8125" x2="713.8125" y1="1596.6475" y2="1596.6475"/><polygon fill="#A80036" points="709.8125,1640.1914,713.8125,1650.1914,717.8125,1640.1914,713.8125,1644.1914" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="713.8125" x2="713.8125" y1="1596.6475" y2="1699.2578"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="713.8125" x2="643.3125" y1="1699.2578" y2="1699.2578"/><polygon fill="#A80036" points="653.3125,1695.2578,643.3125,1699.2578,653.3125,1703.2578,649.3125,1699.2578" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1667.2578" y2="1687.2578"/><polygon fill="#A80036" points="627.3125,1677.2578,631.3125,1687.2578,635.3125,1677.2578,631.3125,1681.2578" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1564.6475" y2="1584.6475"/><polygon fill="#A80036" points="627.3125,1574.6475,631.3125,1584.6475,635.3125,1574.6475,631.3125,1578.6475" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1711.2578" y2="1731.2578"/><polygon fill="#A80036" points="627.3125,1721.2578,631.3125,1731.2578,635.3125,1721.2578,631.3125,1725.2578" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="540.8125" x2="540.8125" y1="1853.5234" y2="1873.5234"/><polygon fill="#A80036" points="536.8125,1863.5234,540.8125,1873.5234,544.8125,1863.5234,540.8125,1867.5234" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="721.8125" x2="721.8125" y1="1853.5234" y2="1873.5234"/><polygon fill="#A80036" points="717.8125,1863.5234,721.8125,1873.5234,725.8125,1863.5234,721.8125,1867.5234" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="721.8125" x2="721.8125" y1="1907.6563" y2="1927.6563"/><polygon fill="#A80036" points="717.8125,1917.6563,721.8125,1927.6563,725.8125,1917.6563,721.8125,1921.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="582.8125" x2="540.8125" y1="1797.3906" y2="1797.3906"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="540.8125" x2="540.8125" y1="1797.3906" y2="1819.3906"/><polygon fill="#A80036" points="536.8125,1809.3906,540.8125,1819.3906,544.8125,1809.3906,540.8125,1813.3906" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="679.8125" x2="721.8125" y1="1797.3906" y2="1797.3906"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="721.8125" x2="721.8125" y1="1797.3906" y2="1819.3906"/><polygon fill="#A80036" points="717.8125,1809.3906,721.8125,1819.3906,725.8125,1809.3906,721.8125,1813.3906" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1765.3906" y2="1785.3906"/><polygon fill="#A80036" points="627.3125,1775.3906,631.3125,1785.3906,635.3125,1775.3906,631.3125,1779.3906" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1506.0371" y2="1530.5146"/><polygon fill="#A80036" points="627.3125,1520.5146,631.3125,1530.5146,635.3125,1520.5146,631.3125,1524.5146" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="803.8125" x2="830.3125" y1="1494.0371" y2="1494.0371"/><polygon fill="#A80036" points="826.3125,1735.3467,830.3125,1745.3467,834.3125,1735.3467,830.3125,1739.3467" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="830.3125" x2="830.3125" y1="1494.0371" y2="1971.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="830.3125" x2="631.3125" y1="1971.6563" y2="1971.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1971.6563" y2="1991.6563"/><polygon fill="#A80036" points="627.3125,1981.6563,631.3125,1991.6563,635.3125,1981.6563,631.3125,1985.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1457.5596" y2="1482.0371"/><polygon fill="#A80036" points="627.3125,1472.0371,631.3125,1482.0371,635.3125,1472.0371,631.3125,1476.0371" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="825.3125" x2="852.3125" y1="1445.5596" y2="1445.5596"/><polygon fill="#A80036" points="848.3125,1729.3467,852.3125,1739.3467,856.3125,1729.3467,852.3125,1733.3467" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="852.3125" x2="852.3125" y1="1445.5596" y2="2003.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="852.3125" x2="643.3125" y1="2003.6563" y2="2003.6563"/><polygon fill="#A80036" points="653.3125,1999.6563,643.3125,2003.6563,653.3125,2007.6563,649.3125,2003.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1409.082" y2="1433.5596"/><polygon fill="#A80036" points="627.3125,1423.5596,631.3125,1433.5596,635.3125,1423.5596,631.3125,1427.5596" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="672.8125" x2="874.3125" y1="1397.082" y2="1397.082"/><polygon fill="#A80036" points="870.3125,1729.3467,874.3125,1739.3467,878.3125,1729.3467,874.3125,1733.3467" style="stroke: #A80036; stroke-width: 1.5;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="874.3125" x2="874.3125" y1="1397.082" y2="2047.6563"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="874.3125" x2="643.3125" y1="2047.6563" y2="2047.6563"/><polygon fill="#A80036" points="653.3125,2043.6563,643.3125,2047.6563,653.3125,2051.6563,649.3125,2047.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="2015.6563" y2="2035.6563"/><polygon fill="#A80036" points="627.3125,2025.6563,631.3125,2035.6563,635.3125,2025.6563,631.3125,2029.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="1365.082" y2="1385.082"/><polygon fill="#A80036" points="627.3125,1375.082,631.3125,1385.082,635.3125,1375.082,631.3125,1379.082" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="2059.6563" y2="2079.6563"/><polygon fill="#A80036" points="627.3125,2069.6563,631.3125,2079.6563,635.3125,2069.6563,631.3125,2073.6563" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.3125" x2="342.3125" y1="2235.9219" y2="2270.9219"/><polygon fill="#A80036" points="338.3125,2260.9219,342.3125,2270.9219,346.3125,2260.9219,342.3125,2264.9219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2235.9219" y2="2270.9219"/><polygon fill="#A80036" points="545.3125,2260.9219,549.3125,2270.9219,553.3125,2260.9219,549.3125,2264.9219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2305.0547" y2="2325.0547"/><polygon fill="#A80036" points="545.3125,2315.0547,549.3125,2325.0547,553.3125,2315.0547,549.3125,2319.0547" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="479.3125" x2="479.3125" y1="2447.3203" y2="2467.3203"/><polygon fill="#A80036" points="475.3125,2457.3203,479.3125,2467.3203,483.3125,2457.3203,479.3125,2461.3203" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="619.3125" x2="619.3125" y1="2447.3203" y2="2467.3203"/><polygon fill="#A80036" points="615.3125,2457.3203,619.3125,2467.3203,623.3125,2457.3203,619.3125,2461.3203" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="619.3125" x2="619.3125" y1="2501.4531" y2="2521.4531"/><polygon fill="#A80036" points="615.3125,2511.4531,619.3125,2521.4531,623.3125,2511.4531,619.3125,2515.4531" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="500.8125" x2="479.3125" y1="2391.1875" y2="2391.1875"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="479.3125" x2="479.3125" y1="2391.1875" y2="2413.1875"/><polygon fill="#A80036" points="475.3125,2403.1875,479.3125,2413.1875,483.3125,2403.1875,479.3125,2407.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="597.8125" x2="619.3125" y1="2391.1875" y2="2391.1875"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="619.3125" x2="619.3125" y1="2391.1875" y2="2413.1875"/><polygon fill="#A80036" points="615.3125,2403.1875,619.3125,2413.1875,623.3125,2403.1875,619.3125,2407.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2359.1875" y2="2379.1875"/><polygon fill="#A80036" points="545.3125,2369.1875,549.3125,2379.1875,553.3125,2369.1875,549.3125,2373.1875" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="413.3125" x2="342.3125" y1="2179.7891" y2="2179.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="342.3125" x2="342.3125" y1="2179.7891" y2="2201.7891"/><polygon fill="#A80036" points="338.3125,2191.7891,342.3125,2201.7891,346.3125,2191.7891,342.3125,2195.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="478.3125" x2="549.3125" y1="2179.7891" y2="2179.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="549.3125" x2="549.3125" y1="2179.7891" y2="2201.7891"/><polygon fill="#A80036" points="545.3125,2191.7891,549.3125,2201.7891,553.3125,2191.7891,549.3125,2195.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="816.8125" x2="816.8125" y1="2201.9219" y2="2236.9219"/><polygon fill="#A80036" points="812.8125,2226.9219,816.8125,2236.9219,820.8125,2226.9219,816.8125,2230.9219" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="577.3125" x2="445.8125" y1="2145.7891" y2="2145.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="445.8125" x2="445.8125" y1="2145.7891" y2="2167.7891"/><polygon fill="#A80036" points="441.8125,2157.7891,445.8125,2167.7891,449.8125,2157.7891,445.8125,2161.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="685.3125" x2="816.8125" y1="2145.7891" y2="2145.7891"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="816.8125" x2="816.8125" y1="2145.7891" y2="2167.7891"/><polygon fill="#A80036" points="812.8125,2157.7891,816.8125,2167.7891,820.8125,2157.7891,816.8125,2161.7891" style="stroke: #A80036; stroke-width: 1.0;"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="631.3125" x2="631.3125" y1="2113.7891" y2="2133.7891"/><polygon fill="#A80036" points="627.3125,2123.7891,631.3125,2133.7891,635.3125,2123.7891,631.3125,2127.7891" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[afafd38710d9a052946de087a4cad58a]
@startuml
title requestLease4 algorithm (Kea 1.8.0)
endif
else (no)
if (client lease and lease address in allowed pool) then (no)
- while (iterate over pools and subnect)
+ while (iterate over pools and subnets)
:pick candidate address;
if (candidate is reserved for another client) then (no)
if (candidate is used by another thread) then (no)
endif
else (no)
if (client lease and lease address in allowed pool) then (no)
- while (iterate over pools and subnect)
+ while (iterate over pools and subnets)
:pick candidate address;
if (candidate is reserved for another client) then (no)
if (candidate is used by another thread) then (no)
endif
else (no)
if (client lease and lease address in allowed pool) then (no)
- while (iterate over pools and subnect)
+ while (iterate over pools and subnets)
:pick candidate address;
if (candidate is reserved for another client) then (no)
if (candidate is used by another thread) then (no)
link relay_network to relay_class--><path d="M268.91,567.3992 C250.69,587.0392 221.02,619.0092 201.5,640.0392 " fill="none" id="relay_network->relay_class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="197.98,643.8392,207.0376,639.9713,201.3844,640.1773,201.1785,634.5242,197.98,643.8392" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="39" x="241" y="610.6276">match</text><!--MD5=[44feab40ce9c0df31465bdb13adac7ed]
link relay_class to found--><path d="M177.97,680.0792 C172.39,705.1692 163,753.6292 163,795.4192 C163,795.4192 163,795.4192 163,1878.4192 C163,1932.4492 543.78,1954.4892 703.15,1961.3492 " fill="none" id="relay_class->found" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="708.26,1961.5692,699.4395,1957.1875,703.2646,1961.3551,699.097,1965.1802,708.26,1961.5692" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="70" x="164" y="1362.4876">compatible</text><!--MD5=[d5e1893c7bc3c7589901f4b78d6439f0]
link relay_class to set_address--><path d="M185.6,680.2592 C190.22,698.4992 199.91,727.0992 218,745.0592 C222.9438,749.9667 228.4423,754.4291 234.2844,758.4815 C237.2054,760.5077 240.2123,762.4314 243.2786,764.2571 C244.8117,765.1699 246.3597,766.0582 247.9193,766.9226 C248.6991,767.3547 249.4818,767.7809 250.2669,768.2012 C250.6595,768.4113 251.0527,768.6199 251.4464,768.8271 " fill="none" id="relay_class->set_address" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="251.4464,768.8271,245.3441,761.0965,247.0215,766.499,241.6191,768.1764,251.4464,768.8271" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="95" x="219" y="741.6276">not compatible</text><!--MD5=[3f679d64a1cccee12b0e824b1733c0ed]
-link set_address to relay_address--><path d="M334.99,796.9892 C334.66,798.9192 327.44,841.3492 322.81,868.5092 " fill="none" id="set_address->relay_address" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="321.93,873.7292,327.3899,865.5323,322.7728,868.8008,319.5043,864.1837,321.93,873.7292" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="135" x="330" y="840.4876">try the relay addreess</text><!--MD5=[9d0435cdb5bba0d446c223c46240db6f]
+link set_address to relay_address--><path d="M334.99,796.9892 C334.66,798.9192 327.44,841.3492 322.81,868.5092 " fill="none" id="set_address->relay_address" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="321.93,873.7292,327.3899,865.5323,322.7728,868.8008,319.5043,864.1837,321.93,873.7292" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="135" x="330" y="840.4876">try the relay address</text><!--MD5=[9d0435cdb5bba0d446c223c46240db6f]
link relay_address to client_address--><path d="M387.22,891.9192 C434.95,891.9192 498.7,891.9192 547.88,891.9192 " fill="none" id="relay_address->client_address" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="552.9,891.9192,543.9,887.9192,547.9,891.9192,543.9,895.9192,552.9,891.9192" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="129" x="405.5" y="885.4876">has no relay address</text><!--MD5=[4192df04ddbb3f1e00a57ee174f51cdb]
-link client_address to source_address--><path d="M693.28,891.9192 C740.3,891.9192 802.28,891.9192 851.17,891.9192 " fill="none" id="client_address->source_address" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="856.46,891.9192,847.46,887.9192,851.46,891.9192,847.46,895.9192,856.46,891.9192" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="127" x="711.25" y="885.4876">has no client addrss</text><!--MD5=[1cd4e848379fc555ffa76a6d3111f3fb]
+link client_address to source_address--><path d="M693.28,891.9192 C740.3,891.9192 802.28,891.9192 851.17,891.9192 " fill="none" id="client_address->source_address" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="856.46,891.9192,847.46,887.9192,851.46,891.9192,847.46,895.9192,856.46,891.9192" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="127" x="711.25" y="885.4876">has no client address</text><!--MD5=[1cd4e848379fc555ffa76a6d3111f3fb]
link source_address to interface_subnet--><path d="M949.58,910.1292 C979.61,937.9292 1038.68,992.6192 1070.85,1022.4092 " fill="none" id="source_address->interface_subnet" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1074.63,1025.9092,1070.7255,1016.8674,1070.9543,1022.5196,1065.3021,1022.7484,1074.63,1025.9092" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="123" x="1017" y="971.4876">no suitable address</text><!--MD5=[a29ca77fdc41863d51ecafa8e32dcb85]
link relay_address to inRange--><path d="M319,910.0192 C319,937.8592 319,994.7392 319,1042.9192 C319,1042.9192 319,1042.9192 319,1445.9192 C319,1534.9892 608.22,1565.7192 755.69,1575.5992 " fill="none" id="relay_address->inRange" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="760.87,1575.9392,752.1525,1571.356,755.8808,1575.6104,751.6264,1579.3387,760.87,1575.9392" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="120" x="320" y="1274.9876">has a relay address</text><!--MD5=[bf38c5431748c4414750c7275409615d]
link client_address to inRange--><path d="M598.14,910.0992 C565.15,935.1492 511,985.0692 511,1042.9192 C511,1042.9192 511,1042.9192 511,1445.9192 C511,1498.7592 658.41,1540.8992 755.88,1562.9892 " fill="none" id="client_address->inRange" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="760.78,1564.0892,752.8657,1558.2272,755.8997,1563.0015,751.1254,1566.0356,760.78,1564.0892" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="125" x="512" y="1274.9876">has a client address</text><!--MD5=[306377b471c1f30003804df3ba3e4280]
-link source_address to inRange--><path d="M856.74,909.9992 C791.87,929.8492 708,969.6692 708,1042.9192 C708,1042.9192 708,1042.9192 708,1445.9192 C708,1498.6392 760.49,1538.1592 799.27,1560.1592 " fill="none" id="source_address->inRange" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="803.93,1562.7492,798.0248,1554.8671,799.5653,1560.3101,794.1222,1561.8506,803.93,1562.7492" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="219" x="709" y="1274.9876">has source addess and use unicast</text><!--MD5=[4c5f9760336ab58778079bb174cbf5f0]
+link source_address to inRange--><path d="M856.74,909.9992 C791.87,929.8492 708,969.6692 708,1042.9192 C708,1042.9192 708,1042.9192 708,1445.9192 C708,1498.6392 760.49,1538.1592 799.27,1560.1592 " fill="none" id="source_address->inRange" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="803.93,1562.7492,798.0248,1554.8671,799.5653,1560.3101,794.1222,1561.8506,803.93,1562.7492" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="219" x="709" y="1274.9876">has source address and use unicast</text><!--MD5=[4c5f9760336ab58778079bb174cbf5f0]
link interface_subnet to not_found--><path d="M1183.41,1061.9192 C1267.54,1080.3992 1380,1113.1092 1380,1155.9192 C1380,1155.9192 1380,1155.9192 1380,1878.4192 C1380,1952.2692 1138.67,1963.6392 1013.06,1964.5692 " fill="none" id="interface_subnet->not_found" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1007.91,1964.5992,1016.9327,1968.5477,1012.9099,1964.5706,1016.887,1960.5479,1007.91,1964.5992" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="75" x="1381" y="1508.4876">no interface</text><!--MD5=[f6d146b568a537518d52dd0109d2cafd]
link interface_subnet to interface_class--><path d="M1071.84,1062.1092 C1052.58,1079.2392 1025.46,1107.4692 1014,1138.9192 C998.88,1180.3992 1037.07,1223.3392 1065.19,1248.0092 " fill="none" id="interface_subnet->interface_class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1069.26,1251.5192,1065.0657,1242.6081,1065.4768,1248.25,1059.835,1248.6612,1069.26,1251.5192" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="39" x="1015" y="1161.9876">match</text><!--MD5=[8c73b6f253b7f8003f1aeec9d3e2c401]
link interface_subnet to interface_network--><path d="M1109.41,1062.2592 C1127.98,1081.8992 1158.22,1113.8692 1178.12,1134.8992 " fill="none" id="interface_subnet->interface_network" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1181.71,1138.6992,1178.417,1129.4172,1178.2685,1135.0721,1172.6136,1134.9236,1181.71,1138.6992" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="59" x="1152" y="1105.4876">no match</text><!--MD5=[8a490629b42afa0a067bde343f0409be]
relay_network - -> relay_class : match
relay_class - - -> found : compatible
relay_class - -> set_address : not compatible
-set_address - -> relay_address : try the relay addreess
+set_address - -> relay_address : try the relay address
relay_address -r-> client_address : has no relay address
-client_address -r-> source_address : has no client addrss
+client_address -r-> source_address : has no client address
source_address - -> interface_subnet : no suitable address
relay_address - -> inRange : has a relay address
client_address - -> inRange : has a client address
-source_address - -> inRange : has source addess and use unicast
+source_address - -> inRange : has source address and use unicast
interface_subnet - - -> not_found : no interface
interface_subnet - -> interface_class : match
interface_subnet - -> interface_network : no match
subnet4_select - -> no_subnet : SKIP or subnet not set
subnet4_select - -> drop : DROP
-@endutl
+@enduml
PlantUML version 1.2020.15(Sun Jun 28 13:39:45 CEST 2020)
(GPL source distribution)
relay_network --> relay_class : match
relay_class ---> found : compatible
relay_class --> set_address : not compatible
-set_address --> relay_address : try the relay addreess
+set_address --> relay_address : try the relay address
relay_address -r-> client_address : has no relay address
-client_address -r-> source_address : has no client addrss
+client_address -r-> source_address : has no client address
source_address --> interface_subnet : no suitable address
relay_address --> inRange : has a relay address
client_address --> inRange : has a client address
-source_address --> inRange : has source addess and use unicast
+source_address --> inRange : has source address and use unicast
interface_subnet ---> not_found : no interface
interface_subnet --> interface_class : match
interface_subnet --> interface_network : no match
subnet4_select --> no_subnet : SKIP or subnet not set
subnet4_select --> drop : DROP
-@endutl
+@enduml
output = ''
t0 = time.time()
t1 = time.time()
- # repeat until process is running or timeout not occured
+ # repeat until process is running or timeout not occurred
while p.poll() is None and (timeout is None or t1 - t0 < timeout):
line = p.stdout.readline()
if line:
log_file.write(line)
t1 = time.time()
- # If no exitcode yet, ie. process is still running then it means that timeout occured.
+ # If no exitcode yet, ie. process is still running then it means that timeout occurred.
# In such case terminate the process and raise an exception.
if p.poll() is None:
# kill using sudo to be able to kill other sudo commands
}
# Verifies that you can upgrade from an earlier version and
-# that all hosts and options from old host_reseravation table (version 3.0) are
+# that all hosts and options from old host_reservation table (version 3.0) are
# converted to new schema (version 4.0) with new key partition key and are
# moved to new hosts table
cql_upgrade_hosts_test() {
qry="$1";shift
exp_value="${1-}" # Optional value. If not given, replace with empty string.
- # Execute the statment
+ # Execute the statement
run_command \
mysql_execute "${qry}"
value="${OUTPUT}"
count="${OUTPUT}"
assert_eq 0 "${EXIT_CODE}" "select scope_id from dhcp6_options failed. (expected status code %d, returned %d)"
- #table: DHCPv4 fixed field colums (upgrade 4.1 -> 5.0)
+ #table: DHCPv4 fixed field columns (upgrade 4.1 -> 5.0)
# verify that hosts table has columns holding values for DHCPv4 fixed fields
qry="select dhcp4_next_server, dhcp4_server_hostname, dhcp4_boot_file_name, auth_key from hosts";
run_command \
qry="$1";shift
exp_value="${1-}" # Optional value. If not given, replace with empty string.
- # Execute the statment
+ # Execute the statement
run_command \
pgsql_execute "${qry}"
value="${OUTPUT}"
/// @brief Creates unfinalized stock HTTP response.
///
- /// The unfinilized response is the response that can't be sent over the
+ /// The unfinalized response is the response that can't be sent over the
/// wire until @c finalize() is called, which commits the contents of the
/// message body.
///
// Check realm
EXPECT_EQ("foobar", basic_auth->getRealm());
- // Check credentails
+ // Check credentials
auto credentials = basic_auth->getCredentialMap();
EXPECT_EQ(2, credentials.size());
std::string user;
ConstElementPtr command = createCommand("foo", service);
ConstElementPtr answer = mgr_.processCommand(command);
- // Stop IO service immediatelly and let the thread die.
+ // Stop IO service immediately and let the thread die.
getIOService()->stop();
// Wait for the thread to finish.
ConstElementPtr answer = mgr_.handleCommand("list-commands", ConstElementPtr(),
command);
- // Stop IO service immediatelly and let the thread die.
+ // Stop IO service immediately and let the thread die.
getIOService()->stop();
// Wait for the thread to finish.
// unknown keyword
testError("{ \"Control-agent\":{\n"
- " \"topping\": \"Mozarella\" }}\n",
+ " \"topping\": \"Mozzarella\" }}\n",
ParserContext::PARSER_AGENT,
"<string>:2.2-10: got unexpected keyword "
"\"topping\" in Control-agent map.");
/// to the NOT_INITTED state. This is provided to support reconfiguring
/// a new listener without losing queued requests.
///
- /// @throw D2QueMgrError if called when the manager state is RUNNING.
+ /// @throw D2QueueMgrError if called when the manager state is RUNNING.
void removeListener();
/// @brief Returns the number of entries in the queue.
///
/// @return Pointer reference to the queue entry.
///
- /// @throw D2QueueMgrQueEmpty if there are no entries in the queue.
+ /// @throw D2QueueMgrQueueEmpty if there are no entries in the queue.
const dhcp_ddns::NameChangeRequestPtr& peek() const;
/// @brief Returns the entry at a given position in the queue.
/// @brief Removes the entry at the front of the queue.
///
- /// @throw D2QueueMgrQueEmpty if there are no entries in the queue.
+ /// @throw D2QueueMgrQueueEmpty if there are no entries in the queue.
void dequeue();
/// @brief Adds a request to the end of the queue.
};
-/// @brief Fixture class intended for testin control channel in D2.
+/// @brief Fixture class intended for testing control channel in D2.
class CtrlChannelD2Test : public ::testing::Test {
public:
isc::test::Sandbox sandbox;
// LeaseMgr uses IO service to run asynchronous timers.
LeaseMgr::setIOService(getIOService());
- // HosrMgr uses IO service to run asynchronous timers.
+ // HostMgr uses IO service to run asynchronous timers.
HostMgr::setIOService(getIOService());
// These are the commands always supported by the DHCPv4 server.
// LeaseMgr uses IO service to run asynchronous timers.
LeaseMgr::setIOService(IOServicePtr());
- // HosrMgr uses IO service to run asynchronous timers.
+ // HostMgr uses IO service to run asynchronous timers.
HostMgr::setIOService(IOServicePtr());
} catch (...) {
// Don't want to throw exceptions from the destructor. The server
/// @brief A handler for processing 'dhcp-disable' command.
///
/// @param command command name (ignored).
- /// @param args aguments for the command. It must be a map and
+ /// @param args arguments for the command. It must be a map and
/// it may include optional 'max-period' parameter.
///
/// @return result of the command.
/// @note The only-if-required flag is related because it avoids
/// double evaluation (which is not forbidden).
///
- /// @param ex The exchange holding needed informations.
+ /// @param ex The exchange holding needed information.
void requiredClassify(Dhcpv4Exchange& ex);
/// @brief Perform deferred option unpacking.
/// @brief Sets global parameters before other parameters are parsed.
///
/// This method sets selected global parameters before other parameters
- /// are parsed. This is important when the bahavior of the parsers
- /// run later depends on these global paramters.
+ /// are parsed. This is important when the behavior of the parsers
+ /// run later depends on these global parameters.
///
/// Currently this method sets the following global parameters:
/// - ip-reservations-unique
/// @brief Check statistics.
///
- /// @param bumped True if pkt4-receive-drop shoud have been bumped by one,
+ /// @param bumped True if pkt4-receive-drop should have been bumped by one,
/// false otherwise.
void checkStat(bool bumped) {
ObservationPtr obs = StatsMgr::instance().getObservation("pkt4-receive-drop");
}
}
- // Apparently we're looking for one that does not prexist.
+ // Apparently we're looking for a new one.
return (TestConfigBackendDHCPv4Ptr(new TestConfigBackendDHCPv4(params)));
});
}
}
}
-// Checks inheritence of calculate-tee-times, t1-perecent, t2-percent
+// Checks inheritence of calculate-tee-times, t1-percent, t2-percent
TEST_F(Dhcp4ParserTest, calculateTeeTimesInheritence) {
// Configure the server. This should succeed.
string config =
response);
}
-// Tests that the server properly responds to shtudown command sent
+// Tests that the server properly responds to shutdown command sent
// via ControlChannel
TEST_F(CtrlChannelDhcpv4SrvTest, controlChannelShutdown) {
createUnixChannelServer();
ASSERT_FALSE(lease1);
}
-// Tests that the server properly responds to shtudown command sent
+// Tests that the server properly responds to shutdown command sent
// via ControlChannel
TEST_F(CtrlChannelDhcpv4SrvTest, listCommands) {
createUnixChannelServer();
IfaceMgr::instance().openSockets4();
// Create configuration for interfaces. It includes the outbound-interface
- // setting which indicates that the responses aren't neccessarily sent
+ // setting which indicates that the responses aren't necessarily sent
// over the same interface via which a request has been received, but routing
// information is used to determine this interface.
CfgMgr::instance().clear();
for (auto test = tests.begin(); test != tests.end(); ++test) {
{
SCOPED_TRACE((*test).description_);
- // Configure sunbet's timer values
+ // Configure subnet's timer values
subnet_->setT1((*test).cfg_t1_);
subnet_->setT2((*test).cfg_t2_);
Triplet<uint32_t> cfg_t1_;
// configured value for subnet's T1
Triplet<uint32_t> cfg_t2_;
- // configured value for sunbet's t1_percent.
+ // configured value for subnet's t1_percent.
double t1_percent_;
- // configured value for sunbet's t2_percent.
+ // configured value for subnet's t2_percent.
double t2_percent_;
// expected value for T1 in server response.
// A value of 0 means server should not have sent T1.
for (auto test = tests.begin(); test != tests.end(); ++test) {
{
SCOPED_TRACE((*test).description_);
- // Configure sunbet's timer values
+ // Configure subnet's timer values
subnet_->setT1((*test).cfg_t1_);
subnet_->setT2((*test).cfg_t2_);
OptionPtr clientid = generateClientId();
dis->addOption(clientid);
- // Set harware address / identifier
+ // Set hardware address / identifier
const HWAddr& hw = HWAddr::fromText("00:00:00:11:22:33");
HWAddrPtr hw_addr(new HWAddr(hw));
dis->setHWAddr(hw_addr);
try {
json = parseJSON(config);
} catch (const std::exception& ex){
- // Fatal falure on parsing error
+ // Fatal failure on parsing error
std::stringstream tmp;
tmp << "parsing failure:"
EXPECT_NO_THROW(status = configureDhcp4Server(srv, json));
EXPECT_TRUE(status);
if (!status) {
- return (make_pair(-1, "configureDhcp4Server didn't return anythin"));
+ return (make_pair(-1, "configureDhcp4Server didn't return anything"));
}
int rcode;
}
if (enable_throw_) {
- isc_throw(Unexpected, "testing if exceptions are corectly handled");
+ isc_throw(Unexpected, "testing if exceptions are correctly handled");
}
}
if (throw_during_fetch) {
expected = "{ \"result\": 1, \"text\": ";
expected += "\"On demand configuration update failed: ";
- expected += "testing if exceptions are corectly handled\" }";
+ expected += "testing if exceptions are correctly handled\" }";
} else {
expected = "{ \"result\": 0, \"text\": ";
expected += "\"On demand configuration update successful.\" }";
typedef enum AuthoritativeFlag {
AUTH_DEFAULT, // explicit value not specified (use default)
AUTH_YES, // defined explicitly as yes
- AUTH_NO // defined explciitly as no
+ AUTH_NO // defined explicitly as no
} AuthoritativeFlag;
/// @brief Returns subnet having specified address in range.
/// - first subnet: authoritative (subnet1 flag here)
/// - second subnet: authoritative (subnet2 flag here)
///
- /// @param global coverns presence/value of global authoritative flag
- /// @param subnet1 coverns presence/value of authoritative flag in subnet1
- /// @param subnet2 coverns presence/value of authoritative flag in subnet2
+ /// @param global governs presence/value of global authoritative flag
+ /// @param subnet1 governs presence/value of authoritative flag in subnet1
+ /// @param subnet2 governs presence/value of authoritative flag in subnet2
string generateAuthConfig(AuthoritativeFlag global, AuthoritativeFlag subnet1,
AuthoritativeFlag subnet2) {
string cfg = "{"
ASSERT_TRUE(resp2);
ASSERT_EQ(DHCPACK, resp2->getType());
- // The lease should get rewnewed.
+ // The lease should get renewed.
EXPECT_EQ(resp2->getYiaddr().toText(), resp1->getYiaddr().toText());
}
// Unfortunately, its definition is blurry, so there are many
// similar, but not exact implementations that do things in
// different ways.
-// vivco (124) - vendor indepdent vendor class option.
+// vivco (124) - vendor independent vendor class option.
// class identifier (60) - not exactly vendor specific. It's a string, but the
// content of that string identifies what kind of vendor device
// this is.
// LeaseMgr uses IO service to run asynchronous timers.
LeaseMgr::setIOService(getIOService());
- // HosrMgr uses IO service to run asynchronous timers.
+ // HostMgr uses IO service to run asynchronous timers.
HostMgr::setIOService(getIOService());
// These are the commands always supported by the DHCPv6 server.
// LeaseMgr uses IO service to run asynchronous timers.
LeaseMgr::setIOService(IOServicePtr());
- // HosrMgr uses IO service to run asynchronous timers.
+ // HostMgr uses IO service to run asynchronous timers.
HostMgr::setIOService(IOServicePtr());
} catch (...) {
// Don't want to throw exceptions from the destructor. The server
/// @brief A handler for processing 'dhcp-disable' command.
///
/// @param command command name (ignored).
- /// @param args aguments for the command. It must be a map and
+ /// @param args arguments for the command. It must be a map and
/// it may include optional 'max-period' parameter.
///
/// @return result of the command.
/// double evaluation (which is not forbidden).
///
/// @param pkt packet to be classified
- /// @param ctx allocation context where to get informations
+ /// @param ctx allocation context where to get information
void requiredClassify(const Pkt6Ptr& pkt, AllocEngine::ClientContext6& ctx);
/// @brief Attempts to get a MAC/hardware address using configured sources
/// @brief Sets global parameters before other parameters are parsed.
///
/// This method sets selected global parameters before other parameters
- /// are parsed. This is important when the bahavior of the parsers
- /// run later depends on these global paramters.
+ /// are parsed. This is important when the behavior of the parsers
+ /// run later depends on these global parameters.
///
/// Currently this method sets the following global parameters:
/// - ip-reservations-unique
/// @brief Check statistics.
///
- /// @param bumped True if pkt6-receive-drop shoud have been bumped by one,
+ /// @param bumped True if pkt6-receive-drop should have been bumped by one,
/// false otherwise.
void checkStat(bool bumped) {
ObservationPtr obs = StatsMgr::instance().getObservation("pkt6-receive-drop");
}
}
- // Apparently we're looking for one that does not prexist.
+ // Apparently we're looking for a new one.
return (TestConfigBackendDHCPv6Ptr(new TestConfigBackendDHCPv6(params)));
});
}
} while (++cnt < 3);
}
-// CHeck that the configuration with two subnets having the same id is rejected.
+// Check that the configuration with two subnets having the same ID is rejected.
TEST_F(Dhcp6ParserTest, multipleSubnetsOverlappingIDs) {
ConstElementPtr x;
// Four subnets, two of them have the same id.
CfgSharedNetworks6Ptr cfg_net = CfgMgr::instance().getStagingCfg()
->getCfgSharedNetworks6();
- // Two shared networks are expeced.
+ // Two shared networks are expected.
ASSERT_TRUE(cfg_net);
const SharedNetwork6Collection* nets = cfg_net->getAll();
ASSERT_TRUE(nets);
CfgSharedNetworks6Ptr cfg_net = CfgMgr::instance().getStagingCfg()
->getCfgSharedNetworks6();
- // Two shared networks are expeced.
+ // Two shared networks are expected.
ASSERT_TRUE(cfg_net);
const SharedNetwork6Collection* nets = cfg_net->getAll();
ASSERT_TRUE(nets);
CfgSharedNetworks6Ptr cfg_net = CfgMgr::instance().getStagingCfg()
->getCfgSharedNetworks6();
- // Two shared networks are expeced.
+ // Two shared networks are expected.
ASSERT_TRUE(cfg_net);
const SharedNetwork6Collection* nets = cfg_net->getAll();
ASSERT_TRUE(nets);
response);
}
-// Tests that the server properly responds to shtudown command sent
+// Tests that the server properly responds to shutdown command sent
// via ControlChannel
TEST_F(CtrlChannelDhcpv6SrvTest, controlChannelShutdown) {
createUnixChannelServer();
response);
}
-// Tests that the server properly responds to shtudown command sent
+// Tests that the server properly responds to shutdown command sent
// via ControlChannel
TEST_F(CtrlChannelDhcpv6SrvTest, listCommands) {
createUnixChannelServer();
namespace dhcp {
namespace test {
-/// @brief Base class for test fixure classes used to validate the DHCPv6
+/// @brief Base class for test fixture classes used to validate the DHCPv6
/// message processing by the server.
class Dhcpv6MessageTest : public Dhcpv6SrvTest {
public:
Triplet<uint32_t> cfg_t2_;
// whether or not calculation is enabled
bool calculate_tee_times;
- // configured value for sunbet's t1_percent.
+ // configured value for subnet's t1_percent.
double t1_percent_;
- // configured value for sunbet's t2_percent.
+ // configured value for subnet's t2_percent.
double t2_percent_;
// expected value for T1 in server response.
// A value of 0 means server should not have sent T1.
for (auto test = tests.begin(); test != tests.end(); ++test) {
{
SCOPED_TRACE((*test).description_);
- // Configure sunbet for the scenario
+ // Configure subnet for the scenario
subnet_->setT1((*test).cfg_t1_);
subnet_->setT2((*test).cfg_t2_);
subnet_->setCalculateTeeTimes((*test).calculate_tee_times);
// This test checks if callout installed on subnet6_select hook point can pick
// a different subnet.
-TEST_F(HooksDhcpv6SrvTest, subnet6SselectChange) {
+TEST_F(HooksDhcpv6SrvTest, subnet6SelectChange) {
// Configure 2 subnets, both directly reachable over local interface
// (let's not complicate the matter with relays)
}
if (enable_throw_) {
- isc_throw(Unexpected, "testing if exceptions are corectly handled");
+ isc_throw(Unexpected, "testing if exceptions are correctly handled");
}
}
if (throw_during_fetch) {
expected = "{ \"result\": 1, \"text\": ";
expected += "\"On demand configuration update failed: ";
- expected += "testing if exceptions are corectly handled\" }";
+ expected += "testing if exceptions are correctly handled\" }";
} else {
expected = "{ \"result\": 0, \"text\": ";
expected += "\"On demand configuration update successful.\" }";
///
/// @param config - text version of the configuration to be tested
/// @param enabled - true = rapid-commit is expected to work
- /// @param exp_addr1 - an eddress the first client is expected to get (if
+ /// @param exp_addr1 - an address the first client is expected to get (if
/// rapid-commit is enabled).
- /// @param exp_addr2 - an eddress the second client is expected to get (if
+ /// @param exp_addr2 - an address the second client is expected to get (if
/// rapid-commit is enabled).
void testRapidCommit(const std::string& config, bool enabled,
const std::string& exp_addr1,
});
ASSERT_TRUE(hasLeaseForAddress(client2, IOAddress("2001:db8:2::20")));
- // Cient #3. It sends Solicit which should result in NoAddrsAvail status
+ // Client #3. It sends Solicit which should result in NoAddrsAvail status
// code because all addresses available for this link have been assigned.
Dhcp6Client client3(client1.getServer());
client3.setInterface("eth1");
// Shared network is selected based on interface id.
TEST_F(Dhcpv6SharedNetworkTest, sharedNetworkSelectedByInterfaceId) {
// Create client #1. This is a relayed client for which interface id
- // has been spefified and this interface id is matching the one specified
+ // has been specified and this interface id is matching the one specified
// for the shared network.
Dhcp6Client client1;
client1.useRelay(true, IOAddress("3001::1"));
// belonging to a shared network.
TEST_F(Dhcpv6SharedNetworkTest, sharedNetworkSelectedByInterfaceIdInSubnet) {
// Create client #1. This is a relayed client for which interface id
- // has been spefified and this interface id is matching the one specified
+ // has been specified and this interface id is matching the one specified
// for the shared network.
Dhcp6Client client1;
client1.useRelay(true, IOAddress("3001::1"));
// Do the actual 4-way exchange.
ASSERT_NO_THROW(client.doSARR());
- // Make sure that we go the expectec number of leases.
+ // Make sure that we go the expected number of leases.
ASSERT_EQ(exp_leases, client.getLeaseNum());
// Simulate aging of leases, by moving their cltt_ back by 1000s.
EXPECT_EQ(2400, actual_t2);
}
-// This test verifies that custom percentags for T1 and T2
+// This test verifies that custom percentages for T1 and T2
// can be used for calculation.
TEST_F(TeeTest, calculateTimers) {
Dhcp6Client client;
fi
}
-# Print Kea daemon verison
+# Print Kea daemon version
print_version() {
name=${1}
binary_path=${2}
# Names for Netconf
NC_CFG_FILE_NAME="nc_test_config.conf"
NC_CFG_FILE="@abs_top_builddir@/src/bin/keactrl/tests/${NC_CFG_FILE_NAME}.json"
-# Configuration files for all deamons.
+# Configuration files for all daemons.
CFG_FILES="kea_dhcp4_config_file=${DHCP4_CFG_FILE}\n\
kea_dhcp6_config_file=${DHCP6_CFG_FILE}\n\
kea_dhcp_ddns_config_file=${D2_CFG_FILE}\n\
/// @brief The boot-update flag.
///
- /// If true (the defaul) Kea server configuration is updated at (netconf
+ /// If true (the default) Kea server configuration is updated at (netconf
/// agent) boot time.
bool boot_update_;
/// @brief The subscribe-changes flag.
///
- /// If true (the deault) the netconf agent subscribes module changes
+ /// If true (the default) the netconf agent subscribes module changes
/// so will be notified when the YANG running configuration is changed.
bool subscribe_changes_;
/// @brief The validate-changes flag.
///
- /// If true (the deault) the netconf agent validates module changes
+ /// If true (the default) the netconf agent validates module changes
/// and can reject bad configurations.
bool validate_changes_;
// unknown keyword
testError("{ \"Netconf\":{\n"
- " \"topping\": \"Mozarella\" }}\n",
+ " \"topping\": \"Mozzarella\" }}\n",
ParserContext::PARSER_NETCONF,
"<string>:2.2-10: got unexpected keyword "
"\"topping\" in Netconf map.");
protected:
CommandOptions& options_; ///< Reference to commandline options.
- TestControl tc_; ///< Object for controling sending and receiving packets.
+ TestControl tc_; ///< Object for controlling sending and receiving packets.
// Helper fields to avoid checking IP version each time an exchange type
// is needed.
// First indicated number of DISCOVER packets eg. 4000 are sent.
// Then in a loop responses to received packets (this is
// consumeReceivedPackets()) are sent and then for every 200ms it is checked
- // if reponses to sent packets were received. If not packets are resent.
+ // if responses to sent packets were received. If not packets are resent.
// This happens in resendPackets() method. For each packet it is checked
// how many times it was already resent and then back off time is calculated:
// 1, 2, 4, 8, 16, 64 (max) seconds. If estimated time has elapsed
// from previous sending then the packet is resent. Some stats are collected
- // and printed during runtime. The whole procedure is stopeed when
- // all packets got reponses.
+ // and printed during runtime. The whole procedure is stoped when
+ // all packets got responses.
uint32_t clients_num = options_.getClientsNum() == 0 ?
1 : options_.getClientsNum();
/// \brief Avalanche Scenario class.
///
/// This class is used to run the performance test where DHCP server
-/// is first loaded with indicated bumer of Discover or Solicit messages
+/// is first loaded with indicated buffer of Discover or Solicit messages
/// and then the class is waiting till receiving all required responses.
/// Full DORA and SARR message sequences are expected.
class AvalancheScen : public AbstractScen {
/// \brief Returns time to wait for elapsed time increase.
///
- /// \return how long perfdhp will wait before start sending
+ /// \return how long perfdhcp will wait before start sending
/// messages with increased elapsed time.
int getWaitForElapsedTime() const { return wait_for_elapsed_time_; }
/// Test period in seconds.
int period_;
- // for how long perfdhcp will wait before start senging
+ // for how long perfdhcp will wait before start sending
// messages with increased elapsed time.
int wait_for_elapsed_time_;
PktPtr pkt;
uint32_t timeout;
if (single_threaded_) {
- // In case of single thread just check socket and if empty exit immediatelly
+ // In case of single thread just check socket and if empty exit immediately
// to not slow down sending part.
timeout = 0;
} else {
// In case of multi thread wait for packets a little bit (1ms) as it is run
- // in separate thread and do not interefere with sending thread.
+ // in separate thread and do not interfere with sending thread.
timeout = 1000;
}
try {
namespace isc {
namespace perfdhcp {
-/// \brief A receviving DHCP packets class.
+/// \brief A receiving DHCP packets class.
///
/// Receiver can be used in two modes: single-thread and multi-thread.
///
/// In single-thread mode the class directly reads packets from socket
/// and returns them to consumer using getPkt method.
///
-/// In case of multi-thread mode the class starts a thread in backgroud.
+/// In case of multi-thread mode the class starts a thread in the background.
/// The thread reads the packets and pushes them to pkt_queue_. Then
/// in main thread packets can be consumed from the queue using getPkt
/// method.
as.run();
- // Check if basic exchange of packets happend. No retransmissions expected.
+ // Check if basic exchange of packets happened. No retransmissions expected.
EXPECT_EQ(as.total_resent_, 0);
EXPECT_EQ(as.fake_sock_.sent_cnt_, 20); // Discovery + Request
EXPECT_EQ(as.tc_.getStatsMgr().getSentPacketsNum(ExchangeType::DO), 10);
as.run();
- // Check if DO exchange of packets happend only. No retransmissions expected.
+ // Check if DO exchange of packets happened only. No retransmissions expected.
EXPECT_EQ(as.total_resent_, 0);
EXPECT_EQ(as.fake_sock_.sent_cnt_, 10); // Discovery + Request
EXPECT_EQ(as.tc_.getStatsMgr().getSentPacketsNum(ExchangeType::DO), 10);
as.fake_sock_.initial_drops_cnt_ = 2;
as.run();
- // Check if basic exchange of packets happend. No retransmissions expected.
+ // Check if basic exchange of packets happened. No retransmissions expected.
EXPECT_EQ(as.total_resent_, 2);
EXPECT_EQ(as.fake_sock_.sent_cnt_, 22); // Discovery + Request
EXPECT_EQ(as.tc_.getStatsMgr().getSentPacketsNum(ExchangeType::DO), 10);
as.run();
- // Check if basic exchange of packets happend. No retransmissions expected.
+ // Check if basic exchange of packets happened. No retransmissions expected.
EXPECT_EQ(as.total_resent_, 0);
EXPECT_GE(as.fake_sock_.sent_cnt_, 20); // Solicit + Request
EXPECT_GE(as.tc_.getStatsMgr().getSentPacketsNum(ExchangeType::SA), 10);
as.run();
- // Check if SA exchange of packets happend only. No retransmissions expected.
+ // Check if SA exchange of packets happened only. No retransmissions expected.
EXPECT_EQ(as.total_resent_, 0);
EXPECT_GE(as.fake_sock_.sent_cnt_, 10); // Solicit + Request
EXPECT_GE(as.tc_.getStatsMgr().getSentPacketsNum(ExchangeType::SA), 10);
as.fake_sock_.initial_drops_cnt_ = 2;
as.run();
- // Check if basic exchange of packets happend. No retransmissions expected.
+ // Check if basic exchange of packets happened. No retransmissions expected.
EXPECT_EQ(as.total_resent_, 2);
EXPECT_EQ(as.fake_sock_.sent_cnt_, 22); // Discovery + Request
EXPECT_EQ(as.tc_.getStatsMgr().getSentPacketsNum(ExchangeType::SA), 10);
tc.setTransidGenerator(generator);
for (int i = 0; i < iterations_num; ++i) {
// Get next transaction id, without actually using it. The same
- // id wll be used by the TestControl class for DHCPDISCOVER.
+ // id will be used by the TestControl class for DHCPDISCOVER.
uint32_t transid = generator->getNext();
if (use_templates) {
tc.sendDiscover4(tc.getTemplateBuffer(0));
// Test checks if sendDiscover really includes custom options
TEST_F(TestControlTest, sendDiscoverExtraOpts) {
- // Important paramters here:
+ // Important parameters here:
// -xT - save first packet of each type for templates (useful for packet inspection)
// -o 200,abcdef1234 - send option 200 with hex content: ab:cd:ef:12:34
// -o 201,00 - send option 201 with hex content: 00
// Test checks if regular packet exchange inserts the extra v4 options
// specified on command line.
TEST_F(TestControlTest, Packet4ExchangeExtraOpts) {
- // Important paramters here:
+ // Important parameters here:
// -xT - save first packet of each type for templates (useful for packet inspection)
// -o 200,abcdef1234 - send option 200 with hex content: ab:cd:ef:12:34
// -o 201,00 - send option 201 with hex content: 00
// Test checks if regular packet exchange inserts the extra v6 options
// specified on command line.
TEST_F(TestControlTest, Packet6ExchangeExtraOpts) {
- // Important paramters here:
+ // Important parameters here:
// -xT - save first packet of each type for templates (useful for packet inspection)
// -o 200,abcdef1234 - send option 200 with hex content: ab:cd:ef:12:34
// -o 201,00 - send option 201 with hex content: 00
// Test checks if multiple v4 PRL options can be sent. They should be merged
// into a single PRL option by perfdhcp.
TEST_F(TestControlTest, sendDiscoverMultiplePRLs) {
- // Important paramters here:
+ // Important parameters here:
// -o 55,1234 - send option 55 with hex content '1234'
// -o 55,abcd - send option 55 with hex content 'abcd'
CommandOptions opt;
help='Timeout (in seconds) when attempting to '
'connect to CA (default: 10)')
parser.add_argument('--service', nargs="?", action="append",
- help='target spcified service. If not specified,'
+ help='target specified service. If not specified,'
'control agent will receive command.')
parser.add_argument('--auth-user', type=auth8, default='',
help='Basic HTTP authentication user')
/// @brief Parse an option config.
///
/// @param option The element with option config.
- /// @throw BadValue and similar exceptionson error.
+ /// @throw BadValue and similar exceptions on error.
void parseOptionConfig(isc::data::ConstElementPtr option);
};
/// It must also run @c poke when the lease update is successful.
///
/// The @c poke method sets the "last poke time" to current time, thus
-/// indicating that the connection is healty. The @c getDurationInMillisecs
+/// indicating that the connection is healthy. The @c getDurationInMillisecs
/// method is used to check for how long the server hasn't been able
/// to communicate with the partner. This duration is simply a time
/// elapsed since last successful poke time. If this duration becomes
///
/// This method checks if the communication with the partner appears
/// to be interrupted. This is the case when the time since last
- /// successful communication is longer than the confgured
+ /// successful communication is longer than the configured
/// max-response-delay value.
///
/// @return true if communication is interrupted, false otherwise.
/// Returning true in that case simplifies the code of the
/// @c HAService which doesn't need to check if the failure detection
/// is enabled or not. It simply calls this method in the
- /// 'communications interrupted' situtation to check if the
+ /// 'communications interrupted' situation to check if the
/// server should be transitioned to the 'partner-down' state.
///
/// @return true if the partner failure has been detected, false
/// will reset the gating counter.
///
/// @return true if the warning message should be logged because of the clock
- /// skew exceeding a warning thresdhold.
+ /// skew exceeding a warning threshold.
bool clockSkewShouldWarn();
/// @brief Indicates whether the HA service should enter "terminated"
- Monitoring the clocks skew between the active servers, which is
calculated by substracting the current time (on the local
server) from the time returned by the partner in response to the
- heartbeat comand.
+ heartbeat command.
The large part of this class is common for the DHCPv4 and DHCPv6 servers.
However, there are differences in how the DHCPv4 and the DHCPv6 messages
return (0);
}
-/// @brief comand_processed callout implementation.
+/// @brief command_processed callout implementation.
///
/// @param handle callout handle.
int command_processed(CalloutHandle& handle) {
HAConfig::PeerConfigPtr
HAConfig::selectNextPeerConfig(const std::string& name) {
- // Check if there is a configuration for this server name alrady. We can't
+ // Check if there is a configuration for this server name already. We can't
// have two servers with the same name.
if (peers_.count(name) > 0) {
isc_throw(BadValue, "peer with name '" << name << "' already specified");
return (pausing_);
}
- /// @brief Sets pausing mode for the gievn state.
+ /// @brief Sets pausing mode for the given state.
///
/// @param pausing new pausing mode in the textual form. Supported
/// values are: always, never, once.
/// @brief Sets new lease database syncing timeout in milliseconds.
///
- /// @param sync_timeout new timeout for lease database synchornization.
+ /// @param sync_timeout new timeout for lease database synchronization.
void setSyncTimeout(const uint32_t sync_timeout) {
sync_timeout_ = sync_timeout;
}
/// @brief Constructor.
HAImpl();
- /// @brief Parases configuration.
+ /// @brief Parses configuration.
///
/// @param input_config Configuration specified for the hooks library.
/// @throw ConfigError when configuration fails.
% HA_LEASES_BACKLOG_FAILED failed to send lease updates backlog to %1: %2
This error message is issued to indicate that sending lease updates backlog
to a partner server failed. The lease updates backlog is sent to the partner
-after resuming tremporarily broken communication with the partner. If this
+after resuming temporarily broken communication with the partner. If this
operation fails the server will transition to the waiting state to initiate
full lease database synchronization.
const HttpResponsePtr& response,
const std::string& error_str) {
- // There are three possible groups of errors during the heartneat.
+ // There are three possible groups of errors during the heartbeat.
// One is the IO error causing issues in communication with the peer.
// Another one is an HTTP parsing error. The last type of error is
// when non-success error code is returned in the response carried
const HttpResponsePtr& response,
const std::string& error_str) {
- // There are three possible groups of errors during the heartneat.
+ // There are three possible groups of errors during the heartbeat.
// One is the IO error causing issues in communication with the peer.
// Another one is an HTTP parsing error. The last type of error is
// when non-success error code is returned in the response carried
const HttpResponsePtr& response,
const std::string& error_str) {
- // There are three possible groups of errors during the heartneat.
+ // There are three possible groups of errors during the heartbeat.
// One is the IO error causing issues in communication with the peer.
// Another one is an HTTP parsing error. The last type of error is
// when non-success error code is returned in the response carried
// page was hit, this value remains null.
LeasePtr last_lease;
- // There are three possible groups of errors during the heartneat.
+ // There are three possible groups of errors during the heartbeat.
// One is the IO error causing issues in communication with the peer.
// Another one is an HTTP parsing error. The last type of error is
// when non-success error code is returned in the response carried
return (createAnswer(CONTROL_RESULT_ERROR, "Unable to transition to the"
" partner-in-maintenance state. The partner server responded"
" with the following message to the ha-maintenance-notify"
- " commmand: " + captured_error_message + "."));
+ " command: " + captured_error_message + "."));
}
return (createAnswer(CONTROL_RESULT_ERROR,
"Unable to cancel maintenance. The partner server responded"
" with the following message to the ha-maintenance-notify"
- " commmand: " + error_message + "."));
+ " command: " + error_message + "."));
}
// Successfully reverted partner's state. Let's also revert our state to the
HAService::clientConnectHandler(const boost::system::error_code& ec, int tcp_native_fd) {
// If things look ok register the socket with Interface Manager. Note
- // we don't register if the FD is < 0 to avoid an expection throw.
+ // we don't register if the FD is < 0 to avoid an exception throw.
// It is unlikely that this will occur but we want to be liberal
// and avoid issues.
if ((!ec || (ec.value() == boost::asio::error::in_progress))
/// Lease database synchronization failed.
static const int HA_SYNCING_FAILED_EVT = SM_DERIVED_EVENT_MIN + 3;
- /// Lease database synchroniation succeeded.
+ /// Lease database synchronization succeeded.
static const int HA_SYNCING_SUCCEEDED_EVT = SM_DERIVED_EVENT_MIN + 4;
/// ha-maintenance-notify command received.
/// This indicates that the HA service is disabled, typically as a result
/// of an unrecoverable error such as detecting that clocks skew between
/// the active HA servers being too large. This situation requires
- /// manual intervation of an administrator. When the problem is corrected,
+ /// manual intervention of an administrator. When the problem is corrected,
/// the HA service needs to be restarted.
///
/// @note Currently, restarting the HA service requires restarting the
/// @brief Sends lease updates from backlog to partner asynchronously.
///
- /// This method checks if there are any outstanding DHCPv4 or DHCOPv6 leases
+ /// This method checks if there are any outstanding DHCPv4 or DHCPv6 leases
/// in the backlog and schedules asynchronous sends of these leases. In
/// DHCPv6 case it sends a single lease6-bulk-apply command with all
/// outstanding leases. In DHCPv4 case, it sends lease4-update or lease4-delete
/// This command attempts to tramsition the server to the in-maintenance state
/// if the cancel flag is set to false. Such transition is not allowed if
/// the server is currently in one of the following states:
- /// - backup: becase maintenance is not supported for backup servers,
+ /// - backup: because maintenance is not supported for backup servers,
/// - partner-in-maintenance: because only one server is in maintenance while
/// the partner must be in parter-in-maintenance state,
/// - terminated: because the only way to resume HA service is by shutting
/// canceled with this operation. If it is set to false the maintenance
/// is being started.
///
- /// @return Pointer to the reponse to the ha-maintenance-notify.
+ /// @return Pointer to the response to the ha-maintenance-notify.
data::ConstElementPtr processMaintenanceNotify(const bool cancel);
/// @brief Processes ha-maintenance-start command and returns a response.
/// previous state. It effectively means canceling the request for
/// maintenance signaled with the ha-maintenance-start command.
///
- /// In some cases canceling the maintenace is no longer possible, e.g.
+ /// In some cases canceling the maintenance is no longer possible, e.g.
/// if the server has already got into the partner-down state. Generally,
/// canceling the maintenance is only possible if this server is in the
/// partner-in-maintenance state and the partner is in the in-maintenance
///
/// We do this in case the other peer closed the socket (e.g. idle timeout),
/// as this will cause the socket to appear ready to read to the
- /// IfaceMgr::select(). If this happens while no transcations are
- /// in progess, we won't have anything to deal with the socket event.
+ /// IfaceMgr::select(). If this happens while no transactions are
+ /// in progress, we won't have anything to deal with the socket event.
/// This causes IfaceMgr::select() to endlessly interrupt on the socket.
///
/// @param tcp_native_fd socket descriptor of the ready socket
/// @brief Holds the queue size limit.
size_t limit_;
- /// @brief Remebers whether the queue was overflown.
+ /// @brief Remembers whether the queue was overflown.
bool overflown_;
/// @brief Actual queue of lease updates and their types.
return (service_->pendingRequestSize() == 0);
}));
- // Only if we wait for lease updates to complete it makes senst to test
+ // Only if we wait for lease updates to complete it makes sense to test
// that the packet was either dropped or unparked.
if (num_updates > 0) {
// Try to drop the packet. We expect that the packet has been already
});
// The servers are configured to return success but the server 2 is offline
- // so the heartbeat should be unsuccessul.
+ // so the heartbeat should be unsuccessful.
ASSERT_NO_FATAL_FAILURE(testRecurringHeartbeat(CONTROL_RESULT_SUCCESS, false));
// Server 2 is offline so it would be very weird if it received any command.
}
// Modify cltt of the first lease. This lease should be updated as a result
- // of synchrnonization process because cltt is checked and the lease is
+ // of synchronization process because cltt is checked and the lease is
// updated if the cltt of the fetched lease is later than the cltt of the
// existing lease.
++leases4_[0]->cltt_;
++leases4_[1]->subnet_id_ = 0;
// Modify the partner's lease cltt so it is earlier than the local lease.
- // Therfore, this lease update should be rejected.
+ // Therefore, this lease update should be rejected.
--leases4_[2]->cltt_;
// Create HA configuration.
}
// Modify cltt of the first lease. This lease should be updated as a result
- // of synchrnonization process because cltt is checked and the lease is
+ // of synchronization process because cltt is checked and the lease is
// updated if the cltt of the fetched lease is later than the cltt of the
// existing lease.
++leases4_[0]->cltt_;
++leases4_[1]->subnet_id_ = 0;
// Modify the partner's lease cltt so it is earlier than the local lease.
- // Therfore, this lease update should be rejected.
+ // Therefore, this lease update should be rejected.
--leases4_[2]->cltt_;
// Create HA configuration.
}
// Modify cltt of the first lease. This lease should be updated as a result
- // of synchrnonization process because cltt is checked and the lease is
+ // of synchronization process because cltt is checked and the lease is
// updated if the cltt of the fetched lease is later than the cltt of the
// existing lease.
++leases6_[0]->cltt_;
++leases6_[1]->subnet_id_ = 0;
// Modify the partner's lease cltt so it is earlier than the local lease.
- // Therfore, this lease update should be rejected.
+ // Therefore, this lease update should be rejected.
--leases6_[2]->cltt_;
// Create HA configuration.
}
// Modify cltt of the first lease. This lease should be updated as a result
- // of synchrnonization process because cltt is checked and the lease is
+ // of synchronization process because cltt is checked and the lease is
// updated if the cltt of the fetched lease is later than the cltt of the
// existing lease.
++leases6_[0]->cltt_;
++leases6_[1]->subnet_id_ = 0;
// Modify the partner's lease cltt so it is earlier than the local lease.
- // Therfore, this lease update should be rejected.
+ // Therefore, this lease update should be rejected.
--leases6_[2]->cltt_;
// Create HA configuration.
checkAnswer(rsp, CONTROL_RESULT_ERROR,
"Unable to transition to the partner-in-maintenance state."
" The partner server responded with the following message"
- " to the ha-maintenance-notify commmand: response returned,"
+ " to the ha-maintenance-notify command: response returned,"
" error code 1001.");
// The partner's state precludes entering the in-maintenance state. Thus, this
checkAnswer(rsp, CONTROL_RESULT_ERROR,
"Unable to cancel maintenance. The partner server responded"
" with the following message to the ha-maintenance-notify"
- " commmand: response returned, error code 1.");
+ " command: response returned, error code 1.");
// The state of this server should not change.
EXPECT_EQ(HA_PARTNER_IN_MAINTENANCE_ST, service.getCurrState());
checkAnswer(rsp, CONTROL_RESULT_ERROR,
"Unable to cancel maintenance. The partner server responded"
" with the following message to the ha-maintenance-notify"
- " commmand: Unauthorized, error code 1.");
+ " command: Unauthorized, error code 1.");
// The state of this server should not change.
EXPECT_EQ(HA_PARTNER_IN_MAINTENANCE_ST, service.getCurrState());
HAConfigPtr config_storage = createValidConfiguration();
TestHAService service(io_service_, network_state_, config_storage);
- // Transion the server to the load-balancing state.
+ // Transition the server to the load-balancing state.
EXPECT_NO_THROW(service.transition(HA_LOAD_BALANCING_ST, HAService::NOP_EVT));
// Process ha-reset command that should cause the server to transition
HAConfigPtr config_storage = createValidConfiguration();
TestHAService service(io_service_, network_state_, config_storage);
- // Transion the server to the load-balancing state.
+ // Transition the server to the load-balancing state.
EXPECT_NO_THROW(service.transition(HA_WAITING_ST, HAService::NOP_EVT));
// Process ha-reset command that should not change the state of the
// 4. Partner shows up and eventually transitions to the ready state.
// 5. I can communicate with the partner so I transition to the hot-standby
// state as a standby server.
-// 6. Patrtner stops responding again.
+// 6. Partner stops responding again.
// 7. I monitor communication with the partner and eventually consider the
// communication to be interrupted.
// 8. I start monitoring the DHCP traffic directed to the partner and observe
EXPECT_EQ(HA_WAITING_ST, service_->getCurrState());
- // WAITING state: no heartbeat reponse for a long period of time.
+ // WAITING state: no heartbeat response for a long period of time.
ASSERT_NO_FATAL_FAILURE(waitForEvent(HAService::HA_HEARTBEAT_COMPLETE_EVT));
simulateNoCommunication();
ASSERT_TRUE(isDoingHeartbeat());
});
// READY state: our partner sees that we're ready so it will start to
- // synchronize. We reamain the READY state as long as the partner is not
+ // synchronize. We remain in the READY state as long as the partner is not
// ready.
partner.transition("syncing");
ASSERT_NO_FATAL_FAILURE(waitForEvent(HAService::HA_HEARTBEAT_COMPLETE_EVT));
HAConfig::LOAD_BALANCING) const;
/// @brief Return HA configuration with one primary and two backup
- /// serveers in the JSON format.
+ /// servers in the JSON format.
///
/// @return Pointer to the unparsed configuration.
data::ConstElementPtr
// The 'hw-address' argument is a string.
if (hw_address->getType() != Element::string) {
- isc_throw(BadValue, "'hw-address'parameter must be a string");
+ isc_throw(BadValue, "'hw-address' parameter must be a string");
}
HWAddr hwaddr = HWAddr::fromText(hw_address->stringValue());
// The 'client-id' argument is a string.
if (client_id->getType() != Element::string) {
- isc_throw(BadValue, "'client-id'parameter must be a string");
+ isc_throw(BadValue, "'client-id' parameter must be a string");
}
ClientIdPtr clientid = ClientId::fromText(client_id->stringValue());
// The 'duid' argument is a string.
if (duid->getType() != Element::string) {
- isc_throw(BadValue, "'duid'parameter must be a string");
+ isc_throw(BadValue, "'duid' parameter must be a string");
}
DUID duid_ = DUID::fromText(duid->stringValue());
// The 'hostname' argument is a string.
if (hostname->getType() != Element::string) {
- isc_throw(BadValue, "'hostname'parameter must be a string");
+ isc_throw(BadValue, "'hostname' parameter must be a string");
}
std::string hostname_ = hostname->stringValue();
///
/// Creates a lease manager (memfile, trimmed down to keep everything in memory
/// only) and optionally can create a lease, which is useful for leaseX-get and
- /// leasex-del type of tests. For lease details, see @ref createLease4 and
+ /// leaseX-del type of tests. For lease details, see @ref createLease4 and
/// @ref createLease6.
///
/// @param v6 true = v6, false = v4
" }"
"}";
- // For the first two pages we shuould get success. For the last
+ // For the first two pages we should get success. For the last
// one an empty status code.
ConstElementPtr rsp;
if (i < 2) {
" }"
"}";
- // For the first two pages we shuould get success. For the last
+ // For the first two pages we should get success. For the last
// one an empty status code.
ConstElementPtr rsp;
if (i < 2) {
" \"hw-address\": 1234\n"
" }\n"
"}";
- exp_rsp = "'hw-address'parameter must be a string";
+ exp_rsp = "'hw-address' parameter must be a string";
testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
// Simply bad value.
" \"client-id\": 1234\n"
" }\n"
"}";
- exp_rsp = "'client-id'parameter must be a string";
+ exp_rsp = "'client-id' parameter must be a string";
testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
// Simply bad value.
" \"duid\": 1234\n"
" }\n"
"}";
- exp_rsp = "'duid'parameter must be a string";
+ exp_rsp = "'duid' parameter must be a string";
testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
// Simply bad value.
" \"hostname\": 1234\n"
" }\n"
"}";
- exp_rsp = "'hostname'parameter must be a string";
+ exp_rsp = "'hostname' parameter must be a string";
testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
// hostname must be not empty.
" \"hostname\": 1234\n"
" }\n"
"}";
- exp_rsp = "'hostname'parameter must be a string";
+ exp_rsp = "'hostname' parameter must be a string";
testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
// hostname must be not empty.
/// @param subnet_id Identifier of the subnet the option belongs to.
/// @param option Pointer to the option descriptor encapsulating the option.
/// @param cascade_update Boolean value indicating whether the update is
- /// performed as part of the ownining element, e.g. subnet.
+ /// performed as part of the owning element, e.g. subnet.
void createUpdateOption4(const ServerSelector& server_selector,
const SubnetID& subnet_id,
const OptionDescriptorPtr& option,
/// @param pool_id Identifier of the pool the option belongs to.
/// @param option Pointer to the option descriptor encapsulating the option.
/// @param cascade_update Boolean value indicating whether the update is
- /// performed as part of the ownining element, e.g. subnet.
+ /// performed as part of the owning element, e.g. subnet.
void createUpdateOption4(const ServerSelector& server_selector,
const uint64_t pool_id,
const OptionDescriptorPtr& option,
/// belongs to.
/// @param option Pointer to the option descriptor encapsulating the option.
/// @param cascade_update Boolean value indicating whether the update is
- /// performed as part of the ownining element, e.g. shared network.
+ /// performed as part of the owning element, e.g. shared network.
void createUpdateOption4(const ServerSelector& server_selector,
const std::string& shared_network_name,
const OptionDescriptorPtr& option,
/// @param subnet_id Identifier of the subnet the option belongs to.
/// @param option Pointer to the option descriptor encapsulating the option.
/// @param cascade_update Boolean value indicating whether the update is
- /// performed as part of the ownining element, e.g. subnet.
+ /// performed as part of the owning element, e.g. subnet.
void createUpdateOption6(const ServerSelector& server_selector,
const SubnetID& subnet_id,
const OptionDescriptorPtr& option,
/// the option belongs to.
/// @param option Pointer to the option descriptor encapsulating the option.
/// @param cascade_update Boolean value indicating whether the update is
- /// performed as part of the ownining element, e.g. subnet.
+ /// performed as part of the owning element, e.g. subnet.
void createUpdateOption6(const ServerSelector& server_selector,
const Lease::Type& pool_type,
const uint64_t pool_id,
/// belongs to.
/// @param option Pointer to the option descriptor encapsulating the option.
/// @param cascade_update Boolean value indicating whether the update is
- /// performed as part of the ownining element, e.g. shared network.
+ /// performed as part of the owning element, e.g. shared network.
void createUpdateOption6(const ServerSelector& server_selector,
const std::string& shared_network_name,
const OptionDescriptorPtr& option,
/// revision.
/// @param log_message log message to be used for the audit revision.
/// @param cascade_transaction Boolean value indicating whether the
- /// configuration modification is performed as part of the ownining
+ /// configuration modification is performed as part of the owning
/// element modification, e.g. subnet is modified resulting in
/// modification of the DHCP options it owns. In that case only the
/// audit entry for the owning element should be created.
EXPECT_EQ(subnet->toElement()->str(), returned_subnet->toElement()->str());
// Fetching the subnet for an explicitly specified server tag should
- // succeeed too.
+ // succeed too.
returned_subnet = cbptr_->getSubnet4(ServerSelector::ONE("server1"),
"192.0.2.0/24");
EXPECT_EQ(subnet->toElement()->str(), returned_subnet->toElement()->str());
TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateSharedNetwork4) {
auto shared_network = test_networks_[0];
- // An attempto insert the shared network for non-existing server should fail.
+ // An attempt to insert the shared network for non-existing server should fail.
EXPECT_THROW(cbptr_->createUpdateSharedNetwork4(ServerSelector::ONE("server1"),
shared_network),
NullKeyError);
EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork4(ServerSelector::ALL(), test_networks_[0]));
EXPECT_EQ(4, countRows("dhcp4_options"));
- // Delete this shared netwiork. This should not affect the option associated
+ // Delete this shared network. This should not affect the option associated
// with the remaining shared network.
EXPECT_NO_THROW(cbptr_->deleteSharedNetwork4(ServerSelector::ALL(),
test_networks_[0]->getName()));
++updates_num;
} else {
- SCOPED_TRACE("CREATE audit entry for the option defnition " + name);
+ SCOPED_TRACE("CREATE audit entry for the option definition " + name);
testNewAuditEntry("dhcp4_option_def",
AuditEntry::ModificationType::CREATE,
"option definition set");
EXPECT_EQ(subnet->toElement()->str(), returned_subnet->toElement()->str());
// Fetching the subnet for an explicitly specified server tag should
- // succeeed too.
+ // succeed too.
returned_subnet = cbptr_->getSubnet6(ServerSelector::ONE("server1"),
"2001:db8::/64");
EXPECT_EQ(subnet->toElement()->str(), returned_subnet->toElement()->str());
TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateSharedNetwork6) {
auto shared_network = test_networks_[0];
- // An attempto insert the shared network for non-existing server should fail.
+ // An attempt to insert the shared network for non-existing server should fail.
EXPECT_THROW(cbptr_->createUpdateSharedNetwork6(ServerSelector::ONE("server1"),
shared_network),
NullKeyError);
EXPECT_FALSE(network->hasServerTag(ServerTag()));
}
-// Test that craeteUpdateSharedNetwork6 throws appropriate exceptions for various
+// Test that createUpdateSharedNetwork6 throws appropriate exceptions for various
// server selectors.
TEST_F(MySqlConfigBackendDHCPv6Test, createUpdateSharedNetwork6Selectors) {
ASSERT_NO_THROW(cbptr_->createUpdateServer6(test_servers_[0]));
EXPECT_NO_THROW(cbptr_->createUpdateSharedNetwork6(ServerSelector::ALL(), test_networks_[0]));
EXPECT_EQ(4, countRows("dhcp6_options"));
- // Delete this shared netwiork. This should not affect the option associated
+ // Delete this shared network. This should not affect the option associated
// with the remaining shared network.
EXPECT_NO_THROW(cbptr_->deleteSharedNetwork6(ServerSelector::ALL(),
test_networks_[0]->getName()));
/// @ref isc::stat_cmds::StatCmds::statLease4GetHandler
///
/// It parses the command arguments, and then invokes makeResult4()
- /// to fulfull the lease4 statistics fetch. It then constructs the outbound
+ /// to fulfil the lease4 statistics fetch. It then constructs the outbound
/// response based on those results. If a NotFound exception is caught,
/// a CONTROL_RESULT_EMTPY response is generated.
///
/// @ref isc::stat_cmds::StatCmds::statLease6GetHandler
///
/// It parses the command arguments, and then invokes makeResult6()
- /// to fulfull the lease6 statistics fetch. It then constructs the outbound
+ /// to fulfil the lease6 statistics fetch. It then constructs the outbound
/// response based on those results. If a NotFound exception is caught,
/// a CONTROL_RESULT_EMTPY response is generated.
///
// If we expect nothing and nothing is what we got, we're done.
if (exp_args->size() == 0) {
ASSERT_TRUE(actual_args->size() == 0)
- << "Acutal args should be empty:" << toJSON(actual_args);
+ << "Actual args should be empty:" << toJSON(actual_args);
return;
}
"}\n"
},
{
- "ALL-Subnets6 arugments omitted",
+ "ALL-Subnets6 arguments omitted",
"{\n"
" \"command\": \"stat-lease6-get\"\n"
"}",
return (addr);
}
- // If this is IPv4 addrss we utilize the conversion to uint32_t.
+ // If this is an IPv4 address, then we utilize the conversion to uint32_t.
if (addr.isV4()) {
auto addr_uint32 = static_cast<uint64_t>(addr.toUint32());
// If the result would exceed the maximum possible IPv4 address, let's return
IOAddress addr2("2001::");
- // These are tricker, though, as they are done in 1 bit increments
+ // These are trickier, though, as they are done in 1 bit increments
// the last address in 2001::/127 pool should be 2001::1
EXPECT_EQ("2001::1", lastAddrInPrefix(addr2, 127).toText());
IOAddress addr2("2001::ffff");
- // These are tricker, though, as they are done in 1 bit increments
+ // These are trickier, though, as they are done in 1 bit increments
// the first address in 2001::/127 pool should be 2001::1
EXPECT_EQ("2001::fffe", firstAddrInPrefix(addr2, 127).toText());
/// Opens the UDP socket. This is a synchronous operation.
///
/// \param endpoint Endpoint to which the socket will send data. This is
- /// used to determine the address family trhat should be used for the
+ /// used to determine the address family that should be used for the
/// underlying socket.
/// \param callback Unused as the operation is synchronous.
virtual void open(const IOEndpoint* endpoint, C& callback);
timestamp_ = timestamp;
}
- /// @brief Sets timestmp to the current time.
+ /// @brief Sets timestamp to the current time.
void updateModificationTime();
/// @brief Returns timestamp.
/// @brief Set the callout argument "response" to the given response
///
/// @param handle Callout context handle in which to set the "response" argument
- /// @param response ElementPtr to a the result to use as the reponse
+ /// @param response ElementPtr to a the result to use as the response
void setResponse(hooks::CalloutHandle& handle, data::ConstElementPtr& response) {
handle.setArgument ("response", response);
}
/// Kea server, e.g. DHCP server.
///
/// This value is high to ensure that the server have enough time
-/// to generate large responses, e.g. dump whole lease databse.
+/// to generate large responses, e.g. dump whole lease database.
constexpr long TIMEOUT_AGENT_FORWARD_COMMAND = 60000;
/// @brief Timeout for the HTTP clients awaiting a response to a request.
///
/// This value is high to ensure that the client waits long enough
/// for the fulfilling server to generate a response. Specified
-/// milliseconds.
+/// milliseconds.
constexpr long TIMEOUT_DEFAULT_HTTP_CLIENT_REQUEST = 10000;
CassFuture* close_future = cass_session_close(session_);
cass_future_wait(close_future);
error = checkFutureError(
- "CqlConnection::~CqlConnection(): cass_sesssion_close() != CASS_OK",
+ "CqlConnection::~CqlConnection(): cass_session_close() != CASS_OK",
close_future);
rc = cass_future_error_code(close_future);
cass_future_free(close_future);
stream << "Session action ";
}
if (cass_error == CASS_OK) {
- stream << " executed succesfully.";
+ stream << " executed successfully.";
} else {
stream << " failed, Kea error: " << what
<< ", Cassandra error code: " << cass_error_desc(cass_error)
/// @brief Binds a C++ object to a Cassandra statement's parameter. Used in all
/// statements.
-/// @param value the value to be set or retreived
+/// @param value the value to be set or retrieved
/// @param index offset of the value being processed
/// @param statement pointer to the parent statement being used
typedef CassError (*CqlBindFunction)(const boost::any& value,
CassStatement* statement);
/// @brief Sets a member in a UDT. Used in INSERT & UPDATE statements.
-/// @param value the value to be set or retreived
+/// @param value the value to be set or retrieved
/// @param index offset of the value being processed
/// @param cass_user_type pointer to the user type that uses this member
typedef CassError (*CqlUdtSetFunction)(const boost::any& value,
/// @param column_count number of columns queried
///
/// On insert, a false [applied] means there is a duplicate entry with the
- /// same priumary key.
+ /// same primary key.
///
- /// @return true if statement has been succesfully applied, false otherwise
+ /// @return true if statement has been successfully applied, false otherwise
bool statementApplied(CassFuture* future, size_t* row_count = NULL,
size_t* column_count = NULL);
void
destroyCqlSchema(bool show_err, bool force) {
- // If force is true or wipeCqlData() fails, destory the schema.
+ // If force is true or wipeCqlData() fails, destroy the schema.
if (force || (!softWipeEnabled()) || wipeCqlData(show_err)) {
runCqlScript(DATABASE_SCRIPTS_DIR, "cql/dhcpdb_drop.cql", show_err);
}
///
/// Cassandra have a concept of mutation (any statement that does change the
/// data, like INSERT, UPDATE or DELETE). Under certain conditions it may be
-/// possible that those statesments may fail to apply.
+/// possible that those statements may fail to apply.
class StatementNotApplied : public Exception {
public:
StatementNotApplied(const char* file, size_t line, const char* what)
% DATABASE_MYSQL_FATAL_ERROR Unrecoverable MySQL error occurred: %1 for <%2>, reason: %3 (error code: %4).
An error message indicating that communication with the MySQL database server
has been lost. If automatic recovery has been enabled, then the server will
-attempt to recover connectivity. If not the server wil exit with a
+attempt to recover connectivity. If not, then the server will exit with a
non-zero exit code. The cause of such an error is most likely a network issue
or the MySQL server has gone down.
% DATABASE_PGSQL_FATAL_ERROR Unrecoverable PostgreSQL error occurred: Statement: <%1>, reason: %2 (error code: %3).
An error message indicating that communication with the PostgreSQL database server
has been lost. If automatic recovery has been enabled, then the server will
-attempt to recover the connectivity. If not the server wil exit with a
+attempt to recover the connectivity. If not, then the server will exit with a
non-zero exit code. The cause of such an error is most likely a network issue
or the PostgreSQL server has gone down.
/// In the latter case, a subnet may be associated with a subset of
/// servers or all servers. An administrator may also add the
/// configuration data into the database and do not associate this data
-/// with any patrticular server.
+/// with any particular server.
///
-/// When fetching the configuration data from a databse or when storing
+/// When fetching the configuration data from a database or when storing
/// data in the database there is a need to specify which servers this
/// data is associated with. The @c ServerSelector class represents
/// such associations.
/// exposure of the DHCP library to server side concepts such as client
/// classification the classes herein provide a mechanism to maintain lists
/// of class names, rather than the classes they represent. It is the
-/// upper layers' perogative to use these names as they see fit.
+/// upper layers' prerogative to use these names as they see fit.
///
/// @todo This file should be moved to dhcpsrv eventually as the classification
/// is server side concept. Client has no notion of classifying incoming server
// We'll need DUID stored in the file to compare it against the
// new configuration. If the new configuration indicates that some
// bits of the DUID should be generated we'll first try to use the
- // values stored in the file to prvent DUID from changing if possible.
+ // values stored in the file to prevent DUID from changing if possible.
readFromFile();
uint32_t enterprise_id_current = 0;
// We'll need DUID stored in the file to compare it against the
// new configuration. If the new configuration indicates that some
// bits of the DUID should be generated we'll first try to use the
- // values stored in the file to prvent DUID from changing if possible.
+ // values stored in the file to prevent DUID from changing if possible.
readFromFile();
uint16_t htype_current = 0;
// that the interface configuration is valid and that the interface
// is not a loopback interface. In both cases, we want to report
// that the socket will not be opened.
- // Relax the check when the loopback interface was explicitely
+ // Relax the check when the loopback interface was explicitly
// allowed
if (iface->flag_loopback_ && !allow_loopback_) {
IFACEMGR_ERROR(SocketConfigError, error_handler,
// that the interface configuration is valid and that the interface
// is not a loopback interface. In both cases, we want to report
// that the socket will not be opened.
- // Relax the check when the loopback interface was explicitely
+ // Relax the check when the loopback interface was explicitly
// allowed
if (iface->flag_loopback_ && !allow_loopback_) {
IFACEMGR_ERROR(SocketConfigError, error_handler,
switch (family) {
case AF_INET:
// If the queue doesn't exist, packet queing has been configured
- // as disabled. If there is no queue, we do not create a reciever.
+ // as disabled. If there is no queue, we do not create a receiver.
if(!getPacketQueue4()) {
return;
}
break;
case AF_INET6:
// If the queue doesn't exist, packet queing has been configured
- // as disabled. If there is no queue, we do not create a reciever.
+ // as disabled. If there is no queue, we do not create a receiver.
if(!getPacketQueue6()) {
return;
}
// zero out the errno to be safe.
errno = 0;
- // Select with null timeouts to wait indefinetly an event
+ // Select with null timeouts to wait indefinitely an event
int result = select(maxfd + 1, &rd_set, 0, 0, 0);
// Re-check the watch socket.
/// This method opens sockets only on interfaces which have the
/// @c inactive4_ field set to false (are active). If the interface is active
/// but it is not running, it is down, or is a loopback interface when
- /// oopback is not allowed, an error is reported.
+ /// loopback is not allowed, an error is reported.
///
/// The type of the socket being open depends on the selected Packet Filter
/// represented by a class derived from @c isc::dhcp::PktFilter abstract
delete[] (*msg);
}
- // ang get rid of the message pointers as well
+ // and get rid of the message pointers as well
messages.clear();
}
/// @ref Pkt4::pack(). That call leads to it being called recursively in
/// @ref Option::packOptions(). Thus the logic used to output the
/// message type should only be executed by the top-most. This is governed
- /// by the paramater top, below.
+ /// by the parameter top, below.
///
/// @param buf output buffer (assembled options will be stored here)
/// @param options collection of options to store to
/// unpacking efforts and allow the server to attempt to process
/// the packet as it stands. In other words, the option that failed
/// is perhaps optional, and rather than drop the packet as unusable
-/// we wish to attempt to proces it.
+/// we wish to attempt to process it.
class SkipRemainingOptionsError : public Exception {
public:
SkipRemainingOptionsError (const char* file, size_t line, const char* what) :
buf.writeUint16(11 + uint16_t(auth_info_.size()));
// protocol 1 byte
buf.writeUint8(protocol_);
- // algoritm 1 byte
+ // algorithm 1 byte
buf.writeUint8(algorithm_);
// replay detection method
buf.writeUint8(rdm_method_);
buf.writeUint16(OPTION6_AUTH_MIN_LEN + OPTION6_HASH_MSG_LEN);
// protocol 1 byte
buf.writeUint8(protocol_);
- // algoritm 1 byte
+ // algorithm 1 byte
buf.writeUint8(algorithm_);
// replay detection method
buf.writeUint8(rdm_method_);
#include <dhcp/option.h>
#include <boost/shared_ptr.hpp>
-#include <vector>
+#include <vector>
namespace isc {
namespace dhcp {
public:
static const uint8_t OPTION6_AUTH_MIN_LEN = 11;
static const uint8_t OPTION6_HASH_MSG_LEN = 16;
- static const uint8_t OPTION6_HDR = 4;
+ static const uint8_t OPTION6_HDR = 4;
/// @brief Constructor, used for auth options while transmitting
///
/// @param proto protocol type
/// @param buf buffer (option will be stored here)
void pack(isc::util::OutputBuffer& buf) const;
- /// Writes option in wire-format to buf, for computing hash
+ /// Writes option in wire-format to buf, for computing hash
/// auth info filled with 0 for a length of 128 bits
/// returns with pointer to first unused
/// byte after stored option.
/// @param proto protocol type to be set
void setProtocol(uint8_t proto) { protocol_ = proto; }
- /// Set hash alogrithm type
+ /// Set hash algorithm type
///
- /// @param algo hash alogrithm type to be set
+ /// @param algo hash algorithm type to be set
void setHashAlgo(uint8_t algo) { algorithm_ = algo; }
/// Set replay detection method type
/// @param value replay detection method value to be set
void setReplyDetectionValue(uint64_t value) { rdm_value_ = value; }
- /// Set authentication information
+ /// Set authentication information
///
/// @param auth_info authentication information to be set
void setAuthInfo(const std::vector<uint8_t>& auth_info) { auth_info_ = auth_info; }
/// @return replay detection method type value
uint8_t getReplyDetectionMethod() const { return rdm_method_; }
- /// Return replay detection mechanism
+ /// Return replay detection mechanism
///
/// @return replay detection method value
uint64_t getReplyDetectionValue() const { return rdm_value_; }
-
- /// Return authentication information
+
+ /// Return authentication information
///
/// @return authentication information value
std::vector<uint8_t> getAuthInfo() const { return auth_info_; }
protected:
- /// keeps protocol type
+ /// keeps protocol type
uint8_t protocol_;
-
+
/// keeps hash algorithm value
uint8_t algorithm_;
-
+
/// keeps replay detection method type
uint8_t rdm_method_;
-
+
/// keeps replay detection method value
uint64_t rdm_value_;
-
+
/// keeps authentication information
- std::vector<uint8_t> auth_info_;
+ std::vector<uint8_t> auth_info_;
};
} // isc::dhcp namespace
/// @brief Packet Queue Managers (PQM).
///
-/// Base class to manage the registry of packet queue implemenations
+/// Base class to manage the registry of packet queue implementations
/// and the creation of and access to the current packet queue.
///
/// @tparam PacktQueueTypePtr Base type of packet queues managed by
/// @brief Defines the type of the packet queue factory function.
///
/// Factory function returns a pointer to the instance of the packet
- /// queue created.
+ /// queue created.
typedef std::function<PacketQueueTypePtr(data::ConstElementPtr)> Factory;
/// @brief Constructor.
/// provides an opportunity to examine and discard packets from
/// the queue prior to dequeuing the next packet to be
/// processed. Derivations are expected to provide implementations
- /// based on their own requirements. The default implemenation is to
+ /// based on their own requirements. The default implementation is to
/// to simply return without skipping any packets.
///
/// @return The number of packets discarded.
/// on sockets must be simulated.
///
/// @note This class is named after @c PktFilter abstract class which exposes
-/// similar interface for DHVPv4. However, the PktFilter class is devoted to
+/// similar interface for DHCPv4. However, the PktFilter class is devoted to
/// solve the problem of sending DHCPv4 messages to the hosts which don't have
/// an IP address yet (a.k.a. direct DHCPv4 traffic). Where required, the
/// custom implementations of @c PktFilter are provided to send and receive
OPT_FQDN_TYPE, true, NO_RECORD_DEF, "" },
{ "bcms-controller-address", DHO_BCMCS_IPV4_ADDR, DHCP4_OPTION_SPACE,
OPT_IPV4_ADDRESS_TYPE, true, NO_RECORD_DEF, "" },
- // Unfortunatelly the AUTHENTICATE option contains a 64-bit
+ // Unfortunately the AUTHENTICATE option contains a 64-bit
// data field called 'replay-detection' that can't be added
// as a record field to a custom option. Also, there is no
// dedicated option class to handle it so we simply return
// "eth0" or "eth1".
// Name of loopback interface detection.
const size_t BUF_SIZE = 32;
-// Can be overwriten to "lo0" for instance on BSD systems.
+// Can be overwritten to "lo0" for instance on BSD systems.
char LOOPBACK_NAME[BUF_SIZE] = "lo";
// In fact is never 0, 1 is by far the most likely.
uint32_t LOOPBACK_INDEX = 0;
/// @param errmsg An error string indicating the reason for failure.
void ifaceMgrErrorHandler(const std::string&) {
// Increase the counter of invocations to this function. By checking
- // this number, a test amy check if the expected number of errors
+ // this number, a test may check if the expected number of errors
// has occurred.
++errors_count_;
}
// Now check whether the second callback is still functional
EXPECT_EQ(38, write(secondpipe[1], "Hi, this is a message sent over a pipe", 38));
- // Call recevie4 again, this should work.
+ // Call receive4 again, this should work.
ASSERT_NO_THROW(pkt4 = ifacemgr->receive4(RECEIVE_WAIT_MS(10)));
// Should have callback2 data only.
// Now check whether the second callback is still functional
EXPECT_EQ(38, write(secondpipe[1], "Hi, this is a message sent over a pipe", 38));
- // Call recevie6 again, this should work.
+ // Call receive6 again, this should work.
ASSERT_NO_THROW(pkt6 = ifacemgr->receive6(RECEIVE_WAIT_MS(10)));
// Should have callback2 data only.
EXPECT_EQ("foo", sub->getValue());
}
-// Verfies that option 0 (PAD) is handled as PAD in option 43 (so when
+// Verifies that option 0 (PAD) is handled as PAD in option 43 (so when
// flexible pad end flag is true) only when option 0 (PAD) is not defined.
TEST_F(LibDhcpTest, option43Pad) {
string space = "my-option43-space";
EXPECT_EQ(1, sub2->getValue());
}
-// Verfies that option 255 (END) is handled as END in option 43 (so when
+// Verifies that option 255 (END) is handled as END in option 43 (so when
//flexible pad end flag is true) only when option 255 (END) is not defined.
TEST_F(LibDhcpTest, option43End) {
string space = "my-option43-space";
// will result in an exception.
EXPECT_THROW(OptionString(Option::V6, 123, ""), isc::OutOfRange);
- // Check that an attempt to use string containgin only nulls
+ // Check that an attempt to use string containing only nulls
// in the constructor will result in an exception.
std::string nulls{"\0\0",2};
EXPECT_THROW(OptionString(Option::V6, 123, nulls), isc::OutOfRange);
/// @brief DHCPv4 queue with implements drop and eat logic
///
/// This class derives from the default DHCPv4 ring queue
-/// and provies implementations for shouldDropPacket() and
+/// and provides implementations for shouldDropPacket() and
/// eatPackets(). This permits a full exercising of the
/// PacketQueue interface as well as the basic v4 ring queue
/// mechanics.
/// @brief DHCPv6 queue with implements drop and eat logic
///
/// This class derives from the default DHCPv6 ring queue
-/// and provies implementations for shouldDropPacket() and
+/// and provides implementations for shouldDropPacket() and
/// eatPackets(). This permits a full exercising of the
/// PacketQueue interface as well as the basic v6 ring queue
/// mechanics.
/// @brief Convenience function for construction a dhcp-queue-control element map
///
-/// @param queue_type logical name of the queue implemenation type
+/// @param queue_type logical name of the queue implementation type
/// @param capacity maximum queue capacity
/// @param enable_queue bool value to ascribe to the 'enable-queue' parameter, defaults to true
data::ElementPtr
<< default_queue_type_ << "\", \"size\": 0 }");
}
-// Verifies that PQM registry and creation of custome queue implementations.
+// Verifies that PQM registry and creation of custom queue implementations.
TEST_F(PacketQueueMgr4Test, customQueueType) {
// Verify that we cannot create a queue for a non-existant type
<< default_queue_type_ << "\", \"size\": 0 }");
}
-// Verifies that PQM registry and creation of custome queue implementations.
+// Verifies that PQM registry and creation of custom queue implementations.
TEST_F(PacketQueueMgr6Test, customQueueType) {
// Verify that we cannot create a queue for a non-existant type
EXPECT_TRUE(hwaddr == pkt->getHWAddr());
}
-// This test verifies that the packet remte and local HW address can
+// This test verifies that the packet remote and local HW address can
// be set and returned.
TEST_F(Pkt4Test, hwaddrSrcRemote) {
scoped_ptr<Pkt4> pkt(new Pkt4(DHCPOFFER, 1234));
pkt->pack()
);
- // Create a vector of our expectd packed option data.
+ // Create a vector of our expected packed option data.
vector<uint8_t> packed_opts =
{
DHO_HOST_NAME, 3, 't', 'w', 'o',
/// @brief returns captured DISCOVER from Genexis hardware.
///
- /// This device in uncommon, because it doesn't send VIVSO in Dicover, but
+ /// This device in uncommon, because it doesn't send VIVSO in Discover, but
/// expects one in Offer.
/// @return DISCOVER.
static isc::dhcp::Pkt4Ptr discoverGenexis();
/// @brief Instance method for marshalling the contents of the request
/// into the given buffer in the given format.
///
- /// Whe the format is:
+ /// When the format is:
///
/// JSON: Upon completion, the buffer will contain a two byte unsigned
/// integer which specifies the length of the JSON text; followed by the
protected:
/// @brief Stores additional client query parameters on a V4 lease
///
- /// Extended features such as LeaseQuery require addtional parameters
+ /// Extended features such as LeaseQuery require additional parameters
/// to be stored for each lease, than we would otherwise retain.
/// This function adds that information to the lease's user-context.
/// (Note it is protected to facilitate unit testing).
/// @brief Stores additional client query parameters on a V6 lease
///
/// Extended features such as LeaseQuery and Reconfigure require
- /// addtional parameters to be stored for each lease, than we would
+ /// additional parameters to be stored for each lease, than we would
/// otherwise retain. This function adds that information to the
/// lease's user-context.
/// (Note it is protected to facilitate unit testing).
/// @defgroup benchmark_params Benchmark parameters that define boundary values
/// for benchmarks.
///
-/// The range is defined as 512..65533. Google benchmark will pick a few specifc
+/// The range is defined as 512..65533. Google benchmark will pick a few specific
/// values: 512, 4096, 32768, 65533.
/// @{
return (isc::hooks::CalloutHandlePtr());
}
-} // namespace shcp
+} // namespace dhcp
} // namespace isc
#endif // CALLOUT_HANDLE_STORE_H
// inactive state. We will later enable them selectively using the
// interface names specified by the user. If wildcard interface was
// specified, mark all interfaces active. Mark loopback inactive when
- // not explicitely allowed.
+ // not explicitly allowed.
setState(family, !wildcard_used_, !loopback_used_);
IfaceMgr& iface_mgr = IfaceMgr::instance();
// Remove selection of unicast addresses from all interfaces.
/// @param server_selector Server selector.
/// @param pd_pool_prefix Address part of the prefix of the prefix
/// delegation pool to which the option belongs.
- /// @param pd_pool_prefix_length Prefix length of the prefix delegayion
+ /// @param pd_pool_prefix_length Prefix length of the prefix delegation
/// pool to which the option belongs.
/// @param option Option to be added or updated.
virtual void
/// values which uniquely determine an entry in the table. Uses FNV-1a
/// on 64 bits.
///
- /// The primary key clustering column aggregates: host_dentifier,
+ /// The primary key clustering column aggregates: host_identifier,
/// host_identifier_type, host_ipv4_subnet_id, host_ipv6_subnet_id,
/// host_ipv4_address, reserved_ipv6_prefix_address,
/// reserved_ipv6_prefix_length, option_code, option_space.
/// @brief Create unique key for storage in table key.
///
- /// The primary key partition key aggregates: host_dentifier,
+ /// The primary key partition key aggregates: host_identifier,
/// host_identifier_type, host_ipv4_subnet_id, host_ipv6_subnet_id,
/// host_ipv4_address
uint64_t hashIntoKey() const;
/// @brief Create unique key string for a host.
///
- /// The primary key partition key aggregates: host_dentifier,
+ /// The primary key partition key aggregates: host_identifier,
/// host_identifier_type, host_ipv4_subnet_id, host_ipv6_subnet_id,
/// host_ipv4_address
std::string hostKey() const;
/// Pointer to Host object holding information being inserted into database.
HostPtr host_;
- /// @brief Primary key. Partition key. Aggregates: host_dentifier,
+ /// @brief Primary key. Partition key. Aggregates: host_identifier,
/// host_identifier_type, host_ipv4_subnet_id host_ipv6_subnet_id,
/// host_ipv4_address
cass_int64_t key_;
/// - tcp-keepalive no
/// - tcp-nodelay no
///
- /// For details regarding those paraemters, see
+ /// For details regarding those parameters, see
/// @ref isc::db::CqlConnection::openDatabase.
///
/// Finally, all the CQL commands are pre-compiled.
///
/// This method supports both v4 and v6.
///
- /// @param subnet_id subnet identfier.
+ /// @param subnet_id subnet identifier.
/// @param addr specified address.
/// @return true if deletion was successful, false if the host was not
/// there.
/// @brief Constructor to query for the stats for a range of subnets
///
/// The query created will return statistics for the inclusive range of
- /// subnets described by first and last sunbet IDs.
+ /// subnets described by first and last subnet IDs.
///
/// @param conn An open connection to the database housing the lease data
/// @param statement The lease data SQL prepared statement tag to execute
/// The @c Lease4 is a structure that should be itself responsible for this
/// validation (see http://oldkea.isc.org/ticket/2405). However, when #2405
/// is implemented, the @c next function may need to be updated to use the
-/// validation capablity of @c Lease4.
+/// validation capability of @c Lease4.
class CSVLeaseFile4 : public isc::util::VersionedCSVFile, public LeaseFileStats {
public:
/// The @c Lease6 is a structure that should be itself responsible for this
/// validation (see http://oldkea.isc.org/ticket/2405). However, when #2405
/// is implemented, the @c next function may need to be updated to use the
-/// validation capablity of @c Lease6.
+/// validation capability of @c Lease6.
class CSVLeaseFile6 : public isc::util::VersionedCSVFile, public LeaseFileStats {
public:
/// @param client_n N Flag from the client's FQDN
/// @param server_s [out] S Flag for the server's FQDN
/// @param server_n [out] N Flag for the server's FQDN
- /// @param ddns_params DDNS behaviorial configuration parameters
+ /// @param ddns_params DDNS behavioral configuration parameters
///
/// @throw isc::BadValue if client_s and client_n are both 1 as this is
/// an invalid combination per RFCs.
/// ('.' for IPv4 or ':' for IPv6) replaced with a hyphen, '-'.
///
/// @param address IP address from which to derive the name (IPv4 or IPv6)
- /// @param ddns_params DDNS behaviorial configuration parameters
+ /// @param ddns_params DDNS behavioral configuration parameters
/// @param trailing_dot A boolean value which indicates whether trailing
/// dot should be appended (if true) or not (false).
///
/// <partial_name>.<qualifying-suffix>.
///
/// @param partial_name domain name to qualify
- /// @param ddns_params DDNS behaviorial configuration parameters
+ /// @param ddns_params DDNS behavioral configuration parameters
/// @param trailing_dot A boolean value which when true guarantees the
/// result will end with a "." and when false that the result will not
/// end with a "." Note that this rule is applied even if the qualifying
///
/// @param fqdn FQDN option from which to read client (inbound) flags
/// @param fqdn_resp FQDN option to update with the server (outbound) flags
- /// @param ddns_params DDNS behaviorial configuration parameters
+ /// @param ddns_params DDNS behavioral configuration parameters
/// @tparam T FQDN Option class containing the FQDN data such as
/// dhcp::Option4ClientFqdn or dhcp::Option6ClientFqdn
template <class T>
///
/// @param fqdn FQDN option from which to get client (inbound) name
/// @param fqdn_resp FQDN option to update with the adjusted name
- /// @param ddns_params DDNS behaviorial configuration parameters
+ /// @param ddns_params DDNS behavioral configuration parameters
/// @tparam T FQDN Option class containing the FQDN data such as
/// dhcp::Option4ClientFqdn or dhcp::Option6ClientFqdn
template <class T>
/// @param io_service IOService to be used for sender IO event processing
/// @warning It is up to the invoking layer to ensure the io_service
/// instance used outlives the D2ClientMgr send mode. When the send mode
- /// is exited, either explicitly by callind stopSender() or implicitly
- /// through D2CLientMgr destruction, any ASIO objects such as sockets or
+ /// is exited, either explicitly by calling stopSender() or implicitly
+ /// through D2ClientMgr destruction, any ASIO objects such as sockets or
/// timers will be closed and released. If the io_service goes out of scope
/// first this behavior could be unpredictable.
///
FreeLeaseQueue::getLeases(const AddressRange& range) const {
auto cont = ranges_.find(range.start_);
if (cont == ranges_.end()) {
- isc_throw(BadValue, "conatiner for the specified address range " << range.start_
+ isc_throw(BadValue, "container for the specified address range " << range.start_
<< ":" << range.end_ << " does not exist");
}
return (cont->leases_);
FreeLeaseQueue::getLeases(const PrefixRange& range) const {
auto cont = ranges_.find(range.start_);
if (cont == ranges_.end()) {
- isc_throw(BadValue, "conatiner for the specified prefix " << range.start_
+ isc_throw(BadValue, "container for the specified prefix " << range.start_
<< " and delegated length of " << static_cast<int>(range.delegated_length_)
<< " does not exist");
}
FreeLeaseQueue::RangeDescriptor
FreeLeaseQueue::getRangeDescriptor(const uint64_t range_index) const {
if (ranges_.get<2>().size() <= range_index) {
- isc_throw(BadValue, "conatiner for the specified range index " << range_index
+ isc_throw(BadValue, "container for the specified range index " << range_index
<< " does not exist");
}
auto cont = ranges_.get<2>().at(range_index);
uint64_t getRangeIndex(const RangeType& range) const {
auto cont = ranges_.get<1>().find(range.start_);
if (cont == ranges_.get<1>().end()) {
- isc_throw(BadValue, "conatiner for the specified range " << range.start_
+ isc_throw(BadValue, "container for the specified range " << range.start_
<< ":" << range.end_ << " does not exist");
}
return (std::distance(ranges_.get<2>().begin(), ranges_.project<2>(cont)));
/// @throw BadValue if the range with the given index does not exist.
RangeDescriptor getRangeDescriptor(const uint64_t range_index) const;
- /// @brief This is internal implemenation of the @c next and @c pop
+ /// @brief This is internal implementation of the @c next and @c pop
/// methods.
///
/// @param range range for which next address is to be returned.
///
/// Set the key value.
// If the size is greater than 16 bytes, we resize to 16 bytes.
- /// Doesnt throw an exception.
+ /// Doesn't throw an exception.
/// @param key auth key in binary to be stored
void setAuthKey(const std::vector<uint8_t>& key);
/// @brief Cache an answer.
///
- /// @param host Pointer to the missied host.
+ /// @param host Pointer to the missed host.
virtual void cache(ConstHostPtr host) const;
/// @brief Cache a negative answer.
/// caller so we forget them.
///
/// This algorithm guarantees that all IP addresses or delegated prefixes
-/// beloging to the given range are returned and no duplicates are returned.
+/// belonging to the given range are returned and no duplicates are returned.
/// The addresses or delegated prefixes are returned in a random order.
///
/// @todo Methods of this class should be called in thread safe context. Otherwise
/// @brief Constructor.
///
/// @param address IPv4 address.
- /// @param hw_address Pointer to client's HW addresss.
+ /// @param hw_address Pointer to client's HW address.
/// @param client_id pointer to the client id structure.
/// @param valid_lifetime Valid lifetime value.
/// @param cltt Timestamp when the lease is acquired, renewed.
/// The query created will return statistics for a single subnet
///
/// @param subnet_id id of the subnet for which stats are desired
- /// @throw BadValue if sunbet_id given is 0.
+ /// @throw BadValue if subnet_id given is 0.
LeaseStatsQuery(const SubnetID& subnet_id);
/// @brief Constructor to query for the stats for a range of subnets
///
/// The query created will return statistics for the inclusive range of
- /// subnets described by first and last sunbet IDs.
+ /// subnets described by first and last subnet IDs.
///
/// @param first_subnet_id first subnet in the range of subnets
/// @param last_subnet_id last subnet in the range of subnets
/// @brief MySQL Host Context Pool
///
/// This class provides a pool of contexts.
-/// The manager will use this class to handle avalilable contexts.
+/// The manager will use this class to handle available contexts.
/// There is only one ContextPool per manager per back-end, which is created
/// and destroyed by the respective manager factory class.
class MySqlHostContextPool {
/// @param statement_index Index of the query's prepared statement
/// @param fetch_type Indicates if query supplies lease type
/// @param subnet_id id of the subnet for which stats are desired
- /// @throw BadValue if sunbet_id given is 0 or if statement index is invalid.
+ /// @throw BadValue if subnet_id given is 0 or if statement index is invalid.
MySqlLeaseStatsQuery(MySqlConnection& conn, const size_t statement_index,
const bool fetch_type, const SubnetID& subnet_id)
: LeaseStatsQuery(subnet_id), conn_(conn), statement_index_(statement_index),
/// @brief Constructor to query for the stats for a range of subnets
///
/// The query created will return statistics for the inclusive range of
- /// subnets described by first and last sunbet IDs.
+ /// subnets described by first and last subnet IDs.
///
/// @param conn An open connection to the database housing the lease data
/// @param statement_index Index of the query's prepared statement
/// @brief MySQL Lease Context Pool
///
/// This class provides a pool of contexts.
-/// The manager will use this class to handle avalilable contexts.
+/// The manager will use this class to handle available contexts.
/// There is only one ContextPool per manager per back-end, which is created
/// and destroyed by the respective manager factory class.
class MySqlLeaseContextPool {
inheritance, "t1-percent"));
}
- /// @brief Sets new precentage for calculating T1 (renew timer).
+ /// @brief Sets new percentage for calculating T1 (renew timer).
///
/// @param t1_percent New percentage to use.
void setT1Percent(const util::Optional<double>& t1_percent) {
inheritance, "t2-percent"));
}
- /// @brief Sets new precentage for calculating T2 (rebind timer).
+ /// @brief Sets new percentage for calculating T2 (rebind timer).
///
/// @param t2_percent New percentage to use.
void setT2Percent(const util::Optional<double>& t2_percent) {
ddns_override_no_update_ = ddns_override_no_update;
}
- /// @brief Returns ddns-overridie-client-update
+ /// @brief Returns ddns-override-client-update
///
/// @param inheritance inheritance mode to be used.
util::Optional<bool>
/// Meaningful only if hostname_char_set_ is not empty.
util::Optional<std::string> hostname_char_replacement_;
- /// @brief Should Kea store addtional client query data (e.g. relay-agent-info)
+ /// @brief Should Kea store additional client query data (e.g. relay-agent-info)
/// on the lease.
util::Optional<bool> store_extended_info_;
network->setHostnameCharReplacement(hostname_char_replacement);
}
- // We need to validate santizer values here so we can detect problems and
+ // We need to validate sanitizer values here so we can detect problems and
// cause a configuration. We don't retain the compilation because it's not
// something we can inherit.
if (!hostname_char_set.empty()) {
"user-context",
"only-if-required" };
- // The v4 client class supports additional parmeters.
+ // The v4 client class supports additional parameters.
static std::set<std::string> supported_params_v4 = { "option-def",
"next-server",
"server-hostname",
/// literal, then it is converted into binary format. These literals
/// may contain upper and lower case digits. They may be octets
/// delimited by colons or spaces (octets may be 1 or 2 digits)
- /// If not delimited octets then they must be a continous string of
+ /// If not delimited octets then they must be a continuous string of
/// digits with or without a "0x" prefix. Examples:
///
/// -# ab:cd:ef - colon delimited
" IPv6 reservation");
}
- // If we have reservation id we havent' seen yet, retrieve the
+ // If we have reservation id we haven't seen yet, retrieve the
// the reservation, adding it to the current host
uint64_t reservation_id = getReservationId(r, row);
if (reservation_id && (reservation_id > most_recent_reservation_id_)) {
/// @brief PostgreSQL Host Context Pool
///
/// This class provides a pool of contexts.
-/// The manager will use this class to handle avalilable contexts.
+/// The manager will use this class to handle available contexts.
/// There is only one ContextPool per manager per back-end, which is created
/// and destroyed by the respective manager factory class.
class PgSqlHostContextPool {
/// @brief Constructor to query for the stats for a range of subnets
///
/// The query created will return statistics for the inclusive range of
- /// subnets described by first and last sunbet IDs.
+ /// subnets described by first and last subnet IDs.
///
/// @param conn A open connection to the database housing the lease data
/// @param statement The lease data SQL prepared statement to execute
/// @brief PostgreSQL Lease Context Pool
///
/// This class provides a pool of contexts.
-/// The manager will use this class to handle avalilable contexts.
+/// The manager will use this class to handle available contexts.
/// There is only one ContextPool per manager per back-end, which is created
/// and destroyed by the respective manager factory class.
class PgSqlLeaseContextPool {
class CfgMgr;
-/// @brief Convenience container for conveying DDNS behaviorial parameters
+/// @brief Convenience container for conveying DDNS behavioral parameters
/// It is intended to be created per Packet exchange using the selected
/// subnet passed into functions that require them
class DdnsParams {
/// @brief Fetches the DDNS parameters for a given DHCPv4 subnet.
///
/// Creates a DdnsParams structure which retain and thereafter
- /// use the given subnet to fetch DDNS behaviorial parameters.
+ /// use the given subnet to fetch DDNS behavioral parameters.
/// The values are fetched with the inheritance scope mode
/// of Network::ALL.
///
/// @brief Fetches the DDNS parameters for a given DHCPv6 subnet.
///
/// Creates a DdnsParams structure which retain and thereafter
- /// use the given subnet to fetch DDNS behaviorial parameters.
+ /// use the given subnet to fetch DDNS behavioral parameters.
/// The values are fetched with the inheritance scope mode
/// of Network::ALL.
///
/// stored in the staging configuration. The other part of the
/// configuration comes from the database. The configuration fetched
/// from the database is stored in a separate @c SrvConfig instance
- /// and then merged into the staging configuration prior to commiting
+ /// and then merged into the staging configuration prior to committing
/// it.
///
/// The merging strategy depends on the underlying data being merged.
subnet_->setValid(Triplet<uint32_t>(1, 3, 5));
ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234));
- // Speficy the valid lifetime we want.
+ // Specify the valid lifetime we want.
OptionUint32Ptr opt(new OptionUint32(Option::V4, DHO_DHCP_LEASE_TIME, 4));
ctx.query_->addOption(opt);
subnet_->setValid(Triplet<uint32_t>(2, 3, 5));
ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234));
- // Speficy the valid lifetime we want, as it is lower than the min value
+ // Specify the valid lifetime we want, as it is lower than the min value
// we'll get this min value instead.
OptionUint32Ptr opt(new OptionUint32(Option::V4, DHO_DHCP_LEASE_TIME, 1));
ctx.query_->addOption(opt);
subnet_->setValid(Triplet<uint32_t>(1, 3, 5));
ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234));
- // Speficy the valid lifetime we want, as it is greater than the max value
+ // Specify the valid lifetime we want, as it is greater than the max value
// we'll get this max value instead.
OptionUint32Ptr opt(new OptionUint32(Option::V4, DHO_DHCP_LEASE_TIME, 6));
ctx.query_->addOption(opt);
subnet_->setValid(Triplet<uint32_t>(1, 3, 5));
ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234));
- // Speficy the valid lifetime we want.
+ // Specify the valid lifetime we want.
OptionUint32Ptr opt(new OptionUint32(Option::V4, DHO_DHCP_LEASE_TIME, 4));
ctx.query_->addOption(opt);
subnet_->setValid(Triplet<uint32_t>(2, 3, 5));
ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234));
- // Speficy the valid lifetime we want, as it is lower than the min value
+ // Specify the valid lifetime we want, as it is lower than the min value
// we'll get this min value instead.
OptionUint32Ptr opt(new OptionUint32(Option::V4, DHO_DHCP_LEASE_TIME, 1));
ctx.query_->addOption(opt);
subnet_->setValid(Triplet<uint32_t>(1, 3, 5));
ctx.query_.reset(new Pkt4(DHCPREQUEST, 1234));
- // Speficy the valid lifetime we want, as it is greater than the max value
+ // Specify the valid lifetime we want, as it is greater than the max value
// we'll get this max value instead.
OptionUint32Ptr opt(new OptionUint32(Option::V4, DHO_DHCP_LEASE_TIME, 6));
ctx.query_->addOption(opt);
return (lease);
}
- /// Covenience pointers to configuration elements. These are initialized
+ /// Convenience pointers to configuration elements. These are initialized
/// in the constructor and are used throughout the tests.
AllocEngine engine_;
Subnet4Ptr subnet1_;
return (lease);
}
- /// Covenience pointers to configuration elements. These are initialized
+ /// Convenience pointers to configuration elements. These are initialized
/// in the constructor and are used throughout the tests.
AllocEngine engine_;
Subnet6Ptr subnet1_;
ASSERT_TRUE(lease);
EXPECT_EQ("2001:db8:2::ff", lease->addr_.toText());
- // Ok, now try for anoher client. We should be completely full.
+ // Ok, now try for another client. We should be completely full.
DuidPtr other_duid(new DUID(vector<uint8_t>(12, 0xff)));
AllocEngine::ClientContext6 ctx2(subnet2_, other_duid, false, false, "", false,
query);
// Reset configuration.
cfg.reset();
- // Retry with wirdcard
+ // Retry with wildcard
ASSERT_NO_THROW(cfg.use(AF_INET, "*"));
ASSERT_NO_THROW(cfg.use(AF_INET, "lo"));
ASSERT_NO_THROW(cfg.useSocketType(AF_INET, CfgIface::SOCKET_UDP));
// Reset configuration.
cfg.reset();
- // Retry with wirdcard
+ // Retry with wildcard
ASSERT_NO_THROW(cfg.use(AF_INET6, "*"));
ASSERT_NO_THROW(cfg.use(AF_INET6, "lo/::1"));
cfg.openSockets(AF_INET6, DHCP6_SERVER_PORT);
/// @brief Verifies that a set of subnets contains a given a subnet
///
-/// @param cfg_subnets set of sunbets in which to look
+/// @param cfg_subnets set of subnets in which to look
/// @param prefix prefix of the target subnet
/// @param exp_subnet_id expected id of the target subnet
/// @param exp_valid expected valid lifetime of the subnet
/// @brief Verifies that a set of subnets contains a given a subnet
///
-/// @param cfg_subnets set of sunbets in which to look
+/// @param cfg_subnets set of subnets in which to look
/// @param exp_subnet_id expected id of the target subnet
/// @param prefix prefix of the target subnet
/// @param exp_valid expected valid lifetime of the subnet
// This test checks the data directory handling.
TEST_F(CfgMgrTest, dataDir) {
- // It is only in DHCPv6 systax so switch to IPv6.
+ // It is only in DHCPv6 syntax so switch to IPv6.
CfgMgr::instance().setFamily(AF_INET6);
// Default.
/// occur.
/// @return Returns a pointer to class instance created, or NULL if
/// for some unforeseen reason it wasn't created in the local dictionary
- /// @throw indirectly, exceptions convertring the JSON text to elements,
+ /// @throw indirectly, exceptions converting the JSON text to elements,
/// or by the parsing itself are not caught
ClientClassDefPtr parseClientClassDef(const std::string& config,
uint16_t family) {
}
/// @brief Test that client class parser throws when unspported parameter
- /// is specfied.
+ /// is specified.
///
/// @param config JSON string containing the client class configuration.
/// @param family The address family indicating whether the DHCPv4 or
/// @param family - the address family in which the parsing should
/// occur.
/// @return Returns a pointer to class dictionary created
- /// @throw indirectly, execptions convertring the JSON text to elements,
+ /// @throw indirectly, execptions converting the JSON text to elements,
/// or by the parsing itself are not caught
ClientClassDictionaryPtr parseClientClassDefList(const std::string& config,
uint16_t family)
///
/// This test checks if the CqlHostDataSource can be instantiated. This happens
/// only if the database can be opened. Note that this is not part of the
-/// CqlHostMgr test fixure set. This test checks that the database can be
+/// CqlHostMgr test fixture set. This test checks that the database can be
/// opened: the fixtures assume that and check basic operations.
TEST(CqlHostDataSource, OpenDatabase) {
///
/// This test checks if the CqlLeaseMgr can be instantiated. This happens
/// only if the database can be opened. Note that this is not part of the
-/// CqlLeaseMgr test fixure set. This test checks that the database can be
+/// CqlLeaseMgr test fixture set. This test checks that the database can be
/// opened: the fixtures assume that and check basic operations.
TEST(CqlOpenTest, OpenDatabase) {
/// @brief Verify that large IAID values work correctly.
///
/// Adds lease with a large IAID to the database and verifies it can
-/// fetched correclty.
+/// fetched correctly.
TEST_F(CqlLeaseMgrTest, leases6LargeIaidCheck) {
testLease6LargeIaidCheck();
}
Optional<std::string> opt_hostname_char_set("", true);
Optional<std::string> opt_hostname_char_replacement("", true);
- // Veeify that constructor handles optional hostname char stuff.
+ // Verify that constructor handles optional hostname char stuff.
ASSERT_NO_THROW(d2_client_config.reset(new
D2ClientConfig(enable_updates,
server_ip,
// Calling receive should complete the first message and start the second.
IfaceMgr::instance().receive4(0, 0);
- // Verify the callback hander was invoked, no errors counted.
+ // Verify the callback handler was invoked, no errors counted.
EXPECT_EQ(2, getQueueSize());
ASSERT_EQ(1, callback_count_);
ASSERT_EQ(0, error_handler_count_);
}
// Verifies that DHCPQueueControlParser handles
-// expected valid dhcp-queue-control contet
+// expected valid dhcp-queue-control content
TEST_F(DHCPQueueControlParserTest, validContent) {
struct Scenario {
std::string description_;
uint32_t iaid = 7; // random number
- SubnetID subnet_id = 8; // radom number
+ SubnetID subnet_id = 8; // random number
Lease6Ptr lease1(new Lease6(Lease::TYPE_NA, addr1, duid1, iaid, 100, 200,
subnet_id));
/// @brief Compares a StatsMgr statistic to an expected value
///
- /// Attempt to fetch the named statistic from the StatsMg and if
+ /// Attempt to fetch the named statistic from the StatsMgr and if
/// found, compare its observed value to the given value.
/// Fails if the stat is not found or if the values do not match.
///
/// @brief verifies getLeases6 method by DUID
///
/// Adds 3 leases to backend and retrieves, verifes empty
- /// retrival of non existent DUID.
+ /// retrieval of non existent DUID.
void testGetLeases6Duid();
/// @brief Checks that getLease6() works with different DUID sizes
/// @brief Checks operation of v4 LeaseStatsQuery variants
///
- /// It creates three subnets with leasese in various states in
+ /// It creates three subnets with leases in various states in
/// each. It runs and verifies the returned query contents for
/// each of the v4 startLeaseQuery variants:
///
/// @brief Checks operation of v6 LeaseStatsQuery variants
///
- /// It creates three subnets with leasese in various states in
+ /// It creates three subnets with leases in various states in
/// each. It runs and verifies the returned query contents for
/// each of the v6 startLeaseQuery variants:
///
if (boot_file_name && boot_file_name->stringValue().empty()) {
resv->remove("boot-file-name");
}
- ConstElementPtr client_classess = resv->get("client-classes");
- if (client_classess && client_classess->empty()) {
+ ConstElementPtr client_classes = resv->get("client-classes");
+ if (client_classes && client_classes->empty()) {
resv->remove("client-classes");
}
ConstElementPtr option_data = resv->get("option-data");
option->set("always-send", Element::create(false));
config = prettyPrint(config_element);
boost::algorithm::to_lower(config);
-
+
// Try to unparse it.
CfgMgr::instance().setFamily(AF_INET6);
CfgHostsSubnet cfg_subnet(cfg_hosts, SubnetID(10));
/// @brief Setup for each test.
///
- /// Clears the configuration in the @c CfgMgr. It alse initializes
+ /// Clears the configuration in the @c CfgMgr. It also initializes
/// hwaddr_ and duid_ class members.
virtual void SetUp();
if (boot_file_name && boot_file_name->stringValue().empty()) {
resv->remove("boot-file-name");
}
- ConstElementPtr client_classess = resv->get("client-classes");
- if (client_classess && client_classess->empty()) {
+ ConstElementPtr client_classes = resv->get("client-classes");
+ if (client_classes && client_classes->empty()) {
resv->remove("client-classes");
}
ConstElementPtr option_data = resv->get("option-data");
// parses IPv6 reservations correctly.
TEST_F(HostReservationsListParserTest, ipv6Reservations) {
// hexadecimal in lower case for toElement()
- std::string config =
+ std::string config =
"[ "
" { \"duid\": \"01:02:03:04:05:06:07:08:09:0A\","
" \"ip-addresses\": [ ],"
IOAddress("2001:db8:1::1")));
);
- // Add invisble user context
+ // Add invisible user context
std::string user_context = "{ \"foo\": \"bar\" }";
host->setContext(Element::fromJSON(user_context));
EXPECT_EQ(12345, host->getHostId());
}
-// Tets verifies if we can modify the host keys.
+// Test verifies if we can modify the host keys.
TEST_F(HostTest, keys) {
HostPtr host;
ASSERT_NO_THROW(host.reset(new Host("01:02:03:04:05:06", "hw-address",
/// @brief Returns existing IPv4 lease for specified client identifier,
/// HW address and subnet identifier.
///
- /// @param client_id Aclient identifier
+ /// @param client_id A client identifier
/// @param hwaddr A HW address.
/// @param subnet_id A subnet identifier.
///
/// @brief Pretends to wipe all IPv4 leases from a subnet
/// @param subnet_id (ignored, but one day may specify the subnet)
virtual size_t wipeLeases4(const SubnetID&) {
- isc_throw(NotImplemented, "ConreteLeaseMgr::wipeLeases4 not implemented");
+ isc_throw(NotImplemented, "ConcreteLeaseMgr::wipeLeases4 not implemented");
}
/// @brief Pretends to wipe all IPv4 leases from a subnet
/// @param subnet_id (ignored, but one day may specify the subnet)
virtual size_t wipeLeases6(const SubnetID&) {
- isc_throw(NotImplemented, "ConreteLeaseMgr::wipeLeases4 not implemented");
+ isc_throw(NotImplemented, "ConcreteLeaseMgr::wipeLeases4 not implemented");
}
/// @brief Returns backend type.
}
/// @brief This test adds 3 leases and verifies fetch by DUID.
-/// Verifies retrival of non existant DUID fails
+/// Verifies retrieval of non existant DUID fails
TEST_F(MemfileLeaseMgrTest, getLeases6Duid) {
startBackend(V6);
testGetLeases6Duid();
///
/// This test checks if the MySqlLeaseMgr can be instantiated. This happens
/// only if the database can be opened. Note that this is not part of the
-/// MySqlLeaseMgr test fixure set. This test checks that the database can be
+/// MySqlLeaseMgr test fixture set. This test checks that the database can be
/// opened: the fixtures assume that and check basic operations.
TEST(MySqlOpenTest, OpenDatabase) {
- // Explicitely disable Multi-Threading.
+ // Explicitly disable Multi-Threading.
MultiThreadingMgr::instance().setMode(false);
// Schema needs to be created for the test to work.
/// @brief Verify that large IAID values work correctly.
///
/// Adds lease with a large IAID to the database and verifies it can
-/// fetched correclty.
+/// fetched correctly.
TEST_F(MySqlLeaseMgrTest, leases6LargeIaidCheck) {
testLease6LargeIaidCheck();
}
///
/// This test checks if the PgSqlLeaseMgr can be instantiated. This happens
/// only if the database can be opened. Note that this is not part of the
-/// PgSqlLeaseMgr test fixure set. This test checks that the database can be
+/// PgSqlLeaseMgr test fixture set. This test checks that the database can be
/// opened: the fixtures assume that and check basic operations.
TEST(PgSqlOpenTest, OpenDatabase) {
- // Explicitely disable Multi-Threading.
+ // Explicitly disable Multi-Threading.
MultiThreadingMgr::instance().setMode(false);
// Schema needs to be created for the test to work.
/// @brief Verify that large IAID values work correctly.
///
/// Adds lease with a large IAID to the database and verifies it can
-/// fetched correclty.
+/// fetched correctly.
TEST_F(PgSqlLeaseMgrTest, leases6LargeIaidCheck) {
testLease6LargeIaidCheck();
}
EXPECT_FALSE(network->hasRelays());
EXPECT_FALSE(network->hasRelayAddress(IOAddress("2001:db8:2::1")));
- // Add realy addresses to the network.
+ // Add relay addresses to the network.
network->addRelayAddress(IOAddress("2001:db8:2::1"));
network->addRelayAddress(IOAddress("2001:db8:2::2"));
network->addRelayAddress(IOAddress("2001:db8:2::3"));
/// notation). It simply creates an @c OptionDescriptor with the generic
/// option instance (containing an option code and no option value) and
/// the other @c OptionDescriptor parameters set appropriately. The
- /// @c CfgOption class contains methds that can be used on demand to
+ /// @c CfgOption class contains methods that can be used on demand to
/// replace these instances with the appropriate types (derived from
/// @c Option) which represent formatted option data, if necessary.
///
///
/// @param srv_cfg server config where the global should be checked.
/// @param name name of the global parameter
- /// @param exp_value expected value of the global paramter as an Element
+ /// @param exp_value expected value of the global parameter as an Element
void checkConfiguredGlobal(const SrvConfigPtr& srv_cfg,
const std::string &name,
data::ConstElementPtr exp_value);
void testClientIdNotHWAddr();
/// @brief Test adds specified number of hosts with unique hostnames, then
- /// retrives them and checks that the hostnames are set properly.
+ /// retrieves them and checks that the hostnames are set properly.
///
/// Uses gtest macros to report failures.
///
isc::dhcp::CfgMgr::instance().clear();
}
- /// @brief Abstract method for destroying the back end specific shcema
+ /// @brief Abstract method for destroying the back end specific schema
virtual void destroySchema() = 0;
- /// @brief Abstract method for creating the back end specific shcema
+ /// @brief Abstract method for creating the back end specific schema
virtual void createSchema() = 0;
/// @brief Abstract method which returns the back end specific connection
MemHostDataSource::getAll4(const SubnetID& subnet_id) const {
ConstHostCollection hosts;
for (auto h = store_.begin(); h != store_.end(); ++h) {
- // Keep it when subnet_id matchs.
+ // Keep it when subnet_id matches.
if ((*h)->getIPv4SubnetID() == subnet_id) {
hosts.push_back(*h);
}
MemHostDataSource::getAll6(const SubnetID& subnet_id) const {
ConstHostCollection hosts;
for (auto h = store_.begin(); h != store_.end(); ++h) {
- // Keep it when subnet_id matchs.
+ // Keep it when subnet_id matches.
if ((*h)->getIPv6SubnetID() == subnet_id) {
hosts.push_back(*h);
}
MemHostDataSource::getAllbyHostname(const std::string& hostname) const {
ConstHostCollection hosts;
for (auto h = store_.begin(); h != store_.end(); ++h) {
- // Keep it when hostname matchs.
+ // Keep it when hostname matches.
if ((*h)->getLowerHostname() == hostname) {
hosts.push_back(*h);
}
/// @brief Test config backend that implements all of the DHCPv4 API calls
///
/// This backend should be used for unit testing the DHCPv4 server and the
-/// commands which manpiluate the configuration information stored in the
+/// commands which manipulate the configuration information stored in the
/// database.
///
/// Server selectors supported by this test configuration backend are a
/// @brief Test config backend that implements all of the DHCPv6 API calls
///
/// This backend should be used for unit testing the DHCPv6 server and the
-/// commands which manpiluate the configuration information stored in the
+/// commands which manipulate the configuration information stored in the
/// database.
///
/// Server selectors supported by this test configuration backend are a
return
# Create a list of (code, code-text) pairs, where code-text is generally
- # upper-cased, with applying speicial filters when necessary.
+ # upper-cased, with applying special filters when necessary.
def convert(code_txt):
# Workaround by heuristics: there's a "NULL" RR type, but it would
# cause conflict with the C/C++ macro. We use Null as a special case.
virtual void handle(MasterLexer& lexer) const {
// We've just seen '\r'. If this is part of a sequence of '\r\n',
// we combine them as a single END-OF-LINE. Otherwise we treat the
- // single '\r' as an EOL and continue tokeniziation from the character
+ // single '\r' as an EOL and continue tokenization from the character
// immediately after '\r'. One tricky case is that there's a comment
// between '\r' and '\n'. This implementation combines these
// characters and treats them as a single EOL (the behavior derived
/// <b>Exceptions</b>
///
/// \c InvalidRdataLength is thrown if rdata_len exceeds the maximum.
- /// \c DNSMessageFORMERR is thrown if the RR is misformed.
+ /// \c DNSMessageFORMERR is thrown if the RR is malformed.
TXTLikeImpl(util::InputBuffer& buffer, size_t rdata_len) {
if (rdata_len > MAX_RDLENGTH) {
isc_throw(InvalidRdataLength, "RDLENGTH too large: " << rdata_len);
// Order or preference cannot be missed
EXPECT_THROW(const NAPTR naptr("10 \"S\" SIP \"\" _sip._udp.example.com."),
InvalidRdataText);
- // Unquoted fields must be seperated by spaces
+ // Unquoted fields must be separated by spaces
EXPECT_THROW(const NAPTR naptr("100 10S SIP \"\" _sip._udp.example.com."),
InvalidRdataText);
EXPECT_THROW(const NAPTR naptr("10010 \"S\" \"SIP\" \"\" _sip._udp.example.com."),
testVendorClass("vendor-class[4491].data[3] == 0x1234", Option::V6, 4491, 3);
}
-// Test the parsing of a sub-option with perent by code.
+// Test the parsing of a sub-option with parent by code.
TEST_F(EvalContextTest, subOptionWithCode) {
EvalContext eval(Option::V4);
checkTokenSubOption(eval.expression.at(0), 123, 234, TokenOption::TEXTUAL);
}
-// Test the parsing of a sub-option with perent by name.
+// Test the parsing of a sub-option with parent by name.
TEST_F(EvalContextTest, subOptionWithName) {
EvalContext eval(Option::V4);
/// @brief Test fixture for testing dependency.
///
/// This class provides several convenience objects to be used during testing
-/// of the dependcy of classification expressions.
+/// of the dependency of classification expressions.
class DependencyTest : public ::testing::Test {
public:
testExpressionNegative<EvalParseError>("pkt6.msgtype == 1", Option::V6,
EvalContext::PARSER_STRING);
- // Check that ifelse works as expecting (it was added explicitely for
+ // Check that ifelse works as expecting (it was added explicitly for
// the string evaluation).
testExpressionString(Option::V4,
"ifelse(option[100].exists,'foo','bar')", "foo");
TEST_F(TokenTest, tohexstring) {
ASSERT_NO_THROW(t_.reset(new TokenToHexString()));
- // Hexstring equires two values on the stack, try
+ // Hexstring requires two values on the stack, try
// with 0 and 1 both should throw an exception
EXPECT_THROW(t_->evaluate(*pkt4_, values_), EvalBadStack);
// Case 2: option present, but uses different enterprise-id, should fail
testVendorExists(Option::V4, 4491, 1234, "false");
- // Case 3: option present and has matchin enterprise-id, should succeed
+ // Case 3: option present and has matching enterprise-id, should succeed
testVendorExists(Option::V4, 4491, 4491, "true");
// Check if the logged messages are correct.
// Case 2: option present, but uses different enterprise-id, should fail
testVendorExists(Option::V6, 4491, 1234, "false");
- // Case 3: option present and has matchin enterprise-id, should succeed
+ // Case 3: option present and has matching enterprise-id, should succeed
testVendorExists(Option::V6, 4491, 4491, "true");
// Check if the logged messages are correct.
///
/// binary is the binary value (note it can be any value, i.e.
/// it is not checked to really be not printable).
- /// separator is litteral for instance '-' or ':'. The empty separator
+ /// separator is literal for instance '-' or ':'. The empty separator
/// means no separator.
///
/// The following example use a binary MAC address 06:ce:8f:55:b3:33:
private:
- /// @brief This method checks whether the hook_vector_ size is suffucient
+ /// @brief This method checks whether the hook_vector_ size is sufficient
/// and extends it if necessary.
///
/// The problem is as follows: some hooks are initialized statically
void
Connection::timerCallback() {
- // Request timeout occured.
+ // Request timeout occurred.
terminate(boost::asio::error::timed_out);
}
struct RequestTimeout {
/// @brief Constructor.
///
- /// @param value Reuqest/response timeout value in milliseconds.
+ /// @param value Request/response timeout value in milliseconds.
explicit RequestTimeout(long value)
: value_(value) {
}
/// transaction is still in progress, the new transaction is queued. The
/// queued transactions are started in the FIFO order one after another. If
/// the connection is idle or the connection doesn't exist, the new
- /// transaction is started immediatelly.
+ /// transaction is started immediately.
///
/// The existing connection is tested before it is used for the new
/// transaction by attempting to read (with message peeking) from the open
///
/// The callback function provided by the caller is invoked when the
/// transaction terminates, i.e. when the server has responded or when an
- /// error occured. The callback is expected to be exception safe, but the
+ /// error occurred. The callback is expected to be exception safe, but the
/// client internally guards against exceptions thrown by the callback.
///
/// The first argument of the callback indicates an IO error during
// if such transaction exists.
auto request = spawned_transaction->getRequest();
- // Depending on when the timeout occured, the HTTP version of the request
+ // Depending on when the timeout occurred, the HTTP version of the request
// may or may not be available. Therefore we check if the HTTP version is
// set in the request. If it is not available, we need to create a dummy
// request with the default HTTP/1.0 version. This version will be used
/// @param transaction Pointer to the transaction to be guarded by the timeout.
void setupRequestTimer(TransactionPtr transaction = TransactionPtr());
- /// @brief Reset timer for detecing idle timeout in persistent connections.
+ /// @brief Reset timer for detecting idle timeout in persistent connections.
void setupIdleTimer();
/// @brief Callback invoked when the HTTP Request Timeout occurs.
/// @brief Creates an instance of the @c HttpConnection.
///
- /// This method is virtual so as it can be overriden when customized
+ /// This method is virtual so as it can be overridden when customized
/// connections are to be used, e.g. in case of unit testing.
///
/// @param response_creator Pointer to the response creator object used to
/// If the next_state is HTTP_PARSE_OK_ST it indicates that the parsed
/// value is a 3rd new line within request HTTP message. In this case the
/// handler calls @ref HttpRequest::create to validate the received message
- /// (excluding body). The hander then reads the "Content-Length" header to
+ /// (excluding body). The handler then reads the "Content-Length" header to
/// check if the request contains a body. If the "Content-Length" is greater
/// than zero, the parser transitions to HTTP_BODY_ST. If the
/// "Content-Length" doesn't exist the parser transitions to
/// If the next_state is HTTP_PARSE_OK_ST it indicates that the parsed
/// value is a 3rd new line within request HTTP message. In this case the
/// handler calls @ref HttpRequest::create to validate the received message
- /// (excluding body). The hander then reads the "Content-Length" header to
+ /// (excluding body). The handler then reads the "Content-Length" header to
/// check if the request contains a body. If the "Content-Length" is greater
/// than zero, the parser transitions to HTTP_BODY_ST. If the
/// "Content-Length" doesn't exist the parser transitions to
/// @brief Request timeout used in tests.
const long CONN_REQUEST_TIMEOUT = 1000;
-/// @brief Idle connecion timeout used in tests.
+/// @brief Idle connection timeout used in tests.
const long CONN_IDLE_TIMEOUT = 1000;
/// @brief Implementation of the @ref HttpResponseCreator.
/// @brief Creates an instance of the @c HttpConnection.
///
- /// This method is virtual so as it can be overriden when customized
+ /// This method is virtual so as it can be overridden when customized
/// connections are to be used, e.g. in case of unit testing.
///
/// @param io_service IO service to be used by the connection.
return (s.str());
}
- /// @brief Tests that HTTP request tiemout status is returned when the
+ /// @brief Tests that HTTP request timeout status is returned when the
/// server does not receive the entire request.
///
/// @param request Partial request for which the parser will be waiting for
// This test verifies that persistent HTTP connection can be established when
-// "Conection: Keep-Alive" header value is specified.
+// "Connection: Keep-Alive" header value is specified.
TEST_F(HttpListenerTest, keepAlive) {
// The first request contains the keep-alive header which instructs the server
}
/// @brief Tests that underlying TCP socket can be registered and
- /// unregsitered via connection and close callbacks.
+ /// unregistered via connection and close callbacks.
///
- /// It conducts to consequetive requests over the same client.
+ /// It conducts to consecutive requests over the same client.
///
/// @param version HTTP version to be used.
void testConnectCloseCallbacks(const HttpVersion& version) {
// Older log4cplus versions (1.2.0) don't have the initializer.h header that
// would allow explicit initialization. Newer versions (2.0.4 for sure, possibly
// older as well) have it and it's recommended to use it. We detect whether
-// it's present or not and do explicit initalization if possible.
+// it's present or not and do explicit initialization if possible.
#ifdef LOG4CPLUS_INITIALIZER_H
#include <log4cplus/initializer.h>
namespace {
/// @throw InvalidOperation if the value is NULL or the binding
/// type is not @c MYSQL_TYPE_BLOB.
///
- /// @return Blob in a vactor.
+ /// @return Blob in a vector.
std::vector<uint8_t> getBlob() const;
/// @brief Returns value held in the binding as blob.
///
/// @throw InvalidOperation if the binding type is not @c MYSQL_TYPE_BLOB.
///
- /// @return Blob in a vactor.
+ /// @return Blob in a vector.
std::vector<uint8_t>
getBlobOrDefault(const std::vector<uint8_t>& default_value) const;
}
void destroyMySQLSchema(bool show_err, bool force) {
- // If force is true or wipeMySQLData() fails, destory the schema.
+ // If force is true or wipeMySQLData() fails, destroy the schema.
if (force || (!softWipeEnabled()) || wipeMySQLData(show_err)) {
runMySQLScript(DATABASE_SCRIPTS_DIR, "mysql/dhcpdb_drop.mysql", show_err);
}
return(true);
}
-//********* ConfiControlInfo ************//
+//******** ConfigControlInfo ********//
ConfigControlInfo::ConfigControlInfo(const ConfigControlInfo& other)
: config_fetch_wait_time_(other.config_fetch_wait_time_) {
// Everything is clear for launch, so start the application's
// event loop.
try {
- // Now that we have a proces, we can set up signal handling.
+ // Now that we have a process, we can set up signal handling.
initSignalHandling();
runProcess();
} catch (const std::exception& ex) {
// Temporary storage for logging configuration
ConfigPtr storage(new ConfigBase());
- // Configure logging to the tempoary storage.
+ // Configure logging to the temporary storage.
Daemon::configureLogger(module_config, storage);
// Let's apply the new logging. We do it early, so we'll be able
// Temporary storage for logging configuration
ConfigPtr storage(new ConfigBase());
- // Configure logging to the tempoary storage.
+ // Configure logging to the temporary storage.
Daemon::configureLogger(module_config, storage);
// Let's apply the new logging. We do it early, so we'll be able
///
/// Performs configuration backend specific final clean-up. This is called
/// shortly before the daemon terminates. Depending on backend, it may
- /// terminat existing msgq session, close LDAP connection or similar.
+ /// terminate existing msgq session, close LDAP connection or similar.
///
/// The daemon is not expected to receive any further commands or
/// configuration updates as it is in final stages of shutdown.
// Verifies initializing via an access string and unparsing into elements
// We just test basic unparsing, as more rigorous testing is done in
-// libkea-db testing which ConfibDBInfo uses.
+// libkea-db testing which ConfigDBInfo uses.
TEST(ConfigDbInfo, basicOperation) {
ConfigDbInfo db;
std::string access = "type=mysql user=tom password=terrific";
EXPECT_FALSE(db_info2 == ConfigControlInfo::EMPTY_DB());
EXPECT_EQ (access_str2, db_info2.getAccessString());
- // Verify not finding a db reutrns EMPTY_DB().
+ // Verify not finding a db returns EMPTY_DB().
const ConfigDbInfo& db_info3 = ctl.findConfigDb("type", "bogus");
EXPECT_TRUE(db_info3 == ConfigControlInfo::EMPTY_DB());
// Verifies that log rotation occurs when configured. We do not
// worry about contents of the log files, only that rotation occurs.
// Such details are tested in lib/log. This test verifies that
-// we can correcty configure logging such that rotation occurs as
+// we can correctly configure logging such that rotation occurs as
// expected.
TEST_F(LoggingTest, logRotate) {
wipeFiles();
TEST_F(LoggingInfoTest, defaults) {
// We now need to set the default logger explicitly.
- // Otherwise leftovers from pervious tests that use DController
+ // Otherwise leftovers from previous tests that use DController
// would leave the default logger set to TestBin.
Daemon::setDefaultLoggerName("kea");
/// @brief Provides alternate parse file implementation
///
- /// Overrides the base class implementation to mimick controllers which
+ /// Overrides the base class implementation to mimic controllers which
/// implement alternate file parsing. If enabled via useAlternateParser()
/// the method will return a fixed map of elements reflecting the following
/// JSON:
///
/// Overrides the base class implementation so we can
/// verify the getting the extended version text
- /// contains derivaiton specific contributions.
+ /// contains derivation specific contributions.
virtual std::string getVersionAddendum() {
return ("StubController Version Text");
}
ASSERT_EQ(c.getSize(), 20);
ASSERT_EQ(d.getSize(), 20);
- // And whether storaged values are correct
+ // And whether stored values are correct
uint32_t i = 20; // index of the last element in array of test's samples
for (std::list<IntegerSample>::iterator it = samples_int.begin(); it != samples_int.end(); ++it) {
EXPECT_EQ((*it).first, int_samples[i]);
~Sandbox() {
// Delete content of path_ recursively.
if (nftw(path_.c_str(), Sandbox::rmFile, 10, FTW_DEPTH | FTW_MOUNT | FTW_PHYS) < 0) {
- auto msg = "Some error occured while deleting unit test sandbox " + path_;
+ auto msg = "Some error occurred while deleting unit test sandbox " + path_;
std::perror(msg.c_str());
exit(1);
}
/// @brief Mutex used to synchronize threads.
std::mutex mutex_;
- /// Condtional variable for thread waits.
+ /// Conditional variable for thread waits.
std::condition_variable condvar_;
/// Flag indicating that the thread is ready.
}
# Print the lines between two matching regex patterns from a file. Excludes the
-# lines that contain the patterns themselves. Matches only the first occurence.
+# lines that contain the patterns themselves. Matches only the first occurrence.
_print_lines_between_matching_patterns() {
local start_pattern=${1}; shift
local end_pattern=${1}; shift
///
/// This template class encapsulates an optional value. The default implementation
/// encapsulates numeric values, but additional specializations are defined
-/// as neccessary to support other types od data.
+/// as necessary to support other types od data.
///
/// This class includes a boolean flag which indicates if the encapsulated
/// value is specified or unspecified. For example, a configuration parser
EXPECT_TRUE(areDoublesEquivalent( 1.0000000, 1.0000005));
EXPECT_FALSE(areDoublesEquivalent(1.0000000, 1.000005));
- // Check custome tolerance.
+ // Check custom tolerance.
EXPECT_TRUE(areDoublesEquivalent( 1.000, 1.005, 0.01));
EXPECT_FALSE(areDoublesEquivalent(1.000, 1.005, 0.001));
}
// Start it again.
stopwatch.start();
- // Slee for 1 ms.
+ // Sleep for 1 ms.
usleep(1000);
// The durations should get updated as appropriate.
}
if (lock_ == 1) {
// only one thread has the lock
- // self healing mutex reseting the dead lock flag
+ // self healing mutex resetting the dead lock flag
dead_lock_ = false;
// reset the thread id
id_ = std::thread::id();
/// @brief Collect definition.
///
/// This method looks at an option definition and adds the
- /// space+name to code maping into the OptionCodes codes store
+ /// space+name to code mapping into the OptionCodes codes store
/// aka definitions.
///
/// @param option The option definition.
default:
isc_throw(NotImplemented,
- "YangRepr::set called with unupported type: "
+ "YangRepr::set called with unsupported type: "
<< item.type_);
}
session->set_item(item.xpath_.c_str(), s_val);
default:
isc_throw(NotImplemented,
- "value called with unupported type: " << s_val->type());
+ "value called with unsupported type: " << s_val->type());
}
}
default:
isc_throw(NotImplemented,
- "value called with unupported type: " << type);
+ "value called with unsupported type: " << type);
}
return (s_val);
/// "option-data": <option data list>,
/// (DHCPv4 only)
/// "option-def": <option definition list>,
-/// "next-server": <next server addresss>,
+/// "next-server": <next server address>,
/// "server-hostname": <server hostname>,
/// "boot-file-name": <boot filename>,
/// "user-context": { <json map> },
/// @brief A translator class for converting a client class between
/// YANG and JSON.
///
-/// Currently supports on kea-dhcp[46]-server. Ietf-dhcpv6-server does
-/// not define client classe contents.
+/// Currently supports only kea-dhcp[46]-server. Ietf-dhcpv6-server does
+/// not define client class contents.
class TranslatorClass : virtual public TranslatorOptionDataList,
virtual public TranslatorOptionDefList {
public:
/// @brief A translator class for converting a client class list between
/// YANG and JSON.
///
-/// Currently supports on kea-dhcp[46]-server. Ietf-dhcpv6-server does
-/// not define client classe contents.
+/// Currently supports only kea-dhcp[46]-server. Ietf-dhcpv6-server does
+/// not define client class contents.
class TranslatorClasses : virtual public TranslatorClass {
public:
/// @param xpath The xpath of the database access.
/// @param elem The JSON element.
/// @param skip The skip type field flag.
- /// @throw BadValue on database without tyoe,
+ /// @throw BadValue on database without type,
void setDatabaseKea(const std::string& xpath,
isc::data::ConstElementPtr elem,
bool skip);
///
/// @param xpath The xpath of databases including the list name.
/// @param elem The JSON element.
- /// @throw BadValue on database without tyoe,
+ /// @throw BadValue on database without type,
void setDatabasesKea(const std::string& xpath,
isc::data::ConstElementPtr elem);
};
/// {
/// "output": <output, e.g. log file name>,
/// "maxver": <maximum file version>,
-/// "maxsize": <maxium file size>,
+/// "maxsize": <maximum file size>,
/// "flush": <flush flag>,
/// "pattern": <custom layout>
/// }
/// @brief A translator class for converting a logger list between
/// YANG and JSON.
///
-/// Currently supports all kea servers and agents. Speficic to Kea.
+/// Currently supports all kea servers and agents. Specific to Kea.
class TranslatorLoggers : virtual public TranslatorLogger {
public:
/// "next-server": "<next server>",
/// "server-hostname": "<server hostname>",
/// "boot-file-name": "<boot file name>",
-/// "4o6-interface": "<dhpv4-over-dhcpv6 interface>",
-/// "4o6-interface-id": "<dhpv4-over-dhcpv6 interface id>",
-/// "4o6-subnet": "<dhpv4-over-dhcpv6 subnet>",
+/// "4o6-interface": "<dhcpv4-over-dhcpv6 interface>",
+/// "4o6-interface-id": "<dhcpv4-over-dhcpv6 interface id>",
+/// "4o6-subnet": "<dhcpv4-over-dhcpv6 subnet>",
/// "authoritative": <authoritative flag>,
/// "user-context": { <json map> },
/// "comment": "<comment>"
# for each row that needs at least one of the columns updated. In other
# words, if at least one of the subnet ID columns in a row is 0, an
# update statement for that row will be emitted. The update statements
-# are captured in a second temprory file, the "update" file.
+# are captured in a second temporary file, the "update" file.
#
# After exhausting the export file, the update file is submitted to
# cqlsh for execution.
# Modify the primary key to BINGINT as other tables have.
ALTER TABLE dhcp4_options MODIFY option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
-# Add conifguration backend specific columns.
+# Add configuration backend specific columns.
ALTER TABLE dhcp4_options
ADD COLUMN shared_network_name VARCHAR(128) DEFAULT NULL,
ADD COLUMN pool_id BIGINT(20) UNSIGNED DEFAULT NULL,
# Modify the primary key to BINGINT as other tables have.
ALTER TABLE dhcp6_options MODIFY option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
-# Add conifguration backend specific columns.
+# Add configuration backend specific columns.
ALTER TABLE dhcp6_options
ADD COLUMN shared_network_name VARCHAR(128) DEFAULT NULL,
ADD COLUMN pool_id BIGINT(20) UNSIGNED DEFAULT NULL,
#
ALTER TABLE dhcp4_options MODIFY option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
-# Add conifguration backend specific columns.
+# Add configuration backend specific columns.
ALTER TABLE dhcp4_options
ADD COLUMN shared_network_name VARCHAR(128) DEFAULT NULL,
ADD COLUMN pool_id BIGINT(20) UNSIGNED DEFAULT NULL,
# Modify the primary key to BINGINT as other tables have.
ALTER TABLE dhcp6_options MODIFY option_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
-# Add conifguration backend specific columns.
+# Add configuration backend specific columns.
ALTER TABLE dhcp6_options
ADD COLUMN shared_network_name VARCHAR(128) DEFAULT NULL,
ADD COLUMN pool_id BIGINT(20) UNSIGNED DEFAULT NULL,
-- Note we have introduced a bug a while ago which causes the index to have
-- different names depending on whether the schema was created via the
-- dhcpdb_create.pgsql script or via updates. Therefore, let's make sure
--- that we drop the index regarless of its current name.
+-- that we drop the index regardless of its current name.
DROP INDEX IF EXISTS key_dhcp4_ipv4_address_subnet_id;
DROP INDEX IF EXISTS hosts_dhcp4_ipv4_address_subnet_id;
CREATE INDEX key_dhcp4_ipv4_address_subnet_id
# shellcheck disable=SC1004
# SC1004: This backslash+linefeed is literal. Break outside single quotes if you
# just want to break the line.
-# Reason: blackslash+linefeed inside single quotes in sed are needed for
+# Reason: backslash+linefeed inside single quotes in sed are needed for
# POSIX-compliance. \n works only with GNU sed.
# Exit with error if commands exit with non-zero and if undefined variables are
}
# Print the lines between two matching regex patterns from a file. Excludes the
-# lines that contain the patterns themselves. Matches only the first occurence.
+# lines that contain the patterns themselves. Matches only the first occurrence.
print_lines_between_matching_patterns() {
mandatory_commands sed