some changes

master
Frederik Maaßen 2 years ago
parent c7bc0b2a7c
commit 4794fe82da
  1. 12
      implementation/topologies/6r4h_topo.py
  2. 12
      implementation/topologies/8r4h_topo.py
  3. 12
      thesis/content/conclusion/conclusion.tex
  4. 36
      thesis/content/evaluation/evaluation.tex
  5. 76
      thesis/content/evaluation/failure_path_networks.tex
  6. 10
      thesis/content/introduction.tex
  7. 4
      thesis/content/testing/topologies_and_routing.tex
  8. 268
      thesis/images/tests/minimal_bandwidth_link_usage/bandwidth_link_usage_concurrent_wo_sc.eps

@ -351,9 +351,9 @@ class SixRoutersFourHosts(CustomTopo):
"use_pre_defined_function": True,
"separate_definitions": True,
"command_pre": ("measure_packet_flow", (
'h1', 'h6', '10.6.0.101', ["r1", "r3", "r5", "r6"], 30, 1, "before_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
'h1', 'h6', '10.6.0.101', ["r1", "r2", "r5", "r6"], 30, 1, "before_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
"command_post": ("measure_packet_flow", (
'h1', 'h6', '10.6.0.101', ["r1", "r3", "r5", "r6"], 30, 1, "after_failure", [0, 3000], "Packet flow on routers after failure", "tcp", 100)),
'h1', 'h6', '10.6.0.101', ["r1", "r2", "r5", "r6"], 30, 1, "after_failure", [0, 3000], "Packet flow on routers after failure", "tcp", 100)),
},
"failures": [
@ -378,7 +378,7 @@ class SixRoutersFourHosts(CustomTopo):
"execute": {
"use_pre_defined_function": True,
"command": ("measure_packet_flow", (
'h1', 'h6', '10.6.0.101', ["r1", "r3", "r5", "r6"], 30, 1, "concurrent_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
'h1', 'h6', '10.6.0.101', ["r1", "r2", "r5", "r6"], 30, 1, "concurrent_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
},
"failures": [
@ -405,10 +405,10 @@ class SixRoutersFourHosts(CustomTopo):
"use_pre_defined_function": True,
"separate_definitions": True,
"command_pre": ("measure_packet_flow", (
'h1', 'h6', '10.6.0.101', ["r1", "r3", "r5", "r6"], 30, 1, "udp_before_failure", [0, 20000],
'h1', 'h6', '10.6.0.101', ["r1", "r2", "r5", "r6"], 30, 1, "udp_before_failure", [0, 20000],
"UDP Packet flow on routers before failure", "udp", 100)),
"command_post": ("measure_packet_flow", (
'h1', 'h6', '10.6.0.101', ["r1", "r3", "r5", "r6"], 30, 1, "udp_after_failure", [0, 22000],
'h1', 'h6', '10.6.0.101', ["r1", "r2", "r5", "r6"], 30, 1, "udp_after_failure", [0, 22000],
"UDP Packet flow on routers after failure", "udp", 100)),
},
@ -434,7 +434,7 @@ class SixRoutersFourHosts(CustomTopo):
"execute": {
"use_pre_defined_function": True,
"command": ("measure_packet_flow", (
'h1', 'h6', '10.6.0.101', ["r1", "r3", "r5", "r6"], 30, 1, "udp_concurrent_failure", [0, 22000],
'h1', 'h6', '10.6.0.101', ["r1", "r2", "r5", "r6"], 30, 1, "udp_concurrent_failure", [0, 22000],
"UDP Packet flow on routers before failure", "udp", 100)),
},

@ -498,9 +498,9 @@ class EightRoutersFourHosts(CustomTopo):
"use_pre_defined_function": True,
"separate_definitions": True,
"command_pre": ("measure_packet_flow", (
'h1', 'h8', '10.8.0.101', ["r1", "r4", "r7", "r8"], 30, 1, "before_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
'h1', 'h8', '10.8.0.101', ["r1", "r2", "r7", "r8"], 30, 1, "before_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
"command_post": ("measure_packet_flow", (
'h1', 'h8', '10.8.0.101', ["r1", "r4", "r7", "r8"], 30, 1, "after_failure", [0, 3000], "Packet flow on routers after failure", "tcp", 100)),
'h1', 'h8', '10.8.0.101', ["r1", "r2", "r7", "r8"], 30, 1, "after_failure", [0, 3000], "Packet flow on routers after failure", "tcp", 100)),
},
"failures": [
@ -525,7 +525,7 @@ class EightRoutersFourHosts(CustomTopo):
"execute": {
"use_pre_defined_function": True,
"command": ("measure_packet_flow", (
'h1', 'h8', '10.8.0.101', ["r1", "r4", "r7", "r8"], 30, 1, "concurrent_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
'h1', 'h8', '10.8.0.101', ["r1", "r2", "r7", "r8"], 30, 1, "concurrent_failure", [0, 3000], "Packet flow on routers before failure", "tcp", 100)),
},
"failures": [
@ -552,9 +552,9 @@ class EightRoutersFourHosts(CustomTopo):
"use_pre_defined_function": True,
"separate_definitions": True,
"command_pre": ("measure_packet_flow", (
'h1', 'h8', '10.8.0.101', ["r1", "r4", "r7", "r8"], 30, 1, "udp_before_failure", [0, 15000], "UDP Packet flow on routers before failure", "udp", 100)),
'h1', 'h8', '10.8.0.101', ["r1", "r2", "r7", "r8"], 30, 1, "udp_before_failure", [0, 15000], "UDP Packet flow on routers before failure", "udp", 100)),
"command_post": ("measure_packet_flow", (
'h1', 'h8', '10.8.0.101', ["r1", "r4", "r7", "r8"], 30, 1, "udp_after_failure", [0, 15000], "UDP Packet flow on routers after failure", "udp", 100)),
'h1', 'h8', '10.8.0.101', ["r1", "r2", "r7", "r8"], 30, 1, "udp_after_failure", [0, 15000], "UDP Packet flow on routers after failure", "udp", 100)),
},
"failures": [
@ -579,7 +579,7 @@ class EightRoutersFourHosts(CustomTopo):
"execute": {
"use_pre_defined_function": True,
"command": ("measure_packet_flow", (
'h1', 'h8', '10.8.0.101', ["r1", "r4", "r7", "r8"], 30, 1, "udp_concurrent_failure", [0, 15000], "UDP Packet flow on routers before failure", "udp", 100)),
'h1', 'h8', '10.8.0.101', ["r1", "r2", "r7", "r8"], 30, 1, "udp_concurrent_failure", [0, 15000], "UDP Packet flow on routers before failure", "udp", 100)),
},
"failures": [

@ -3,6 +3,7 @@
\section{Results of this work}
\section{Future work}
During our work on this thesis we were not able to
\subsection{Testing framework}
We provided the testing framework we used for performing tests on ShortCut. This framework can be used for many different test runs, but is still a prototype. The structure is far from optimal and most pipelines can be optimized.
@ -13,4 +14,13 @@ One example is the usage of \textit{iperf3} for performing bandwidth measurement
All measurements were done using one specific tool, depending on the type of measurement, namely \textit{iperf} for bandwidth measurements and the production of data streams and \textit{ping} for latency tests. \textit{iperf} could be replaced with a multitude of software packets and some members of the Mininet community have suggested that e.g. \textit{netperf} (\cite{Jones.2015}) would provide more accurate results. This could be evaluated in further detail.
\subsection{Measuring CPU usage of hosts in Mininet}
Tests in this work are done with a limit of \SI{100}{Mbps} imposed on the links, in tests without a limit to the bandwidth values of around \SI{40}{Gbps} were reached. While this should remove any fluctuations that could be caused by additional operations either on the virtual machine or the host system, it does not completely ensure proper distribution of processing power. For this we could run CPU usage measurements while the actual tests are running. This would enable us to further interpret results and possible spikes in delay or bandwidth.
Tests in this work are done with a limit of \SI{100}{Mbps} imposed on the links, in tests without a limit to the bandwidth values of around \SI{40}{Gbps} were reached. While this should remove any fluctuations that could be caused by additional operations either on the virtual machine or the host system, it does not completely ensure proper distribution of processing power. For this we could run CPU usage measurements while the actual tests are running. This would enable us to further interpret results and possible spikes in delay or bandwidth.
\subsection{Massive testing}
Because of the time constrains of this work we were unable to test in high volumes, even though we experienced some fluctuations in our measurements. To increase the reliability of our results the tests could be run e.g. a hundred times. This could also be integrated into the testing framework with an additional argument specifying in which quantity the test should be run.
\subsection{Adding topologies, FRR variants and FRMs}
In this work we evaluated three pretty similar topologies, as well as a simple implementation of FRR and an implementation of the FRM ShortCut.
Depending on the requirements of a network, an e.g. full topology with all routers inter-connected might be a good starting point for further testing. This should go hand in hand with the implementation of an automatic routing and a more strategic deployment of FRR and FRMs.
As described in \cref{FRM} there are also many different FRMs which could be implemented in Mininet and tested using our test framework.

@ -7,8 +7,44 @@ The evaluations are sorted by topology. For each topology we measured the bandwi
We start with our minimal network in section \ref{eva_minimal_network}, followed by the evaluation of two networks with longer "failure paths", measuring the influence of additional nodes in looped paths in section \ref{eva_failure_path_network}.
Lastly we discuss our results in \cref{discussion}.
\input{content/evaluation/minimal_network}
\input{content/evaluation/failure_path_networks}
\section{Discussion of results}
\label{discussion}
In this section we discuss our results in the previous measurements. We proceed by comparing the results of different measurement types using the three topologies. For each measurement type we collect the implications of a failure for the network and whether ShortCut is able to enhance results. We start with the bandwidth in \cref{discussion_bandwidth}, continuing to the bandwidth with a second data flow in \cref{discussion_bandwidth_link_usage}. After that we talk about our latency measurements in \cref{discussion_latency} followed by our packet flow measurements using TCP and UDP in \cref{discussion_packet_flow_tcp} and \cref{discussion_packet_flow_udp} respectively.
\subsection{Bandwidth}
\label{discussion_bandwidth}
A failure in our topologies did not have an impact on our bandwidth measurement results. The throughput of a network and therefore the bandwidth that can be achieved on a path is not influenced by additional hops on a route, even though these might increase latency. This is, of course, also true for longer failure paths. As long as no additional data flows are sent through the network the bandwidth is not impacted and ShortCut has no need to restore performance.
\subsection{Bandwidth with concurrent data flow}
\label{discussion_bandwidth_link_usage}
Measuring the achieved bandwidth with a concurrent data flow shows that in case a second data flow is running on the network, the looped path now has a real performance impact. The throughput is split between both data flows on all links that are looped. This causes an overall throughput loss of 50\%, as the links included in the looped path create a bottleneck for both data flows.
Using ShortCut under such circumstances will fully restore performance to the state without failure. It has to be noted that, although in our measurements both data flows achieved a maximum throughput with ShortCut, the alternative route still could be used by other data flows which might be influenced. This is however also true for the network when not using ShortCut.
Longer failure paths showed no additional impact on the performance and ability of ShortCut to restore the throughput.
A longer failure path will have an adverse effect in a realistic network. Because more links experience additional traffic, even more data flows might be affected by the failure. The usage of ShortCut would therefore be more beneficial the more links can be removed from looped paths.
\subsection{Latency}
\label{discussion_latency}
Sending packets over additional hops will without a doubt increase the latency. This is confirmed in our results.
Longer failure paths would of course increase this additional delay. Because ShortCut was able to cut off the looped path, it was able to restore the original latency on our test networks.
As such ShortCut provides a reliable way to optimize alternative routes, especially for time sensitive data like VOIP.
\subsection{TCP packet flow}
\label{discussion_packet_flow_tcp}
Our packet flow measurements using a TCP data transfer showed the amount of packets forwarded on each router. A naive assumption would be that the routers on a looped path would have to forward each packet twice and therefore have a 100\% increased load on them. This is, however, not true for TCP as only packets sent to the receiving device are forwarded through our loop in our topologies. ACKs returning from the \textit{iperf} server are not sent through the looped path. Because of this the routers on the looped path actually only forward half of all packets, except for the router at the entry point of the loop. It has to be noted that these packets all contain data and therefore do have full impact on the bandwidth of links involved in the looped path as discussed previously in \cref{discussion_bandwidth_link_usage}.
The entry point of the loop, which in our topologies is always router R1, forwards each packet containing data twice and acknowledgements once, increasing the workload for the router by 50\%.
Longer failure paths do not influence this behaviour.
ShortCut is able to cut the looped path and therefore restores the network to a state in which all routers on the path of routing forward the same amount of packets, with routers on the looped path not forwarding any packets anymore.
\subsection{UDP packet flow}
\label{discussion_packet_flow_udp}
When using UDP for our data transfer and measuring the packets forwarded on routers, the differences between TCP and UDP become quite obvious. As UDP does not send ACKs on successful transmission there a

@ -30,9 +30,11 @@ When measuring the bandwidth of our networks with longer failure paths the resul
The addition of hops to the failure path did not have an effect on the bandwidth.
\subsection{Two concurrent data transfers}
Similar to the the results for our minimal network in \cref{evaluation_minimal_bandwidth_link_usage}, the addition of a second measurement running concurrently on the looped path does reduce throughput for both data flows.
The longer failure path however implicates that the impact in a realistic environment might be much bigger. Because more links experience additional traffic, even more data flows might be affected by the failure. The usage of ShortCut would therefore be more beneficial the more links can be removed from looped paths.
We started two concurrent data flows using \textit{iperf}. In case of a failure, these two data flows would influence each other.
\subsubsection{With FRR}
\begin{figure}
\centering
@ -52,6 +54,11 @@ The longer failure path however implicates that the impact in a realistic enviro
\caption{Bandwidth with concurrent data transfer on H3 to H1}
\label{fig:evaluation_failure_path_1_bandwidth_link_usage_wo_sc}
\end{figure}
Similar to the the results for our minimal network in \cref{evaluation_minimal_bandwidth_link_usage}, the addition of a second measurement running concurrently on the looped path does not reduce throughput for both data flows as can be seen in \cref{fig:evaluation_failure_path_1_bandwidth_link_usage_wo_sc_a}.
When introducing a failure however the two data flows use all links from router R3 to router R1 simultaneously. They effectively have to split the available bandwidth, reducing the overall throughput by 50\% as can be seen in \cref{fig:evaluation_failure_path_1_bandwidth_link_usage_wo_sc_b}, but there is no impact on the available bandwidth unique to the longer failure paths. This is why we only added the graphs for the smaller variant shown in \cref{fig:evaluation_failure_path_1_network}.
\begin{figure}
\centering
@ -60,7 +67,11 @@ The longer failure path however implicates that the impact in a realistic enviro
\label{fig:evaluation_failure_path_1_bandwidth_link_usage_concurrent_wo_sc}
\end{figure}
Introducing the failure concurrently to the data transfer causes both bandwidths to abruptly drop, which can be seen in \cref{fig:evaluation_failure_path_1_bandwidth_link_usage_concurrent_wo_sc}. Although the two data flows distribute the bandwidth differently, they achieve an overall throughput of \SI{100}{Mbps}. We assume that the incoherent distribution of bandwidth is caused by the timing of the data transfers.
The data transfer in \cref{fig:evaluation_failure_path_1_bandwidth_link_usage_wo_sc_b} already starts with the failure in place. Because the \textit{iperf} instance producing the additional data flow is started slightly before our main data flow, Mininet seems to allocate more bandwidth to this transfer. The graph also suggests that both bandwidths approximate each other, suggesting that Mininet tries to, over time, allocate both transfers the same bandwidth.
Our measurement with a failure occurring concurrent to our data transfers however evens the playing field. Both \textit{iperf} instances already send data over the network. This could explain the overall more evenly distributed bandwidth, as well as the main data flow even overtaking the additional data flow.
\subsubsection{With FRR and ShortCut}
@ -92,37 +103,42 @@ The longer failure path however implicates that the impact in a realistic enviro
\subsection{Latency}
\label{failure_path_latency}
We measured the latency between host H1 and H6 for our first failure path network and between host H1 and H8 for our second failure path network.
\subsubsection{With FRR}
\label{failure_path_1_latency_with_frr}
\begin{figure}
\centering
\begin{subfigure}[b]{0.49\textwidth}
\centering
\includegraphics[width=\textwidth]{tests/failure_path_1_latency/latency_before_wo_sc}
\label{fig:evaluation_failure_path_1_latency_wo_sc_a}
\caption{Latency before a failure}
\caption{Latency before a failure on 1st failure path network}
\end{subfigure}
\begin{subfigure}[b]{0.49\textwidth}
\centering
\includegraphics[width=\textwidth]{tests/failure_path_1_latency/latency_after_wo_sc}
\label{fig:evaluation_failure_path_1_latency_wo_sc_b}
\caption{Latency after a failure}
\caption{Latency after a failure on 1st failure path network}
\end{subfigure}
\vskip\baselineskip
\begin{subfigure}[b]{0.49\textwidth}
\centering
\includegraphics[width=\textwidth]{tests/failure_path_2_latency/latency_before_wo_sc}
\label{fig:evaluation_failure_path_2_latency_wo_sc_a}
\caption{Latency before a failure on 2nd failure path network}
\end{subfigure}
\caption{Latency measured with ping}
\begin{subfigure}[b]{0.49\textwidth}
\centering
\includegraphics[width=\textwidth]{tests/failure_path_2_latency/latency_after_wo_sc}
\label{fig:evaluation_failure_path_2_latency_wo_sc_b}
\caption{Latency after a failure on 2nd failure path network}
\end{subfigure}
\caption{Latency measured with \textit{ping} on both failure path networks}
\label{fig:evaluation_failure_path_1_latency_wo_sc}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=10cm]{tests/failure_path_1_latency/latency_concurrent_wo_sc}
\caption{Latency with a concurrent failure after 15 seconds}
\label{fig:evaluation_failure_path_1_latency_concurrent_wo_sc}
\end{figure}
The additional hops in our failure path networks add, as expected, latency to the measurements. In case of our first failure path network around \SI{20}{\milli\second} of additional latency were measured after a failure as can be seen in \cref{fig:evaluation_failure_path_1_latency_wo_sc_b}. The second failure path network adds an additional \SI{10}{\milli\second} to the latency in case of a failure, adding \SI{30}{\milli\second} in total as can be seen in \cref{fig:evaluation_failure_path_2_latency_wo_sc_b}. This is caused by the additional links on the longer path, with Mininet adding \SI{5}{\milli\second} of delay for each link that is passed. Because only ICMP echo requests and not replies use the looped path, as packets returning from either host H6 or H8 are not forwarded to router R2 when arriving on router R1, the additional latency on the network will always be \SI{10}{\milli\second} for each link contained on the looped path. The additional link is passed twice by each ICMP echo request.
\subsubsection{With FRR and ShortCut}
\label{failure_path_1_latency_with_frr_and_shortcut}
@ -132,25 +148,35 @@ The longer failure path however implicates that the impact in a realistic enviro
\centering
\includegraphics[width=\textwidth]{tests/failure_path_1_latency/latency_before_sc}
\label{fig:evaluation_failure_path_1_latency_sc_a}
\caption{Latency before a failure}
\caption{Latency before a failure on 1st failure path network}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.49\textwidth}
\centering
\includegraphics[width=\textwidth]{tests/failure_path_1_latency/latency_after_sc}
\label{fig:evaluation_failure_path_1_latency_sc_b}
\caption{Latency after a failure}
\caption{Latency after a failure on 1st failure path network}
\end{subfigure}
\caption{Latency measured with ping using ShortCut}
\begin{subfigure}[b]{0.49\textwidth}
\centering
\includegraphics[width=\textwidth]{tests/failure_path_2_latency/latency_before_sc}
\label{fig:evaluation_failure_path_2_latency_sc_a}
\caption{Latency before a failure on 2nd failure path network}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.49\textwidth}
\centering
\includegraphics[width=\textwidth]{tests/failure_path_2_latency/latency_after_sc}
\label{fig:evaluation_failure_path_2_latency_sc_b}
\caption{Latency after a failure on 2nd failure path network}
\end{subfigure}
\vskip\baselineskip
\caption{Latency measured with \textit{ping} on both failure path networks using ShortCut}
\label{fig:evaluation_failure_path_1_latency_sc}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=10cm]{tests/failure_path_1_latency/latency_concurrent_sc}
\caption{Latency with a concurrent failure after 15 seconds with ShortCut}
\label{fig:evaluation_failure_path_1_latency_concurrent_sc}
\end{figure}
Similar to our results when measuring the minimal topology in \cref{evaluation_minimal_latency}, ShortCut is able to restore the original latency after a failure, independent of the length of the cut looped path, as can be seen in \cref{fig:evaluation_failure_path_1_latency_sc}.
\subsection{Packet flow - TCP}
\label{failure_path_tcp_packet_flow}

