diff options
author | Andrew Shadura <andrewsh@debian.org> | 2016-07-19 11:12:41 +0200 |
---|---|---|
committer | Andrew Shadura <andrewsh@debian.org> | 2016-07-19 11:12:41 +0200 |
commit | 2040e3232f6d2283ba8ac24e8785b055a8c89796 (patch) | |
tree | 0cff1863269b44d1c268bc95a8a31a972e7dd280 | |
parent | dc07d8fbc513a49101e53e57a98906d7e07092a7 (diff) |
Imported Upstream version 0.4.2
22 files changed, 3107 insertions, 48 deletions
diff --git a/.travis.yml b/.travis.yml index 4ae5fcb..c55db71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,57 +1,94 @@ +sudo: false language: cpp -compiler: - - gcc - #- clang +addons: + apt: + packages: + - ccache +cache: + apt: true + directories: + - ccache + - $HOME/.ccache + - $DEPS_DIR + +env: + global: + - DEPS_DIR="$HOME/install" + - CMAKE_DIR="$DEPS_DIR/cmake-3.3.2-Linux-x86_64" + - CMAKE="$CMAKE_DIR/bin/cmake" + - JSON_DIR="$DEPS_DIR/json-c-0.11" + - JSON_LIB="$JSON_DIR/install" + - JSON_INCLUDE_DIR="$JSON_DIR" + - LCOV_DIR="$DEPS_DIR/lcov-1.11" + - LCOV="$LCOV_DIR/bin/lcov" + - GMOCK_DIR="$DEPS_DIR/gmock-1.7.0" + +matrix: + include: + - os: linux + compiler: gcc-4.9 + addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['texlive-latex-base','gcc-4.9','g++-4.9','libpcap-dev','valgrind'] + env: + # You can not set CXX directly as Travis CI will overwrite it. You need an intermediate variable like COMPILER + - COMPILER=g++-4.9 CXX_FLAGS="-g -O0 -fprofile-arcs -ftest-coverage -fPIC" C_FLAGS="-g -O0 -fprofile-arcs -ftest-coverage" gcov="/usr/bin/gcov-4.9" + fast_finish: true before_install: - uname -a - pwd - export - - sudo pip install codecov - - sudo pip install --user cpp-coveralls - - sudo apt-add-repository -y ppa:ubuntu-toolchain-r/test - - sudo apt-get install software-properties-common - #- sudo add-apt-repository -y ppa:george-edison55/cmake-3.x - - sudo apt-add-repository -y ppa:ondrej/php5-5.6 # libjson0-dev 0.11 - - sudo apt-get update -qq + - export PATH="$PATH:$JSON_LIB" + install: - - sudo apt-get -y --force-yes install -qq build-essential g++-4.9 gcc-4.9 libpcap-dev valgrind libjson0-dev - - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20 - - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20 - - sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.9 20 - - sudo update-alternatives --config gcc - - sudo update-alternatives --config g++ - - sudo update-alternatives --config gcov - - sudo apt-get install cmake - - wget -O - --no-check-certificate https://cmake.org/files/v3.3/cmake-3.3.2-Linux-x86_64.tar.gz | tar xz && sudo cp -fR cmake-3.3.2-Linux-x86_64/* /usr - - wget -q https://googlemock.googlecode.com/files/gmock-1.7.0.zip && unzip gmock-1.7.0.zip -d /tmp - # install latest LCOV - - wget http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.11.orig.tar.gz - - tar xf lcov_1.11.orig.tar.gz - - sudo make -C lcov-1.11/ install + - pip install --user --upgrade cpp-coveralls - gem install coveralls-lcov + - | + if [ ! -f "$CMAKE" ]; then + wget -O - --no-check-certificate https://cmake.org/files/v3.3/cmake-3.3.2-Linux-x86_64.tar.gz | tar xz && cp -r cmake-3.3.2-Linux-x86_64 $DEPS_DIR + else + echo "Using cached cmake" + fi + - | + if [ ! -f "$GMOCK_DIR/CMakeLists.txt" ]; then + wget -q https://googlemock.googlecode.com/files/gmock-1.7.0.zip && unzip gmock-1.7.0.zip -d $DEPS_DIR + else + echo "Using cached gmock" + fi + + # installing libjson-c from source because #'ondrej/php5-5.6' is disallowed source in travis-ci + - | + if [ ! -f "$JSON_DIR/configure" ]; then + wget -O - --no-check-certificate https://s3.amazonaws.com/json-c_releases/releases/json-c-0.11.tar.gz | tar xz && cp -r json-c-0.11 $DEPS_DIR && (cd $JSON_DIR && mkdir -p $JSON_LIB && sh ./autogen.sh && ./configure --prefix=$JSON_LIB && make install) + else + echo "Using cached json" + fi + + - | + if [ ! -f "$LCOV" ]; then + wget -O - --no-check-certificate http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.11.orig.tar.gz | tar xz && cp -r lcov-1.11 $DEPS_DIR + make -C $LCOV_DIR + else + echo "Using cached lcov" + fi before_script: - - cmake --version + - $CMAKE --version - gcov --version - - if [ $CXX == 'g++' ]; - then - export CXX="g++-4.9"; - export CC="gcc-4.9"; - export CXX_FLAGS="-g -O0 -fprofile-arcs -ftest-coverage -fPIC"; - export C_FLAGS="-g -O0 -fprofile-arcs -ftest-coverage"; - fi - - lcov --directory . --zerocounters + - $LCOV --gcov-tool "/usr/bin/gcov-4.9" --directory . --zerocounters script: - mkdir debug && cd debug - - cmake -DCMAKE_BUILD_TYPE=DEBUG -DGMOCK_SOURCE_DIR=/tmp/gmock-1.7.0 -D"CMAKE_CXX_FLAGS=$CXX_FLAGS" -D"CMAKE_C_FLAGS=$C_FLAGS" -DINCLUDE_COVERAGE_INFO="true" ../ - - sudo make install + - $CMAKE -DCMAKE_CXX_COMPILER="$COMPILER" -DCMAKE_BUILD_TYPE=DEBUG -DGMOCK_SOURCE_DIR=$GMOCK_DIR -D"CMAKE_CXX_FLAGS=$CXX_FLAGS" -DCMAKE_C_FLAGS="$C_FLAGS" -DINCLUDE_COVERAGE_INFO="true" ../ + - make - make test - #- cpack -G DEB + - make documentation-pdflatex + - ccache -s -after_success: - - lcov --compat-libtool --directory . --capture --output-file coverage.info # capture coverage info - - lcov --remove coverage.info 'tests/*' '/usr/*' '*gmock*' --output-file coverage.info # filter out system and test code - #- lcov --list coverage.info # debug before upload +after_success: + - $LCOV --gcov-tool "/usr/bin/gcov-4.9" --compat-libtool --directory . --capture --output-file coverage.info # capture coverage info + - $LCOV --gcov-tool "/usr/bin/gcov-4.9" --remove coverage.info 'tests/*' '/usr/*' '*gmock*' --output-file coverage.info # filter out system and test code - coveralls-lcov coverage.info + # - coveralls --gcov "$(which "${GCOV}")" --encoding iso-8859-1 || echo 'coveralls upload failed.' diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d7899d..eb1ec08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +0.4.1 +===== +- minor bug fixes for Debian platforms; +- add travis-ci and coveralls.io integration with github.com repo. + 0.4.0 ===== - new libwatch plugin that outputs statistics to terminal via ncurses; @@ -4,7 +4,7 @@ [![Issues](https://img.shields.io/github/issues/epam/nfstrace.svg)](https://github.com/epam/nfstrace/issues?q=is%3Aopen+is%3Aissue) [![Build Status](https://img.shields.io/travis/epam/nfstrace/master.svg)](https://travis-ci.org/epam/nfstrace) [![Coverage Status](http://img.shields.io/coveralls/epam/nfstrace/master.svg)](https://coveralls.io/r/epam/nfstrace?branch=master) -NFSTRACE ![NFSTRACE Logo](docs/logo64.png "Logo") +NFSTRACE ![NFSTRACE Logo](docs/pictures/logo64.png "Logo") ======== `nfstrace` is an NFS and CIFS tracing/monitoring/capturing/analyzing tool. @@ -1 +1 @@ -0.4.0 +0.4.2 diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 5b119bd..bf540f8 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -1,11 +1,28 @@ add_custom_target (documentation) -find_program (DOXYGEN_PATH doxygen) -if (DOXYGEN_PATH) +find_package (Doxygen) +if (DOXYGEN_FOUND) add_custom_target (documentation-doxygen - COMMAND ${DOXYGEN_PATH} Doxyfile + COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_dependencies (documentation documentation-doxygen) -else () - message (WARNING "Doxygen is not found - source-code documentation is not available") -endif ()
\ No newline at end of file +endif () + +find_package (LATEX COMPONENTS PDFLATEX) +file (GLOB_RECURSE TEXS "*.tex") +if (TEXS AND LATEX_PDFLATEX_FOUND) + foreach (tex ${TEXS}) + get_filename_component (name ${tex} NAME_WE) + set (pdf "${name}.pdf") + list (APPEND PDFS ${pdf}) + set(args ${tex} -quiet -interaction=nonstopmode -halt-on-error -disable-installer -aux-directory=${CMAKE_CURRENT_BINARY_DIR}) + add_custom_command (OUTPUT ${pdf} + COMMAND ${PDFLATEX_COMPILER} ${args} + COMMAND ${PDFLATEX_COMPILER} ${args} + DEPENDS ${tex} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Converting ${tex} to ${pdf}" VERBATIM) + endforeach () + add_custom_target (documentation-pdflatex DEPENDS ${PDFS} SOURCES ${TEXS}) + add_dependencies (documentation documentation-pdflatex) +endif () diff --git a/docs/graphics.pdf b/docs/graphics.pdf Binary files differdeleted file mode 100644 index a1bb237..0000000 --- a/docs/graphics.pdf +++ /dev/null diff --git a/docs/graphics.vsdx b/docs/graphics.vsdx Binary files differdeleted file mode 100644 index f07dcea..0000000 --- a/docs/graphics.vsdx +++ /dev/null diff --git a/docs/nfstrace_manual.docx b/docs/nfstrace_manual.docx Binary files differdeleted file mode 100755 index 98fbafb..0000000 --- a/docs/nfstrace_manual.docx +++ /dev/null diff --git a/docs/nfstrace_manual.pdf b/docs/nfstrace_manual.pdf Binary files differindex 75672a6..aa408dd 100644 --- a/docs/nfstrace_manual.pdf +++ b/docs/nfstrace_manual.pdf diff --git a/docs/nfstrace_manual.tex b/docs/nfstrace_manual.tex new file mode 100644 index 0000000..11a3b58 --- /dev/null +++ b/docs/nfstrace_manual.tex @@ -0,0 +1,626 @@ +\documentclass[oneside]{article} + +% packages + +\usepackage{color} +\usepackage{graphicx} +\usepackage{fancyhdr} +\usepackage{verbatim} +\usepackage{tabularx} +\usepackage{array} +\usepackage[ + left=0.80in, + right=0.80in, + top=1.0in, + bottom=1.0in, + paperheight=11in, + paperwidth=8.5in +]{geometry}% +\usepackage{alltt} + +\geometry{a4paper} + +{\hyphenpenalty 10000} +\setlength{\parindent}{1cm} % Default is 15pt. + +% new commands +% redefine itemsize: adds more vertical space between elements +\let\OLDitemize\itemize +\renewcommand\itemize{\OLDitemize\addtolength{\itemsep}{10pt}} +\definecolor{lightblue}{RGB}{12,183,240} +\definecolor{orange}{RGB}{255,165,0} +\newcommand*{\includeCodeInsting}[2][]{\VerbatimInput[ + frame=single, + rulecolor=\color{listingframecolor}, + framesep=4pt,#1]{#2}} + +\newcommand{\code}[1]{\texttt{#1}} +\newcommand{\includetext}[1]{ +\begin{alltt} + % \texttt{\fbox{\parbox{\textwidth}{\small{\input{#1}}}}} + \small{\input{#1}} +\end{alltt} +} + +\newcommand{\gls}{} + +\newcommand*{\textfile}[1]{\textsf{#1}} +\newcommand*{\textprog}[1]{\textfile{#1}} + +\widowpenalties 1 10000 +\raggedbottom + +\pagestyle{fancy} +\fancyfoot[L]{Nfstrace User and Developer Manual}% \fancyfoot[R]{\thepage} +\renewcommand{\headrulewidth}{0.4pt}% Default \headrulewidth is 0.4pt +\renewcommand{\footrulewidth}{0.4pt}% Default \footrulewidth is 0pt +\rfoot{\today} + +% ============================================================================== +\begin{document} +%\title{NFTRACE USER AND DEVELOPER MANUAL} + +% Title begin +% (titlepage is needed to display +% image logo and title on the same page) +\begin{titlepage} + +\newcommand{\HRule}{\rule{\linewidth}{0.5mm}} % Defines a new command for the horizontal lines, change thickness here + +\includegraphics[width=2cm]{pictures/epam-logo.png} +\newline +\center +\vspace{3cm} +\includegraphics[width=5cm]{pictures/logo.png} + +\par\vspace{1cm} +\center +{\huge NFSTRACE USER AND DEVELOPER MANUAL}\\[0.4cm] % Title of your document +{\centering {\small Version 0.4.0}} +\vfill +\end{titlepage} +% Title end + +%\maketitle + +\newpage + +\vspace{5mm} +NFSTRACE User and developer manual + +\vspace{5mm} +EPAM Systems + +\vspace{5mm} +Copyright © 2014, 2015 EPAM Systems + +\vspace{5mm} This documentation is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +\vspace{5mm} This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +more details. + +\vspace{5mm} You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +\vspace{5mm} For more details see the file LICENSE in the source of nfstrace. + +\vspace{5mm} This manual provides basic instructions on how to use \textprog{nfstrace} to +monitor \gls{NFS} and \gls{CIFS} activity and how to develop pluggable analysis +modules. + +\newpage + +\tableofcontents + +\newpage + +\section{INTRODUCTION} + +\textprog{nfstrace} performs live Ethernet 1 Gbps – 10 Gbps packets capturing and helps to +determine \gls{NFS} and \gls{CIFS} procedures in raw network traffic. +Furthermore, it performs filtration, dumping, compression, statistical +analysis, visualization and provides the API for custom pluggable analysis +modules. + +\textprog{nfstrace} captures raw packets from an Ethernet interface using libpcap +interface to Linux (\gls{LSF}) or FreeBSD (\gls{BPF}) implementations. At the +moment it is assumed that libpcap delivers correct TCP and UDP packets. +Assembling of IP packets from ethernet frames and IP packets defragmentation +are performed in the operating system's kernel. + +The application has been tested on the workstations with integrated 1 Gbps +\gls{NIC}s (Ethernet 1000baseT/Full). + +Currently \textprog{nfstrace} supports the following protocols: +\begin{alltt} +Ethernet | IPv4 | IPv6 | UDP | TCP | NFSv3 | NFSv4 | NFSv4.1 | CIFSv1 | CIFSv2 +\end{alltt} + + +\subsection{PORTABILITY} + +The application has been developed and tested on GNU/Linux (Fedora 20, OpenSUSE +13.2, Ubuntu 14.04/14.10, CentOS 7, Arch Linux, Alt Linux 7.0.5) and FreeBSD +(FreeBSD 10.1). It is written in C++11 programming language and uses standard +\gls{POSIX} interfaces and the following libraries: libpthread, libpcap, +libstdc++. + +\section{USAGE} +\subsection{OPTIONS} +%\setlength\extrarowheight{3pt} +\begin{tabularx}{\linewidth}{ r X } +\textprog{-m}, & \code{--mode=live|dump|drain|stat} \\ + & Set the running mode (see the description below) (default: live).\\ +\textprog{-i}, & \code{--interface=INTERFACE}\\ +& Listen interface, it is required for live and dump modes (default: searches +for the lowest numbered, configured up interface (except loopback)).\\ +\textprog{-f}, & \code{--filtration="filter"}\\ + & Specify the packet filter in \gls{BPF} syntax; for the expression syntax, see +pcapfilter(7) (default: "\code{port 2049 or port 445}").\\ +\textprog{-s}, & \code{--snaplen=1..65535}\\ +& Set the max length of captured raw packet (bigger packets will be truncated). +Can be used only for UDP (default: 65535).\\ +\textprog{-t}, & \code{--timeout=milliseconds}\\ +& Set the read timeout that will be used while capturing (default: 100).\\ +\textprog{-b}, & \code{--bsize=MBytes}\\ +& Set the size of the operating system capture buffer in MBytes; note that this +option is crucial for capturing performance (default: 20).\\ +\textprog{-p}, & \code{--promisc}\\ +& Put the capturing interface into promiscuous mode (default: true).\\ +\textprog{-d}, & \code{--direction=in|out|inout}\\ +& Set the direction for which packets will be captured (default: inout).\\ +\textprog{-a}, & \code{--analysis=PATH\#opt1,opt2=val,...}\\ +& Specify the path to an analysis module and set its options (if any).\\ +\textprog{-I}, & \code{--ifile=PATH}\\ +& Specify the input file for stat mode, '-' means stdin (default: +nfstrace\{filter\}.pcap).\\ +\textprog{-O}, & \code{--ofile=PATH}\\ +& Specify the output file for dump mode, '-' means stdout (default: +nfstrace-\{filter\}.pcap).\\ +\textprog{--log}, & --log=PATH\\ & Specify the log file (default: nfstrace.log).\\ +\textprog{-C}, & \code{--command="shell command"} \\ +& Execute command for each dumped file.\\ +\textprog{-D}, & \code{--dump-size=MBytes}\\ +& Set the size of dumping file portion, 0 means no limit (default: 0).\\ +\textprog{-E}, & \code{--enum=interfaces|plugins|-}\\ +& Enumerate all available network interfaces and and/or all available plugins, +then exit; please note that interfaces can't be listed unless \textprog{nfstrace} was +built against the recent version of libpcap that supports the +pcap\_findalldevs() function (default: none).\\ +\textprog{-M}, & +\textprog{--msg-header=1..4000}\\ +& Truncate RPC messages to this limit (specified in bytes) before passing to a +pluggable analysis module (default: 512).\\ +\textprog{-Q}, & \code{--qcapacity=1..65535}\\ +& Set the initial capacity of the queue with RPC messages (default: 4096).\\ +\textprog{-T}, & \code{--trace}\\ +& Print collected NFSv3/NFSv4/NFSv4.1/CIFSv2 procedures, true if no modules were +passed with -a option.\\ +\textprog{-Z}, & \code{--droproot=username}\\ +& Drop root privileges after opening the capture device.\\ +\textprog{-v}, & \code{--verbose=0|1|2}\\ +& Specify verbosity level (default: 1).\\ +\textprog{-h}, & \code{--help}\\ +& Print help message and usage for modules passed with -a option, then exit.\\ +\end{tabularx} + +\subsection{RUNNING MODES} + +\begin{minipage}[t]{\linewidth} +\textprog{nfstrace} can operate in four different modes: +\vspace{5mm} +\begin{itemize} +\item online analysis (\textprog{--mode=live}): performs online capturing, + filtration and live analysis of detected NFS/CIFS procedures using a + pluggable analysis module or prints out them to stdout (\code{-T} or + \code{--trace} options); \item online dumping (\textprog{--mode=dump}): + performs online traffic capturing, filtration and dumping to the output + file (specified with \code{-O} or \code{--ofile} options); +\item offline analysis (\textprog{--mode=stat}): + performs offline filtration of the .pcap that contains previously captured + traces and performs analysis using a pluggable analysis module or prints + found NFS/CIFS procedures to stdout (\code{-T} or \code{–trace} options); +\item offline dumping (\textprog{--mode=drain}): performs a reading of traffic + from the .pcap file (specified with \code{-I} or \code{--ifile} options), + filtration, dumping to the output .pcap file (specified with \code{-O} or + \code{--ofile} options) and removing all the packets that are not related + to NFS/CIFS procedures. \end{itemize} +\end{minipage} + +\subsection{PACKETS FILTRATION} + +Internally \textprog{nfstrace} uses libpcap that provides a portable interface to +the native system API for capturing network traffic. By so doing, filtration is +performed in the operating system's kernel. \textprog{nfstrace} provides a special option +(\code{-f} or \code{–-filtration}) for specifying custom filters in \gls{BPF} syntax. + +The default \gls{BPF} filter in \textprog{nfstrace} is \textprog{port 2049 or port +445}, which means that each packet that is delivered to user-space from the +kernel satisfies the following conditions: it has IPv4 or IPv6 header and it +has TCP and UDP header with source or destination port number equals to 2049 +(default NFS port) or 445 (default \gls{CIFS} port). + +The reality is that this filter is very heavy and support of IPv6 is +experimental, so if you want to reach faster filtration of IPv4-only traffic we +suggest to use the following \gls{BPF} filter: \textprog{ip and port 2049 or port +445}. + +\subsection{DUMP FILE FORMAT} +\label{sec:dumpfileformat} + +\textprog{nfstrace} uses libpcap file format for input and output files so any +external tool (e.g. \gls{Wireshark}) can be used in order to inspect filtered +traces. + +\subsection{USAGE EXAMPLES} + +In this sections some use cases will be explained. Every next example inherit +something from the previous ones, so we suggest to read all of them from the +beginning. + +\subsubsection{AVAILABLE OPTIONS} + +The following command demonstrates available options of the application and +plugged analysis modules (attached with \code{--analysis} or \code{-a} options). Note that +you can pass more than one module here. +\begin{alltt} +nfstrace –-help --analysis=libjson.so +\end{alltt} + +\subsubsection{ONLINE TRACING} + +The following command will run \textprog{nfstrace} in online analysis mode (specified with +\code{--mode} or \code{-m} options) without a pluggable analysis module. It will capture +\gls{NFS} traffic transferred over TCP or UDP with source or destination port +number equals to 2049 and will simply print them out to stdout (\code{-T} or \code{--trace} +options). Capturing is over when \textprog{nfstrace} receives \textprog{SIGINT} (Control-C). Note +that capturing from network interface requires superuser privileges. + +\begin{alltt} +nfstrace -–mode=live --filtration="ip and port 2049" -T +\end{alltt} + +\subsubsection{ONLINE ANALYSIS} + +The following command demonstrates running \textprog{nfstrace} in online analysis mode. +Just like in the previous example it will capture \gls{NFS} traffic transferred +over TCP or UDP with source or destination port number equals to 2049 and then +it will perform Operation Breakdown analysis using pluggable analysis module +\code{libbreakdown.so}. +\begin{alltt} +nfstrace –-mode=live -–filtration=”ip and port 2049” --analysis=libbreakdown.so +\end{alltt} + +\subsubsection{ONLINE DUMPING AND OFFLINE ANALYSIS} + +The following example demonstrates running \textprog{nfstrace} in online +dumping and offline analysis modes. At first \textprog{nfstrace} will capture +\gls{NFS} traffic transferred over TCP or UDP with source or destination port +number equals to 2049 and will dump captured packets to \code{dump.pcap} file +(specified with \code{--ofile} or \code{-O} options). At the second run +\textprog{nfstrace} will perform offline Operation Breakdown analysis using +pluggable analysis module \code{libbreakdown.so}. +\begin{alltt} +\# Dump captured packets to dump.pcap +nfstrace --mode=dump + --filtration="ip and port 2049" + -O dump.pcap +\# Analyse dump.pcap using libbreakdown.so +nfstrace --mode=stat + -I dump.pcap + --analysis=libbreakdown.so +\end{alltt} + +\subsubsection{ONLINE DUMPING, COMPRESSION AND OFFLINE ANALYSIS} + +The following example demonstrates running \textprog{nfstrace} in online dumping and +offline analysis modes. Since dump file can easily exhaust disk space, +compression makes sense. + +At first \textprog{nfstrace} will capture \gls{NFS} traffic transferred over TCP or UDP +with source or destination port number equals to 2049 and will dump captured +packets to \code{dump.pcap} file. + +Note that compression is done by the external tool (executed in script passed +with \code{--command} or \code{-C} options) and it will be executed when +capturing is done. The output file can be inspected using some external tool +as described in \ref{sec:dumpfileformat}. + +At the second run \textprog{nfstrace} will perform offline analysis. Again, the external +tool (bzcat in this example) is used in order to decompress previously saved +dump. +\textprog{nfstrace} will read \code{stdin} (note the \code{-I -} option) and perform offline +analysis using Operation Breakdown analyzer. + +\begin{alltt} +\# Dump captured procedures to dump.pcap file. +\# Compress output using bzip2 when capturing is over. +nfstrace --mode=dump + --filtration="ip and port 2049" + -O dump.pcap + -C "bzip2 -f -9" +\# Extract dump.pcap from dump.pcap.bz2 to stdin. +\# Read stdin and analyze data with libbreakdown.so module. +bzcat dump.pcap.bz2 | nfstrace --mode=stat + -I - + --analysis=libbreakdown.so +\end{alltt} + +\subsubsection{ONLINE DUMPING WITH FILE LIMIT, COMPRESSION AND OFFLINE ANALYSIS} + +This example is similar to the previous one except one thing: output dump file +can be very huge and cause problems in some situations, so \textprog{nfstrace} provides +the ability to split it into parts. + +At first \textprog{nfstrace} will be invoked in online dumping mode. Everything is similar +to the previous example except \code{-D} (\code{--dump-size}) option: it specifies the size +limit in MBytes, so dump file will be split according to this value. + +At the second run \textprog{nfstrace} will perform offline analysis of captured packets +using Operation Breakdown analyzer. + +Please note that only the first dump file has the pcap header. + +\begin{alltt} +\# Dump captured procedures to the multiple files and compress them. +nfstrace --mode=dump --filtration="ip and port 2049" -O dump.pcap -D 1 -C "bzip2 -f -9" + +\# get list of parts in the right order: +\# dump.pcap.bz2 +\# dump.pcap-1.bz2 +parts=\$(ls dump.pcap*.bz2 | sort -n -t - -k 2) +\# Extract main dump.pcap and parts from dump.pcap.bz2 to stdin. +\# Read stdin and analyze data with libbreakdown.so module. +bzcat “\$parts” | nfstrace --mode=stat +-I - +--analysis=libbreakdown.so +\end{alltt} + +\subsubsection{VISUALIZATION} +\label{sec:visualization} + +This example demonstrates the ability to plot graphical representation of data +collected by Operation Breakdown analyzer. + +\code{nst.sh} is a shell script that collects data generated by analyzers and +passes it to \gls{Gnuplot} script specified with -a option. + +\code{breakdown\_nfsv3.plt} and \code{breakdown\_nfsv4.plt} are a \gls{Gnuplot} +scripts that understand output data format of Operation Breakdown analyzer and +generate .png files with plots. Note that \gls{Gnuplot} must be installed. + +\begin{minipage}[t]{\linewidth} +\begin{alltt} +\# Extract dump.pcap from dump.pcap.bz2 to stdin. +\# Read stdin and analyze data with libbreakdown.so module. +bzcat trace.pcap.bz2 | nfstrace -m stat -I - -a libbreakdown.so + +\# Generate plot according to *.dat files generated by +\# libbreakdown.so analyzer. +nst.sh -a breakdown.plt -d . -p 'breakdown*.dat' -v +\end{alltt} +\end{minipage} + +\section{ANALYZERS} + +All pluggable modules are implemented as external shared libraries. + +\subsection{OPERATION BREAKDOWN ANALYZER (LIBBREAKDOWN.SO)} + +Operation Breakdown (OB) analyzer calculates average frequency of NFS/CIFS +procedures and computes standard deviation of latency. + +\begin{alltt} +\$ nfstrace -a libbreakdown.so –h +nfstrace 0.4.0 (Release) built on Linux-3.16.1-1-generic by C++ compiler GNU 4.9.1 +Usage: ./nfstrace [OPTIONS]... +\end{alltt} +And the result of execution will look something like this: +%\includetextListing{nfstrace_manual_includes/breakdown_output.txt} +\includetext{nfstrace_manual_includes/breakdown_output.txt} + +%\begin{CodeListing} +%\end{CodeListing} +OB analyzer produces \code{.dat} file in the current directory for each detected +NFS/CIFS session: +\begin{alltt} +\$ ls -a *.dat breakdown\_10.6.137.79:949 --> 10.6.7.38:2049 [TCP].dat +\end{alltt} +As described in \ref{sec:visualization}, produced \code{.dat} +files can be visualized using \code{nst.sh} and \code{breakdown\_nfsv3.plt} or +\code{breakdown\_nfsv4.plt} (according to \gls{NFS} version). +\begin{alltt} +nst.sh -a breakdown\_nfsv3.plt -d . -f 'breakdown\_10.6.137.79:949 --> +10.6.7.38:2049 [TCP].dat' +\end{alltt} + +\begin{figure} +\includegraphics[width=\linewidth]{./pictures/session-visualization.png} +\caption{Session visualization} +\label{Session visualization} +\centering +\end{figure} + +\subsection{WATCH (LIBWATCH.SO)} + +Watch plugin mimics old nfswatch utility: it monitors \gls{NFS} and \gls{CIFS} +traffic and displays it in terminal using \code{ncurses}. It supports NFSv3, NFSv4, +NFSv4.1, CIFSv1 and CIFSv2. + +\begin{minipage}[t]{\linewidth} +\includetext{nfstrace_manual_includes/libwatch_output.txt} +\end{minipage} + +\vspace{5mm} + +By default watch plugin will update its screen every second, you can specify +another timeout in milliseconds: + +\begin{alltt} +\$ nfstrace -a libwatch.so\#2000 +\end{alltt} + +\subsection{JSON ANALYZER (LIBJSON.SO)} +JSON analyzer calculates a total amount of each supported application protocol +operation. It accepts TCP-connections on particular TCP-endpoint (host:port), +sends a respective JSON to the TCP-client and closes connection. Suggested to +be used in live mode. + +Available options: + +\begin{minipage}[t]{\linewidth} +\begin{tabular}{ll} +\textprog{host=HOSTNAME} & +Network interface to listen (default: listen all interfaces)\\ +\textprog{port=PORT} & +IP-port to bind to (default: 8888)\\ +\textprog{workers=WORKERS} & +Amount of worker threads (default: 10)\\ +\textprog{duration=DURATION} & +Max serving duration in milliseconds (default: 500)\\ +\textprog{backlog=BACKLOG} & +Listen backlog (default: 15)\\ +\end{tabular} +\end{minipage} + +In order to try this analyzer out you can start \textprog{nfstrace} in on terminal: +\begin{alltt} +\$ nfstrace -i eth0 -a libjson.so\#host=localhost +\end{alltt} +And then you can make a TCP-request to \textprog{nfstrace} in another terminal to fetch +current statistics: + +\begin{minipage}[t]{\linewidth} +\includetext{nfstrace_manual_includes/telnet_output.txt} +\end{minipage} + +\section{IMPLEMENTATION DETAILS} + +This section may be interested for the developers who want to contribute or +implement new pluggable analysis module. + +\subsection{PAYLOAD FILTRATION} + +Each NFSv3 procedure consists of two RPC messages: + +\begin{itemize} + \item call – request from client to server; + \item reply – reply from server with result of requested procedure. +\end{itemize} +\vspace{5mm} + +Both RPC messages may contain data useful for analysis. Both RPC messages may +contain thousands of \gls{Payload} bytes useless for analysis. nfstrace +captures headers of calls and replies and then matches pairs of them to +complete \gls{NFS} procedures. + +The \code{--snaplen} option sets up the amount of bytes of incoming packet for +uprising from the kernel to user-space. In case of TCP transport layer this +option is useless because TCP connection is a bidirectional stream of data +(instead of UDP that is form of interchange up to 64k datagrams). In case of +\gls{NFS} over TCP \textprog{nfstrace} captures whole packets and copies them to +user-space from the kernel for \gls{DPI} and performing \gls{NFS} statistical +analysis. + +Finally, \textprog{nfstrace} filtrates whole \gls{NFS} traffic passed from the kernel to +user-space and detects RPC/NFS message headers (up to 4 Kbytes) within +gigabytes of network traffic. + +Detected headers are copied into internal buffers (or dumped into a +\code{.pcap} file) for statistical analysis. + +The key principle of the filtration here is \textbf{discard \gls{Payload} +ASAP}. + +Filtration module works in a separate thread and captures packets from network +interface using libpcap. It matches packets to a related session (TCP or UDP) +and performs reassembling of TCP flow from a TCP segment of a packet. After +that the part of a packet will be passed to \code{RPCFiltrator}. In case of NFSv4 the +whole packet will be passed to \code{RPCFiltrator} because it consists of several +NFSv4 operations. + +There are two \code{RPCFiltrator} in one TCP session. Both of them +know the state of the current RPC message in related TCP flow. They can detect +RPC messages and perform actions on a packet: discard it or collect for +analysis. + +The size of the kernel capture buffer can be set with \code{-b} option (in +MBytes). Note that this option is very crucial for capturing performance. + +\gls{wsize} and \gls{rsize} of an \gls{NFS} connection are important for +filtration and performance analysis too. + +\subsection{PLUGGABLE ANALYSIS MODULES} + +nfstrace provides C++ api for implementing pluggable analysis modules. Header +files provide definitions of \code{IAnalyzer} interface, NFS/CIFS data structures and +functions. The \code{IAnalyzer} interface is a set of NFS/CIFS handlers that will be +called by \code{Analysis} module for each NFS/CIFS procedure. All constants and +definitions of types will be included with \code{<nfstrace/api/plugin\_api.h>} header. + +A pluggable analysis module must be a dynamically linked shared object and must +export the following C functions: + +\begin{alltt} +const char* usage (); // return description of expected opts for create(opts) +IAnalyzer* create (const char* opts); // create and return an instance of an Analyzer +void destroy (IAnalyzer* instance); // destroy created instance of an Analyzer +const AnalyzerRequirements* requirements(); // return Analyzer's requirements +\end{alltt} +After the declaration of all these function there must be the following macro: +\begin{alltt} +NST\_PLUGIN\_ENTRY\_POINTS (\&usage, \&create, \&destroy, \&requirements) +\end{alltt} + +\textprog{usage()} function must return a C-string with module description and +required parameters for creation of an instance of analyzer, this string will +be shown in the output of \code{--help} option. + +\textprog{IAnalyzer* create(const char* opts)} must create and return an instance +of the analyzer according to passed options. + +\textprog{void destroy(IAnalyzer* instance)} must destroy previously created +analyzer instance and perform required cleanups (e.g. close connection to a +database etc.). + +\textprog{const AnalyzerRequirements* requirements()} must create and return an +instance of analyzer requirements. Its silence property is used if exclusive +control over standard output is required. + +All existing analyzers are implemented as pluggable analysis modules and can be +attached to \textprog{nfstrace} with \code{-a} option. + +\subsection{GENERAL SCHEMA} + +\begin{minipage}[t]{\linewidth} +The general schema of \textprog{nfstrace} is presented in the Figure \ref{fig:generalschema}. +In this schema you can see how data flows in different modes: +\begin{itemize} + \item on-line analysis – \colorbox{green}{green line} + \item on-line dumping – \colorbox{yellow}{yellow line} + \item off-line dumping – \colorbox{lightblue}{blue line} + \item off-line analysis – \colorbox{orange}{orange line} +\end{itemize} +\end{minipage} + +\newpage + +%\begin{sidewaysfigure} +\begin{figure} +\includegraphics[width=\linewidth]{./pictures/general-structure.png} +\caption{General schema} +\label{General schema} +\centering +\label{fig:generalschema} +\end{figure} + +\clearpage + +% \printglossaries + +\end{document} diff --git a/docs/nfstrace_manual_includes/breakdown_output.txt b/docs/nfstrace_manual_includes/breakdown_output.txt new file mode 100755 index 0000000..6516e64 --- /dev/null +++ b/docs/nfstrace_manual_includes/breakdown_output.txt @@ -0,0 +1,67 @@ +LLog file: nfstrace.log +Loading module: 'libbreakdown.so' with args: [] +Read packets from: datalink: EN10MB (Ethernet) version: 2.4 +Note: It's potentially unsafe to run this program as root without dropping root privileges. +Note: Use -Z username option for dropping root privileges when you run this program as user with root privileges. +Processing packets. Press CTRL-C to quit and view results. +Detect session 127.0.0.1:34744 --> 127.0.1.1:2049 [TCP] +Detect session 127.0.0.1:929 --> 127.0.1.1:2049 [TCP] +Detect session 127.0.0.1:774 --> 127.0.1.1:2049 [TCP] +Detect session 127.0.0.1:854 --> 127.0.1.1:2049 [TCP] +Detect session 10.0.2.15:55529 --> 10.6.208.121:445 [TCP] +Detect session 10.0.2.15:55530 --> 10.6.208.121:445 [TCP] +\#\#\# Breakdown analyzer \#\#\# +CIFS v1 protocol Total operations: 101. Per operation: +CREATE\_DIRECTORY 0 0.00\% +DELETE\_DIRECTORY 0 0.00\% +OPEN 0 0.00\% +CREATE 0 0.00\% ...complete output has been omitted... +Per connection info: +Session: 10.0.2.15:55529 --> 10.6.208.121:445 [TCP] Total operations: 101. Per operation: +CREATE\_DIRECTORY Count: 0 ( 0.00\%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: +0.00000000 +DELETE\_DIRECTORY Count: 0 ( 0.00\%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: +0.00000000 +OPEN Count: 0 ( 0.00\%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: +0.00000000 +CREATE Count: 0 ( 0.00\%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: +0.00000000 +CLOSE Count: 2 ( 1.98\%) Min: 0.001 Max: 0.002 Avg: 0.001 StDev: +0.00057205 +...complete output has been omitted... +\#\#\# Breakdown analyzer \#\#\# +CIFS v2 protocol Total operations: 77. Per operation: +NEGOTIATE 1 1.30\% +SESSION SETUP 2 2.60\% + +LOGOFF 0 0.00\% +TREE CONNECT 2 2.60\% +...complete output has been omitted... +\#\#\# Breakdown analyzer \#\#\# +NFS v3 protocol Total operations: 7123. Per operation: +NULL 2 0.03\% +GETATTR 47 0.66\% +SETATTR 5 0.07\% +LOOKUP 4 0.06\% +...complete output has been omitted... +\#\#\# Breakdown analyzer \#\#\# +NFS v4.0 protocol +Total procedures: 3264. Per procedure: +NULL 2 0.06\% +COMPOUND 3262 99.94\% +Total operations: 9701. Per operation: +ILLEGAL 0 0.00\% +ACCESS 16 0.16\% +CLOSE 5 0.05\% +...complete output has been omitted... +\#\#\# Breakdown analyzer \#\#\# +NFS v4.1 protocol +Total procedures: 8127. Per procedure: +NULL 0 0.00\% +COMPOUND 8127 100.00\% +Total operations: 32359. Per operation: +ILLEGAL 0 0.00\% +ACCESS 15 0.05\% +CLOSE 5 0.02\% +COMMIT 81 0.25\% +...complete output has been omitted... diff --git a/docs/nfstrace_manual_includes/libwatch_output.txt b/docs/nfstrace_manual_includes/libwatch_output.txt new file mode 100755 index 0000000..8d49018 --- /dev/null +++ b/docs/nfstrace_manual_includes/libwatch_output.txt @@ -0,0 +1,29 @@ +-------------------------------------------------------------------------------| +|Nfstrace watch plugin. To scroll press up or down keys. Ctrl + c to exit. | +|Host name: epbyminw0059.minsk.epam.com | +|Date: 3.4.2015 Time: 16:57:58 | +|Elapsed time: 0 days; 0:1:50 times | +-------------------------------------------------------------------------------¬ +| NFS v3 NFS v4 NFS v41 CIFS v1 < CIFS v2 > | +| | +|Total: 182 | +|NEGOTIATE 3 1.65% | +|SESSION SETUP 8 4.40% | +|LOGOFF 1 0.55% | +|TREE CONNECT 4 2.20% | +|TREE DISCONNECT 2 1.10% | +|CREATE 33 18.13% | +|CLOSE 32 17.58% | +|FLUSH 0 0.00% | +|READ 2 1.10% | +|WRITE 1 0.55% | +|LOCK 0 0.00% | +|IOCTL 0 0.00% | +|CANCEL 0 0.00% | +|ECHO 50 27.47% | +|QUERY DIRECTORY 34 18.68% | +|CHANGE NOTIFY 0 0.00% | +|QUERY INFO 9 4.95% | +|SET INFO 3 1.65% | +|OPLOCK BREAK 0 0.00% | +L------------------------------------------------------------------------------- diff --git a/docs/nfstrace_manual_includes/telnet_output.txt b/docs/nfstrace_manual_includes/telnet_output.txt new file mode 100755 index 0000000..ba42dfb --- /dev/null +++ b/docs/nfstrace_manual_includes/telnet_output.txt @@ -0,0 +1,9 @@ +\$ telnet localhost 8888 Trying 127.0.0.1... +Connected to localhost. +Escape character is ’\^\{\}]’. +\{ +"nfs\_v3":\{ "null":32, +"getattr":4582, ... +\}, +"nfs\_v4":\{ ... \}, ... +\}Connection closed by foreign host. diff --git a/docs/pictures/allocator-queue.svg b/docs/pictures/allocator-queue.svg new file mode 100755 index 0000000..240ea07 --- /dev/null +++ b/docs/pictures/allocator-queue.svg @@ -0,0 +1,1050 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export allocator-queue.svg BlockAllocator and Queue -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="11.6929in" height="8.26772in"
+ viewBox="0 0 841.89 595.276" xml:space="preserve" color-interpolation-filters="sRGB" class="st24">
+ <v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false">
+ <v:userDefs>
+ <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
+ <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
+ </v:userDefs>
+ </v:documentProperties>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#ffffff;stroke:#000000;stroke-width:0.25}
+ .st2 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st3 {fill:#ffffff;stroke:#000000;stroke-dasharray:3.75,2.25;stroke-width:0.25}
+ .st4 {visibility:visible}
+ .st5 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st6 {fill:#a5a5a5;stroke:#000000;stroke-width:0.5}
+ .st7 {marker-end:url(#mrkr3-61);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.5}
+ .st8 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.25773195876289}
+ .st9 {fill:#ffffff;stroke:none;stroke-width:0.25}
+ .st10 {fill:#a5a5a5;stroke:#000000;stroke-width:0.25}
+ .st11 {fill:none;stroke:none;stroke-width:0.25}
+ .st12 {marker-end:url(#mrkr3-213);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5}
+ .st13 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.51020408163265}
+ .st14 {fill:#ffffff;stroke:#000000;stroke-width:0.5}
+ .st15 {fill:none;filter:url(#filter_2)}
+ .st16 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st17 {fill:#5b9bd5;filter:url(#filter_2);font-family:Calibri;font-size:1.00001em;opacity:0.219608}
+ .st18 {font-size:1em}
+ .st19 {fill:none}
+ .st20 {stroke:#c7c8c8;stroke-width:0.25}
+ .st21 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+ .st22 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.22}
+ .st23 {fill:none;stroke:#c7c8c8;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
+ .st24 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend3">
+ <path d="M 2 1 L 0 0 L 2 -1 " style="stroke-linecap:round;stroke-linejoin:round;fill:none"/>
+ </g>
+ <marker id="mrkr3-61" class="st8" v:arrowType="3" v:arrowSize="0" orient="auto" markerUnits="strokeWidth"
+ overflow="visible">
+ <use xlink:href="#lend3" transform="scale(-3.88,-3.88) "/>
+ </marker>
+ <marker id="mrkr3-213" class="st13" v:arrowType="3" v:arrowSize="0" orient="auto" markerUnits="strokeWidth"
+ overflow="visible">
+ <use xlink:href="#lend3" transform="scale(-1.96,-1.96) "/>
+ </marker>
+ </defs>
+ <defs id="Filters">
+ <filter id="filter_2">
+ <feGaussianBlur stdDeviation="2"/>
+ </filter>
+ </defs>
+ <g v:mID="4" v:index="2" v:groupContext="foregroundPage">
+ <v:userDefs>
+ <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
+ </v:userDefs>
+ <title>BlockAllocator and Queue</title>
+ <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
+ v:shadowOffsetY="-8.50394"/>
+ <v:layer v:name="Connector" v:index="0"/>
+ <v:layer v:name="Container" v:index="1"/>
+ <g id="shape4-1" v:mID="4" v:groupContext="shape" transform="translate(178.583,-118.63)">
+ <title>Rectangle.4</title>
+ <desc>Queue<T></desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197" v:verticalAlign="0"/>
+ <v:textRect cx="216.85" cy="505.559" width="433.71" height="179.433"/>
+ <rect x="0" y="415.843" width="433.701" height="179.433" class="st1"/>
+ <text x="4" y="428.84" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Queue<T></text> </g>
+ <g id="shape251-4" v:mID="251" v:groupContext="shape" transform="translate(232.933,-216.86)">
+ <title>Rectangle.251</title>
+ <desc>allocator spinlock</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="159.449" cy="579.69" width="318.9" height="31.1719"/>
+ <path d="M0 595.28 L318.9 595.28 L318.9 564.1 L0 564.1 L0 595.28 Z" class="st3"/>
+ <text x="123.9" y="582.69" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>allocator spinlock</text> </g>
+ <g id="shape242-7" v:mID="242" v:groupContext="shape" transform="translate(1159.2,333.071) rotate(90)">
+ <title>Rectangle.242</title>
+ <desc>ElementList</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="63.7795" cy="576.014" width="127.56" height="38.5228"/>
+ <rect x="0" y="556.753" width="127.559" height="38.5228" class="st1"/>
+ <text x="40.04" y="579.01" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ElementList</text> </g>
+ <g id="shape238-10" v:mID="238" v:groupContext="shape" transform="translate(782.196,338.594) rotate(90)">
+ <title>Rectangle.238</title>
+ <desc>ElementPtr</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="63.7795" cy="578.102" width="127.56" height="34.3479"/>
+ <rect x="0" y="560.928" width="127.559" height="34.3479" class="st1"/>
+ <text x="40.92" y="581.1" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>ElementPtr</text> </g>
+ <g id="shape157-13" v:mID="157" v:groupContext="shape" transform="translate(366.781,-188.646)">
+ <title>Sheet.157</title>
+ <g id="shadow157-14" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape153-18" v:mID="153" v:groupContext="shape" transform="translate(338.435,-188.646)">
+ <title>Sheet.153</title>
+ <g id="shadow153-19" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape149-23" v:mID="149" v:groupContext="shape" transform="translate(311.67,-188.646)">
+ <title>Sheet.149</title>
+ <g id="shadow149-24" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape133-28" v:mID="133" v:groupContext="shape" transform="translate(283.77,-188.646)">
+ <title>Sheet.133</title>
+ <g id="shadow133-29" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape165-33" v:mID="165" v:groupContext="shape" transform="translate(480.973,-188.646)">
+ <title>Sheet.165</title>
+ <g id="shadow165-34" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape167-38" v:mID="167" v:groupContext="shape" transform="translate(452.626,-188.646)">
+ <title>Sheet.167</title>
+ <g id="shadow167-39" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape170-43" v:mID="170" v:groupContext="shape" transform="translate(425.861,-188.646)">
+ <title>Sheet.170</title>
+ <g id="shadow170-44" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape173-48" v:mID="173" v:groupContext="shape" transform="translate(397.962,-188.646)">
+ <title>Sheet.173</title>
+ <g id="shadow173-49" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape1-53" v:mID="1" v:groupContext="shape" transform="translate(195.591,-347.244)">
+ <title>Rectangle.2</title>
+ <desc>BlockAllocator</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197" v:verticalAlign="0"/>
+ <v:textRect cx="199.843" cy="513.78" width="399.69" height="162.992"/>
+ <rect x="0" y="432.283" width="399.685" height="162.992" class="st1"/>
+ <text x="4" y="445.28" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>BlockAllocator</text> </g>
+ <g id="shape26-56" v:mID="26" v:groupContext="shape" v:layerMember="0" transform="translate(289.134,-425.197)">
+ <title>Dynamic connector</title>
+ <path d="M0 595.28 L21.26 581.1" class="st7"/>
+ </g>
+ <g id="group28-62" transform="translate(250.611,-403.937)" v:mID="28" v:groupContext="group">
+ <title>Sheet.28</title>
+ <g id="shape22-63" v:mID="22" v:groupContext="shape" transform="translate(1.19904E-014,-17.0079)">
+ <title>Rectangle.22</title>
+ <desc>Block 0</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="19.2614" cy="591.024" width="38.53" height="8.50394"/>
+ <rect x="0" y="586.772" width="38.5228" height="8.50394" class="st1"/>
+ <text x="4" y="594.02" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Block 0</text> </g>
+ <g id="shape24-66" v:mID="24" v:groupContext="shape" transform="translate(0,-8.53228)">
+ <title>Rectangle.24</title>
+ <desc>Block 1</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="19.2614" cy="591.024" width="38.53" height="8.50394"/>
+ <rect x="0" y="586.772" width="38.5228" height="8.50394" class="st1"/>
+ <text x="4" y="594.02" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Block 1</text> </g>
+ <g id="shape25-69" v:mID="25" v:groupContext="shape">
+ <title>Rectangle.25</title>
+ <desc>Block n</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="19.2614" cy="591.024" width="38.53" height="8.50394"/>
+ <rect x="0" y="586.772" width="38.5228" height="8.50394" class="st1"/>
+ <text x="4" y="594.02" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Block n</text> </g>
+ </g>
+ <g id="shape54-72" v:mID="54" v:groupContext="shape" transform="translate(303.307,-462.047)">
+ <title>Rectangle.25</title>
+ <desc>free</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="12.7559" cy="588.898" width="25.52" height="12.7559"/>
+ <rect x="0" y="582.52" width="25.5118" height="12.7559" class="st9"/>
+ <text x="4" y="591.9" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>free</text> </g>
+ <g id="group55-75" transform="translate(310.394,-420.954)" v:mID="55" v:groupContext="group">
+ <title>Sheet.55</title>
+ <g id="group21-76" transform="translate(0,-5.66009)" v:mID="21" v:groupContext="group">
+ <title>Sheet.21</title>
+ <g id="shape10-77" v:mID="10" v:groupContext="shape">
+ <title>Rectangle.10</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st10"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape11-80" v:mID="11" v:groupContext="shape" transform="translate(34.526,0)">
+ <title>Rectangle.11</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st10"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape12-83" v:mID="12" v:groupContext="shape" transform="translate(69.052,0)">
+ <title>Rectangle.12</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape13-86" v:mID="13" v:groupContext="shape" transform="translate(103.578,0)">
+ <title>Rectangle.13</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape14-89" v:mID="14" v:groupContext="shape" transform="translate(138.104,0)">
+ <title>Rectangle.14</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st10"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape15-92" v:mID="15" v:groupContext="shape" transform="translate(172.63,0)">
+ <title>Rectangle.15</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape17-95" v:mID="17" v:groupContext="shape" transform="translate(207.156,0)">
+ <title>Rectangle.17</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape18-98" v:mID="18" v:groupContext="shape" transform="translate(241.682,-1.13687E-013)">
+ <title>Rectangle.18</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ </g>
+ <g id="shape45-101" v:mID="45" v:groupContext="shape" transform="translate(86.315,0)">
+ <title>Sheet.45</title>
+ <path d="M0 589.62 C5.42 595.28 7.79 595.68 13.89 595.08 C16.34 594.84 19.38 594.43 22.68 589.62" class="st7"/>
+ </g>
+ <g id="shape46-106" v:mID="46" v:groupContext="shape" transform="translate(120.841,0)">
+ <title>Sheet.46</title>
+ <path d="M0 589.62 C16.5 595.28 23.73 595.68 42.3 595.08 C49.75 594.84 59.02 594.43 69.05 589.62" class="st7"/>
+ </g>
+ <g id="shape48-111" v:mID="48" v:groupContext="shape" transform="translate(189.893,0)">
+ <title>Sheet.48</title>
+ <path d="M0 589.62 C5.42 595.28 7.79 595.68 13.89 595.08 C16.34 594.84 19.38 594.43 22.68 589.62" class="st7"/>
+ </g>
+ <g id="shape49-116" v:mID="49" v:groupContext="shape" transform="translate(224.419,-1.13687E-013)">
+ <title>Sheet.49</title>
+ <path d="M0 589.62 C5.42 595.28 7.79 595.68 13.89 595.08 C16.34 594.84 19.38 594.43 22.68 589.62" class="st7"/>
+ </g>
+ </g>
+ <g id="shape58-121" v:mID="58" v:groupContext="shape" transform="translate(314.391,-362.835)">
+ <title>Rectangle.58</title>
+ <desc>NULL</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="19.2614" cy="588.898" width="38.53" height="12.7559"/>
+ <rect x="0" y="582.52" width="38.5228" height="12.7559" class="st11"/>
+ <text x="4" y="591.9" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>NULL</text> </g>
+ <g id="shape59-124" v:mID="59" v:groupContext="shape" v:layerMember="0" transform="translate(289.134,-408.189)">
+ <title>Dynamic connector.59</title>
+ <path d="M0 595.28 L25.26 634.25" class="st7"/>
+ </g>
+ <g id="shape62-129" v:mID="62" v:groupContext="shape" transform="translate(467.786,-451.977) rotate(13.5003)">
+ <title>Sheet.62</title>
+ <path d="M0 595.28 C15.88 590.58 24.96 588.95 38.98 589.6 C44.61 589.86 51.03 590.49 69.82 595.28" class="st7"/>
+ </g>
+ <g id="group100-134" transform="translate(310.564,-381.264)" v:mID="100" v:groupContext="group">
+ <title>Sheet.100</title>
+ <g id="group101-135" transform="translate(0,-5.66009)" v:mID="101" v:groupContext="group">
+ <title>Sheet.101</title>
+ <g id="shape102-136" v:mID="102" v:groupContext="shape">
+ <title>Rectangle.10</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st10"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape103-139" v:mID="103" v:groupContext="shape" transform="translate(34.526,0)">
+ <title>Rectangle.11</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st10"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape104-142" v:mID="104" v:groupContext="shape" transform="translate(69.052,0)">
+ <title>Rectangle.12</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape105-145" v:mID="105" v:groupContext="shape" transform="translate(103.578,0)">
+ <title>Rectangle.13</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape106-148" v:mID="106" v:groupContext="shape" transform="translate(138.104,0)">
+ <title>Rectangle.14</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape107-151" v:mID="107" v:groupContext="shape" transform="translate(172.63,0)">
+ <title>Rectangle.15</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape108-154" v:mID="108" v:groupContext="shape" transform="translate(207.156,0)">
+ <title>Rectangle.17</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st1"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ <g id="shape109-157" v:mID="109" v:groupContext="shape" transform="translate(241.682,-1.13687E-013)">
+ <title>Rectangle.18</title>
+ <desc>Chunk</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="17.263" cy="582.52" width="34.53" height="25.5118"/>
+ <rect x="0" y="569.764" width="34.526" height="25.5118" class="st10"/>
+ <text x="4" y="585.52" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk</text> </g>
+ </g>
+ <g id="shape110-160" v:mID="110" v:groupContext="shape" transform="translate(86.315,0)">
+ <title>Sheet.110</title>
+ <path d="M0 589.62 C5.42 595.28 7.79 595.68 13.89 595.08 C16.34 594.84 19.38 594.43 22.68 589.62" class="st7"/>
+ </g>
+ <g id="shape112-165" v:mID="112" v:groupContext="shape" transform="translate(189.893,0)">
+ <title>Sheet.112</title>
+ <path d="M0 589.62 C5.42 595.28 7.79 595.68 13.89 595.08 C16.34 594.84 19.38 594.43 22.68 589.62" class="st7"/>
+ </g>
+ </g>
+ <g id="shape114-170" v:mID="114" v:groupContext="shape" v:layerMember="0" transform="translate(289.134,-416.721)">
+ <title>Dynamic connector.114</title>
+ <path d="M0 595.28 L21.43 612.32" class="st7"/>
+ </g>
+ <g id="shape115-175" v:mID="115" v:groupContext="shape" transform="translate(465.931,-381.264)">
+ <title>Sheet.115</title>
+ <path d="M0 589.62 C5.42 595.28 7.79 595.68 13.89 595.08 C16.34 594.84 19.38 594.43 22.68 589.62" class="st7"/>
+ </g>
+ <g id="shape116-180" v:mID="116" v:groupContext="shape" transform="translate(618.045,761.134) rotate(175.3)">
+ <title>Sheet.116</title>
+ <path d="M0 594.47 C2.82 586.17 -9.74 585.59 70.67 591.28 C102.92 593.56 150.12 596.86 173.04 594.47" class="st7"/>
+ </g>
+ <g id="shape117-185" v:mID="117" v:groupContext="shape" transform="translate(431.405,-381.264)">
+ <title>Sheet.117</title>
+ <path d="M0 589.62 C5.42 595.28 7.79 595.68 13.89 595.08 C16.34 594.84 19.38 594.43 22.68 589.62" class="st7"/>
+ </g>
+ <g id="shape118-190" v:mID="118" v:groupContext="shape" transform="translate(348.661,-263.622)">
+ <title>Rectangle.118</title>
+ <desc>BlockAllocator</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="43.7209" cy="582.52" width="87.45" height="25.5118"/>
+ <rect x="0" y="569.764" width="87.4417" height="25.5118" class="st1"/>
+ <text x="14.44" y="585.52" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>BlockAllocator</text> </g>
+ <g id="shape128-193" v:mID="128" v:groupContext="shape" transform="translate(232.441,-141.732)">
+ <title>Rectangle.128</title>
+ <desc>queue spinlock</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="159.449" cy="579.69" width="318.9" height="31.1719"/>
+ <path d="M0 595.28 L318.9 595.28 L318.9 564.1 L0 564.1 L0 595.28 Z" class="st3"/>
+ <text x="128.93" y="582.69" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>queue spinlock</text> </g>
+ <g id="shape129-196" v:mID="129" v:groupContext="shape" transform="translate(239.528,-143.531)">
+ <title>Rectangle.129</title>
+ <desc>push(T*)</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="23.1024" cy="587.483" width="46.21" height="15.586"/>
+ <rect x="0" y="579.69" width="46.2047" height="15.586" class="st9"/>
+ <text x="5.31" y="590.48" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>push(T*)</text> </g>
+ <g id="shape130-199" v:mID="130" v:groupContext="shape" transform="translate(477.638,-145.329)">
+ <title>Rectangle.130</title>
+ <desc>T[] pop_list()</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="33.3071" cy="587.483" width="66.62" height="15.586"/>
+ <rect x="0" y="579.69" width="66.6142" height="15.586" class="st9"/>
+ <text x="7.34" y="590.48" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T[] pop_list()</text> </g>
+ <g id="shape123-202" v:mID="123" v:groupContext="shape" transform="translate(241.917,-225.354)">
+ <title>Rectangle.123</title>
+ <desc>T* allocate()</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="29.5884" cy="588.898" width="59.18" height="12.7559"/>
+ <rect x="0" y="582.52" width="59.1768" height="12.7559" class="st9"/>
+ <text x="4" y="591.9" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>T* allocate()</text> </g>
+ <g id="shape124-205" v:mID="124" v:groupContext="shape" transform="translate(477.098,-226.772)">
+ <title>Rectangle.124</title>
+ <desc>deallocate(T*)</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="33.0909" cy="588.898" width="66.19" height="12.7559"/>
+ <rect x="0" y="582.52" width="66.1819" height="12.7559" class="st9"/>
+ <text x="4" y="591.9" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>deallocate(T*)</text> </g>
+ <g id="shape125-208" v:mID="125" v:groupContext="shape" v:layerMember="0" transform="translate(348.661,-276.378)">
+ <title>Dynamic connector.125</title>
+ <path d="M0 595.28 L-77.16 633.54" class="st12"/>
+ </g>
+ <g id="shape126-214" v:mID="126" v:groupContext="shape" v:layerMember="0" transform="translate(510.189,-239.528)">
+ <title>Dynamic connector.126</title>
+ <path d="M0 595.28 L-74.09 558.43" class="st12"/>
+ </g>
+ <g id="shape160-219" v:mID="160" v:groupContext="shape" transform="translate(240.139,-155.906)">
+ <title>Rectangle.160</title>
+ <desc>list</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st9"/>
+ <text x="4.4" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>list</text> </g>
+ <g id="shape161-222" v:mID="161" v:groupContext="shape" v:layerMember="0" transform="translate(250.463,-168.661)">
+ <title>Dynamic connector.161</title>
+ <path d="M0 595.28 L32.5 566.93" class="st7"/>
+ </g>
+ <g id="shape162-227" v:mID="162" v:groupContext="shape" transform="translate(507.566,-157.323)">
+ <title>Rectangle.162</title>
+ <desc>first</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="15.4264" cy="588.898" width="30.86" height="12.7559"/>
+ <rect x="0" y="582.52" width="30.8529" height="12.7559" class="st9"/>
+ <text x="7.38" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>first</text> </g>
+ <g id="shape176-230" v:mID="176" v:groupContext="shape" transform="translate(110.424,-177.316)">
+ <title>Rectangle.176</title>
+ <desc>Writer</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="29.8913" cy="579.69" width="59.79" height="31.1719"/>
+ <rect x="0" y="564.104" width="59.7827" height="31.1719" class="st1"/>
+ <text x="16.65" y="582.69" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Writer</text> </g>
+ <g id="shape177-233" v:mID="177" v:groupContext="shape" transform="translate(627.746,-181.422)">
+ <title>Rectangle.177</title>
+ <desc>Reader</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="29.8913" cy="579.69" width="59.79" height="31.1719"/>
+ <rect x="0" y="564.104" width="59.7827" height="31.1719" class="st1"/>
+ <text x="15.44" y="582.69" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Reader</text> </g>
+ <g id="shape156-236" v:mID="156" v:groupContext="shape" transform="translate(365.975,-190.63)">
+ <title>Rectangle.156</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape152-239" v:mID="152" v:groupContext="shape" transform="translate(337.628,-190.63)">
+ <title>Rectangle.152</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape154-242" v:mID="154" v:groupContext="shape" v:layerMember="0" transform="translate(368.482,-190.346)">
+ <title>Dynamic connector.154</title>
+ <path d="M-1.7 588.19 L-12.47 588.19" class="st7"/>
+ </g>
+ <g id="shape148-247" v:mID="148" v:groupContext="shape" transform="translate(310.863,-190.63)">
+ <title>Rectangle.148</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape150-250" v:mID="150" v:groupContext="shape" v:layerMember="0" transform="translate(340.926,-190.346)">
+ <title>Dynamic connector.150</title>
+ <path d="M-2.49 588.19 L-11.68 588.19" class="st7"/>
+ </g>
+ <g id="shape134-255" v:mID="134" v:groupContext="shape" transform="translate(282.964,-190.63)">
+ <title>Rectangle.134</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape145-258" v:mID="145" v:groupContext="shape" v:layerMember="0" transform="translate(313.594,-190.346)">
+ <title>Dynamic connector.145</title>
+ <path d="M-1.92 588.19 L-12.25 588.19" class="st7"/>
+ </g>
+ <g id="shape164-263" v:mID="164" v:groupContext="shape" transform="translate(480.167,-190.63)">
+ <title>Rectangle.164</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape166-266" v:mID="166" v:groupContext="shape" transform="translate(451.82,-190.63)">
+ <title>Rectangle.166</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape168-269" v:mID="168" v:groupContext="shape" v:layerMember="0" transform="translate(482.674,-190.346)">
+ <title>Dynamic connector.168</title>
+ <path d="M-1.7 588.19 L-12.47 588.19" class="st7"/>
+ </g>
+ <g id="shape169-274" v:mID="169" v:groupContext="shape" transform="translate(425.055,-190.63)">
+ <title>Rectangle.169</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape171-277" v:mID="171" v:groupContext="shape" v:layerMember="0" transform="translate(455.118,-190.346)">
+ <title>Dynamic connector.171</title>
+ <path d="M-2.49 588.19 L-11.68 588.19" class="st7"/>
+ </g>
+ <g id="shape172-282" v:mID="172" v:groupContext="shape" transform="translate(397.156,-190.63)">
+ <title>Rectangle.172</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ <g id="shape174-285" v:mID="174" v:groupContext="shape" v:layerMember="0" transform="translate(427.786,-190.346)">
+ <title>Dynamic connector.174</title>
+ <path d="M-1.92 588.19 L-12.25 588.19" class="st7"/>
+ </g>
+ <g id="shape175-290" v:mID="175" v:groupContext="shape" v:layerMember="0" transform="translate(398.246,-190.346)">
+ <title>Dynamic connector.175</title>
+ <path d="M-0.28 588.19 L-13.89 588.19" class="st7"/>
+ </g>
+ <g id="shape183-295" v:mID="183" v:groupContext="shape" transform="translate(372.089,932.539) rotate(167.114)">
+ <title>Sheet.183</title>
+ <path d="M0 583.7 C38.54 597.44 83.34 600.97 104.23 583.7" class="st12"/>
+ </g>
+ <g id="shape184-300" v:mID="184" v:groupContext="shape" transform="translate(287.889,-145.324) rotate(14.6809)">
+ <title>Sheet.184</title>
+ <path d="M0 582.29 C24.9 607.39 69.61 589.7 102.56 582.29" class="st12"/>
+ </g>
+ <g id="shape185-305" v:mID="185" v:groupContext="shape" transform="translate(403.494,-121.803) rotate(-14.0141)">
+ <title>Sheet.185</title>
+ <path d="M0 581.26 C12.78 584.97 50.85 595.17 74.95 595.28 C95.42 595.36 105.8 588.16 116.86 581.26" class="st12"/>
+ </g>
+ <g id="shape186-310" v:mID="186" v:groupContext="shape" transform="translate(554.066,958.884) rotate(-169.81)">
+ <title>Sheet.186</title>
+ <path d="M0 585.44 C33.25 596.44 83.96 600.67 116.19 585.44" class="st12"/>
+ </g>
+ <g id="shape163-315" v:mID="163" v:groupContext="shape" v:layerMember="0" transform="translate(522.992,-170.079)">
+ <title>Dynamic connector.163</title>
+ <path d="M0 595.28 L-26.45 573.51" class="st7"/>
+ </g>
+ <g id="group210-320" transform="translate(193.77,-141.732)" v:mID="210" v:groupContext="group">
+ <title>Sheet.210</title>
+ <g id="shape197-321" v:mID="197" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.197</title>
+ <g id="shadow197-322" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape196-326" v:mID="196" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.196</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="group211-329" transform="translate(564.989,-146.268)" v:mID="211" v:groupContext="group">
+ <title>Sheet.211</title>
+ <g id="shape200-330" v:mID="200" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.200</title>
+ <g id="shadow200-331" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape199-335" v:mID="199" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.199</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="group217-338" transform="translate(194.784,-223.937)" v:mID="217" v:groupContext="group">
+ <title>Sheet.217</title>
+ <g id="shape193-339" v:mID="193" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.193</title>
+ <g id="shadow193-340" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st14"/>
+ </g>
+ <g id="shape192-344" v:mID="192" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.192</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="group218-347" transform="translate(573.613,-227.906)" v:mID="218" v:groupContext="group">
+ <title>Sheet.218</title>
+ <g id="shape206-348" v:mID="206" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.206</title>
+ <g id="shadow206-349" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st14"/>
+ </g>
+ <g id="shape205-353" v:mID="205" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.123</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="group219-356" transform="translate(569.972,-146.551)" v:mID="219" v:groupContext="group">
+ <title>Sheet.219</title>
+ <g id="shape220-357" v:mID="220" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.220</title>
+ <g id="shadow220-358" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape221-362" v:mID="221" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.199</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="group222-365" transform="translate(573.821,-147.118)" v:mID="222" v:groupContext="group">
+ <title>Sheet.222</title>
+ <g id="shape223-366" v:mID="223" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.223</title>
+ <g id="shadow223-367" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape224-371" v:mID="224" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.199</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="group225-374" transform="translate(578.551,-147.402)" v:mID="225" v:groupContext="group">
+ <title>Sheet.225</title>
+ <g id="shape226-375" v:mID="226" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.226</title>
+ <g id="shadow226-376" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape227-380" v:mID="227" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.199</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="group228-383" transform="translate(582.236,-147.969)" v:mID="228" v:groupContext="group">
+ <title>Sheet.228</title>
+ <g id="shape229-384" v:mID="229" v:groupContext="shape" transform="translate(0.806102,0)">
+ <title>Sheet.229</title>
+ <g id="shadow229-385" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st5"/>
+ </g>
+ <ellipse cx="8.7874" cy="586.488" rx="8.7874" ry="8.7874" class="st6"/>
+ </g>
+ <g id="shape230-389" v:mID="230" v:groupContext="shape" transform="translate(0,-1.98425)">
+ <title>Rectangle.199</title>
+ <desc>T</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="10.3243" cy="588.898" width="20.65" height="12.7559"/>
+ <rect x="0" y="582.52" width="20.6486" height="12.7559" class="st11"/>
+ <text x="7.89" y="591.9" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>T</text> </g>
+ </g>
+ <g id="shape232-392" v:mID="232" v:groupContext="shape" v:layerMember="0" transform="translate(527.992,-387.21)">
+ <title>Dynamic connector.232</title>
+ <path d="M6.99 595.56 L7.18 609.16" class="st7"/>
+ </g>
+ <g id="shape234-397" v:mID="234" v:groupContext="shape" transform="translate(520.381,-360.567)">
+ <title>Rectangle.234</title>
+ <desc>NULL</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="14.7929" cy="588.898" width="29.59" height="12.7559"/>
+ <rect x="0" y="582.52" width="29.5857" height="12.7559" class="st11"/>
+ <text x="4" y="591.9" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>NULL</text> </g>
+ <g id="shape66-400" v:mID="66" v:groupContext="shape" transform="translate(209.853,-474.803)">
+ <title>Rectangle.66</title>
+ <desc>Chunk* allocate()</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="39.6405" cy="588.898" width="79.29" height="12.7559"/>
+ <rect x="0" y="582.52" width="79.2809" height="12.7559" class="st9"/>
+ <text x="4" y="591.9" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>Chunk* allocate()</text> </g>
+ <g id="shape75-403" v:mID="75" v:groupContext="shape" transform="translate(208.123,-446.457)">
+ <title>Rectangle.75</title>
+ <desc>deallocate(Chunk*)</desc>
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
+ </v:userDefs>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="43.7209" cy="588.898" width="87.45" height="12.7559"/>
+ <rect x="0" y="582.52" width="87.4417" height="12.7559" class="st9"/>
+ <text x="4" y="591.9" class="st2" v:langID="1033"><v:paragraph/><v:tabList/>deallocate(Chunk*)</text> </g>
+ <g id="shape98-406" v:mID="98" v:groupContext="shape" v:layerMember="0" transform="translate(316.063,-470.906)">
+ <title>Dynamic connector.98</title>
+ <path d="M0 591.38 L-26.93 585" class="st12"/>
+ </g>
+ <g id="shape99-411" v:mID="99" v:groupContext="shape" v:layerMember="0" transform="translate(295.564,-450.354)">
+ <title>Dynamic connector.99</title>
+ <path d="M0 592.8 L20.5 583.58" class="st12"/>
+ </g>
+ <g id="group190-416" transform="translate(528.661,-70.1575)" v:mID="190" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="msvStructureType" v:prompt="" v:val="VT4(Callout)"/>
+ <v:ud v:nameU="msvSDTargetIntersection" v:prompt=""/>
+ <v:ud v:nameU="msvSDCalloutNoHighlight" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="msvShapeCategories" v:prompt="" v:val="VT0(0):26"/>
+ <v:ud v:nameU="Side" v:prompt="" v:val="VT0(4):26"/>
+ <v:ud v:nameU="LeaderEnd" v:prompt="" v:val="VT7(PNT(6.25MM,-0.28346456692913)):40"/>
+ <v:ud v:nameU="WHBoxIntersection" v:prompt="" v:val="VT7(PNT(10.096153846154MM,0)):40"/>
+ <v:ud v:nameU="FoldSize" v:prompt="" v:val="VT0(0.11811023622047):24"/>
+ <v:ud v:nameU="msvSDTargetIntersection" v:prompt="" v:val="VT7(PNT(-0.12709905838268,1.0440494563244)):40"/>
+ <v:ud v:nameU="Side" v:prompt="" v:val="VT0(3):26"/>
+ <v:ud v:nameU="LeaderEnd" v:prompt="" v:val="VT7(PNT(-0.12709905838268,1.0440494563244)):40"/>
+ <v:ud v:nameU="WHBoxIntersection" v:prompt="" v:val="VT7(PNT(0,0.53149606299213)):40"/>
+ </v:userDefs>
+ <title>Note.190</title>
+ <desc>take out all Ts from the Queue</desc>
+ <g id="shape190-417" v:mID="190" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="52.4409" cy="576.142" width="104.89" height="36.8038"/>
+ <g id="shadow190-418" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28 Z" class="st15"/>
+ <path d="M0 557.01 L-9.15 520.1" class="st16"/>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28" class="st16"/>
+ <text x="5.31" y="572.54" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>take out all Ts from <tspan
+ x="26.62" dy="1.2em" class="st18">the Queue</tspan></text> </g>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28 Z" class="st19"/>
+ <path d="M0 557.01 L-9.15 520.1" class="st20"/>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28" class="st20"/>
+ <text x="5.31" y="572.54" class="st21" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>take out all Ts from <tspan
+ x="26.62" dy="1.2em" class="st18">the Queue</tspan></text> </g>
+ <g id="shape191-432" v:mID="191" v:groupContext="shape" transform="translate(96.378,-29.7638)">
+ <title>Sheet.191</title>
+ <v:userDefs>
+ <v:ud v:nameU="FoldSize" v:prompt="" v:val="VT0(0.11811023622047):24"/>
+ </v:userDefs>
+ <g id="shadow191-433" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <path d="M0 595.28 L8.5 595.28 L8.5 596.13 L8.5 595.28 L0 586.77 L-0.85 586.77 L0 586.77 L0 595.28 Z"
+ class="st22"/>
+ </g>
+ <path d="M0 595.28 L8.5 595.28 L8.5 596.13 L8.5 595.28 L0 586.77 L-0.85 586.77 L0 586.77 L0 595.28 Z" class="st23"/>
+ </g>
+ </g>
+ <g id="group243-437" transform="translate(632.126,-257.244)" v:mID="243" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="msvStructureType" v:prompt="" v:val="VT4(Callout)"/>
+ <v:ud v:nameU="msvSDTargetIntersection" v:prompt=""/>
+ <v:ud v:nameU="msvSDCalloutNoHighlight" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="msvShapeCategories" v:prompt="" v:val="VT0(0):26"/>
+ <v:ud v:nameU="Side" v:prompt="" v:val="VT0(4):26"/>
+ <v:ud v:nameU="LeaderEnd" v:prompt="" v:val="VT7(PNT(6.25MM,-0.28346456692913)):40"/>
+ <v:ud v:nameU="WHBoxIntersection" v:prompt="" v:val="VT7(PNT(10.096153846154MM,0)):40"/>
+ <v:ud v:nameU="FoldSize" v:prompt="" v:val="VT0(0.11811023622047):24"/>
+ <v:ud v:nameU="msvSDTargetIntersection" v:prompt="" v:val="VT7(PNT(-0.41214936502337,-0.61122298311842)):40"/>
+ <v:ud v:nameU="Side" v:prompt="" v:val="VT0(3):26"/>
+ <v:ud v:nameU="LeaderEnd" v:prompt="" v:val="VT7(PNT(-0.41214936502337,-0.61122298311842)):40"/>
+ <v:ud v:nameU="WHBoxIntersection" v:prompt="" v:val="VT7(PNT(0,0)):40"/>
+ </v:userDefs>
+ <title>Note.243</title>
+ <desc>smart pointer for list of elements</desc>
+ <g id="shape243-438" v:mID="243" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="52.4409" cy="576.142" width="104.89" height="36.8038"/>
+ <g id="shadow243-439" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28 Z" class="st15"/>
+ <path d="M0 595.28 L-29.67 639.28" class="st16"/>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28" class="st16"/>
+ <text x="10.59" y="572.54" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>smart pointer for <tspan
+ x="14.99" dy="1.2em" class="st18">list of elements</tspan></text> </g>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28 Z" class="st19"/>
+ <path d="M0 595.28 L-29.67 639.28" class="st20"/>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28" class="st20"/>
+ <text x="10.59" y="572.54" class="st21" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>smart pointer for <tspan
+ x="14.99" dy="1.2em" class="st18">list of elements</tspan></text> </g>
+ <g id="shape244-453" v:mID="244" v:groupContext="shape" transform="translate(96.378,-29.7638)">
+ <title>Sheet.244</title>
+ <v:userDefs>
+ <v:ud v:nameU="FoldSize" v:prompt="" v:val="VT0(0.11811023622047):24"/>
+ </v:userDefs>
+ <g id="shadow244-454" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <path d="M0 595.28 L8.5 595.28 L8.5 596.13 L8.5 595.28 L0 586.77 L-0.85 586.77 L0 586.77 L0 595.28 Z"
+ class="st22"/>
+ </g>
+ <path d="M0 595.28 L8.5 595.28 L8.5 596.13 L8.5 595.28 L0 586.77 L-0.85 586.77 L0 586.77 L0 595.28 Z" class="st23"/>
+ </g>
+ </g>
+ <g id="group247-458" transform="translate(58.1102,-257.953)" v:mID="247" v:groupContext="group">
+ <v:userDefs>
+ <v:ud v:nameU="visVersion" v:prompt="" v:val="VT0(15):26"/>
+ <v:ud v:nameU="msvStructureType" v:prompt="" v:val="VT4(Callout)"/>
+ <v:ud v:nameU="msvSDTargetIntersection" v:prompt=""/>
+ <v:ud v:nameU="msvSDCalloutNoHighlight" v:prompt="" v:val="VT0(0):5"/>
+ <v:ud v:nameU="msvShapeCategories" v:prompt="" v:val="VT0(0):26"/>
+ <v:ud v:nameU="Side" v:prompt="" v:val="VT0(4):26"/>
+ <v:ud v:nameU="LeaderEnd" v:prompt="" v:val="VT7(PNT(6.25MM,-0.28346456692913)):40"/>
+ <v:ud v:nameU="WHBoxIntersection" v:prompt="" v:val="VT7(PNT(10.096153846154MM,0)):40"/>
+ <v:ud v:nameU="FoldSize" v:prompt="" v:val="VT0(0.11811023622047):24"/>
+ <v:ud v:nameU="msvSDTargetIntersection" v:prompt="" v:val="VT7(PNT(1.789031742126,-0.68881655337357)):40"/>
+ <v:ud v:nameU="Side" v:prompt="" v:val="VT0(1):26"/>
+ <v:ud v:nameU="LeaderEnd" v:prompt="" v:val="VT7(PNT(1.789031742126,-0.68881655337357)):40"/>
+ <v:ud v:nameU="WHBoxIntersection" v:prompt="" v:val="VT7(PNT(1.4566929133858,0)):40"/>
+ </v:userDefs>
+ <title>Note.247</title>
+ <desc>smart pointer for allocated element</desc>
+ <g id="shape247-459" v:mID="247" v:groupContext="groupContent">
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="52.4409" cy="576.142" width="104.89" height="36.8038"/>
+ <g id="shadow247-460" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28 Z" class="st15"/>
+ <path d="M104.88 595.28 L128.81 644.87" class="st16"/>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28" class="st16"/>
+ <text x="10.59" y="572.54" class="st17" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>smart pointer for <tspan
+ x="8.45" dy="1.2em" class="st18">allocated element</tspan></text> </g>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28 Z" class="st19"/>
+ <path d="M104.88 595.28 L128.81 644.87" class="st20"/>
+ <path d="M0 595.28 L104.88 595.28 L104.88 565.51 L96.38 557.01 L0 557.01 L0 595.28" class="st20"/>
+ <text x="10.59" y="572.54" class="st21" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>smart pointer for <tspan
+ x="8.45" dy="1.2em" class="st18">allocated element</tspan></text> </g>
+ <g id="shape248-474" v:mID="248" v:groupContext="shape" transform="translate(96.378,-29.7638)">
+ <title>Sheet.248</title>
+ <v:userDefs>
+ <v:ud v:nameU="FoldSize" v:prompt="" v:val="VT0(0.11811023622047):24"/>
+ </v:userDefs>
+ <g id="shadow248-475" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279"
+ v:shadowType="1" transform="matrix(1,0,0,1,0.345598,1.97279)" class="st4">
+ <path d="M0 595.28 L8.5 595.28 L8.5 596.13 L8.5 595.28 L0 586.77 L-0.85 586.77 L0 586.77 L0 595.28 Z"
+ class="st22"/>
+ </g>
+ <path d="M0 595.28 L8.5 595.28 L8.5 596.13 L8.5 595.28 L0 586.77 L-0.85 586.77 L0 586.77 L0 595.28 Z" class="st23"/>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/docs/pictures/epam-logo.png b/docs/pictures/epam-logo.png Binary files differnew file mode 100755 index 0000000..83e5628 --- /dev/null +++ b/docs/pictures/epam-logo.png diff --git a/docs/pictures/epam-logo.svg b/docs/pictures/epam-logo.svg new file mode 100755 index 0000000..7c2fc6f --- /dev/null +++ b/docs/pictures/epam-logo.svg @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 333.73334 117.42667" + height="117.42667" + width="333.73334" + xml:space="preserve" + id="svg2" + version="1.1"><metadata + id="metadata8"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs + id="defs6"><clipPath + id="clipPath20" + clipPathUnits="userSpaceOnUse"><path + id="path18" + d="M 0,0 H 2503 V 880.746 H 0 Z" /></clipPath></defs><g + transform="matrix(1.3333333,0,0,-1.3333333,0,117.42667)" + id="g10"><g + transform="scale(0.1)" + id="g12"><g + id="g14"><g + clip-path="url(#clipPath20)" + id="g16"><path + id="path22" + style="fill:#3d3a3b;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 472.504,581.254 h 138.41 V 728.23 c 0,41.012 -20.496,61.52 -61.512,61.52 h -15.379 c -41.011,0 -61.519,-20.508 -61.519,-61.52 z m -0.313,-93.793 0.313,-161.66 c 0,-41.012 20.508,-61.52 61.519,-61.52 h 17.942 c 41.012,0 61.515,20.508 61.515,61.52 v 79.461 h 94.84 v -75.617 c 0,-103.813 -52.543,-156.36 -156.355,-156.36 h -20.508 c -103.812,0 -156.355,52.547 -156.355,144.203 V 712.23 c 0,115.965 52.543,168.516 156.355,168.516 h 20.508 c 103.812,0 156.355,-52.551 156.355,-156.363 L 708.008,487.461 H 472.191" /><path + id="path24" + style="fill:#3d3a3b;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 869.008,301.445 c 26.914,-23.062 57.676,-35.879 89.715,-35.879 35.886,0 56.397,16.657 56.397,56.387 v 410.121 c 0,39.735 -20.511,56.391 -56.397,56.391 -32.039,0 -62.801,-12.817 -89.715,-35.887 z m -97.406,571.61 h 97.406 v -44.86 c 23.07,24.356 62.801,52.551 119.195,52.551 83.307,0 124.317,-55.109 124.317,-137.133 V 310.422 c 0,-82.027 -41.01,-137.137 -124.317,-137.137 -56.394,0 -96.125,26.914 -119.195,49.985 V 0 h -97.406 v 873.055" /><path + id="path26" + style="fill:#3d3a3b;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 1404.57,297.605 v 228.282 l -88.43,-33.477 c -35.89,-14.101 -47.42,-32.039 -47.42,-71.769 V 315.547 c 0,-33.324 16.66,-49.981 47.42,-49.981 29.47,0 56.39,10.25 88.43,32.039 z m -233.26,124.321 c 0,85.863 28.2,120.469 102.53,146.097 l 130.73,44.864 V 728.23 c 0,41.012 -20.51,62.801 -61.52,62.801 h -15.87 c -41.01,0 -61.52,-21.789 -61.52,-62.801 v -98.027 h -94.84 v 94.18 c 0,103.812 52.55,156.363 156.36,156.363 h 18.43 c 103.81,0 156.36,-52.551 156.36,-156.363 V 180.977 h -97.4 v 43.578 c -26.91,-25.637 -62.8,-51.27 -119.19,-51.27 -78.18,0 -114.07,44.86 -114.07,121.754 v 126.887" /><path + id="path28" + style="fill:#3d3a3b;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 1895.92,180.977 h -97.41 V 738.48 c 0,34.606 -16.65,49.985 -46.13,49.985 -26.92,0 -55.11,-10.25 -89.72,-34.602 V 180.977 h -97.4 v 692.078 h 97.4 v -44.86 c 28.2,26.914 65.37,52.551 119.2,52.551 49.98,0 83.3,-20.508 101.24,-56.394 34.61,29.48 75.62,56.394 132.01,56.394 75.62,0 114.07,-46.144 114.07,-121.758 V 180.977 h -97.41 V 738.48 c 0,34.606 -16.66,49.985 -46.14,49.985 -26.91,0 -55.11,-10.25 -89.71,-34.602 V 180.977" /><path + id="path30" + style="fill:#29b9d2;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="M 250.262,809.312 V 682.047 L 86.3398,525.848 250.262,372.438 V 242.391 L 0,477.641 v 93.629 l 250.262,238.042" /><path + id="path32" + style="fill:#29b9d2;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 2503.02,571.27 v -93.629 l -250.26,-235.25 v 130.047 l 163.92,153.41 -163.92,156.199 V 809.312 L 2503.02,571.27" /></g></g></g></g></svg>
\ No newline at end of file diff --git a/docs/pictures/general-structure.png b/docs/pictures/general-structure.png Binary files differnew file mode 100755 index 0000000..b88628e --- /dev/null +++ b/docs/pictures/general-structure.png diff --git a/docs/pictures/general-structure.svg b/docs/pictures/general-structure.svg new file mode 100755 index 0000000..46cfbf4 --- /dev/null +++ b/docs/pictures/general-structure.svg @@ -0,0 +1,876 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export general-structure.svg General structure -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ width="11.6929in" height="8.26772in" viewBox="0 0 841.889 595.276" xml:space="preserve" color-interpolation-filters="sRGB"
+ class="st37">
+ <title>General structure of nfstrace</title>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {fill:#ffffff;stroke:#000000;stroke-width:0.25}
+ .st2 {fill:#000000;font-family:Calibri;font-size:0.833336em}
+ .st3 {font-size:1em}
+ .st4 {font-size:0.899997em}
+ .st5 {marker-start:url(#mrkr7-35);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.499999}
+ .st6 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.16556271699054}
+ .st7 {fill:#ffffff;stroke:none;stroke-linecap:butt;stroke-width:7.2}
+ .st8 {fill:#000000;font-family:Calibri;font-size:0.666664em}
+ .st9 {marker-end:url(#mrkr7-43);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.499999}
+ .st10 {marker-end:url(#mrkr4-65);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.999999}
+ .st11 {fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;stroke-width:0.28409061919554}
+ .st12 {fill:#ffffff;stroke:none;stroke-width:0.25}
+ .st13 {fill:none}
+ .st14 {stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.999999}
+ .st15 {marker-end:url(#mrkr22-112);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.499999}
+ .st16 {fill:none;stroke:none;stroke-width:0.25}
+ .st17 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+ .st18 {marker-end:url(#mrkr4-129);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.499999}
+ .st19 {marker-end:url(#mrkr16-135);stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.499999}
+ .st20 {fill:none;stroke:#000000;stroke-dasharray:0.01,1.25;stroke-width:0.25}
+ .st21 {fill:#000000;font-family:Calibri;font-size:0.833336em;font-weight:bold}
+ .st22 {fill:#000000;font-family:Calibri;font-size:0.666664em;font-weight:bold}
+ .st23 {font-size:1em;font-weight:normal}
+ .st24 {fill:none;stroke:#000000;stroke-width:0.25}
+ .st25 {fill:none;stroke:none;stroke-width:5.99999}
+ .st26 {stroke:#fec000;stroke-opacity:0.5;stroke-width:5.99999}
+ .st27 {stroke:#f59d56;stroke-opacity:0.5;stroke-width:5.99999}
+ .st28 {stroke:#70ad47;stroke-opacity:0.5;stroke-width:5.99999}
+ .st29 {stroke:#9cc3e5;stroke-opacity:0.5;stroke-width:5.99999}
+ .st30 {fill:none;stroke:none;stroke-width:0.999999}
+ .st31 {stroke:#c7c8c8;stroke-width:0.25}
+ .st32 {fill:none;stroke:#c7c8c8;stroke-width:0.25}
+ .st33 {fill:none;stroke:#c7c8c8;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
+ .st34 {stroke:#c8c8c8;stroke-width:0.25}
+ .st35 {fill:none;stroke:#c8c8c8;stroke-width:0.25}
+ .st36 {fill:none;stroke:#c8c8c8;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.25}
+ .st37 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Markers">
+ <g id="lend7">
+ <path
+ d="M 1.84309 -0.959455 C 1.43792 -0.3808 0.784502 -0.0260248 0.0785258 -0.00137083 L 0.0785228 0.00137063 C 0.784499 0.0260235 1.43791 0.380798 1.84309 0.959452 "
+ style="stroke-linecap:round;stroke-linejoin:round;fill:none"/>
+ </g>
+ <marker id="mrkr7-35" class="st6" orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend7" transform="scale(6.0400071838466) "/>
+ </marker>
+ <marker id="mrkr7-43" class="st6" orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend7" transform="scale(-6.0400071838466,-6.0400071838466) "/>
+ </marker>
+ <g id="lend4">
+ <path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
+ </g>
+ <marker id="mrkr4-65" class="st11" refX="-0" orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-3.5200035919233,-3.5200035919233) "/>
+ </marker>
+ <g id="lend22">
+ <path d="M 0 0 L 2.25 -1.125 L 4.5 0 L 2.25 1.125 L 0 0 " style="stroke-linecap:round;stroke-linejoin:round;fill:none"/>
+ </g>
+ <marker id="mrkr22-112" class="st6" refX="-0" orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend22" transform="scale(-6.0400071838466,-6.0400071838466) "/>
+ </marker>
+ <marker id="mrkr4-129" class="st6" refX="-0" orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend4" transform="scale(-6.0400071838466,-6.0400071838466) "/>
+ </marker>
+ <g id="lend16">
+ <path d="M 0 0 L 2 -1 L 2 1 L 0 0 " style="stroke-linecap:round;stroke-linejoin:round;fill:none"/>
+ </g>
+ <marker id="mrkr16-135" class="st6" refX="-0" orient="auto" markerUnits="strokeWidth" overflow="visible">
+ <use xlink:href="#lend16" transform="scale(-6.0400071838466,-6.0400071838466) "/>
+ </marker>
+ </defs>
+ <g>
+ <title>General structure</title>
+ <g id="shape32-1" transform="translate(442.204,-53.7171)">
+ <title>Sheet.32</title>
+ <path d="M-0 589.61 A5.66941 5.66941 -180 0 0 5.67 595.28 L240.94 595.28 A5.66941 5.66941 -180 0 0 246.61 589.61 L246.61
+ 538.3 A5.66941 5.66941 -180 0 0 240.94 532.63 L5.67 532.63 A5.66941 5.66941 -180 0 0 -0 538.3 L0 589.61
+ Z" class="st1"/>
+ </g>
+ <g id="shape29-3" transform="translate(613.7,-62.5133)">
+ <title>Rectangle.153</title>
+ <desc>Operation Breakdown Analyzer</desc>
+ <rect x="0" y="550.222" width="66.3269" height="45.0535" class="st1"/>
+ <text x="12.51" y="563.22" class="st2">Operation <tspan x="10.08" dy="1.2em" class="st3">Breakdown </tspan><tspan
+ x="15.63" dy="1.2em" class="st3">Analyzer</tspan></text> </g>
+ <g id="shape1-8" transform="translate(440.788,-124.725)">
+ <title>Rectangle.5</title>
+ <desc>AnalysisManager</desc>
+ <rect x="0" y="321.546" width="246.614" height="273.73" class="st1"/>
+ <text x="4" y="334.55" class="st2">AnalysisManager</text> </g>
+ <g id="shape2-11" transform="translate(99.2125,-124.725)">
+ <title>Rectangle.4</title>
+ <desc>FiltrationManager</desc>
+ <rect x="0" y="321.546" width="246.614" height="273.73" class="st1"/>
+ <text x="4" y="334.55" class="st2">FiltrationManager</text> </g>
+ <g id="shape3-14" transform="translate(99.2126,-420.019)">
+ <title>Rectangle.2</title>
+ <desc>Controller : main() thread</desc>
+ <rect x="0" y="521.051" width="586.771" height="74.2251" class="st1"/>
+ <text x="4" y="534.05" class="st2">Controller : main() thread</text> </g>
+ <g id="shape4-17" transform="translate(361.137,-433.414)">
+ <title>Rectangle.7</title>
+ <desc>RunningStatus</desc>
+ <rect x="0" y="547.844" width="68.5909" height="47.4322" class="st1"/>
+ <text x="4.95" y="574.56" class="st2">RunningStatus</text> </g>
+ <g id="shape5-20" transform="translate(487.558,-204.094)">
+ <title>Rectangle.42</title>
+ <desc>Analysers storage for Analyzers manager of plugin instances</desc>
+ <rect x="0" y="496.063" width="102.047" height="99.2125" class="st1"/>
+ <text x="4" y="509.06" class="st2">Analysers<tspan x="4" dy="2.4em" class="st3">s</tspan><tspan class="st4">torage for Analyzers </tspan><tspan
+ x="4" dy="1.233em" class="st4">manager of plugin </tspan><tspan x="4" dy="1.2em" class="st4">instances</tspan></text> </g>
+ <g id="shape6-27" transform="translate(471.117,-330.155)">
+ <title>Rectangle.72</title>
+ <desc>NFSParserThread : std::thread</desc>
+ <rect x="0" y="557.008" width="204.945" height="38.2676" class="st1"/>
+ <text x="4" y="570.01" class="st2">NFSParserThread : std::thread</text> </g>
+ <g id="shape7-30" transform="translate(883.146,-196.142) rotate(52.9285)">
+ <title>Sheet.7</title>
+ <desc>Exception</desc>
+ <path d="M0 595.28 L104.39 595.28" class="st5"/>
+ <rect x="36.2592" y="590.472" width="31.8744" height="9.59985" class="st7"/>
+ <text x="36.26" y="597.67" class="st8">Exception</text> </g>
+ <g id="shape8-38" transform="translate(-198.71,-0.661027) rotate(-64.3256)">
+ <title>Sheet.8</title>
+ <desc>Exception</desc>
+ <path d="M0 595.28 L104.91 595.28" class="st9"/>
+ <rect x="36.5169" y="590.472" width="31.8744" height="9.59985" class="st7"/>
+ <text x="36.52" y="597.67" class="st8">Exception</text> </g>
+ <g id="shape9-46" transform="translate(106.778,-130.394)">
+ <title>Rectangle.98</title>
+ <desc>FiltrationImpl<Reader, Writer> : ProcessingThread</desc>
+ <rect x="0" y="408.189" width="230.544" height="187.087" class="st1"/>
+ <text x="4" y="421.19" class="st2">FiltrationImpl<Reader, Writer> : ProcessingThread</text> </g>
+ <g id="shape10-49" transform="translate(-128.261,391.181) rotate(-90)">
+ <title>Rectangle.8</title>
+ <desc>Queue</desc>
+ <rect x="0" y="577.552" width="99.2125" height="17.724" class="st1"/>
+ <text x="36.01" y="588.91" class="st2">Queue</text> </g>
+ <g id="shape11-52" transform="translate(114.803,-138.339)">
+ <title>Rectangle.74</title>
+ <desc>FiltrationProcessor<Reader, Writer> parsing a packet matching...</desc>
+ <rect x="0" y="441.646" width="215.433" height="153.63" class="st1"/>
+ <text x="4" y="454.65" class="st2">FiltrationProcessor<Reader, Writer><tspan x="4" dy="2.4em" class="st3">parsing a packet</tspan><tspan
+ x="4" dy="1.2em" class="st3">matching to session</tspan><tspan x="4" dy="1.2em" class="st3">reassembling TCP flows</tspan><tspan
+ x="4" dy="1.2em" class="st3">detecting RPC</tspan>/NFS/CIFS headers <tspan x="4" dy="1.2em" class="st3">copying headers to Writer</tspan>::Collection of session</text> </g>
+ <g id="shape12-60" transform="translate(277.169,-100.879)">
+ <title>Dynamic connector.83</title>
+ <path d="M0 552.72 L0 588.24 L0 595.28" class="st10"/>
+ </g>
+ <g id="shape13-66" transform="translate(232.441,-88.122)">
+ <title>Sheet.13</title>
+ <desc>out.pcap | ::stdout</desc>
+ <rect x="0" y="582.52" width="85.0393" height="12.7559" class="st12"/>
+ <text x="4.12" y="591.9" class="st2">out.pcap | ::stdout</text> </g>
+ <g id="shape14-69" transform="translate(231.717,-143.443)">
+ <title>Rectangle.18</title>
+ <desc>Dumping</desc>
+ <rect x="0" y="563.586" width="90.8975" height="31.6899" class="st1"/>
+ <text x="27" y="581.93" class="st2">Dumping</text> </g>
+ <g id="shape15-72" transform="translate(322.614,-188.977)">
+ <title>Dynamic connector.99</title>
+ <path d="M0 595.28 L37.11 595.28 L0 595.28 Z" class="st13"/>
+ <path d="M0 595.28 L37.11 595.28" class="st14"/>
+ </g>
+ <g id="shape16-75" transform="translate(458.148,-303.303)">
+ <title>Dynamic connector.100</title>
+ <path d="M0 595.28 L0 549.29 L5.93 549.29 L12.97 549.29" class="st10"/>
+ </g>
+ <g id="shape17-80" transform="translate(231.717,-174.096)">
+ <title>Rectangle.75</title>
+ <desc>Queuing</desc>
+ <rect x="0" y="565.512" width="90.8975" height="29.7638" class="st1"/>
+ <text x="28.21" y="582.89" class="st2">Queuing</text> </g>
+ <g id="shape18-83" transform="translate(428.562,-468.278) rotate(-0.112214)">
+ <title>Sheet.18</title>
+ <desc>Exception</desc>
+ <path d="M0 595.28 L72.37 595.28" class="st5"/>
+ <rect x="20.2466" y="590.472" width="31.8744" height="9.59985" class="st7"/>
+ <text x="20.25" y="597.67" class="st8">Exception</text> </g>
+ <g id="shape19-90" transform="translate(613.7,-147.403)">
+ <title>Rectangle.106</title>
+ <desc>IAnalyzer</desc>
+ <rect x="0" y="579.685" width="66.3269" height="15.5906" class="st1"/>
+ <text x="14.37" y="591.18" class="st2">IAnalyzer</text> </g>
+ <g id="shape20-93" transform="translate(359.719,-184.018)">
+ <title>Rectangle.114</title>
+ <desc>FiltrationData</desc>
+ <rect x="0" y="585.355" width="68.5909" height="9.92125" class="st1"/>
+ <text x="6.26" y="593.32" class="st2">FiltrationData</text> </g>
+ <g id="shape21-96" transform="translate(428.31,-188.973)">
+ <title>Dynamic connector.117</title>
+ <path d="M0 595.28 L29.84 595.28 L29.84 587.2 L29.84 580.16" class="st10"/>
+ </g>
+ <g id="shape22-101" transform="translate(613.7,-212.598)">
+ <title>Rectangle.118</title>
+ <desc>PrintAnalyzer</desc>
+ <rect x="0" y="579.685" width="66.3269" height="15.5906" class="st1"/>
+ <text x="5.86" y="591.18" class="st2">PrintAnalyzer</text> </g>
+ <g id="shape23-104" transform="translate(107.247,-362.835)">
+ <title>Rectangle.121</title>
+ <desc>std::vector<std::unique_ptr<ProcessingThread>></desc>
+ <rect x="0" y="579.685" width="230.544" height="15.5906" class="st1"/>
+ <text x="15.93" y="591.18" class="st2">std::vector<std::unique_ptr<ProcessingThread>></text> </g>
+ <g id="shape24-107" transform="translate(222.523,-345.823)">
+ <title>Dynamic connector.131</title>
+ <path d="M0 595.28 L0 591.86 L0 578.27" class="st15"/>
+ </g>
+ <g id="shape25-113" transform="translate(680.027,-220.393)">
+ <title>Dynamic connector.136</title>
+ <path d="M0 595.28 L14.51 595.28 L21.55 595.28" class="st10"/>
+ </g>
+ <g id="shape26-118" transform="translate(502.095,-459.921)">
+ <title>Rectangle.6</title>
+ <desc>SignalHandler : std::thread</desc>
+ <rect x="0" y="578.268" width="121.526" height="17.0079" class="st1"/>
+ <text x="6.57" y="589.27" class="st2">SignalHandler : std::thread</text> </g>
+ <g id="shape27-121" transform="translate(434.834,-510.236)">
+ <title>Sheet.27</title>
+ <desc>SIGINT</desc>
+ <rect x="0" y="584.043" width="41.3857" height="11.2326" class="st16"/>
+ <text x="4.33" y="593.26" class="st17">SIGINT</text> </g>
+ <g id="shape28-124" transform="translate(735.85,-441.599) rotate(27.785)">
+ <title>Sheet.28</title>
+ <path d="M0 595.28 L65.41 595.28 L71.45 595.28" class="st18"/>
+ </g>
+ <g id="shape30-130" transform="translate(646.867,-107.562)">
+ <title>Dynamic connector.154</title>
+ <path d="M0 595.28 L0 561.48 L0 555.44" class="st19"/>
+ </g>
+ <g id="shape31-136" transform="translate(481.609,-147.403)">
+ <title>Rectangle.155</title>
+ <desc>PluginInstance</desc>
+ <rect x="0" y="579.685" width="68.5909" height="15.5906" class="st1"/>
+ <text x="4.67" y="591.18" class="st2">PluginInstance</text> </g>
+ <g id="shape33-139" transform="translate(447.874,-60.6614)">
+ <title>Sheet.33</title>
+ <desc>const char* usage(); IAnalyzer* create(const char* params); d...</desc>
+ <path d="M0 595.28 L161.57 595.28 L161.57 556.72 L0 556.72 L0 595.28 Z" class="st20"/>
+ <text x="92.25" y="564" class="st8">const char* usage();<tspan x="30.48" dy="1.2em" class="st3">IAnalyzer</tspan>* create(const char* params);<tspan
+ x="91.91" dy="1.2em" class="st3">destroy</tspan>(IAnalyzer*); <tspan x="7.44" dy="1.2em" class="st3">const AnalyzerRequirements</tspan>* requirements();</text> </g>
+ <g id="shape34-145" transform="translate(449.827,-101.339)">
+ <title>Sheet.34</title>
+ <desc>libbreakdown.so</desc>
+ <rect x="0" y="585.355" width="78.2991" height="9.92125" class="st16"/>
+ <text x="4.37" y="593.32" class="st21">libbreakdown.so</text> </g>
+ <g id="shape35-148" transform="translate(495.782,-116.358)">
+ <title>Dynamic connector.160</title>
+ <path d="M0 595.28 L20.12 595.28 L20.12 577.83 L20.12 564.24" class="st15"/>
+ </g>
+ <g id="shape36-153" transform="translate(646.867,-162.994)">
+ <title>Dynamic connector.161</title>
+ <path d="M0 545.68 L0 589.24 L0 595.28" class="st19"/>
+ </g>
+ <g id="shape37-158" transform="translate(515.901,-162.988)">
+ <title>Dynamic connector.162</title>
+ <path d="M0 595.28 L0 567.76 L0 554.17" class="st15"/>
+ </g>
+ <g id="shape38-163" transform="translate(140.315,-70.4013)">
+ <title>Sheet.38</title>
+ <desc>Optional CHILD Process with external tool for compression, li...</desc>
+ <path d="M0 595.28 L93.54 595.28 L93.54 552.29 L0 552.29 L0 595.28 Z" class="st20"/>
+ <text x="7.99" y="566.58" class="st22">Optional CHILD Process<tspan x="12.26" dy="1.2em" class="st23">with external tool for </tspan><tspan
+ x="8.69" dy="1.2em" class="st23">compression</tspan><tspan class="st23">, </tspan><tspan class="st23">like </tspan>bzip2</text> </g>
+ <g id="shape39-170" transform="translate(608.03,-340.157)">
+ <title>Rectangle.169</title>
+ <desc>RPCSessions</desc>
+ <rect x="0" y="575.433" width="59.5275" height="19.8425" class="st1"/>
+ <text x="4.74" y="588.43" class="st2">RPCSessions</text> </g>
+ <g id="shape40-173" transform="translate(701.785,-62.5133)">
+ <title>Rectangle.186</title>
+ <desc>Plugin output (gnuplot)</desc>
+ <rect x="0" y="550.222" width="49.6062" height="45.0535" class="st1"/>
+ <text x="12.32" y="563.22" class="st2">Plugin <tspan x="10.94" dy="1.2em" class="st3">output</tspan><tspan x="6.08"
+ dy="1.2em" class="st3">(</tspan>gnuplot)</text> </g>
+ <g id="shape41-178" transform="translate(680.027,-85.039)">
+ <title>Dynamic connector.187</title>
+ <path d="M0 595.28 L14.72 595.28 L21.76 595.28" class="st10"/>
+ </g>
+ <g id="group42-183" transform="translate(253.701,-472.492)">
+ <title>Sheet.42</title>
+ <g id="shape43-184" transform="translate(-7.99361E-015,-36.7016)">
+ <title>Sheet.43</title>
+ <desc>argc</desc>
+ <rect x="0" y="584.544" width="28.3465" height="10.7323" class="st16"/>
+ <text x="5.57" y="592.91" class="st2">argc</text> </g>
+ <g id="shape44-187" transform="translate(609.445,560.576) rotate(90)">
+ <title>Sheet.44</title>
+ <path d="M0 595.28 L28.66 595.28 L34.7 595.28" class="st18"/>
+ </g>
+ </g>
+ <g id="group45-192" transform="translate(274.362,-472.793)">
+ <title>Sheet.45</title>
+ <g id="shape46-193" transform="translate(-5.9952E-015,-36.4008)">
+ <title>Sheet.46</title>
+ <desc>argv[]</desc>
+ <rect x="0" y="584.544" width="34.6142" height="10.7323" class="st16"/>
+ <text x="5.49" y="592.91" class="st2">argv[]</text> </g>
+ <g id="shape47-196" transform="translate(612.831,560.576) rotate(90)">
+ <title>Sheet.47</title>
+ <path d="M0 595.28 L28.66 595.28 L34.7 595.28" class="st18"/>
+ </g>
+ </g>
+ <g id="shape48-201" transform="translate(226.772,-432.657)">
+ <title>Rectangle.194</title>
+ <desc>Parameters</desc>
+ <rect x="0" y="545.234" width="109.134" height="50.0417" class="st24"/>
+ <text x="31.11" y="588.28" class="st2">Parameters</text> </g>
+ <g id="shape49-204" transform="translate(235.087,-452.65)">
+ <title>Rectangle.43</title>
+ <desc>CmdlineParser<CLI></desc>
+ <rect x="0" y="575.433" width="90.8975" height="19.8425" class="st1"/>
+ <text x="4.84" y="588.35" class="st2">CmdlineParser<CLI></text> </g>
+ <g id="shape50-207" transform="translate(476.219,-510.236)">
+ <title>Sheet.50</title>
+ <desc>SIGCHLD</desc>
+ <rect x="0" y="584.043" width="53.8582" height="11.2326" class="st16"/>
+ <text x="5.72" y="593.26" class="st17">SIGCHLD</text> </g>
+ <g id="shape51-210" transform="translate(14.1732,-189.921)">
+ <title>Sheet.51</title>
+ <desc>Offline Analysis</desc>
+ <rect x="0" y="575.276" width="85.0393" height="20" class="st25"/>
+ <text x="4.98" y="588.88" class="st17">Offline Analysis</text> </g>
+ <g id="shape52-213" transform="translate(14.1732,-158.583)">
+ <title>Sheet.52</title>
+ <desc>Online Analysis</desc>
+ <rect x="0" y="575.276" width="85.0393" height="20" class="st25"/>
+ <text x="5.49" y="588.88" class="st17">Online Analysis</text> </g>
+ <g id="shape53-216" transform="translate(15.5433,-140.236)">
+ <title>Sheet.53</title>
+ <desc>Online Dumping</desc>
+ <rect x="0" y="575.276" width="87.9684" height="20" class="st25"/>
+ <text x="4.47" y="588.88" class="st17">Online Dumping</text> </g>
+ <g id="shape54-219" transform="translate(926.702,-340.288) rotate(44.3969)">
+ <title>Sheet.54</title>
+ <path d="M0 595.28 L41.57 595.28 L47.61 595.28" class="st18"/>
+ </g>
+ <g id="shape55-224" transform="translate(638.613,-459.921)">
+ <title>Rectangle.180</title>
+ <desc>Log</desc>
+ <rect x="0" y="578.268" width="34.6142" height="17.0079" class="st1"/>
+ <text x="10.21" y="589.77" class="st2">Log</text> </g>
+ <g id="shape56-227" transform="translate(673.227,-468.425)">
+ <title>Dynamic connector.184</title>
+ <path d="M0 595.28 L21.31 595.28 L28.35 595.28" class="st10"/>
+ </g>
+ <g id="shape57-232" transform="translate(638.613,-435.472)">
+ <title>Rectangle.231</title>
+ <desc>Out</desc>
+ <rect x="0" y="578.268" width="34.6142" height="17.0079" class="st1"/>
+ <text x="9.69" y="589.77" class="st2">Out</text> </g>
+ <g id="shape58-235" transform="translate(673.227,-443.976)">
+ <title>Dynamic connector.233</title>
+ <path d="M0 595.28 L21.31 595.28 L28.35 595.28" class="st10"/>
+ </g>
+ <g id="shape59-240" transform="translate(222.515,-398.451)">
+ <title>Dynamic connector.239</title>
+ <path d="M0 595.28 L0.06 587.3 L0.16 573.71" class="st15"/>
+ </g>
+ <g id="shape60-245" transform="translate(557.005,-398.451)">
+ <title>Dynamic connector.240</title>
+ <path d="M8.51 595.28 L0 595.28 L0 587.3 L0 573.71" class="st15"/>
+ </g>
+ <g id="shape61-250" transform="translate(107.247,-330.236)">
+ <title>Rectangle.242</title>
+ <desc>ProcessingThread : std::thread</desc>
+ <rect x="0" y="579.685" width="230.544" height="15.5906" class="st1"/>
+ <text x="53.26" y="591.18" class="st2">ProcessingThread : std::thread</text> </g>
+ <g id="shape62-253" transform="translate(219.685,-317.478)">
+ <title>Dynamic connector.245</title>
+ <path d="M0 595.28 L0 589.96 L0 588.56 L0 582.52" class="st19"/>
+ </g>
+ <g id="shape63-258" transform="translate(18,-182.835)">
+ <title>Sheet.63</title>
+ <desc>in.pcap | ::stdin</desc>
+ <rect x="0" y="582.52" width="72.5668" height="12.7559" class="st16"/>
+ <text x="4.21" y="591.4" class="st2">in.pcap | ::stdin</text> </g>
+ <g id="shape64-261" transform="translate(49.6062,-152.362)">
+ <title>Sheet.64</title>
+ <desc>eth0</desc>
+ <rect x="0" y="582.52" width="26.6614" height="12.7559" class="st16"/>
+ <text x="4.01" y="591.4" class="st2">eth0</text> </g>
+ <g id="shape65-264" transform="translate(137.96,-174.331)">
+ <title>Rectangle.11</title>
+ <desc>FileReader</desc>
+ <rect x="0" y="564.245" width="70.3861" height="31.0307" class="st1"/>
+ <text x="13.66" y="582.76" class="st2">FileReader</text> </g>
+ <g id="shape66-267" transform="translate(137.96,-142.716)">
+ <title>Rectangle.10</title>
+ <desc>CaptureReader</desc>
+ <rect x="0" y="563.586" width="70.3861" height="31.6899" class="st1"/>
+ <text x="4.52" y="582.43" class="st2">CaptureReader</text> </g>
+ <g id="shape67-270" transform="translate(715.512,389.914) rotate(90)">
+ <title>Rectangle.21</title>
+ <desc>libpcap</desc>
+ <rect x="0" y="577.552" width="62.6456" height="17.724" class="st1"/>
+ <text x="16.64" y="589.41" class="st2">libpcap</text> </g>
+ <g id="shape68-273" transform="translate(76.2676,-158.563)">
+ <title>Dynamic connector.16</title>
+ <path d="M0 595.1 L48.93 595.1 L48.93 595.28 L54.65 595.28 L61.69 595.28" class="st10"/>
+ </g>
+ <g id="shape69-278" transform="translate(90.5668,-189.921)">
+ <title>Dynamic connector.17</title>
+ <path d="M0 595.28 L40.35 595.28 L47.39 595.28" class="st10"/>
+ </g>
+ <g id="shape70-283" transform="translate(538.585,-303.311)">
+ <title>Dynamic connector.260</title>
+ <desc>NFS Procedure (Call+Reply)</desc>
+ <path d="M0 568.44 L0 581.86 L0 588.24 L0 595.28" class="st10"/>
+ <rect x="-10.6519" y="573.113" width="88.4018" height="9.59985" class="st7"/>
+ <text x="-10.65" y="580.31" class="st8">NFS Procedure (Call+Reply)</text> </g>
+ <g id="shape71-290" transform="translate(701.574,-438.36)">
+ <title>Sheet.71</title>
+ <desc>::stdout</desc>
+ <rect x="0" y="584.043" width="41.3857" height="11.2326" class="st12"/>
+ <text x="4.82" y="592.66" class="st2">::stdout</text> </g>
+ <g id="shape72-293" transform="translate(701.574,-462.809)">
+ <title>Sheet.72</title>
+ <desc>application.log</desc>
+ <rect x="0" y="584.043" width="68.0314" height="11.2326" class="st12"/>
+ <text x="4.08" y="592.66" class="st2">application.log</text> </g>
+ <g id="shape73-296" transform="translate(701.574,-214.777)">
+ <title>Sheet.73</title>
+ <desc>::stdout</desc>
+ <rect x="0" y="584.043" width="41.3857" height="11.2326" class="st12"/>
+ <text x="4.82" y="592.66" class="st2">::stdout</text> </g>
+ <g id="shape74-299" transform="translate(22.6772,-92.4952)">
+ <title>Sheet.74</title>
+ <path d="M0 537.17 L76.54 538.3 C97.56 540 184.96 539.06 235.7 538.66 C241.39 538.62 246.61 538.58 246.61 595.28 L0 537.17
+ Z" class="st13"/>
+ <path d="M0 537.17 L76.54 538.3 C97.56 540 184.96 539.06 235.7 538.66 C241.39 538.62 246.61 538.58 246.61 595.28"
+ class="st26"/>
+ </g>
+ <g id="shape75-302" transform="translate(21.2598,-93.1195)">
+ <title>Sheet.75</title>
+ <path d="M0 489.97 C165.83 489.97 297.51 490.54 380.25 491.08 C395.11 491.18 408.39 491.27 419.53 484.3 C429.79 476.23
+ 430.77 452.47 431.47 415.76 C431.92 392.23 432.26 363.37 441.77 346.48 C458.64 316.52 504.38 324.17 513.99
+ 355.05 C516.8 364.08 516.52 375.11 516.26 395.4 C515.93 421.13 515.64 461.76 516.36 499.21 C516.89 526.45
+ 517.95 552 523.64 568.03 C533.13 594.74 555.48 594.96 576.84 595.09 C627.23 595.41 672.09 595.22 742.96
+ 595.22" class="st27"/>
+ </g>
+ <g id="shape76-305" transform="translate(22.6772,-77.5079)">
+ <title>Sheet.76</title>
+ <path d="M0 504.2 L2.83 504.2 C82.39 502.71 183.59 507.39 196.58 500.36 C199.05 499.02 198.33 497.26 201.5 496.08 C212.42
+ 492.01 269.52 494.8 339.97 494.12 C371.02 493.81 404.66 492.83 422.01 490.46 C432.11 489.07 436.69 487.21
+ 439.04 479.27 C443.9 462.88 439.29 420.6 439.98 391.02 C440.44 371.23 443.27 357.13 447.91 347.19 C460.66
+ 319.9 487.05 324.09 497.95 339.22 C500.82 343.21 502.62 347.96 503.54 358.27 C506.95 396.25 498.58 509.66
+ 509.55 557.61 C515.89 585.33 528.7 591.17 565.82 593.38 C573.89 593.86 583.11 594.17 593.44 594.4 C633.98
+ 595.28 691.65 594.83 742.68 594.83 L0 504.2 Z" class="st13"/>
+ <path d="M0 504.2 L2.83 504.2 C82.39 502.71 183.59 507.39 196.58 500.36 C199.05 499.02 198.33 497.26 201.5 496.08 C212.42
+ 492.01 269.52 494.8 339.97 494.12 C371.02 493.81 404.66 492.83 422.01 490.46 C432.11 489.07 436.69 487.21
+ 439.04 479.27 C443.9 462.88 439.29 420.6 439.98 391.02 C440.44 371.23 443.27 357.13 447.91 347.19 C460.66
+ 319.9 487.05 324.09 497.95 339.22 C500.82 343.21 502.62 347.96 503.54 358.27 C506.95 396.25 498.58 509.66
+ 509.55 557.61 C515.89 585.33 528.7 591.17 565.82 593.38 C573.89 593.86 583.11 594.17 593.44 594.4 C633.98
+ 595.28 691.65 594.83 742.68 594.83" class="st28"/>
+ </g>
+ <g id="shape77-308" transform="translate(589.61,-220.396)">
+ <title>Dynamic connector.285</title>
+ <path d="M24.09 595.28 L13.59 595.28 L0 595.28" class="st15"/>
+ </g>
+ <g id="shape78-313" transform="translate(14.1732,-170.079)">
+ <title>Sheet.78</title>
+ <desc>Offline Dumping</desc>
+ <rect x="0" y="575.276" width="90.8975" height="20" class="st25"/>
+ <text x="5.42" y="588.88" class="st17">Offline Dumping</text> </g>
+ <g id="shape79-316" transform="translate(22.6772,-92.1222)">
+ <title>Sheet.79</title>
+ <path d="M0 507.12 C144.57 510.52 186.41 506.25 199.87 510.7 C212.43 514.86 200.24 526.62 239.68 525.4 C248.84 525.11
+ 260.79 524.13 260.79 595.28 L0 507.12 Z" class="st13"/>
+ <path d="M0 507.12 C144.57 510.52 186.41 506.25 199.87 510.7 C212.43 514.86 200.24 526.62 239.68 525.4 C248.84 525.11
+ 260.79 524.13 260.79 595.28" class="st29"/>
+ </g>
+ <g id="shape80-319" transform="translate(535.747,-510.489)">
+ <title>Sheet.80</title>
+ <desc>SIGHUP</desc>
+ <rect x="0" y="584.043" width="46.8222" height="11.2326" class="st16"/>
+ <text x="4.67" y="593.26" class="st17">SIGHUP</text> </g>
+ <g id="shape81-322" transform="translate(1156.54,86.7404) rotate(90)">
+ <title>Sheet.81</title>
+ <path d="M0 595.28 L25.57 595.28 L31.61 595.28" class="st18"/>
+ </g>
+ <g id="shape82-327" transform="translate(586.771,-510.342)">
+ <title>Sheet.82</title>
+ <desc>SIGTERM</desc>
+ <rect x="0" y="584.043" width="53.8582" height="11.2326" class="st16"/>
+ <text x="4.63" y="593.26" class="st17">SIGTERM</text> </g>
+ <g id="shape83-330" transform="translate(1036.95,500.628) rotate(134.293)">
+ <title>Sheet.83</title>
+ <path d="M0 595.28 L40.64 595.28 L46.68 595.28" class="st18"/>
+ </g>
+ <g id="shape84-335" transform="translate(647.574,-510.236)">
+ <title>Sheet.84</title>
+ <desc>SIGWINCH</desc>
+ <rect x="0" y="584.043" width="60.9448" height="11.2326" class="st16"/>
+ <text x="4.76" y="593.26" class="st17">SIGWINCH</text> </g>
+ <g id="shape85-338" transform="translate(967.675,597.783) rotate(149.566)">
+ <title>Sheet.85</title>
+ <path d="M0 595.28 L59.71 595.28 L65.75 595.28" class="st18"/>
+ </g>
+ <g id="group86-343" transform="translate(351.495,-191.968)">
+ <title>Note</title>
+ <desc>Session + timestamp + raw RPC/NFS/CIFS message</desc>
+ <g id="group87-344">
+ <title>shape126-347</title>
+ <desc>Session + timestamp + raw RPC/NFS/CIFS message</desc>
+ <g id="shape92-345" transform="translate(1.59872E-013,-27.7128)">
+ <title>Sheet.92</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 561.26 L76.54 552.76 L0 552.76 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape93-347" transform="translate(42.5199,-1.97279)">
+ <title>Sheet.93</title>
+ <path d="M0 569.54 L0 595.28 L0 569.54 Z" class="st13"/>
+ <path d="M0 569.54 L0 595.28" class="st31"/>
+ </g>
+ <g id="shape94-350" transform="translate(1.59872E-013,-27.7128)">
+ <title>Sheet.94</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 561.26 L76.54 552.76 L0 552.76 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape87-352">
+ <text x="6.18" y="539.1" class="st8">Session + timestamp +<tspan x="12.91" dy="1.2em" class="st3">raw RPC</tspan>/NFS/CIFS <tspan
+ x="28.42" dy="1.2em" class="st3">message</tspan></text> </g>
+ </g>
+ <g id="shape95-356" transform="translate(75.6853,-60.8784)">
+ <title>Sheet.95</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group96-358" transform="translate(589.604,-263.39)">
+ <title>Note.133</title>
+ <desc>Pass NFS operations to each Analyzer</desc>
+ <g id="group97-359">
+ <title>shape133-370</title>
+ <desc>Pass NFS operations to each Analyzer</desc>
+ <g id="shape102-360" transform="translate(111.97,-24.3228)">
+ <title>Sheet.102</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 574.02 L93.54 565.51 L0 565.51 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape103-362" transform="translate(-4.8761E-013,-1.97279)">
+ <title>Sheet.103</title>
+ <path d="M111.97 572.93 L0 595.28 L111.97 572.93 Z" class="st13"/>
+ <path d="M111.97 572.93 L0 595.28" class="st31"/>
+ </g>
+ <g id="shape104-365" transform="translate(111.97,-24.3228)">
+ <title>Sheet.104</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 574.02 L93.54 565.51 L0 565.51 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape97-367">
+ <text x="115.97" y="554.07" class="st8">Pass NFS operations to each <tspan x="115.97" dy="1em" class="st3">Analyzer</tspan></text> </g>
+ </g>
+ <g id="shape105-370" transform="translate(204.663,-44.7325)">
+ <title>Sheet.105</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="shape112-372" transform="translate(312.823,-554.219)">
+ <title>Sheet.112</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 574.02 L76.54 565.51 L0 565.51 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape113-374" transform="translate(397.862,-521.471)">
+ <title>Sheet.113</title>
+ <path d="M0 582.56 L40.73 595.28 L0 582.56 Z" class="st13"/>
+ <path d="M0 582.56 L40.73 595.28" class="st31"/>
+ </g>
+ <g id="shape107-377" transform="translate(317.136,-522.142)">
+ <title>shape145-393</title>
+ <desc>Exit via (Ctrl-C)</desc>
+ <text x="4.28" y="574.86" class="st2">Exit via (Ctrl-C)</text> </g>
+ <g id="group116-379" transform="translate(669.664,-226.215)">
+ <title>Note.163</title>
+ <desc>Builtin Analyzer for trace-out NFSv3/NFSv4/NFSv41/CIFSv2 Proc...</desc>
+ <g id="group117-380">
+ <title>shape163-414</title>
+ <desc>Builtin Analyzer for trace-out NFSv3/NFSv4/NFSv41/CIFSv2 Proc...</desc>
+ <g id="shape122-381" transform="translate(31.91,-11.1828)">
+ <title>Sheet.122</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 565.51 L93.54 557.01 L0 557.01 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape123-383" transform="translate(-4.19664E-014,-1.97279)">
+ <title>Sheet.123</title>
+ <path d="M31.91 586.07 L0 595.28 L31.91 586.07 Z" class="st13"/>
+ <path d="M31.91 586.07 L0 595.28" class="st31"/>
+ </g>
+ <g id="shape124-386" transform="translate(31.91,-11.1828)">
+ <title>Sheet.124</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 565.51 L93.54 557.01 L0 557.01 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape117-388">
+ <text x="35.91" y="557.75" class="st8">Builtin Analyzer for trace-<tspan x="35.91" dy="1.2em" class="st3">out NFSv</tspan>3/NFSv4/NFSv41/<tspan
+ x="35.91" dy="1.2em" class="st3">CIFSv</tspan>2 Procedures to stdout</text> </g>
+ </g>
+ <g id="shape125-392" transform="translate(124.603,-40.0965)">
+ <title>Sheet.125</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group126-394" transform="translate(667.554,-336.054)">
+ <title>Note.170</title>
+ <desc>Storage for RPC calls related to a session</desc>
+ <g id="group127-395">
+ <title>shape170-437</title>
+ <desc>Storage for RPC calls related to a session</desc>
+ <g id="shape132-396" transform="translate(34.02,-1.97279)">
+ <title>Sheet.132</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 578.27 L93.54 569.76 L0 569.76 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape133-398" transform="translate(3.89688E-013,-14.2128)">
+ <title>Sheet.133</title>
+ <path d="M34.02 595.07 L0 595.28 L34.02 595.07 Z" class="st13"/>
+ <path d="M34.02 595.07 L0 595.28" class="st31"/>
+ </g>
+ <g id="shape134-401" transform="translate(34.02,-1.97279)">
+ <title>Sheet.134</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 578.27 L93.54 569.76 L0 569.76 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape127-403">
+ <text x="38.02" y="578.54" class="st8">Storage for RPC calls related <tspan x="38.02" dy="1em" class="st3">to a session</tspan></text> </g>
+ </g>
+ <g id="shape135-406" transform="translate(126.713,-18.1307)">
+ <title>Sheet.135</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group136-408" transform="translate(347.531,-59.3936)">
+ <title>Note.177</title>
+ <desc>Analysis module API</desc>
+ <g id="group137-409">
+ <title>shape177-458</title>
+ <desc>Analysis module API</desc>
+ <g id="shape142-410" transform="translate(4.55636E-013,-1.97279)">
+ <title>Sheet.142</title>
+ <path d="M0 595.28 L66.33 595.28 L66.33 569.76 L57.82 561.26 L0 561.26 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape143-412" transform="translate(66.3299,-18.1417)">
+ <title>Sheet.143</title>
+ <path d="M0 595.28 L28.06 595.28" class="st31"/>
+ </g>
+ <g id="shape144-415" transform="translate(4.55636E-013,-1.97279)">
+ <title>Sheet.144</title>
+ <path d="M0 595.28 L66.33 595.28 L66.33 569.76 L57.82 561.26 L0 561.26 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape137-417">
+ <text x="6.74" y="573.89" class="st8">Analysis module <tspan x="27.77" dy="1.2em" class="st3">API</tspan></text> </g>
+ </g>
+ <g id="shape145-420" transform="translate(56.9729,-26.6346)">
+ <title>Sheet.145</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group146-422" transform="translate(673.224,-471.397)">
+ <title>Note.181</title>
+ <desc>Global logger for traces</desc>
+ <g id="group147-423">
+ <title>shape181-479</title>
+ <desc>Global logger for traces</desc>
+ <g id="shape152-424" transform="translate(28.35,-13.3228)">
+ <title>Sheet.152</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 581.1 L93.54 572.6 L0 572.6 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape153-426" transform="translate(7.19425E-014,-1.97279)">
+ <title>Sheet.153</title>
+ <path d="M28.35 583.93 L0 595.28 L28.35 583.93 Z" class="st13"/>
+ <path d="M28.35 583.93 L0 595.28" class="st31"/>
+ </g>
+ <g id="shape154-429" transform="translate(28.35,-13.3228)">
+ <title>Sheet.154</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 581.1 L93.54 572.6 L0 572.6 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape147-431">
+ <text x="32.35" y="572.61" class="st8">Global logger for traces</text> </g>
+ </g>
+ <g id="shape155-433" transform="translate(121.043,-26.646)">
+ <title>Sheet.155</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group156-435" transform="translate(135.874,-480.726)">
+ <title>Note.196</title>
+ <desc>Wrapper over CLI with validation</desc>
+ <g id="group157-436">
+ <title>shape196-498</title>
+ <desc>Wrapper over CLI with validation</desc>
+ <g id="shape162-437" transform="translate(-2.23821E-013,-25.9628)">
+ <title>Sheet.162</title>
+ <path d="M0 595.28 L90.9 595.28 L90.9 574.02 L82.39 565.51 L0 565.51 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape163-439" transform="translate(90.8999,-1.97279)">
+ <title>Sheet.163</title>
+ <path d="M0 571.29 L15.4 595.28 L0 571.29 Z" class="st13"/>
+ <path d="M0 571.29 L15.4 595.28" class="st31"/>
+ </g>
+ <g id="shape164-442" transform="translate(-2.23821E-013,-25.9628)">
+ <title>Sheet.164</title>
+ <path d="M0 595.28 L90.9 595.28 L90.9 574.02 L82.39 565.51 L0 565.51 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape157-444">
+ <text x="9.96" y="551.93" class="st2">Wrapper over CLI <tspan x="15.24" dy="1em" class="st3">with validation</tspan></text> </g>
+ </g>
+ <g id="shape165-447" transform="translate(81.5436,-46.3725)">
+ <title>Sheet.165</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group166-449" transform="translate(407.479,-519.498)">
+ <title>Note.212</title>
+ <desc>Compression Process complete</desc>
+ <g id="group167-450">
+ <title>shape212-519</title>
+ <desc>Compression Process complete</desc>
+ <g id="shape172-451" transform="translate(3.83693E-013,-14.6928)">
+ <title>Sheet.172</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 578.27 L76.54 569.76 L0 569.76 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape173-453" transform="translate(85.0399,-1.97279)">
+ <title>Sheet.173</title>
+ <path d="M0 582.56 L1.03 595.28 L0 582.56 Z" class="st13"/>
+ <path d="M0 582.56 L1.03 595.28" class="st34"/>
+ </g>
+ <g id="shape174-456" transform="translate(3.83693E-013,-14.6928)">
+ <title>Sheet.174</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 578.27 L76.54 569.76 L0 569.76 L0 595.28 Z" class="st35"/>
+ </g>
+ <g id="shape167-458">
+ <text x="8.05" y="565.82" class="st8">Compression Process <tspan x="27.18" dy="1em" class="st3">complete</tspan></text> </g>
+ </g>
+ <g id="shape175-461" transform="translate(75.6853,-30.8506)">
+ <title>Sheet.175</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st36"/>
+ </g>
+ </g>
+ <g id="group176-463" transform="translate(673.224,-396.999)">
+ <title>Note.234</title>
+ <desc>User messages regarding to verbose level</desc>
+ <g id="group177-464">
+ <title>shape234-540</title>
+ <desc>User messages regarding to verbose level</desc>
+ <g id="shape182-465" transform="translate(28.35,-1.97279)">
+ <title>Sheet.182</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 578.27 L93.54 569.76 L0 569.76 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape183-467" transform="translate(7.19425E-014,-27.4928)">
+ <title>Sheet.183</title>
+ <path d="M28.35 595.28 L0 581.57 L28.35 595.28 Z" class="st13"/>
+ <path d="M28.35 595.28 L0 581.57" class="st31"/>
+ </g>
+ <g id="shape184-470" transform="translate(28.35,-1.97279)">
+ <title>Sheet.184</title>
+ <path d="M0 595.28 L102.05 595.28 L102.05 578.27 L93.54 569.76 L0 569.76 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape177-472">
+ <text x="32.35" y="578.54" class="st8">User messages regarding to <tspan x="32.35" dy="1em" class="st3">verbose level</tspan></text> </g>
+ </g>
+ <g id="shape185-475" transform="translate(121.043,-18.1307)">
+ <title>Sheet.185</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group186-477" transform="translate(503.149,-519.748)">
+ <title>Note.305</title>
+ <desc>Terminal is closed</desc>
+ <g id="group187-478">
+ <title>shape305-561</title>
+ <desc>Terminal is closed</desc>
+ <g id="shape192-479" transform="translate(1.43885E-013,-14.4428)">
+ <title>Sheet.192</title>
+ <path d="M0 595.28 L75.12 595.28 L75.12 581.1 L66.61 572.6 L0 572.6 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape193-481" transform="translate(44.6699,-1.97279)">
+ <title>Sheet.193</title>
+ <path d="M0 582.81 L7.82 595.28 L0 582.81 Z" class="st13"/>
+ <path d="M0 582.81 L7.82 595.28" class="st31"/>
+ </g>
+ <g id="shape194-484" transform="translate(1.43885E-013,-14.4428)">
+ <title>Sheet.194</title>
+ <path d="M0 595.28 L75.12 595.28 L75.12 581.1 L66.61 572.6 L0 572.6 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape187-486">
+ <text x="8.51" y="571.49" class="st8">Terminal is closed</text> </g>
+ </g>
+ <g id="shape195-488" transform="translate(65.7641,-27.766)">
+ <title>Sheet.195</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group196-490" transform="translate(590.426,-521.588)">
+ <title>Note.308</title>
+ <desc>Termination request</desc>
+ <g id="group197-491">
+ <title>shape308-580</title>
+ <desc>Termination request</desc>
+ <g id="shape202-492" transform="translate(1.59872E-013,-12.6028)">
+ <title>Sheet.202</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 581.1 L76.54 572.6 L0 572.6 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape203-494" transform="translate(30.36,-1.97279)">
+ <title>Sheet.203</title>
+ <path d="M5.89 584.65 L0 595.28 L5.89 584.65 Z" class="st13"/>
+ <path d="M5.89 584.65 L0 595.28" class="st31"/>
+ </g>
+ <g id="shape204-497" transform="translate(1.59872E-013,-12.6028)">
+ <title>Sheet.204</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 581.1 L76.54 572.6 L0 572.6 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape197-499">
+ <text x="9.2" y="573.33" class="st8">Termination request</text> </g>
+ </g>
+ <g id="shape205-501" transform="translate(75.6853,-25.926)">
+ <title>Sheet.205</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="group206-503" transform="translate(688.629,-519.498)">
+ <title>Note.312</title>
+ <desc>Terminal changes size</desc>
+ <g id="group207-504">
+ <title>shape312-599</title>
+ <desc>Terminal changes size</desc>
+ <g id="shape212-505" transform="translate(-1.19904E-013,-14.6928)">
+ <title>Sheet.212</title>
+ <path d="M0 595.28 L90.9 595.28 L90.9 581.1 L82.39 572.6 L0 572.6 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape213-507" transform="translate(1.15142E-016,-1.97279)">
+ <title>Sheet.213</title>
+ <path d="M0 582.56 L0.02 595.28 L0 582.56 Z" class="st13"/>
+ <path d="M0 582.56 L0.02 595.28" class="st31"/>
+ </g>
+ <g id="shape214-510" transform="translate(-1.19904E-013,-14.6928)">
+ <title>Sheet.214</title>
+ <path d="M0 595.28 L90.9 595.28 L90.9 581.1 L82.39 572.6 L0 572.6 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape207-512">
+ <text x="9.96" y="571.24" class="st8">Terminal changes size</text> </g>
+ </g>
+ <g id="shape215-514" transform="translate(81.5436,-28.016)">
+ <title>Sheet.215</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+ <g id="shape220-516" transform="translate(313.228,-551.336)">
+ <title>Sheet.220</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 581.1 L76.54 572.6 L0 572.6 L0 595.28 Z" class="st30"/>
+ </g>
+ <g id="shape222-518" transform="translate(312.661,-534.195)">
+ <title>Sheet.222</title>
+ <path d="M0 595.28 L85.04 595.28 L85.04 581.1 L76.54 572.6 L0 572.6 L0 595.28 Z" class="st32"/>
+ </g>
+ <g id="shape223-520" transform="translate(388.346,-547.648)">
+ <title>Sheet.223</title>
+ <path d="M0.85 594.43 L9.35 594.43 L9.35 595.28 L9.35 594.43 L0.85 585.92 L0 585.92 L0.85 585.92 L0.85 594.43 Z"
+ class="st33"/>
+ </g>
+ </g>
+</svg>
diff --git a/docs/logo.png b/docs/pictures/logo.png Binary files differindex 649e644..649e644 100644..100755 --- a/docs/logo.png +++ b/docs/pictures/logo.png diff --git a/docs/logo64.png b/docs/pictures/logo64.png Binary files differindex d2431ba..d2431ba 100644..100755 --- a/docs/logo64.png +++ b/docs/pictures/logo64.png diff --git a/docs/pictures/metrics.svg b/docs/pictures/metrics.svg new file mode 100755 index 0000000..58c3a01 --- /dev/null +++ b/docs/pictures/metrics.svg @@ -0,0 +1,297 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export metrics.svg Metrics -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+ xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="11.6929in" height="8.26772in"
+ viewBox="0 0 841.89 595.276" xml:space="preserve" color-interpolation-filters="sRGB" class="st13">
+ <v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false">
+ <v:userDefs>
+ <v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
+ <v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
+ </v:userDefs>
+ </v:documentProperties>
+
+ <style type="text/css">
+ <![CDATA[
+ .st1 {visibility:visible}
+ .st2 {fill:none;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st3 {fill:none;stroke:#000000;stroke-width:0.25}
+ .st4 {fill:none;stroke:none;stroke-width:0.25}
+ .st5 {fill:#000000;font-family:Calibri;font-size:1.00001em}
+ .st6 {fill:#000000;font-family:Calibri;font-size:1.00001em;font-weight:bold}
+ .st7 {font-size:1em;font-weight:normal}
+ .st8 {fill:#5b9bd5;fill-opacity:0.22;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.22}
+ .st9 {fill:url(#grad0-62);stroke:#c7c8c8;stroke-width:0.25}
+ .st10 {fill:#000000;font-family:Arial;font-size:1.00001em;font-weight:bold}
+ .st11 {font-size:1em}
+ .st12 {font-size:1em;font-weight:bold}
+ .st13 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+ ]]>
+ </style>
+
+ <defs id="Patterns_And_Gradients">
+ <linearGradient id="grad0-62" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(90 0.5 0.5)">
+ <stop offset="0" stop-color="#f6fafc" stop-opacity="1"/>
+ <stop offset="0.74" stop-color="#b5d2ec" stop-opacity="1"/>
+ <stop offset="0.83" stop-color="#b5d2ec" stop-opacity="1"/>
+ <stop offset="1" stop-color="#cde1f2" stop-opacity="1"/>
+ </linearGradient>
+ </defs>
+ <defs id="Filters">
+ <filter id="filter_2">
+ <feGaussianBlur stdDeviation="2"/>
+ </filter>
+ </defs>
+ <g v:mID="7" v:index="3" v:groupContext="foregroundPage">
+ <v:userDefs>
+ <v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
+ </v:userDefs>
+ <title>Metrics</title>
+ <v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
+ v:shadowOffsetY="-8.50394"/>
+ <g id="group26-1" transform="translate(301.039,-102.985)" v:mID="26" v:groupContext="group">
+ <title>Sheet.26</title>
+ <g id="shape7-2" v:mID="7" v:groupContext="shape" transform="translate(13.8898,-24.0936)">
+ <title>Sheet.7</title>
+ <g id="shadow7-3" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st2"/>
+ </g>
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st3"/>
+ </g>
+ <g id="shape8-7" v:mID="8" v:groupContext="shape" transform="translate(92.5215,-24.0936)">
+ <title>Sheet.8</title>
+ <g id="shadow8-8" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st2"/>
+ </g>
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st3"/>
+ </g>
+ <g id="shape9-12" v:mID="9" v:groupContext="shape" transform="translate(171.047,-24.0936)">
+ <title>Sheet.9</title>
+ <g id="shadow9-13" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st2"/>
+ </g>
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st3"/>
+ </g>
+ <g id="shape10-17" v:mID="10" v:groupContext="shape" transform="translate(249.626,-24.0936)">
+ <title>Sheet.10</title>
+ <g id="shadow10-18" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st2"/>
+ </g>
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st3"/>
+ </g>
+ <g id="shape11-22" v:mID="11" v:groupContext="shape" transform="translate(328.193,-24.0936)">
+ <title>Sheet.11</title>
+ <g id="shadow11-23" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st2"/>
+ </g>
+ <rect x="0" y="270.042" width="78.5791" height="325.234" class="st3"/>
+ </g>
+ <g id="shape16-27" v:mID="16" v:groupContext="shape" transform="translate(78.6054,0)">
+ <title>Sheet.16</title>
+ <desc>25</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="13.8898" cy="583.229" width="27.78" height="24.0936"/>
+ <rect x="0" y="571.182" width="27.7795" height="24.0936" class="st4"/>
+ <text x="7.81" y="586.83" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>25</text> </g>
+ <g id="shape21-30" v:mID="21" v:groupContext="shape">
+ <title>Sheet.21</title>
+ <desc>0</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="13.8898" cy="583.229" width="27.78" height="24.0936"/>
+ <rect x="0" y="571.182" width="27.7795" height="24.0936" class="st4"/>
+ <text x="10.85" y="586.83" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>0</text> </g>
+ <g id="shape22-33" v:mID="22" v:groupContext="shape" transform="translate(157.184,0)">
+ <title>Sheet.22</title>
+ <desc>50</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="13.8898" cy="583.229" width="27.78" height="24.0936"/>
+ <rect x="0" y="571.182" width="27.7795" height="24.0936" class="st4"/>
+ <text x="7.81" y="586.83" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>50</text> </g>
+ <g id="shape23-36" v:mID="23" v:groupContext="shape" transform="translate(235.763,0)">
+ <title>Sheet.23</title>
+ <desc>75</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="13.8898" cy="583.229" width="27.78" height="24.0936"/>
+ <rect x="0" y="571.182" width="27.7795" height="24.0936" class="st4"/>
+ <text x="7.81" y="586.83" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>75</text> </g>
+ <g id="shape24-39" v:mID="24" v:groupContext="shape" transform="translate(314.342,0)">
+ <title>Sheet.24</title>
+ <desc>100</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="13.8898" cy="583.229" width="27.78" height="24.0936"/>
+ <rect x="0" y="571.182" width="27.7795" height="24.0936" class="st4"/>
+ <text x="4.77" y="586.83" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>100</text> </g>
+ <g id="shape25-42" v:mID="25" v:groupContext="shape" transform="translate(392.92,0)">
+ <title>Sheet.25</title>
+ <desc>125</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="13.8898" cy="583.229" width="27.78" height="24.0936"/>
+ <rect x="0" y="571.182" width="27.7795" height="24.0936" class="st4"/>
+ <text x="4.77" y="586.83" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>125</text> </g>
+ </g>
+ <g id="shape27-45" v:mID="27" v:groupContext="shape" transform="translate(313.37,-472.192)">
+ <title>Sheet.27</title>
+ <desc>Gigabit Network Performance 1.0 Gb file transfer over 1G netw...</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="162.992" cy="574.016" width="325.99" height="42.5197"/>
+ <rect x="0" y="552.756" width="325.984" height="42.5197" class="st4"/>
+ <text x="88.44" y="570.42" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Gigabit Network Performance<v:lf/><tspan
+ x="46.58" dy="1.2em" class="st7">1</tspan><tspan class="st7">.</tspan><tspan class="st7">0 </tspan><tspan
+ class="st7">Gb </tspan><tspan class="st7">file transfer over </tspan><tspan class="st7">1</tspan><tspan
+ class="st7">G network connection</tspan></text> </g>
+ <g id="group33-55" transform="translate(595.559,-89.5151)" v:mID="33" v:groupContext="group">
+ <title>Sheet.33</title>
+ <g id="shape31-56" v:mID="31" v:groupContext="shape">
+ <title>Sheet.31</title>
+ <g id="shadow31-57" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="588.446" width="5.66929" height="6.82968" class="st8"/>
+ </g>
+ <rect x="0" y="588.446" width="5.66929" height="6.82968" class="st9"/>
+ </g>
+ <g id="shape32-63" v:mID="32" v:groupContext="shape" transform="translate(5.66929,0)">
+ <title>Sheet.32</title>
+ <desc>Megabytes Per Second</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="60.9449" cy="591.861" width="121.89" height="6.82968"/>
+ <rect x="0" y="588.446" width="121.89" height="6.82968" class="st4"/>
+ <text x="5.28" y="595.46" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Megabytes Per Second</text> </g>
+ </g>
+ <g id="group38-66" transform="translate(85.3228,-396.448)" v:mID="38" v:groupContext="group">
+ <title>Sheet.38</title>
+ <g id="shape30-67" v:mID="30" v:groupContext="shape" transform="translate(229.606,1.13687E-013)">
+ <title>Sheet.30</title>
+ <g id="shadow30-68" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="552.756" width="392.882" height="42.5197" class="st8"/>
+ </g>
+ <rect x="0" y="552.756" width="392.882" height="42.5197" class="st9"/>
+ </g>
+ <g id="shape34-73" v:mID="34" v:groupContext="shape">
+ <title>Sheet.34</title>
+ <desc>Gigabit Network Theoretical Limit</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="109.843" cy="574.016" width="219.69" height="42.5197"/>
+ <rect x="0" y="552.756" width="219.685" height="42.5197" class="st4"/>
+ <text x="27.68" y="577.62" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Gigabit Network Theoretical Limit</text> </g>
+ <g id="shape36-76" v:mID="36" v:groupContext="shape" transform="translate(578.268,-11.3386)">
+ <title>Sheet.36</title>
+ <desc>125.0</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="22.1102" cy="585.354" width="44.23" height="19.8425"/>
+ <rect x="0" y="575.433" width="44.2205" height="19.8425" class="st4"/>
+ <text x="7.1" y="588.95" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>125.0</text> </g>
+ </g>
+ <g id="group39-79" transform="translate(85.3228,-332.668)" v:mID="39" v:groupContext="group">
+ <title>Sheet.39</title>
+ <g id="shape40-80" v:mID="40" v:groupContext="shape" transform="translate(229.606,1.13687E-013)">
+ <title>Sheet.40</title>
+ <g id="shadow40-81" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="552.756" width="250.866" height="42.5197" class="st8"/>
+ </g>
+ <rect x="0" y="552.756" width="250.866" height="42.5197" class="st9"/>
+ </g>
+ <g id="shape41-86" v:mID="41" v:groupContext="shape">
+ <title>Sheet.41</title>
+ <desc>Average HDD 7200 RPM R/W performance</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="114.803" cy="574.016" width="229.61" height="42.5197"/>
+ <rect x="0" y="552.756" width="229.606" height="42.5197" class="st4"/>
+ <text x="10.73" y="577.62" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Average HDD 7200 RPM R/W performance</text> </g>
+ <g id="shape42-89" v:mID="42" v:groupContext="shape" transform="translate(435.118,-11.3386)">
+ <title>Sheet.42</title>
+ <desc>~80.0</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="22.6772" cy="585.354" width="45.36" height="19.8425"/>
+ <rect x="0" y="575.433" width="45.3543" height="19.8425" class="st4"/>
+ <text x="7.5" y="588.95" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>~80.0</text> </g>
+ </g>
+ <g id="group43-92" transform="translate(85.3228,-268.889)" v:mID="43" v:groupContext="group">
+ <title>Sheet.43</title>
+ <g id="shape44-93" v:mID="44" v:groupContext="shape" transform="translate(229.606,1.13687E-013)">
+ <title>Sheet.44</title>
+ <g id="shadow44-94" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="552.756" width="250.866" height="42.5197" class="st8"/>
+ </g>
+ <rect x="0" y="552.756" width="250.866" height="42.5197" class="st9"/>
+ </g>
+ <g id="shape45-99" v:mID="45" v:groupContext="shape">
+ <title>Sheet.45</title>
+ <desc>Gigabit Network NFS file transfer performance</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="114.803" cy="574.016" width="229.61" height="42.5197"/>
+ <rect x="0" y="552.756" width="229.606" height="42.5197" class="st4"/>
+ <text x="34.5" y="570.42" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Gigabit Network NFS file transfer <tspan
+ x="83.14" dy="1.2em" class="st11">performance</tspan></text> </g>
+ <g id="shape46-103" v:mID="46" v:groupContext="shape" transform="translate(431.154,-11.3386)">
+ <title>Sheet.46</title>
+ <desc>~80.0</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="24.6593" cy="585.354" width="49.32" height="19.8425"/>
+ <rect x="0" y="575.433" width="49.3187" height="19.8425" class="st4"/>
+ <text x="9.48" y="588.95" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>~80.0</text> </g>
+ </g>
+ <g id="group47-106" transform="translate(85.0394,-205.109)" v:mID="47" v:groupContext="group">
+ <title>Sheet.47</title>
+ <g id="shape48-107" v:mID="48" v:groupContext="shape" transform="translate(229.89,1.13687E-013)">
+ <title>Sheet.48</title>
+ <g id="shadow48-108" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="552.756" width="352.913" height="42.5197" class="st8"/>
+ </g>
+ <rect x="0" y="552.756" width="352.913" height="42.5197" class="st9"/>
+ </g>
+ <g id="shape49-113" v:mID="49" v:groupContext="shape">
+ <title>Sheet.49</title>
+ <desc>RAM Drive to RAM Drive NFS file transfer</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="114.945" cy="574.016" width="229.89" height="42.5197"/>
+ <rect x="0" y="552.756" width="229.89" height="42.5197" class="st4"/>
+ <text x="14.51" y="577.62" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>RAM Drive to RAM Drive NFS file transfer </text> </g>
+ <g id="shape50-116" v:mID="50" v:groupContext="shape" transform="translate(537.449,-11.3386)">
+ <title>Sheet.50</title>
+ <desc>111.0</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="22.6772" cy="585.354" width="45.36" height="19.8425"/>
+ <rect x="0" y="575.433" width="45.3543" height="19.8425" class="st4"/>
+ <text x="7.66" y="588.95" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>111.0</text> </g>
+ </g>
+ <g id="group53-119" transform="translate(85.0394,-148.416)" v:mID="53" v:groupContext="group">
+ <title>Sheet.53</title>
+ <g id="shape54-120" v:mID="54" v:groupContext="shape" transform="translate(229.89,1.13687E-013)">
+ <title>Sheet.54</title>
+ <g id="shadow54-121" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
+ transform="matrix(1,0,0,1,0.345598,1.97279)" class="st1">
+ <rect x="0" y="552.756" width="352.913" height="42.5197" class="st8"/>
+ </g>
+ <rect x="0" y="552.756" width="352.913" height="42.5197" class="st9"/>
+ </g>
+ <g id="shape55-126" v:mID="55" v:groupContext="shape">
+ <title>Sheet.55</title>
+ <desc>RAM Drive to RAM Drive NFS file transfer over TCP with NST li...</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="114.945" cy="574.016" width="229.89" height="42.5197"/>
+ <rect x="0" y="552.756" width="229.89" height="42.5197" class="st4"/>
+ <text x="14.51" y="556.02" class="st5" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>RAM Drive to RAM Drive NFS file transfer <v:lf/><tspan
+ x="22.56" dy="1.2em" class="st11">over TCP with </tspan><tspan class="st12">NST live traffic analysis<v:lf/></tspan><tspan
+ x="28.93" dy="1.2em" class="st12"> </tspan><tspan class="st12">detects </tspan><tspan class="st12">100</tspan><tspan
+ class="st12">.</tspan><tspan class="st12">0</tspan><tspan class="st12">% </tspan><tspan class="st12">of NFS procedures <v:lf/></tspan><tspan
+ x="38.56" dy="1.2em" class="st11">(</tspan><tspan class="st12">32000</tspan><tspan class="st12">/</tspan><tspan
+ class="st12">32000 </tspan>NFS procedures)</text> </g>
+ <g id="shape56-142" v:mID="56" v:groupContext="shape" transform="translate(537.449,-11.3386)">
+ <title>Sheet.56</title>
+ <desc>111.0</desc>
+ <v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
+ <v:textRect cx="22.6772" cy="585.354" width="45.36" height="19.8425"/>
+ <rect x="0" y="575.433" width="45.3543" height="19.8425" class="st4"/>
+ <text x="7.66" y="588.95" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>111.0</text> </g>
+ </g>
+ </g>
+</svg>
diff --git a/docs/pictures/session-visualization.png b/docs/pictures/session-visualization.png Binary files differnew file mode 100755 index 0000000..f7ff536 --- /dev/null +++ b/docs/pictures/session-visualization.png |