From 65f0418c0a7333eaec4aee33cc51a4030e98e3a2 Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@pm.me>
Date: Tue, 10 Jan 2023 16:06:26 +0100
Subject: [PATCH] added cours 12

---
 slides/cours_11.md                 | 171 ------
 slides/cours_12.md                 | 420 +++++++++++++
 slides/figs/doubly_linked_list.svg | 929 +++++++++++++++++++++++++++++
 3 files changed, 1349 insertions(+), 171 deletions(-)
 create mode 100644 slides/cours_12.md
 create mode 100644 slides/figs/doubly_linked_list.svg

diff --git a/slides/cours_11.md b/slides/cours_11.md
index 5438b42..d1244d0 100644
--- a/slides/cours_11.md
+++ b/slides/cours_11.md
@@ -510,174 +510,3 @@ sorted_list sorted_list_push(sorted_list list, int val) {
 ```
 
 
-# L'extraction
-
-## Trois cas
-
-1. L'élément à extraire n'est **pas** le premier élément de la liste
-
-. . .
-
-![Extraction d'un élément qui n'est pas le premier.](figs/sorted_list_extract_any.svg){width=70%}
-
-. . .
-
-\footnotesize
-
-```C
-sorted_list sorted_list_extract(sorted_list list, int val) {
-    element *prec = *crt = list; // needed to glue elements together
-    while (NULL != crt && val > crt->data) {
-	   prec = crt;
-	   crt = crt->next;
-	}
-    if (NULL != crt && prec != crt && crt->data == val) { // glue things together
-        prec->next = crt->next;
-        free(crt);
-    }
-    return list;
-}
-```
-
-
-# L'extraction
-
-2. L'élément à extraire est le premier élément de la liste
-
-. . .
-
-![Extraction d'un élément qui est le
-premier.](figs/sorted_list_extract_first.svg){width=70%}
-
-. . .
-
-\footnotesize
-
-```C
-sorted_list sorted_list_extract(sorted_list list, int val) {
-    element *prec = *crt = list; // needed to glue elements together
-    while (NULL != crt && val > crt->data) {
-	   prec = crt;
-	   crt = crt->next;
-	}
-    if (NULL != crt && crt->data == val && prec == crt) { // glue things together
-        list = list->next;
-        free(crt);
-    }
-    return list;
-}
-```
-
-# L'extraction
-
-3. L'élément à extraire n'est **pas** dans la liste.
-    * La liste est vide.
-    * La valeur est plus grande que le dernier élément de la liste.
-    * La valeur est plus petite que la valeur de `crt`.
-
-. . .
-
-On retourne la liste inchangée.
-
-. . .
-
-\footnotesize
-
-```C
-sorted_list sorted_list_extract(sorted_list list, int val) {
-    element *prec = *crt = list; // needed to glue elements together
-    while (NULL != crt && val > crt->data) {
-	   prec = crt;
-	   crt = crt->next;
-	}
-    if (NULL == crt || crt->data != val) { // val not present
-        return list;
-    }
-}
-```
-
-# La recherche
-
-```C
-element* sorted_list_search(sorted_list list, int val);
-```
-
-* Retourne `NULL` si la valeur n'est pas présente (ou la liste vide).
-* Retourne un pointeur vers l'élément si la valeur est présente.
-
-. . .
-
-```C
-element* sorted_list_search(sorted_list list, int val) {
-    // search for element smaller than val
-    element* pos = sorted_list_position(list, val); 
-    if (NULL == pos && val == list->data) {
-        return list; // first element contains val
-    } else if (NULL != pos->next && val == pos->next->data) {
-        return pos->next; // non-first element contains val
-    } else {
-        return NULL; // well... val's not here
-    }
-}
-```
-
-# La recherche
-
-## La fonction `sorted_list_position`
-
-```C
-element* sorted_list_position(sorted_list list, int val);
-```
-
-![Trois exemples de retour de la fonction `sorted_list_position()`.](figs/sorted_list_position.svg)
-
-# La recherche
-
-## Exercice: implémenter
-
-```C
-element* sorted_list_position(sorted_list list, int val);
-```
-
-. . .
-
-```C
-element* sorted_list_position(sorted_list list, int val) {
-    element* pos = list;
-    if (sorted_list_is_empty(list) || val <= list->data) {
-        pos = NULL;
-    } else {
-        while (NULL != pos->next && val > pos->next>data) {
-            pos = pos->next;
-        }
-    }
-    return pos;
-}
-```
-
-# Complexité de la liste chaînée triée
-
-## L'insertion?
-
-. . .
-
-$$
-\mathcal{O}(N).
-$$
-
-## L'extraction?
-
-. . .
-
-$$
-\mathcal{O}(N).
-$$
-
-## La recherche?
-
-. . .
-
-$$
-\mathcal{O}(N).
-$$
-
diff --git a/slides/cours_12.md b/slides/cours_12.md
new file mode 100644
index 0000000..fd21805
--- /dev/null
+++ b/slides/cours_12.md
@@ -0,0 +1,420 @@
+---
+title: "Listes triées et listes doublement chaînées"
+date: "2021-12-22"
+patat:
+  eval:
+    tai:
+      command: fish
+      fragment: false
+      replace: true
+    ccc:
+      command: fish
+      fragment: false
+      replace: true
+  images:
+    backend: auto
+---
+
+# Les listes triées
+
+Une liste chaînée triée est:
+
+* une liste chaînée
+* dont les éléments sont insérés dans l'ordre.
+
+![Exemple de liste triée.](./figs/sorted_list_example.svg)
+
+. . .
+
+* L'insertion est faite telle que l'ordre est maintenu.
+
+## Quelle structure de données?
+
+```C
+
+
+
+
+
+```
+
+# Les listes triées
+
+## Quel but?
+
+* Permet de retrouver rapidement un élément.
+* Utile pour la recherche de plus court chemin dans des graphes.
+* Ordonnancement de processus par degré de priorité.
+
+## Comment?
+
+* Les implémentations les plus efficaces se basent sur les tableaux.
+* Possibles aussi avec des listes chaînées.
+
+# Les listes triées
+
+## Quelle structure de données dans notre cas?
+
+
+Une liste chaînée bien sûr (oui c'est pour vous entraîner)!
+
+```C
+typedef struct _element { // chaque élément
+    int data;
+    struct _element *next;
+} element;
+typedef element* sorted_list; // la liste
+```
+
+## Fonctionnalités
+
+```C
+// insertion de val
+sorted_list sorted_list_push(sorted_list list, int val);
+// la liste est-elle vide?
+bool is_empty(sorted_list list); // list == NULL
+// extraction de val (il disparaît)
+sorted_list sorted_list_extract(sorted_list list, int val); 
+ // rechercher un élément et le retourner
+element* sorted_list_search(sorted_list list, int val);
+```
+
+# L'insertion
+
+## Trois cas
+
+1. La liste est vide.
+
+. . .
+
+![Insertion dans une liste vide, `list == NULL`.](figs/sorted_list_insert_one.svg){width=30%}
+
+. . .
+
+```C
+sorted_list sorted_list_push(sorted_list list, int val) {
+    if (sorted_list_is_empty(list)) {
+        list = malloc(sizeof(*list));
+        list->data = val;
+        list->next = NULL;
+        return list;
+    }
+}
+```
+
+# L'insertion
+
+2. L'insertion se fait en première position.
+
+. . .
+
+![Insertion en tête de liste, `list->data >=
+val`.](figs/sorted_list_insert_first.svg){width=80%}
+
+. . .
+
+```C
+sorted_list sorted_list_push(sorted_list list, int val) {
+    if (list->data >= val) {
+        element *tmp = malloc(sizeof(*tmp));
+        tmp->data = val;
+        tmp->next = list;
+        list = tmp;
+        return list;
+    }
+}
+```
+
+# L'insertion
+
+3. L'insertion se fait sur une autre position que la première.
+
+. . .
+
+![Insertion sur une autre position, list->data <
+val.](figs/sorted_list_insert_any.svg){width=70%}
+
+. . .
+
+\footnotesize
+
+```C
+sorted_list sorted_list_push(sorted_list list, int val) {
+    element *tmp = malloc(sizeof(*tmp));
+    tmp->data = val;
+    element *crt = list;
+    while (NULL != crt->next && val > crt->next->data) {
+        crt = crt->next;
+    }
+    tmp->next = crt->next;
+    crt->next = tmp;
+    return list;
+}
+```
+
+
+# L'extraction
+
+## Trois cas
+
+1. L'élément à extraire n'est **pas** le premier élément de la liste
+
+. . .
+
+![Extraction d'un élément qui n'est pas le premier.](figs/sorted_list_extract_any.svg){width=70%}
+
+. . .
+
+\footnotesize
+
+```C
+sorted_list sorted_list_extract(sorted_list list, int val) {
+    element *prec = *crt = list; // needed to glue elements together
+    while (NULL != crt && val > crt->data) {
+	   prec = crt;
+	   crt = crt->next;
+	}
+    if (NULL != crt && prec != crt && crt->data == val) { // glue things together
+        prec->next = crt->next;
+        free(crt);
+    }
+    return list;
+}
+```
+
+
+# L'extraction
+
+2. L'élément à extraire est le premier élément de la liste
+
+. . .
+
+![Extraction d'un élément qui est le
+premier.](figs/sorted_list_extract_first.svg){width=70%}
+
+. . .
+
+\footnotesize
+
+```C
+sorted_list sorted_list_extract(sorted_list list, int val) {
+    element *prec = *crt = list; // needed to glue elements together
+    while (NULL != crt && val > crt->data) {
+	   prec = crt;
+	   crt = crt->next;
+	}
+    if (NULL != crt && crt->data == val && prec == crt) { // glue things together
+        list = list->next;
+        free(crt);
+    }
+    return list;
+}
+```
+
+# L'extraction
+
+3. L'élément à extraire n'est **pas** dans la liste.
+    * La liste est vide.
+    * La valeur est plus grande que le dernier élément de la liste.
+    * La valeur est plus petite que la valeur de `crt`.
+
+. . .
+
+On retourne la liste inchangée.
+
+. . .
+
+\footnotesize
+
+```C
+sorted_list sorted_list_extract(sorted_list list, int val) {
+    element *prec = *crt = list; // needed to glue elements together
+    while (NULL != crt && val > crt->data) {
+	   prec = crt;
+	   crt = crt->next;
+	}
+    if (NULL == crt || crt->data != val) { // val not present
+        return list;
+    }
+}
+```
+
+# La recherche
+
+```C
+element* sorted_list_search(sorted_list list, int val);
+```
+
+* Retourne `NULL` si la valeur n'est pas présente (ou la liste vide).
+* Retourne un pointeur vers l'élément si la valeur est présente.
+
+. . .
+
+```C
+element* sorted_list_search(sorted_list list, int val) {
+    // search for element smaller than val
+    element* pos = sorted_list_position(list, val); 
+    if (NULL == pos && val == list->data) {
+        return list; // first element contains val
+    } else if (NULL != pos->next && val == pos->next->data) {
+        return pos->next; // non-first element contains val
+    } else {
+        return NULL; // well... val's not here
+    }
+}
+```
+
+# La recherche
+
+## La fonction `sorted_list_position`
+
+```C
+element* sorted_list_position(sorted_list list, int val);
+```
+
+![Trois exemples de retour de la fonction `sorted_list_position()`.](figs/sorted_list_position.svg)
+
+# La recherche
+
+## Exercice: implémenter
+
+```C
+element* sorted_list_position(sorted_list list, int val);
+```
+
+. . .
+
+```C
+element* sorted_list_position(sorted_list list, int val) {
+    element* pos = list;
+    if (sorted_list_is_empty(list) || val <= list->data) {
+        pos = NULL;
+    } else {
+        while (NULL != pos->next && val > pos->next>data) {
+            pos = pos->next;
+        }
+    }
+    return pos;
+}
+```
+
+# Complexité de la liste chaînée triée
+
+## L'insertion?
+
+. . .
+
+$$
+\mathcal{O}(N).
+$$
+
+## L'extraction?
+
+. . .
+
+$$
+\mathcal{O}(N).
+$$
+
+## La recherche?
+
+. . .
+
+$$
+\mathcal{O}(N).
+$$
+
+
+# Liste doublement chaînée
+
+## Application navigateur ou éditeur de texte
+
+* Avec une liste chaînée:
+    * Comment implémenter les fonctions `back` et `forward` d'un navigateur??
+    * Comment implémenter les fonctions `undo` et `redo` d'un éditeur de text?
+
+. . .
+
+Pas possible.
+
+## Solution?
+
+. . .
+
+* Garder un pointeur supplémentaire sur l'élément précédent et pas seulement le
+  suivant.
+
+. . .
+
+* Cette structure de donnée est la **liste doublement chaînée** ou **doubly
+  linked list**.
+
+# Liste doublement chaînée
+
+## Exercices
+
+* Partir du dessin suivant et par **groupe de 5**
+
+![Un schéma de liste doublement chaînée d'entiers.](figs/doubly_linked_list.svg)
+
+1. Écrire les structures de données pour représenter la liste doublement
+   chaînée dont le type sera `dll` (pour
+   `doubly_linked_list`)
+
+# Liste doublement chaînée
+
+2. Écrire les fonctionnalités de création et consultation
+
+```C 
+// crée la liste doublement chaînée
+dll dll_create();
+// retourne la valeur à la position actuelle dans la liste
+int dll_value(dll list);
+// la liste est-elle vide?
+bool dll_is_empty(dll list);
+// Est-ce que pos est le 1er élément?
+bool dll_is_head(dll list);
+// Est-ce que pos est le dernier élément?
+bool dll_is_tail(dll list);
+// data est-elle dans la liste?
+bool dll_is_present(dll list, int data);
+// affiche la liste
+void dll_print(dll list);
+```
+
+# Liste doublement chaînée
+
+3. Écrire les fonctionnalités de manipulation 
+
+```C 
+// déplace pos au début de la liste
+dll dll_move_to_head(dll list);
+// déplace pos à la position suivante dans la liste
+dll dll_next(dll list);
+// déplace pos à la position précédente dans la liste
+dll dll_prev(dll list);
+```
+
+# Liste doublement chaînée
+
+4. Écrire les fonctionnalités d'insertion
+
+```C
+// insertion de data dans l'élément *après* pos
+dll dll_insert_after(dll list, int data);
+// insertion de data en tête de liste
+dll dll_push(dll list, int data);
+```
+
+5. Écrire les fonctionnalités d'extraction
+
+```C
+// extraction de la valeur se trouvant dans l'élément *pos*
+// l'élément *pos* est libéré
+int dll_extract(dll *list);
+// extrait la donnée en tête de liste
+int dll_pop(dll *list);
+// vide la liste
+void dll_destroy(dll *list)
+```
+
diff --git a/slides/figs/doubly_linked_list.svg b/slides/figs/doubly_linked_list.svg
new file mode 100644
index 0000000..b96a323
--- /dev/null
+++ b/slides/figs/doubly_linked_list.svg
@@ -0,0 +1,929 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="385.21741mm"
+   height="78.418839mm"
+   viewBox="0 0 385.21741 78.418839"
+   version="1.1"
+   id="svg5"
+   inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, custom)"
+   sodipodi:docname="doubly_linked_list.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview7"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:zoom="0.47433592"
+     inkscape:cx="952.91118"
+     inkscape:cy="365.77453"
+     inkscape:window-width="1920"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <defs
+     id="defs2">
+    <linearGradient
+       id="linearGradient27181"
+       inkscape:swatch="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop27179" />
+    </linearGradient>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-1"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-27" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9-0"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3-6" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-61"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-8" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-20" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9-0-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3-6-3" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-93"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-1" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9-0-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3-6-4" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-5" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9-0-4"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3-6-7" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-3"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-0" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9-0-7"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3-6-8" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-6" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9-0-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3-6-49" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-15"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-9" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-6-9-0-49"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-2-3-6-0" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-12"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-93" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94-0" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-8"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-4" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63-8"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94-1" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-8-9"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-4-6" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63-8-2"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94-1-1" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-8-8"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-4-3" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63-8-1"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94-1-8" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-8-7"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-4-7" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63-8-6"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94-1-4" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63-8-1-5"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94-1-8-4" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Lend-63-8-1-1"
+       refX="0"
+       refY="0"
+       orient="auto"
+       inkscape:stockid="Arrow2Lend"
+       inkscape:isstock="true">
+      <path
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round"
+         id="path5453-94-1-8-2" />
+    </marker>
+  </defs>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(8.5735273,-162.33534)">
+    <g
+       id="g31034">
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect43"
+         width="26.817299"
+         height="21.512512"
+         x="43.79332"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3"
+         width="19.720016"
+         height="21.512497"
+         x="70.592087"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-5"
+         width="19.720016"
+         height="21.512497"
+         x="24.073303"
+         y="162.83536" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="49.381596"
+         y="170.55223"
+         id="text2533"><tspan
+           sodipodi:role="line"
+           id="tspan2531"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="49.381596"
+           y="170.55223">data</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="72.400902"
+         y="176.01866"
+         id="text2533-6"><tspan
+           sodipodi:role="line"
+           id="tspan2531-7"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="72.400902"
+           y="176.01866">next</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="25.847668"
+         y="174.83356"
+         id="text2533-5"><tspan
+           sodipodi:role="line"
+           id="tspan2531-3"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="25.847668"
+           y="174.83356">prev</tspan></text>
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+         d="M 32.566534,179.81541 H 7.1177008"
+         id="path5430"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-63)"
+         d="M 81.846967,167.73425 H 107.2958"
+         id="path5430-8"
+         sodipodi:nodetypes="cc" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect43-0"
+         width="26.817299"
+         height="21.512512"
+         x="128.29239"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-4"
+         width="19.720016"
+         height="21.512497"
+         x="155.09116"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-5-4"
+         width="19.720016"
+         height="21.512497"
+         x="108.57237"
+         y="162.83536" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="133.88066"
+         y="170.55223"
+         id="text2533-4"><tspan
+           sodipodi:role="line"
+           id="tspan2531-4"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="133.88066"
+           y="170.55223">data</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="156.89996"
+         y="176.01866"
+         id="text2533-6-7"><tspan
+           sodipodi:role="line"
+           id="tspan2531-7-6"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="156.89996"
+           y="176.01866">next</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="110.34673"
+         y="174.83356"
+         id="text2533-5-3"><tspan
+           sodipodi:role="line"
+           id="tspan2531-3-1"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="110.34673"
+           y="174.83356">prev</tspan></text>
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-8)"
+         d="M 117.0656,179.81541 H 91.616768"
+         id="path5430-7"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-63-8)"
+         d="m 166.34603,167.73425 h 25.44884"
+         id="path5430-8-5"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-8-7)"
+         d="M 112.23011,218.63392 60.009485,185.36325"
+         id="path5430-7-4"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-63-8-6)"
+         d="m 141.44144,218.73827 72.28584,-33.4172"
+         id="path5430-8-5-6"
+         sodipodi:nodetypes="cc" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect43-0-5"
+         width="26.817299"
+         height="21.512512"
+         x="212.85204"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-4-7"
+         width="19.720016"
+         height="21.512497"
+         x="239.6508"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-5-4-4"
+         width="19.720016"
+         height="21.512497"
+         x="193.13202"
+         y="162.83536" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="218.44032"
+         y="170.55223"
+         id="text2533-4-1"><tspan
+           sodipodi:role="line"
+           id="tspan2531-4-8"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="218.44032"
+           y="170.55223">data</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="241.45963"
+         y="176.01866"
+         id="text2533-6-7-5"><tspan
+           sodipodi:role="line"
+           id="tspan2531-7-6-9"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="241.45963"
+           y="176.01866">next</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="194.90639"
+         y="174.83356"
+         id="text2533-5-3-7"><tspan
+           sodipodi:role="line"
+           id="tspan2531-3-1-5"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="194.90639"
+           y="174.83356">prev</tspan></text>
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-8-9)"
+         d="M 201.62525,179.81541 H 176.17642"
+         id="path5430-7-3"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-63-8-2)"
+         d="m 250.90569,167.73425 h 25.44883"
+         id="path5430-8-5-8"
+         sodipodi:nodetypes="cc" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect43-0-4"
+         width="26.817299"
+         height="21.512512"
+         x="297.36826"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-4-3"
+         width="19.720016"
+         height="21.512497"
+         x="324.16702"
+         y="162.83534" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-5-4-3"
+         width="19.720016"
+         height="21.512497"
+         x="277.64822"
+         y="162.83536" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="302.95651"
+         y="170.55223"
+         id="text2533-4-3"><tspan
+           sodipodi:role="line"
+           id="tspan2531-4-86"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="302.95651"
+           y="170.55223">data</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="325.97583"
+         y="176.01866"
+         id="text2533-6-7-0"><tspan
+           sodipodi:role="line"
+           id="tspan2531-7-6-4"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="325.97583"
+           y="176.01866">next</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="279.42261"
+         y="174.83356"
+         id="text2533-5-3-8"><tspan
+           sodipodi:role="line"
+           id="tspan2531-3-1-8"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="279.42261"
+           y="174.83356">prev</tspan></text>
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-8-8)"
+         d="M 286.14146,179.81541 H 260.69263"
+         id="path5430-7-8"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-63-8-1)"
+         d="m 335.4219,167.73425 h 25.44883"
+         id="path5430-8-5-9"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend-63-8-1-1)"
+         d="M 38.063478,229.50673 H 96.051494"
+         id="path5430-8-5-9-8"
+         sodipodi:nodetypes="cc" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-4-0"
+         width="30.466314"
+         height="21.512512"
+         x="127.86939"
+         y="218.74167" />
+      <rect
+         style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+         id="rect984-3-4-0-2"
+         width="30.466314"
+         height="21.512512"
+         x="97.403076"
+         y="218.74167" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="136.71878"
+         y="232.0807"
+         id="text19798"><tspan
+           sodipodi:role="line"
+           id="tspan19796"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="136.71878"
+           y="232.0807">pos</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="103.82884"
+         y="232.12825"
+         id="text21012"><tspan
+           sodipodi:role="line"
+           id="tspan21010"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="103.82884"
+           y="232.12825">head</tspan></text>
+      <g
+         id="g23095"
+         transform="translate(0.63181235,-8.3387299)">
+        <rect
+           style="fill:none;stroke:#000205;stroke-width:1;stroke-linecap:square"
+           id="rect984-3-4-0-2-2"
+           width="30.466314"
+           height="21.512512"
+           x="6.8544922"
+           y="227.0804" />
+        <text
+           xml:space="preserve"
+           style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+           x="16.658175"
+           y="240.46698"
+           id="text22622"><tspan
+             sodipodi:role="line"
+             id="tspan22620"
+             style="font-size:7.05556px;stroke-width:0.264583"
+             x="16.658175"
+             y="240.46698">list</tspan></text>
+      </g>
+      <g
+         id="g27724">
+        <rect
+           style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000205;stroke-width:1;stroke-linecap:square"
+           id="rect984-3-4-0-9"
+           width="13.974364"
+           height="21.512512"
+           x="-8.0735273"
+           y="162.83534" />
+        <path
+           style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000205;stroke-width:0.704282;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none"
+           d="M -28.32387,656.10754 V 617.5349 H -4.0995075 20.124855 v 38.57264 38.57264 H -4.0995075 -28.32387 Z"
+           id="path27327"
+           transform="scale(0.26458333)" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="M -7.7213419,184.34785 5.8332385,176.52211"
+           id="path27399" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 5.9008369,162.83534 -13.6897772,7.9038"
+           id="path27401" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 5.9008369,167.3846 -13.6897772,7.9038"
+           id="path27401-3" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 5.9008369,171.93383 -13.6897772,7.9038"
+           id="path27401-6" />
+      </g>
+      <g
+         id="g27724-8"
+         transform="translate(370.24303)">
+        <rect
+           style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000205;stroke-width:1;stroke-linecap:square"
+           id="rect984-3-4-0-9-0"
+           width="13.974364"
+           height="21.512512"
+           x="-8.0735273"
+           y="162.83534" />
+        <path
+           style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000205;stroke-width:0.704282;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none"
+           d="M -28.32387,656.10754 V 617.5349 H -4.0995075 20.124855 v 38.57264 38.57264 H -4.0995075 -28.32387 Z"
+           id="path27327-2"
+           transform="scale(0.26458333)" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="M -7.7213419,184.34785 5.8332385,176.52211"
+           id="path27399-1" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 5.9008369,162.83534 -13.6897772,7.9038"
+           id="path27401-0" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 5.9008369,167.3846 -13.6897772,7.9038"
+           id="path27401-3-5" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 5.9008369,171.93383 -13.6897772,7.9038"
+           id="path27401-6-1" />
+      </g>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="54.971268"
+         y="180.15842"
+         id="text2533-46"><tspan
+           sodipodi:role="line"
+           id="tspan2531-2"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="54.971268"
+           y="180.15842">3</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="137.17761"
+         y="180.20837"
+         id="text2533-46-5"><tspan
+           sodipodi:role="line"
+           id="tspan2531-2-8"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="137.17761"
+           y="180.20837">12</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="224.03"
+         y="180.15842"
+         id="text2533-46-6"><tspan
+           sodipodi:role="line"
+           id="tspan2531-2-2"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="224.03"
+           y="180.15842">3</tspan></text>
+      <text
+         xml:space="preserve"
+         style="font-size:7.05556px;line-height:0;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583"
+         x="308.5083"
+         y="180.15842"
+         id="text2533-46-8"><tspan
+           sodipodi:role="line"
+           id="tspan2531-2-4"
+           style="font-size:7.05556px;stroke-width:0.264583"
+           x="308.5083"
+           y="180.15842">6</tspan></text>
+    </g>
+  </g>
+</svg>
-- 
GitLab