@ -17,17 +17,19 @@ The key difference between both is the time they take to become active. Because
Most of the FRR approaches will however create sub-optimal paths which may be already in use or contain loops, effectively reducing the performance of the network.
FRMs like ShortCut (\cite{Shukla.2021}), Resilient Routing Layers (\cite{Kvalbein.2005}), Revive (\cite{Haque.2018}) and Blink (\cite{ThomasHolterbach.2019}) try to alleviate this issue by removing longer paths from the routings only using data available on the device, bridging the gap between FRR and the global convergence protocol.
FRMs like ShortCut (\cite{Shukla.2021}), Resilient Routing Layers (RRL) (\cite{Kvalbein.2005}), Revive (\cite{Haque.2018}) and Blink (\cite{ThomasHolterbach.2019}) try to alleviate this issue by removing longer paths from the routings only using data available on the device, bridging the gap between FRR and the global convergence protocol.
\section{State of the art}
Until the global convergence protocol converges it leaves the routing to In-network methods like FRR which will reroute traffic according to pre-defined alternative routes on the network. In some cases however methods like FRR cause routing paths to be longer than necessary which produces additional traffic on the network and adds delay to transmissions.
Resilient Routing Layers pre-computes alternative routing tables, switching between routing tables in case of failure, but needs to manipulate packets to inform routers of changed routing tables.
RRL pre-computes alternative routing tables, switching between routing tables in case of failure, but needs to manipulate packets to inform routers of changed routing tables.
ShortCut uses information about the incoming packet to determine whether or not the packet returned to the router, using already existing FRR implementations. In case a packet returns it will remove the route with the highest priority from the routing table, assuming that the path is no longer available.
Revive installs backup routes prior WRITE THIS
Revive installs backup routes pro-actively using an optimized algorithm and controllers, but is prone to loops created by alternative paths as failures are not propagated to routers.
Blink WRITE THIS
@ -47,6 +49,6 @@ To test ShortCut we provide a prototype for an implementation using \textit{nfta
We developed a testing framework that can be used to automatically create Mininet topologies, formulate tests in python dictionaries using existing measurement functions, set network wide bandwidth limits or delays and to run automatic sets of tests.
The framework can be called using an argument based \textit{command line interface} (CLI).
Using this framework we test several topologies using FRR with and without ShortCut and discuss the results, showing the usefulness and resource efficiency of the FRM ShortCut.
Using this framework we test several topologies using FRR with and without ShortCut and discuss the results, showing the possible applications and benefits of the FRM ShortCut.

@ -9,8 +9,8 @@ We define a set of topologies, which we later use in our tests. This includes a
\label{testing_minimum_network}
\begin{figure}
\centering
\fbox{\includegraphics[width=10cm]{testing_4r4h}}
\caption{A minimal testing network}
\includegraphics[width=10cm]{testing_4r3h}
\caption{A minimal testing network using 4 routers, 3 switches and 3 hosts}
\label{fig:testing_4r4h}
\end{figure}
This network is used for tests in an environment that fulfils the minimum requirements for the implementation and reliable testing of a FRM.

@ -1,6 +1,6 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.16.0 (https://cairographics.org)
%%CreationDate: Fri May 13 01:40:15 2022
%%CreationDate: Mon May 16 22:16:18 2022
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
@ -568,138 +568,137 @@ ET
q 1 0 0 1 0 0 cm
309.852 18.199 m 333.949 18.199 l S Q
q 1 0 0 1 0 0 cm
42.949 185.75 m 53 57.75 l 63.051 57.352 l 73.051 57.898 l 83.102 58 l
93.148 57.352 l 103.199 57.602 l 113.25 57.898 l 123.25 57.352 l 133.301
57.602 l 143.352 57.352 l 153.398 61 l 163.449 126.5 l 173.449 128.801
l 183.5 129.852 l 193.551 127.949 l 203.602 128.102 l 213.648 126.602 l
223.648 128.398 l 233.699 125.25 l 243.75 138.25 l 253.801 139.199 l 263.852
141.648 l 273.852 138.551 l 283.898 140.398 l 293.949 142.699 l 304 141.352
l 314.051 140.551 l 324.051 142.301 l 334.102 142.301 l 344.148 142.051
l S Q
42.949 185.75 m 53 63.051 l 63.051 58.949 l 73.051 58.449 l 83.102 57.352
l 93.148 59.5 l 103.199 57.75 l 113.25 57.5 l 123.25 57.898 l 133.301 57.5
l 143.352 57.898 l 153.398 58.301 l 163.449 58 l 173.449 59.352 l 183.5
63.852 l 193.551 128.25 l 203.602 128.398 l 213.648 127.949 l 223.648 127.699
l 233.699 127.148 l 243.75 126.199 l 253.801 128.648 l 263.852 125.398
l 273.852 126.75 l 283.898 139.199 l 293.949 127.551 l 304 126.602 l 314.051
127.148 l 324.051 127.051 l 334.102 127.449 l 344.148 128.102 l S Q
q 1 0 0 1 0 0 cm
39.949 185.75 m 45.949 185.75 l S Q
q 1 0 0 1 0 0 cm
42.949 182.75 m 42.949 188.75 l S Q
q 1 0 0 1 0 0 cm
50 57.75 m 56 57.75 l S Q
50 63.051 m 56 63.051 l S Q
q 1 0 0 1 0 0 cm
53 54.75 m 53 60.75 l S Q
53 60.051 m 53 66.051 l S Q
q 1 0 0 1 0 0 cm
60.051 57.352 m 66.051 57.352 l S Q
60.051 58.949 m 66.051 58.949 l S Q
q 1 0 0 1 0 0 cm
63.051 54.352 m 63.051 60.352 l S Q
63.051 55.949 m 63.051 61.949 l S Q
q 1 0 0 1 0 0 cm
70.051 57.898 m 76.051 57.898 l S Q
70.051 58.449 m 76.051 58.449 l S Q
q 1 0 0 1 0 0 cm
73.051 54.898 m 73.051 60.898 l S Q
73.051 55.449 m 73.051 61.449 l S Q
q 1 0 0 1 0 0 cm
80.102 58 m 86.102 58 l S Q
80.102 57.352 m 86.102 57.352 l S Q
q 1 0 0 1 0 0 cm
83.102 55 m 83.102 61 l S Q
83.102 54.352 m 83.102 60.352 l S Q
q 1 0 0 1 0 0 cm
90.148 57.352 m 96.148 57.352 l S Q
90.148 59.5 m 96.148 59.5 l S Q
q 1 0 0 1 0 0 cm
93.148 54.352 m 93.148 60.352 l S Q
93.148 56.5 m 93.148 62.5 l S Q
q 1 0 0 1 0 0 cm
100.199 57.602 m 106.199 57.602 l S Q
100.199 57.75 m 106.199 57.75 l S Q
q 1 0 0 1 0 0 cm
103.199 54.602 m 103.199 60.602 l S Q
103.199 54.75 m 103.199 60.75 l S Q
q 1 0 0 1 0 0 cm
110.25 57.898 m 116.25 57.898 l S Q
110.25 57.5 m 116.25 57.5 l S Q
q 1 0 0 1 0 0 cm
113.25 54.898 m 113.25 60.898 l S Q
113.25 54.5 m 113.25 60.5 l S Q
q 1 0 0 1 0 0 cm
120.25 57.352 m 126.25 57.352 l S Q
120.25 57.898 m 126.25 57.898 l S Q
q 1 0 0 1 0 0 cm
123.25 54.352 m 123.25 60.352 l S Q
123.25 54.898 m 123.25 60.898 l S Q
q 1 0 0 1 0 0 cm
130.301 57.602 m 136.301 57.602 l S Q
130.301 57.5 m 136.301 57.5 l S Q
q 1 0 0 1 0 0 cm
133.301 54.602 m 133.301 60.602 l S Q
133.301 54.5 m 133.301 60.5 l S Q
q 1 0 0 1 0 0 cm
140.352 57.352 m 146.352 57.352 l S Q
140.352 57.898 m 146.352 57.898 l S Q
q 1 0 0 1 0 0 cm
143.352 54.352 m 143.352 60.352 l S Q
143.352 54.898 m 143.352 60.898 l S Q
q 1 0 0 1 0 0 cm
150.398 61 m 156.398 61 l S Q
150.398 58.301 m 156.398 58.301 l S Q
q 1 0 0 1 0 0 cm
153.398 58 m 153.398 64 l S Q
153.398 55.301 m 153.398 61.301 l S Q
q 1 0 0 1 0 0 cm
160.449 126.5 m 166.449 126.5 l S Q
160.449 58 m 166.449 58 l S Q
q 1 0 0 1 0 0 cm
163.449 123.5 m 163.449 129.5 l S Q
163.449 55 m 163.449 61 l S Q
q 1 0 0 1 0 0 cm
170.449 128.801 m 176.449 128.801 l S Q
170.449 59.352 m 176.449 59.352 l S Q
q 1 0 0 1 0 0 cm
173.449 125.801 m 173.449 131.801 l S Q
173.449 56.352 m 173.449 62.352 l S Q
q 1 0 0 1 0 0 cm
180.5 129.852 m 186.5 129.852 l S Q
180.5 63.852 m 186.5 63.852 l S Q
q 1 0 0 1 0 0 cm
183.5 126.852 m 183.5 132.852 l S Q
183.5 60.852 m 183.5 66.852 l S Q
q 1 0 0 1 0 0 cm
190.551 127.949 m 196.551 127.949 l S Q
190.551 128.25 m 196.551 128.25 l S Q
q 1 0 0 1 0 0 cm
193.551 124.949 m 193.551 130.949 l S Q
193.551 125.25 m 193.551 131.25 l S Q
q 1 0 0 1 0 0 cm
200.602 128.102 m 206.602 128.102 l S Q
200.602 128.398 m 206.602 128.398 l S Q
q 1 0 0 1 0 0 cm
203.602 125.102 m 203.602 131.102 l S Q
203.602 125.398 m 203.602 131.398 l S Q
q 1 0 0 1 0 0 cm
210.648 126.602 m 216.648 126.602 l S Q
210.648 127.949 m 216.648 127.949 l S Q
q 1 0 0 1 0 0 cm
213.648 123.602 m 213.648 129.602 l S Q
213.648 124.949 m 213.648 130.949 l S Q
q 1 0 0 1 0 0 cm
220.648 128.398 m 226.648 128.398 l S Q
220.648 127.699 m 226.648 127.699 l S Q
q 1 0 0 1 0 0 cm
223.648 125.398 m 223.648 131.398 l S Q
223.648 124.699 m 223.648 130.699 l S Q
q 1 0 0 1 0 0 cm
230.699 125.25 m 236.699 125.25 l S Q
230.699 127.148 m 236.699 127.148 l S Q
q 1 0 0 1 0 0 cm
233.699 122.25 m 233.699 128.25 l S Q
233.699 124.148 m 233.699 130.148 l S Q
q 1 0 0 1 0 0 cm
240.75 138.25 m 246.75 138.25 l S Q
240.75 126.199 m 246.75 126.199 l S Q
q 1 0 0 1 0 0 cm
243.75 135.25 m 243.75 141.25 l S Q
243.75 123.199 m 243.75 129.199 l S Q
q 1 0 0 1 0 0 cm
250.801 139.199 m 256.801 139.199 l S Q
250.801 128.648 m 256.801 128.648 l S Q
q 1 0 0 1 0 0 cm
253.801 136.199 m 253.801 142.199 l S Q
253.801 125.648 m 253.801 131.648 l S Q
q 1 0 0 1 0 0 cm
260.852 141.648 m 266.852 141.648 l S Q
260.852 125.398 m 266.852 125.398 l S Q
q 1 0 0 1 0 0 cm
263.852 138.648 m 263.852 144.648 l S Q
263.852 122.398 m 263.852 128.398 l S Q
q 1 0 0 1 0 0 cm
270.852 138.551 m 276.852 138.551 l S Q
270.852 126.75 m 276.852 126.75 l S Q
q 1 0 0 1 0 0 cm
273.852 135.551 m 273.852 141.551 l S Q
273.852 123.75 m 273.852 129.75 l S Q
q 1 0 0 1 0 0 cm
280.898 140.398 m 286.898 140.398 l S Q
280.898 139.199 m 286.898 139.199 l S Q
q 1 0 0 1 0 0 cm
283.898 137.398 m 283.898 143.398 l S Q
283.898 136.199 m 283.898 142.199 l S Q
q 1 0 0 1 0 0 cm
290.949 142.699 m 296.949 142.699 l S Q
290.949 127.551 m 296.949 127.551 l S Q
q 1 0 0 1 0 0 cm
293.949 139.699 m 293.949 145.699 l S Q
293.949 124.551 m 293.949 130.551 l S Q
q 1 0 0 1 0 0 cm
301 141.352 m 307 141.352 l S Q
301 126.602 m 307 126.602 l S Q
q 1 0 0 1 0 0 cm
304 138.352 m 304 144.352 l S Q
304 123.602 m 304 129.602 l S Q
q 1 0 0 1 0 0 cm
311.051 140.551 m 317.051 140.551 l S Q
311.051 127.148 m 317.051 127.148 l S Q
q 1 0 0 1 0 0 cm
314.051 137.551 m 314.051 143.551 l S Q
314.051 124.148 m 314.051 130.148 l S Q
q 1 0 0 1 0 0 cm
321.051 142.301 m 327.051 142.301 l S Q
321.051 127.051 m 327.051 127.051 l S Q
q 1 0 0 1 0 0 cm
324.051 139.301 m 324.051 145.301 l S Q
324.051 124.051 m 324.051 130.051 l S Q
q 1 0 0 1 0 0 cm
331.102 142.301 m 337.102 142.301 l S Q
331.102 127.449 m 337.102 127.449 l S Q
q 1 0 0 1 0 0 cm
334.102 139.301 m 334.102 145.301 l S Q
334.102 124.449 m 334.102 130.449 l S Q
q 1 0 0 1 0 0 cm
341.148 142.051 m 347.148 142.051 l S Q
341.148 128.102 m 347.148 128.102 l S Q
q 1 0 0 1 0 0 cm
344.148 139.051 m 344.148 145.051 l S Q
344.148 125.102 m 344.148 131.102 l S Q
q 1 0 0 1 0 0 cm
318.898 18.199 m 324.898 18.199 l S Q
q 1 0 0 1 0 0 cm
@ -719,138 +718,139 @@ q 1 0 0 1 0 0 cm
309.852 27.5 m 333.949 27.5 l S Q
[ 2.5 4 2.5 4 2.5 4 2.5 4] 0 d
q 1 0 0 1 0 0 cm
42.949 185.75 m 53 57.352 l 63.051 57.352 l 73.051 58.148 l 83.102 58 l
93.148 57.602 l 103.199 57.602 l 113.25 57.75 l 123.25 57.5 l 133.301 57.5
l 143.352 57.898 l 153.398 60.199 l 163.449 116.352 l 173.449 116.75 l
183.5 116.75 l 193.551 117.699 l 203.602 115.949 l 213.648 117.852 l 223.648
118.102 l 233.699 116.75 l 243.75 106.449 l 253.801 107 l 263.852 103.602
l 273.852 104.551 l 283.898 102.949 l 293.949 102.148 l 304 103.102 l 314.051
102.148 l 324.051 100.648 l 334.102 102.949 l 344.148 102.398 l S Q
42.949 185.75 m 53.102 64.898 l 63.051 58.699 l 73.051 58.852 l 83.102
57.352 l 93.148 59.648 l 103.199 57.352 l 113.25 57.75 l 123.25 57.75 l
133.301 57.898 l 143.352 58.148 l 153.398 58 l 163.449 58 l 173.449 58.852
l 183.5 58.449 l 193.551 115.102 l 203.602 115.398 l 213.648 116.051 l
223.648 115.648 l 233.699 117.551 l 243.75 119.199 l 253.801 114.699 l 263.852
115.551 l 273.852 117.699 l 283.898 130.148 l 293.949 117.148 l 304 116.602
l 314.051 116.602 l 324.051 116.051 l 334.102 115.648 l 344.148 114.699
l S Q
[] 0.0 d
q 1 0 0 1 0 0 cm
39.949 182.75 m 45.949 188.75 l S Q
q 1 0 0 1 0 0 cm
39.949 188.75 m 45.949 182.75 l S Q
q 1 0 0 1 0 0 cm
50 54.352 m 56 60.352 l S Q
50.102 61.898 m 56.102 67.898 l S Q
q 1 0 0 1 0 0 cm
50 60.352 m 56 54.352 l S Q
50.102 67.898 m 56.102 61.898 l S Q
q 1 0 0 1 0 0 cm
60.051 54.352 m 66.051 60.352 l S Q
60.051 55.699 m 66.051 61.699 l S Q
q 1 0 0 1 0 0 cm
60.051 60.352 m 66.051 54.352 l S Q
60.051 61.699 m 66.051 55.699 l S Q
q 1 0 0 1 0 0 cm
70.051 55.148 m 76.051 61.148 l S Q
70.051 55.852 m 76.051 61.852 l S Q
q 1 0 0 1 0 0 cm
70.051 61.148 m 76.051 55.148 l S Q
70.051 61.852 m 76.051 55.852 l S Q
q 1 0 0 1 0 0 cm
80.102 55 m 86.102 61 l S Q
80.102 54.352 m 86.102 60.352 l S Q
q 1 0 0 1 0 0 cm
80.102 61 m 86.102 55 l S Q
80.102 60.352 m 86.102 54.352 l S Q
q 1 0 0 1 0 0 cm
90.148 54.602 m 96.148 60.602 l S Q
90.148 56.648 m 96.148 62.648 l S Q
q 1 0 0 1 0 0 cm
90.148 60.602 m 96.148 54.602 l S Q
90.148 62.648 m 96.148 56.648 l S Q
q 1 0 0 1 0 0 cm
100.199 54.602 m 106.199 60.602 l S Q
100.199 54.352 m 106.199 60.352 l S Q
q 1 0 0 1 0 0 cm
100.199 60.602 m 106.199 54.602 l S Q
100.199 60.352 m 106.199 54.352 l S Q
q 1 0 0 1 0 0 cm
110.25 54.75 m 116.25 60.75 l S Q
q 1 0 0 1 0 0 cm
110.25 60.75 m 116.25 54.75 l S Q
q 1 0 0 1 0 0 cm
120.25 54.5 m 126.25 60.5 l S Q
120.25 54.75 m 126.25 60.75 l S Q
q 1 0 0 1 0 0 cm
120.25 60.5 m 126.25 54.5 l S Q
120.25 60.75 m 126.25 54.75 l S Q
q 1 0 0 1 0 0 cm
130.301 54.5 m 136.301 60.5 l S Q
130.301 54.898 m 136.301 60.898 l S Q
q 1 0 0 1 0 0 cm
130.301 60.5 m 136.301 54.5 l S Q
130.301 60.898 m 136.301 54.898 l S Q
q 1 0 0 1 0 0 cm
140.352 54.898 m 146.352 60.898 l S Q
140.352 55.148 m 146.352 61.148 l S Q
q 1 0 0 1 0 0 cm
140.352 60.898 m 146.352 54.898 l S Q
140.352 61.148 m 146.352 55.148 l S Q
q 1 0 0 1 0 0 cm
150.398 57.199 m 156.398 63.199 l S Q
150.398 55 m 156.398 61 l S Q
q 1 0 0 1 0 0 cm
150.398 63.199 m 156.398 57.199 l S Q
150.398 61 m 156.398 55 l S Q
q 1 0 0 1 0 0 cm
160.449 113.352 m 166.449 119.352 l S Q
160.449 55 m 166.449 61 l S Q
q 1 0 0 1 0 0 cm
160.449 119.352 m 166.449 113.352 l S Q
160.449 61 m 166.449 55 l S Q
q 1 0 0 1 0 0 cm
170.449 113.75 m 176.449 119.75 l S Q
170.449 55.852 m 176.449 61.852 l S Q
q 1 0 0 1 0 0 cm
170.449 119.75 m 176.449 113.75 l S Q
170.449 61.852 m 176.449 55.852 l S Q
q 1 0 0 1 0 0 cm
180.5 113.75 m 186.5 119.75 l S Q
180.5 55.449 m 186.5 61.449 l S Q
q 1 0 0 1 0 0 cm
180.5 119.75 m 186.5 113.75 l S Q
180.5 61.449 m 186.5 55.449 l S Q
q 1 0 0 1 0 0 cm
190.551 114.699 m 196.551 120.699 l S Q
190.551 112.102 m 196.551 118.102 l S Q
q 1 0 0 1 0 0 cm
190.551 120.699 m 196.551 114.699 l S Q
190.551 118.102 m 196.551 112.102 l S Q
q 1 0 0 1 0 0 cm
200.602 112.949 m 206.602 118.949 l S Q
200.602 112.398 m 206.602 118.398 l S Q
q 1 0 0 1 0 0 cm
200.602 118.949 m 206.602 112.949 l S Q
200.602 118.398 m 206.602 112.398 l S Q
q 1 0 0 1 0 0 cm
210.648 114.852 m 216.648 120.852 l S Q
210.648 113.051 m 216.648 119.051 l S Q
q 1 0 0 1 0 0 cm
210.648 120.852 m 216.648 114.852 l S Q
210.648 119.051 m 216.648 113.051 l S Q
q 1 0 0 1 0 0 cm
220.648 115.102 m 226.648 121.102 l S Q
220.648 112.648 m 226.648 118.648 l S Q
q 1 0 0 1 0 0 cm
220.648 121.102 m 226.648 115.102 l S Q
220.648 118.648 m 226.648 112.648 l S Q
q 1 0 0 1 0 0 cm
230.699 113.75 m 236.699 119.75 l S Q
230.699 114.551 m 236.699 120.551 l S Q
q 1 0 0 1 0 0 cm
230.699 119.75 m 236.699 113.75 l S Q
230.699 120.551 m 236.699 114.551 l S Q
q 1 0 0 1 0 0 cm
240.75 103.449 m 246.75 109.449 l S Q
240.75 116.199 m 246.75 122.199 l S Q
q 1 0 0 1 0 0 cm
240.75 109.449 m 246.75 103.449 l S Q
240.75 122.199 m 246.75 116.199 l S Q
q 1 0 0 1 0 0 cm
250.801 104 m 256.801 110 l S Q
250.801 111.699 m 256.801 117.699 l S Q
q 1 0 0 1 0 0 cm
250.801 110 m 256.801 104 l S Q
250.801 117.699 m 256.801 111.699 l S Q
q 1 0 0 1 0 0 cm
260.852 100.602 m 266.852 106.602 l S Q
260.852 112.551 m 266.852 118.551 l S Q
q 1 0 0 1 0 0 cm
260.852 106.602 m 266.852 100.602 l S Q
260.852 118.551 m 266.852 112.551 l S Q
q 1 0 0 1 0 0 cm
270.852 101.551 m 276.852 107.551 l S Q
270.852 114.699 m 276.852 120.699 l S Q
q 1 0 0 1 0 0 cm
270.852 107.551 m 276.852 101.551 l S Q
270.852 120.699 m 276.852 114.699 l S Q
q 1 0 0 1 0 0 cm
280.898 99.949 m 286.898 105.949 l S Q
280.898 127.148 m 286.898 133.148 l S Q
q 1 0 0 1 0 0 cm
280.898 105.949 m 286.898 99.949 l S Q
280.898 133.148 m 286.898 127.148 l S Q
q 1 0 0 1 0 0 cm
290.949 99.148 m 296.949 105.148 l S Q
290.949 114.148 m 296.949 120.148 l S Q
q 1 0 0 1 0 0 cm
290.949 105.148 m 296.949 99.148 l S Q
290.949 120.148 m 296.949 114.148 l S Q
q 1 0 0 1 0 0 cm
301 100.102 m 307 106.102 l S Q
301 113.602 m 307 119.602 l S Q
q 1 0 0 1 0 0 cm
301 106.102 m 307 100.102 l S Q
301 119.602 m 307 113.602 l S Q
q 1 0 0 1 0 0 cm
311.051 99.148 m 317.051 105.148 l S Q
311.051 113.602 m 317.051 119.602 l S Q
q 1 0 0 1 0 0 cm
311.051 105.148 m 317.051 99.148 l S Q
311.051 119.602 m 317.051 113.602 l S Q
q 1 0 0 1 0 0 cm
321.051 97.648 m 327.051 103.648 l S Q
321.051 113.051 m 327.051 119.051 l S Q
q 1 0 0 1 0 0 cm
321.051 103.648 m 327.051 97.648 l S Q
321.051 119.051 m 327.051 113.051 l S Q
q 1 0 0 1 0 0 cm
331.102 99.949 m 337.102 105.949 l S Q
331.102 112.648 m 337.102 118.648 l S Q
q 1 0 0 1 0 0 cm
331.102 105.949 m 337.102 99.949 l S Q
331.102 118.648 m 337.102 112.648 l S Q
q 1 0 0 1 0 0 cm
341.148 99.398 m 347.148 105.398 l S Q
341.148 111.699 m 347.148 117.699 l S Q
q 1 0 0 1 0 0 cm
341.148 105.398 m 347.148 99.398 l S Q
341.148 117.699 m 347.148 111.699 l S Q
q 1 0 0 1 0 0 cm
318.898 24.5 m 324.898 30.5 l S Q
q 1 0 0 1 0 0 cm