Yichao Zhou 7 лет назад
Сommit
6d4b2a1f17

+ 10 - 0
.gitignore

@@ -0,0 +1,10 @@
+/data
+/logs
+/models
+/post
+.idea
+*.pyc
+.autoenv*
+/*.png
+/*.pdf
+/*.svg

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Yichao Zhou
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 147 - 0
README.md

@@ -0,0 +1,147 @@
+# L-CNN — End-to-End Wireframe Parsing
+
+## Introduction
+
+This repository contains the official PyTorch implementation of L-CNN, a conceptually simple yet effective neural network-based algorithm for detecting the wireframe from a given image. It outperforms the previous state-of-the-art wireframe and line extraction algorithms by a large margin. We hope that this repository serves as an easily reproducible baseline for future researches in this area.
+
+## Main Results
+
+### Qualitative Measures
+
+|     <img src="figs/000452_LSD.png" width="180">      |    <img src="figs/000452_AFM.png" width="180">    |     <img src="figs/000452_WF.png" width="180">      | <img src="figs/000452_LCNN.png" width="180"> | <img src="figs/000452_GT.png" width="180"> |
+| :--------------------------------------------------: | :-----------------------------------------------: | :-------------------------------------------------: | :------------------------------------------: | :----------------------------------------: |
+| [LSD](https://ieeexplore.ieee.org/document/4731268/) | [AFM](https://github.com/cherubicXN/afm_cvpr2019) | [Wireframe](https://github.com/huangkuns/wireframe) |                  **L-CNN**                   |                Ground Truth                |
+
+### Quantitative Measures
+
+The following table reports the performance of several wireframe and line detection algorithms on the [Wireframe dataset](https://github.com/huangkuns/wireframe).
+
+|                                                      | Wireframe (sAP<sup>10</sup>) | Wireframe (AP<sup>H</sup>) | Wireframe (F<sup>H</sup>) | Wireframe (mAP<sup>J</sup>) | 
+| :--------------------------------------------------: | :--------------------------------: | :-----------------------------: | :----------------------------: | :------------------------------: | 
+| [LSD](https://ieeexplore.ieee.org/document/4731268/) |                 /                  |              52.0             |              61.0                |                /                 |              
+|  [AFM](https://github.com/cherubicXN/afm_cvpr2019)   |                24.4                |              69.5               |              77.2              |               23.3               |           
+| [Wireframe](https://github.com/huangkuns/wireframe)  |                5.1                 |              67.8               |              72.6              |               40.9               |              
+|                      **L-CNN**                       |              **62.9**              |            **81.0**             |            **83.8**            |             **59.3**             |               
+
+### Precision-Recall Curves
+<p align="center">
+<img src="figs/PR-APH.svg"  width="420">
+<img src="figs/PR-sAP10.svg" width="420">
+</p>
+
+## Code Structure
+
+Below is a quick overview of the function of each file.
+
+```bash
+########################### Data ###########################
+figs/
+data/                           # default folder for placing the data
+    wireframe/                  # folder for Wireframe dataset (Huang et al.)
+logs/                           # default folder for storing the output during training
+########################### Code ###########################
+config/                         # neural network hyper-parameters and configurations
+    wireframe.yaml              # default parameter for Wireframe dataset
+dataset/                        # all scripts related to data generation
+    wireframe.py                # script for pre-processing the Wireframe dataset to npz
+misc/                           # misc scripts that are not important
+    draw-wireframe.py           # script for generating figure grids
+    lsd.py                      # script for generating npz files for LSD
+    plot-sAP.py                 # script for plotting sAP10 for all algorithms
+lcnn/                           # lcnn module so you can "import lcnn" in other scripts
+    models/                     # neural network structure
+        hourglass_pose.py       # backbone network (stacked hourglass)
+        line_vectorizer.py      # sampler and line verification network
+        multitask_learner.py    # network for multi-task learning
+    datasets.py                 # reading the training data
+    metrics.py                  # functions for evaluation metrics
+    trainer.py                  # trainer
+    config.py                   # global variables for configuration
+    utils.py                    # misc functions
+eval-sAP.py                     # script for sAP evaluation
+eval-APH.py                     # script for APH evaluation
+eval-mAPJ.py                    # script for mAPJ evaluation
+train.py                        # script for training the neural network
+post.py                         # script for post-processing
+```
+
+## Reproducing Results
+
+### Installation
+
+For the ease of reproducibility, you are suggested to install [miniconda](https://docs.conda.io/en/latest/miniconda.html) (or [anaconda](https://www.anaconda.com/distribution/) if you prefer) before following executing the following commands. 
+
+```bash
+git clone https://github.com/zhou13/lcnn
+cd lcnn
+conda create -y -n lcnn
+source activate lcnn
+# Replace cudatoolkit=10.0 with your CUDA version: https://pytorch.org/get-started/
+conda install -y pytorch cudatoolkit=10.0 -c pytorch
+conda install -y tensorboardx -c conda-forge
+conda install -y pyyaml docopt matplotlib scikit-image opencv
+mkdir data logs post
+```
+
+### Downloading data
+Make sure `curl` is installed on your system and execute
+```bash
+cd data
+../misc/gdrive-download.sh 1T4_6Nb5r4yAXre3lf-zpmp3RbmyP1t9q wireframe.tar.xz
+tar xf wireframe.tar.xz
+rm *.xz
+cd ..
+```
+
+If `gdrive-download.sh` does not work for you, you can download the data manually from [Google
+Drive](https://drive.google.com/drive/u/1/folders/1rXLAh5VIj8jwf8vLfuZncStihRO2chFr) and proceed
+accordingly.
+
+### Training
+To train the neural network on GPU 0 (specified by `-d 0`) with the default parameters, execute
+```bash
+python ./train.py -d 0 --identifier baseline  config/wireframe.yaml
+```
+
+### Pre-trained Models
+
+You can download our reference pre-trained models from [Google
+Drive](https://drive.google.com/file/d/1NvZkEqWNUBAfuhFPNGiCItjy4iU0UOy2).  This model was trained
+with `config/wireframe.yaml` for 312k iterations.
+
+### Post Processing
+
+To post processing the output from neural network (only necessary if you are going to evaluate AP<sup>H</sup>), execute
+```bash
+python ./post.py --plot logs/RUN/npz/ITERATION post/RUN-ITERATION
+```
+where ``--plot`` is an *optional* argument to control whether the program should also generate
+images for visualization in addition to the npz files that contain the line information. You should
+replace `RUN` and `ITERATION` to the desired value of your training instance.
+
+### Evaluation
+
+To evaluate the sAP (recommended) of all your checkpoints under `logs/`, execute
+```bash
+python eval-sAP.py logs/*/npz/*
+```
+
+To evaluate the mAP<sup>J</sup>, execute
+```bash
+python eval-mAPJ.py logs/*/npz/*
+```
+
+To evaluate AP<sup>H</sup>, you first need to post process your result (see the previous section).
+In addition, **MATLAB is required for AP<sup>H</sup> evaluation** and `matlab` should be under your
+`$PATH`.  The **parallel computing toolbox** is highly suggested due to the usage of `parfor`.
+After post processing, execute
+
+```bash
+python eval-APH.py post/RUN-ITERATION post/RUN-ITERATION-APH
+```
+to get the plot.  Here `post/RUN-ITERATION-APH` is the temporary directory storing intermediate
+files.  Due to the usage of pixel-wise matching, the evaluation of AP<sup>H</sup> **may take up to
+an hour** depending on your CPUs.
+
+See the source code of `eval-sAP.py`, `eval-mAPJ.py`, `eval-APH.py`, and `misc/*.py` for more
+details on evaluation.

+ 65 - 0
config/wireframe.yaml

@@ -0,0 +1,65 @@
+io:
+  logdir: logs/
+  datadir: data/wireframe/
+  resume_from:
+  num_workers: 4
+  tensorboard_port: 0
+  validation_interval: 24000
+
+model:
+  image:
+      mean: [109.730, 103.832, 98.681]
+      stddev: [22.275, 22.124, 23.229]
+
+  batch_size: 6
+
+  # backbone multi-task parameters
+  head_size: [[2], [1], [2]]
+  loss_weight:
+    jmap: 8.0
+    lmap: 0.5
+    joff: 0.25
+    lpos: 1
+    lneg: 1
+
+  # backbone parameters
+  backbone: stacked_hourglass
+  depth: 4
+  num_stacks: 2
+  num_blocks: 1
+
+  # sampler parameters
+  ## static sampler
+  n_stc_posl: 300
+  n_stc_negl: 40
+
+  ## dynamic sampler
+  n_dyn_junc: 300
+  n_dyn_posl: 300
+  n_dyn_negl: 80
+  n_dyn_othr: 600
+
+  # LOIPool layer parameters
+  n_pts0: 32
+  n_pts1: 8
+
+  # line verification network parameters
+  dim_loi: 128
+  dim_fc: 1024
+
+  # maximum junction and line outputs
+  n_out_junc: 250
+  n_out_line: 2500
+
+  # additional ablation study parameters
+  use_cood: 0
+  use_slop: 0
+  use_conv: 0
+
+optim:
+  name: Adam
+  lr: 4.0e-4
+  amsgrad: True
+  weight_decay: 1.0e-4
+  max_epoch: 24
+  lr_decay_epoch: 10

+ 229 - 0
dataset/wireframe.py

@@ -0,0 +1,229 @@
+#!/usr/bin/env python
+"""Process Huang's wireframe dataset for L-CNN network
+Usage:
+    dataset/wireframe.py <src> <dst>
+    dataset/wireframe.py (-h | --help )
+
+Examples:
+    python dataset/wireframe.py /datadir/wireframe data/wireframe
+
+Arguments:
+    <src>                Original data directory of Huang's wireframe dataset
+    <dst>                Directory of the output
+
+Options:
+   -h --help             Show this screen.
+"""
+
+import os
+import sys
+import json
+from itertools import combinations
+
+import cv2
+import numpy as np
+import skimage.draw
+import matplotlib.pyplot as plt
+from docopt import docopt
+from scipy.ndimage import zoom
+
+try:
+    sys.path.append(".")
+    sys.path.append("..")
+    from lcnn.utils import parmap
+except Exception:
+    raise
+
+
+def inrange(v, shape):
+    return 0 <= v[0] < shape[0] and 0 <= v[1] < shape[1]
+
+
+def to_int(x):
+    return tuple(map(int, x))
+
+
+def save_heatmap(prefix, image, lines):
+    im_rescale = (512, 512)
+    heatmap_scale = (128, 128)
+
+    fy, fx = heatmap_scale[1] / image.shape[0], heatmap_scale[0] / image.shape[1]
+    jmap = np.zeros((1,) + heatmap_scale, dtype=np.float32)
+    joff = np.zeros((1, 2) + heatmap_scale, dtype=np.float32)
+    lmap = np.zeros(heatmap_scale, dtype=np.float32)
+
+    lines[:, :, 0] = np.clip(lines[:, :, 0] * fx, 0, heatmap_scale[0] - 1e-4)
+    lines[:, :, 1] = np.clip(lines[:, :, 1] * fy, 0, heatmap_scale[1] - 1e-4)
+    lines = lines[:, :, ::-1]
+
+    junc = []
+    jids = {}
+
+    def jid(jun):
+        jun = tuple(jun[:2])
+        if jun in jids:
+            return jids[jun]
+        jids[jun] = len(junc)
+        junc.append(np.array(jun + (0,)))
+        return len(junc) - 1
+
+    lnid = []
+    lpos, lneg = [], []
+    for v0, v1 in lines:
+        lnid.append((jid(v0), jid(v1)))
+        lpos.append([junc[jid(v0)], junc[jid(v1)]])
+
+        vint0, vint1 = to_int(v0), to_int(v1)
+        jmap[0][vint0] = 1
+        jmap[0][vint1] = 1
+        rr, cc, value = skimage.draw.line_aa(*to_int(v0), *to_int(v1))
+        lmap[rr, cc] = np.maximum(lmap[rr, cc], value)
+
+    for v in junc:
+        vint = to_int(v[:2])
+        joff[0, :, vint[0], vint[1]] = v[:2] - vint - 0.5
+
+    llmap = zoom(lmap, [0.5, 0.5])
+    lineset = set([frozenset(l) for l in lnid])
+    for i0, i1 in combinations(range(len(junc)), 2):
+        if frozenset([i0, i1]) not in lineset:
+            v0, v1 = junc[i0], junc[i1]
+            vint0, vint1 = to_int(v0[:2] / 2), to_int(v1[:2] / 2)
+            rr, cc, value = skimage.draw.line_aa(*vint0, *vint1)
+            lneg.append([v0, v1, i0, i1, np.average(np.minimum(value, llmap[rr, cc]))])
+            # assert np.sum((v0 - v1) ** 2) > 0.01
+
+    assert len(lneg) != 0
+    lneg.sort(key=lambda l: -l[-1])
+
+    junc = np.array(junc, dtype=np.float32)
+    Lpos = np.array(lnid, dtype=np.int)
+    Lneg = np.array([l[2:4] for l in lneg][:4000], dtype=np.int)
+    lpos = np.array(lpos, dtype=np.float32)
+    lneg = np.array([l[:2] for l in lneg[:2000]], dtype=np.float32)
+
+    image = cv2.resize(image, im_rescale)
+
+    # plt.subplot(131), plt.imshow(lmap)
+    # plt.subplot(132), plt.imshow(image)
+    # for i0, i1 in Lpos:
+    #     plt.scatter(junc[i0][1] * 4, junc[i0][0] * 4)
+    #     plt.scatter(junc[i1][1] * 4, junc[i1][0] * 4)
+    #     plt.plot([junc[i0][1] * 4, junc[i1][1] * 4], [junc[i0][0] * 4, junc[i1][0] * 4])
+    # plt.subplot(133), plt.imshow(lmap)
+    # for i0, i1 in Lneg[:150]:
+    #     plt.plot([junc[i0][1], junc[i1][1]], [junc[i0][0], junc[i1][0]])
+    # plt.show()
+
+    np.savez_compressed(
+        f"{prefix}_label.npz",
+        aspect_ratio=image.shape[1] / image.shape[0],
+        jmap=jmap,  # [J, H, W]
+        joff=joff,  # [J, 2, H, W]
+        lmap=lmap,  # [H, W]
+        junc=junc,  # [Na, 3]
+        Lpos=Lpos,  # [M, 2]
+        Lneg=Lneg,  # [M, 2]
+        lpos=lpos,  # [Np, 2, 3]   (y, x, t) for the last dim
+        lneg=lneg,  # [Nn, 2, 3]
+    )
+    cv2.imwrite(f"{prefix}.png", image)
+
+    # plt.imshow(jmap[0])
+    # plt.savefig("/tmp/1jmap0.jpg")
+    # plt.imshow(jmap[1])
+    # plt.savefig("/tmp/2jmap1.jpg")
+    # plt.imshow(lmap)
+    # plt.savefig("/tmp/3lmap.jpg")
+    # plt.imshow(Lmap[2])
+    # plt.savefig("/tmp/4ymap.jpg")
+    # plt.imshow(jwgt[0])
+    # plt.savefig("/tmp/5jwgt.jpg")
+    # plt.cla()
+    # plt.imshow(jmap[0])
+    # for i in range(8):
+    #     plt.quiver(
+    #         8 * jmap[0] * cdir[i] * np.cos(2 * math.pi / 16 * i),
+    #         8 * jmap[0] * cdir[i] * np.sin(2 * math.pi / 16 * i),
+    #         units="xy",
+    #         angles="xy",
+    #         scale_units="xy",
+    #         scale=1,
+    #         minlength=0.01,
+    #         width=0.1,
+    #         zorder=10,
+    #         color="w",
+    #     )
+    # plt.savefig("/tmp/6cdir.jpg")
+    # plt.cla()
+    # plt.imshow(lmap)
+    # plt.quiver(
+    #     2 * lmap * np.cos(ldir),
+    #     2 * lmap * np.sin(ldir),
+    #     units="xy",
+    #     angles="xy",
+    #     scale_units="xy",
+    #     scale=1,
+    #     minlength=0.01,
+    #     width=0.1,
+    #     zorder=10,
+    #     color="w",
+    # )
+    # plt.savefig("/tmp/7ldir.jpg")
+    # plt.cla()
+    # plt.imshow(jmap[1])
+    # plt.quiver(
+    #     8 * jmap[1] * np.cos(tdir),
+    #     8 * jmap[1] * np.sin(tdir),
+    #     units="xy",
+    #     angles="xy",
+    #     scale_units="xy",
+    #     scale=1,
+    #     minlength=0.01,
+    #     width=0.1,
+    #     zorder=10,
+    #     color="w",
+    # )
+    # plt.savefig("/tmp/8tdir.jpg")
+
+
+def main():
+    args = docopt(__doc__)
+    data_root = args["<src>"]
+    data_output = args["<dst>"]
+
+    os.makedirs(data_output, exist_ok=True)
+    for batch in ["train", "valid"]:
+        anno_file = os.path.join(data_root, f"{batch}.json")
+
+        with open(anno_file, "r") as f:
+            dataset = json.load(f)
+
+        def handle(data):
+            im = cv2.imread(os.path.join(data_root, "images", data["filename"]))
+            prefix = data["filename"].split(".")[0]
+            lines = np.array(data["lines"]).reshape(-1, 2, 2)
+            os.makedirs(os.path.join(data_output, batch), exist_ok=True)
+
+            lines0 = lines.copy()
+            lines1 = lines.copy()
+            lines1[:, :, 0] = im.shape[1] - lines1[:, :, 0]
+            lines2 = lines.copy()
+            lines2[:, :, 1] = im.shape[0] - lines2[:, :, 1]
+            lines3 = lines.copy()
+            lines3[:, :, 0] = im.shape[1] - lines3[:, :, 0]
+            lines3[:, :, 1] = im.shape[0] - lines3[:, :, 1]
+
+            path = os.path.join(data_output, batch, prefix)
+            save_heatmap(f"{path}_0", im[::, ::], lines0)
+            if batch != "valid":
+                save_heatmap(f"{path}_1", im[::, ::-1], lines1)
+                save_heatmap(f"{path}_2", im[::-1, ::], lines2)
+                save_heatmap(f"{path}_3", im[::-1, ::-1], lines3)
+            print("Finishing", os.path.join(data_output, batch, prefix))
+
+        parmap(handle, dataset, 16)
+
+
+if __name__ == "__main__":
+    main()

+ 214 - 0
dataset/york.py

@@ -0,0 +1,214 @@
+#!/usr/bin/env python3
+"""Process YorkUrban dataset for L-CNN network
+Usage:
+    dataset/york.py <src> <dst>
+    dataset/york.py (-h | --help )
+
+Examples:
+    python dataset/york.py /datadir/york data/york
+
+Arguments:
+    <src>                Original data directory of YorkUrban
+    <dst>                Directory of the output
+
+Options:
+   -h --help             Show this screen.
+"""
+
+import os
+import sys
+import glob
+import json
+import os.path as osp
+from itertools import combinations
+
+import cv2
+import numpy as np
+import skimage.draw
+import matplotlib.pyplot as plt
+from docopt import docopt
+from scipy.io import loadmat
+from scipy.ndimage import zoom
+
+try:
+    sys.path.append(".")
+    sys.path.append("..")
+    from lcnn.utils import parmap
+except Exception:
+    raise
+
+
+def inrange(v, shape):
+    return 0 <= v[0] < shape[0] and 0 <= v[1] < shape[1]
+
+
+def to_int(x):
+    return tuple(map(int, x))
+
+
+def save_heatmap(prefix, image, lines):
+    im_rescale = (512, 512)
+    heatmap_scale = (128, 128)
+
+    fy, fx = heatmap_scale[1] / image.shape[0], heatmap_scale[0] / image.shape[1]
+    jmap = np.zeros((1,) + heatmap_scale, dtype=np.float32)
+    joff = np.zeros((1, 2) + heatmap_scale, dtype=np.float32)
+    lmap = np.zeros(heatmap_scale, dtype=np.float32)
+
+    lines[:, :, 0] = np.clip(lines[:, :, 0] * fx, 0, heatmap_scale[0] - 1e-4)
+    lines[:, :, 1] = np.clip(lines[:, :, 1] * fy, 0, heatmap_scale[1] - 1e-4)
+    lines = lines[:, :, ::-1]
+
+    junc = []
+    jids = {}
+
+    def jid(jun):
+        jun = tuple(jun[:2])
+        if jun in jids:
+            return jids[jun]
+        jids[jun] = len(junc)
+        junc.append(np.array(jun + (0,)))
+        return len(junc) - 1
+
+    lnid = []
+    lpos, lneg = [], []
+    for v0, v1 in lines:
+        lnid.append((jid(v0), jid(v1)))
+        lpos.append([junc[jid(v0)], junc[jid(v1)]])
+
+        vint0, vint1 = to_int(v0), to_int(v1)
+        jmap[0][vint0] = 1
+        jmap[0][vint1] = 1
+        rr, cc, value = skimage.draw.line_aa(*to_int(v0), *to_int(v1))
+        lmap[rr, cc] = np.maximum(lmap[rr, cc], value)
+
+    for v in junc:
+        vint = to_int(v[:2])
+        joff[0, :, vint[0], vint[1]] = v[:2] - vint - 0.5
+
+    llmap = zoom(lmap, [0.5, 0.5])
+    lineset = set([frozenset(l) for l in lnid])
+    for i0, i1 in combinations(range(len(junc)), 2):
+        if frozenset([i0, i1]) not in lineset:
+            v0, v1 = junc[i0], junc[i1]
+            vint0, vint1 = to_int(v0[:2] / 2), to_int(v1[:2] / 2)
+            rr, cc, value = skimage.draw.line_aa(*vint0, *vint1)
+            lneg.append([v0, v1, i0, i1, np.average(np.minimum(value, llmap[rr, cc]))])
+            # assert np.sum((v0 - v1) ** 2) > 0.01
+
+    assert len(lneg) != 0
+    lneg.sort(key=lambda l: -l[-1])
+
+    junc = np.array(junc, dtype=np.float32)
+    Lpos = np.array(lnid, dtype=np.int)
+    Lneg = np.array([l[2:4] for l in lneg][:4000], dtype=np.int)
+    lpos = np.array(lpos, dtype=np.float32)
+    lneg = np.array([l[:2] for l in lneg[:2000]], dtype=np.float32)
+
+    image = cv2.resize(image, im_rescale)
+
+    # plt.subplot(131), plt.imshow(lmap)
+    # plt.subplot(132), plt.imshow(image)
+    # for i0, i1 in Lpos:
+    #     plt.scatter(junc[i0][1] * 4, junc[i0][0] * 4)
+    #     plt.scatter(junc[i1][1] * 4, junc[i1][0] * 4)
+    #     plt.plot([junc[i0][1] * 4, junc[i1][1] * 4], [junc[i0][0] * 4, junc[i1][0] * 4])
+    # plt.subplot(133), plt.imshow(lmap)
+    # for i0, i1 in Lneg[:150]:
+    #     plt.plot([junc[i0][1], junc[i1][1]], [junc[i0][0], junc[i1][0]])
+    # plt.show()
+
+    np.savez_compressed(
+        f"{prefix}_label.npz",
+        aspect_ratio=image.shape[1] / image.shape[0],
+        jmap=jmap,  # [J, H, W]
+        joff=joff,  # [J, 2, H, W]
+        lmap=lmap,  # [H, W]
+        junc=junc,  # [Na, 3]
+        Lpos=Lpos,  # [M, 2]
+        Lneg=Lneg,  # [M, 2]
+        lpos=lpos,  # [Np, 2, 3]   (y, x, t) for the last dim
+        lneg=lneg,  # [Nn, 2, 3]
+    )
+    cv2.imwrite(f"{prefix}.png", image)
+
+    # plt.imshow(jmap[0])
+    # plt.savefig("/tmp/1jmap0.jpg")
+    # plt.imshow(jmap[1])
+    # plt.savefig("/tmp/2jmap1.jpg")
+    # plt.imshow(lmap)
+    # plt.savefig("/tmp/3lmap.jpg")
+    # plt.imshow(Lmap[2])
+    # plt.savefig("/tmp/4ymap.jpg")
+    # plt.imshow(jwgt[0])
+    # plt.savefig("/tmp/5jwgt.jpg")
+    # plt.cla()
+    # plt.imshow(jmap[0])
+    # for i in range(8):
+    #     plt.quiver(
+    #         8 * jmap[0] * cdir[i] * np.cos(2 * math.pi / 16 * i),
+    #         8 * jmap[0] * cdir[i] * np.sin(2 * math.pi / 16 * i),
+    #         units="xy",
+    #         angles="xy",
+    #         scale_units="xy",
+    #         scale=1,
+    #         minlength=0.01,
+    #         width=0.1,
+    #         zorder=10,
+    #         color="w",
+    #     )
+    # plt.savefig("/tmp/6cdir.jpg")
+    # plt.cla()
+    # plt.imshow(lmap)
+    # plt.quiver(
+    #     2 * lmap * np.cos(ldir),
+    #     2 * lmap * np.sin(ldir),
+    #     units="xy",
+    #     angles="xy",
+    #     scale_units="xy",
+    #     scale=1,
+    #     minlength=0.01,
+    #     width=0.1,
+    #     zorder=10,
+    #     color="w",
+    # )
+    # plt.savefig("/tmp/7ldir.jpg")
+    # plt.cla()
+    # plt.imshow(jmap[1])
+    # plt.quiver(
+    #     8 * jmap[1] * np.cos(tdir),
+    #     8 * jmap[1] * np.sin(tdir),
+    #     units="xy",
+    #     angles="xy",
+    #     scale_units="xy",
+    #     scale=1,
+    #     minlength=0.01,
+    #     width=0.1,
+    #     zorder=10,
+    #     color="w",
+    # )
+    # plt.savefig("/tmp/8tdir.jpg")
+
+
+def main():
+    args = docopt(__doc__)
+    data_root = args["<src>"]
+    data_output = args["<dst>"]
+    os.makedirs(data_output, exist_ok=True)
+
+    dataset = sorted(glob.glob(osp.join(data_root, "*/*.jpg")))
+
+    def handle(iname):
+        prefix = osp.split(iname)[1].replace(".jpg", "")
+        im = cv2.imread(iname)
+        mat = loadmat(iname.replace(".jpg", "LinesAndVP.mat"))
+        lines = np.array(mat["lines"]).reshape(-1, 2, 2)
+        path = osp.join(data_output, prefix)
+        save_heatmap(f"{path}", im[::, ::], lines)
+        print(f"Finishing {path}")
+
+    parmap(handle, dataset)
+
+
+if __name__ == "__main__":
+    main()

+ 124 - 0
eval-APH.py

@@ -0,0 +1,124 @@
+#!/usr/bin/env python3
+"""Evaluate APH for LCNN
+Usage:
+    eval-APH.py <src> <dst>
+    eval-APH.py (-h | --help )
+
+Examples:
+    python eval-APH.py logs/*
+
+Arguments:
+    <src>                Source directory that stores preprocessed npz
+    <dst>                Temporary output directory
+
+Options:
+   -h --help             Show this screen.
+"""
+
+import os
+import glob
+import os.path as osp
+import subprocess
+
+import numpy as np
+import scipy.io as sio
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+from scipy import interpolate
+from docopt import docopt
+
+mpl.rcParams.update({"font.size": 18})
+plt.rcParams["font.family"] = "Times New Roman"
+del mpl.font_manager.weight_dict["roman"]
+mpl.font_manager._rebuild()
+
+image_path = "data/wireframe/valid-images/"
+line_gt_path = "data/wireframe/valid/"
+output_size = 128
+
+
+def main():
+    args = docopt(__doc__)
+    src_dir = args["<src>"]
+    tar_dir = args["<dst>"]
+
+    output_file = osp.join(tar_dir, "result.mat")
+    target_dir = osp.join(tar_dir, "mat")
+    os.makedirs(target_dir, exist_ok=True)
+    print(f"intermediate matlab results will be saved at: {target_dir}")
+
+    file_list = glob.glob(osp.join(src_dir, "*.npz"))
+    thresh = [0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.97, 0.99, 0.995, 0.999, 0.9995, 0.9999]
+    for t in thresh:
+        for fname in file_list:
+            name = fname.split("/")[-1].split(".")[0]
+            mat_name = name + ".mat"
+            npz = np.load(fname)
+            lines = npz["lines"].reshape(-1, 4)
+            scores = npz["score"]
+            for j in range(len(scores) - 1):
+                if scores[j + 1] == scores[0]:
+                    lines = lines[: j + 1]
+                    scores = scores[: j + 1]
+                    break
+            idx = np.where(scores > t)[0]
+            os.makedirs(osp.join(target_dir, str(t)), exist_ok=True)
+            sio.savemat(osp.join(target_dir, str(t), mat_name), {"lines": lines[idx]})
+
+    cmd = "matlab -nodisplay -nodesktop "
+    cmd += '-r "dbstop if error; '
+    cmd += "eval_release('{:s}', '{:s}', '{:s}', '{:s}', {:d}); quit;\"".format(
+        image_path, line_gt_path, output_file, target_dir, output_size
+    )
+    print("Running:\n{}".format(cmd))
+    os.environ["MATLABPATH"] = "matlab/"
+    subprocess.call(cmd, shell=True)
+
+    mat = sio.loadmat(output_file)
+    tps = mat["sumtp"]
+    fps = mat["sumfp"]
+    N = mat["sumgt"]
+    rcs = sorted(list((tps / N)[:, 0]))
+    prs = sorted(list((tps / np.maximum(tps + fps, 1e-9))[:, 0]))[::-1]
+
+    print(
+        "f measure is: ",
+        (2 * np.array(prs) * np.array(rcs) / (np.array(prs) + np.array(rcs))).max(),
+    )
+
+    recall = np.concatenate(([0.0], rcs, [1.0]))
+    precision = np.concatenate(([0.0], prs, [0.0]))
+
+    for i in range(precision.size - 1, 0, -1):
+        precision[i - 1] = max(precision[i - 1], precision[i])
+    i = np.where(recall[1:] != recall[:-1])[0]
+    print("AP is: ", np.sum((recall[i + 1] - recall[i]) * precision[i + 1]))
+
+    f = interpolate.interp1d(rcs, prs, kind="cubic", bounds_error=False)
+    x = np.arange(0, 1, 0.01) * rcs[-1]
+    y = f(x)
+    plt.plot(x, y, linewidth=3, label="L-CNN")
+
+    f_scores = np.linspace(0.2, 0.8, num=8)
+    for f_score in f_scores:
+        x = np.linspace(0.01, 1)
+        y = f_score * x / (2 * x - f_score)
+        l, = plt.plot(x[y >= 0], y[y >= 0], color="green", alpha=0.3)
+        plt.annotate("f={0:0.1}".format(f_score), xy=(0.9, y[45] + 0.02), alpha=0.4)
+
+    plt.grid(True)
+    plt.axis([0.0, 1.0, 0.0, 1.0])
+    plt.xticks(np.arange(0, 1.0, step=0.1))
+    plt.xlabel("Recall")
+    plt.ylabel("Precision")
+    plt.yticks(np.arange(0, 1.0, step=0.1))
+    plt.legend(loc=3)
+    plt.title("PR Curve for APH")
+    plt.savefig("apH.pdf", format="pdf", bbox_inches="tight")
+    plt.savefig("apH.svg", format="svg", bbox_inches="tight")
+    plt.show()
+
+
+if __name__ == "__main__":
+    plt.tight_layout()
+    main()

+ 167 - 0
eval-mAPJ.py

@@ -0,0 +1,167 @@
+#!/usr/bin/env python3
+"""Evaluate mAPJ for LCNN, AFM, and Wireframe
+Usage:
+    eval-mAPJ.py <path>...
+    eval-mAPJ.py (-h | --help )
+
+Examples:
+    python eval-mAPJ.py logs/*
+
+Arguments:
+    <path>                           One or more directories that contain *.npz
+
+Options:
+   -h --help                         Show this screen.
+"""
+
+import os
+import re
+import glob
+import os.path as osp
+from collections import defaultdict
+
+import cv2
+import numpy as np
+import matplotlib.pyplot as plt
+from docopt import docopt
+from scipy.io import loadmat
+
+import lcnn.models
+from lcnn.metric import mAPJ, post_jheatmap
+
+GT = "data/wireframe/valid/*.npz"
+IM = "data/wireframe/valid-images/*.jpg"
+WF = "/data/wirebase/result/junc/2/17"
+AFM = "/data/wirebase/result/wireframe/afm/*.npz"
+
+DIST = [0.5, 1.0, 2.0]
+
+
+def evaluate_lcnn(im_list, gt_list, lcnn_list):
+    # define result array to aggregate (n x 3) where 3 is (x, y, score)
+    all_junc = np.zeros((0, 3))
+    all_offset_junc = np.zeros((0, 3))
+    # for each detected junction, which image they correspond to
+    all_junc_ids = np.zeros(0, dtype=np.int32)
+    # gt is a list since the variable gt number per image
+    all_jc_gt = []
+
+    for i, (lcnn_fn, gt_fn) in enumerate(zip(lcnn_list, gt_list)):
+        with np.load(lcnn_fn) as npz:
+            result = {name: arr for name, arr in npz.items()}
+            jmap = result["jmap"]
+            joff = result["joff"]
+
+        with np.load(gt_fn) as npz:
+            junc_gt = npz["junc"][:, :2]
+
+        # for j in junc_gt:
+        #     plt.scatter(round(j[1]), round(j[0]), c="red")
+        # for j in juncs_wf:
+        #     plt.scatter(round(j[1]), round(j[0]), c="blue")
+        # plt.show()
+
+        jun_c = post_jheatmap(jmap[0])
+        all_junc = np.vstack((all_junc, jun_c))
+        jun_o_c = post_jheatmap(jmap[0], offset=joff[0])
+        all_offset_junc = np.vstack((all_offset_junc, jun_o_c))
+
+        all_jc_gt.append(junc_gt)
+        all_junc_ids = np.hstack((all_junc_ids, np.array([i] * len(jun_c))))
+
+    # sometimes filter all and concat empty list will change dtype
+    all_junc_ids = all_junc_ids.astype(np.int64)
+    ap_jc = mAPJ(all_junc, all_jc_gt, DIST, all_junc_ids)
+    ap_joc = mAPJ(all_offset_junc, all_jc_gt, DIST, all_junc_ids)
+    print(f"  {ap_jc:.1f} | {ap_joc:.1f}")
+
+
+def evaluate_wireframe(im_list, gt_list, juncs_wf):
+    print("Compute WF mAP")
+    juncs_wf = load_wf()
+    all_junc = np.zeros((0, 3))
+    all_junc_ids = np.zeros(0, dtype=np.int32)
+    all_jc_gt = []
+    for i, (im_fn, gt_fn, junc_wf) in enumerate(zip(im_list, gt_list, juncs_wf)):
+        im = cv2.imread(im_fn)
+        im = cv2.resize(im, (128, 128))
+
+        with np.load(gt_fn) as npz:
+            junc_gt = npz["junc"][:, :2]
+        jun_c = sorted(junc_wf, key=lambda x: -x[2])[:1000]
+
+        all_junc = np.vstack((all_junc, jun_c))
+        all_jc_gt.append(junc_gt)
+        all_junc_ids = np.hstack((all_junc_ids, np.array([i] * len(jun_c))))
+    all_junc_ids = all_junc_ids.astype(np.int64)
+    ap_jc = mAPJ(all_junc, all_jc_gt, DIST, all_junc_ids)
+    print(f"  {ap_jc:.1f}")
+
+
+def evaluate_afm(im_list, gt_list, afm):
+    print("Compute AFM mAP")
+    all_junc = np.zeros((0, 3))
+    all_junc_ids = np.zeros(0, dtype=np.int32)
+    all_jc_gt = []
+    afm = glob.glob(AFM)
+    afm.sort()
+    for i, (im_fn, gt_fn, afm_fn) in enumerate(zip(im_list, gt_list, afm)):
+        im = cv2.imread(im_fn)
+        im = cv2.resize(im, (128, 128))
+
+        with np.load(gt_fn) as npz:
+            junc_gt = npz["junc"][:, :2]
+
+        with np.load(afm_fn) as fafm:
+            afm_line = fafm["lines"].reshape(-1, 2, 2)[:, :, ::-1]
+            afm_score = -fafm["scores"]
+            h = fafm["h"]
+            w = fafm["w"]
+        afm_line[:, :, 0] *= 128 / h
+        afm_line[:, :, 1] *= 128 / w
+
+        jun_c = []
+        for line, score in zip(afm_line, afm_score):
+            jun_c.append(list(line[0]) + [score])
+            jun_c.append(list(line[1]) + [score])
+        jun_c = np.array(jun_c)
+
+        all_junc = np.vstack((all_junc, jun_c))
+        all_jc_gt.append(junc_gt)
+        all_junc_ids = np.hstack((all_junc_ids, np.array([i] * len(jun_c))))
+    all_junc_ids = all_junc_ids.astype(np.int64)
+    ap_jc = mAPJ(all_junc, all_jc_gt, DIST, all_junc_ids)
+    print(f"  {ap_jc:.1f}")
+
+
+def load_wf():
+    pts = [defaultdict(int) for _ in range(500)]
+    for thres in range(10):
+        mats = sorted(glob.glob(f"{WF}/{thres}/*.mat"))
+        for i, mat in enumerate(mats):
+            img = cv2.imread(mat.replace(".mat", "_5.png"))
+            juncs = loadmat(mat)["junctions"]
+            if len(juncs) == 0:
+                continue
+            juncs[:, 0] *= 128 / img.shape[1]
+            juncs[:, 1] *= 128 / img.shape[0]
+            # juncs += 0.5
+            for j in juncs:
+                pts[i][tuple(j)] += 1
+    pts = pts[: len(mats)]
+    return [np.array([(k[1], k[0], v) for k, v in ipts.items()]) for ipts in pts]
+
+
+def main():
+    args = docopt(__doc__)
+    gt_list = sorted(glob.glob(GT))
+    im_list = sorted(glob.glob(IM))
+
+    for path in args["<path>"]:
+        print("Evaluating", path)
+        lcnn_list = sorted(glob.glob(osp.join(path, "*.npz")))
+        evaluate_lcnn(im_list, gt_list, lcnn_list)
+
+
+if __name__ == "__main__":
+    main()

+ 80 - 0
eval-sAP.py

@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+"""Evaluate sAP5, sAP10, sAP15 for LCNN
+Usage:
+    eval-sAP.py <path>...
+    eval-sAP.py (-h | --help )
+
+Examples:
+    python eval-sAP.py logs/*/npz/000*
+
+Arguments:
+    <path>                           One or more directories from train.py
+
+Options:
+   -h --help                         Show this screen.
+"""
+
+import os
+import sys
+import glob
+import os.path as osp
+
+import numpy as np
+import scipy.io
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+from docopt import docopt
+
+import lcnn.utils
+import lcnn.metric
+
+GT = "data/wireframe/valid/*.npz"
+
+
+def line_score(path, threshold=5):
+    preds = sorted(glob.glob(path))
+    gts = sorted(glob.glob(GT))
+
+    n_gt = 0
+    lcnn_tp, lcnn_fp, lcnn_scores = [], [], []
+    for pred_name, gt_name in zip(preds, gts):
+        with np.load(pred_name) as fpred:
+            lcnn_line = fpred["lines"][:, :, :2]
+            lcnn_score = fpred["score"]
+        with np.load(gt_name) as fgt:
+            gt_line = fgt["lpos"][:, :, :2]
+        n_gt += len(gt_line)
+
+        for i in range(len(lcnn_line)):
+            if i > 0 and (lcnn_line[i] == lcnn_line[0]).all():
+                lcnn_line = lcnn_line[:i]
+                lcnn_score = lcnn_score[:i]
+                break
+
+        tp, fp = lcnn.metric.msTPFP(lcnn_line, gt_line, threshold)
+        lcnn_tp.append(tp)
+        lcnn_fp.append(fp)
+        lcnn_scores.append(lcnn_score)
+
+    lcnn_tp = np.concatenate(lcnn_tp)
+    lcnn_fp = np.concatenate(lcnn_fp)
+    lcnn_scores = np.concatenate(lcnn_scores)
+    lcnn_index = np.argsort(-lcnn_scores)
+    lcnn_tp = np.cumsum(lcnn_tp[lcnn_index]) / n_gt
+    lcnn_fp = np.cumsum(lcnn_fp[lcnn_index]) / n_gt
+
+    return lcnn.metric.ap(lcnn_tp, lcnn_fp)
+
+
+if __name__ == "__main__":
+    args = docopt(__doc__)
+
+    def work(path):
+        print(f"Working on {path}")
+        return [100 * line_score(f"{path}/*.npz", t) for t in [5, 10, 15]]
+
+    dirs = sorted(sum([glob.glob(p) for p in args["<path>"]], []))
+    results = lcnn.utils.parmap(work, dirs)
+
+    for d, msAP in zip(dirs, results):
+        print(f"{d}: {msAP[0]:2.1f} {msAP[1]:2.1f} {msAP[2]:2.1f}")

BIN
figs/000452_AFM.png


BIN
figs/000452_GT.png


BIN
figs/000452_LCNN.png


BIN
figs/000452_LSD.png


BIN
figs/000452_WF.png


+ 2563 - 0
figs/PR-APH.svg

@@ -0,0 +1,2563 @@
+<?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">
+<!-- Created with matplotlib (http://matplotlib.org/) -->
+<svg height="339.909pt" version="1.1" viewBox="0 0 420.5525 339.909" width="420.5525pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+  <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+  </style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 339.909 
+L 420.5525 339.909 
+L 420.5525 0 
+L 0 0 
+z
+" style="fill:#ffffff;"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 52.7325 292.644 
+L 409.8525 292.644 
+L 409.8525 26.532 
+L 52.7325 26.532 
+z
+" style="fill:#ffffff;"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 292.644 
+L 52.7325 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_2">
+      <defs>
+       <path d="M 0 0 
+L 0 3.5 
+" id="m9ad32805f6" style="stroke:#000000;stroke-width:0.8;"/>
+      </defs>
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0.0 -->
+      <defs>
+       <path d="M 3.609375 32.71875 
+Q 3.609375 44.046875 7.03125 52.21875 
+Q 10.453125 60.40625 16.109375 64.40625 
+Q 20.515625 67.578125 25.203125 67.578125 
+Q 32.8125 67.578125 38.875 59.8125 
+Q 46.4375 50.203125 46.4375 33.734375 
+Q 46.4375 22.21875 43.109375 14.15625 
+Q 39.796875 6.109375 34.640625 2.46875 
+Q 29.5 -1.171875 24.703125 -1.171875 
+Q 15.234375 -1.171875 8.9375 10.015625 
+Q 3.609375 19.4375 3.609375 32.71875 
+z
+M 13.1875 31.5 
+Q 13.1875 17.828125 16.546875 9.1875 
+Q 19.34375 1.90625 24.859375 1.90625 
+Q 27.484375 1.90625 30.3125 4.265625 
+Q 33.15625 6.640625 34.625 12.203125 
+Q 36.859375 20.609375 36.859375 35.890625 
+Q 36.859375 47.21875 34.515625 54.78125 
+Q 32.765625 60.40625 29.984375 62.75 
+Q 27.984375 64.359375 25.140625 64.359375 
+Q 21.828125 64.359375 19.234375 61.375 
+Q 15.71875 57.328125 14.453125 48.625 
+Q 13.1875 39.9375 13.1875 31.5 
+z
+" id="TimesNewRomanPSMT-30"/>
+       <path d="M 12.5 9.46875 
+Q 14.796875 9.46875 16.359375 7.875 
+Q 17.921875 6.296875 17.921875 4.046875 
+Q 17.921875 1.8125 16.328125 0.21875 
+Q 14.75 -1.375 12.5 -1.375 
+Q 10.25 -1.375 8.65625 0.21875 
+Q 7.078125 1.8125 7.078125 4.046875 
+Q 7.078125 6.34375 8.65625 7.90625 
+Q 10.25 9.46875 12.5 9.46875 
+z
+" id="TimesNewRomanPSMT-2e"/>
+      </defs>
+      <g transform="translate(42.7325 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_3">
+      <path clip-path="url(#p9778b8a2e2)" d="M 88.4445 292.644 
+L 88.4445 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_4">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="88.4445" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 0.1 -->
+      <defs>
+       <path d="M 11.71875 59.71875 
+L 27.828125 67.578125 
+L 29.4375 67.578125 
+L 29.4375 11.671875 
+Q 29.4375 6.109375 29.90625 4.734375 
+Q 30.375 3.375 31.828125 2.640625 
+Q 33.296875 1.90625 37.796875 1.8125 
+L 37.796875 0 
+L 12.890625 0 
+L 12.890625 1.8125 
+Q 17.578125 1.90625 18.9375 2.609375 
+Q 20.3125 3.328125 20.84375 4.515625 
+Q 21.390625 5.71875 21.390625 11.671875 
+L 21.390625 47.40625 
+Q 21.390625 54.640625 20.90625 56.6875 
+Q 20.5625 58.25 19.65625 58.984375 
+Q 18.75 59.71875 17.484375 59.71875 
+Q 15.671875 59.71875 12.453125 58.203125 
+z
+" id="TimesNewRomanPSMT-31"/>
+      </defs>
+      <g transform="translate(78.4445 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-31"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_5">
+      <path clip-path="url(#p9778b8a2e2)" d="M 124.1565 292.644 
+L 124.1565 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_6">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="124.1565" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 0.2 -->
+      <defs>
+       <path d="M 45.84375 12.75 
+L 41.21875 0 
+L 2.15625 0 
+L 2.15625 1.8125 
+Q 19.390625 17.53125 26.421875 27.484375 
+Q 33.453125 37.453125 33.453125 45.703125 
+Q 33.453125 52 29.59375 56.046875 
+Q 25.734375 60.109375 20.359375 60.109375 
+Q 15.484375 60.109375 11.59375 57.25 
+Q 7.71875 54.390625 5.859375 48.875 
+L 4.046875 48.875 
+Q 5.28125 57.90625 10.328125 62.734375 
+Q 15.375 67.578125 22.953125 67.578125 
+Q 31 67.578125 36.390625 62.40625 
+Q 41.796875 57.234375 41.796875 50.203125 
+Q 41.796875 45.171875 39.453125 40.140625 
+Q 35.84375 32.234375 27.734375 23.390625 
+Q 15.578125 10.109375 12.546875 7.375 
+L 29.828125 7.375 
+Q 35.109375 7.375 37.234375 7.765625 
+Q 39.359375 8.15625 41.0625 9.34375 
+Q 42.78125 10.546875 44.046875 12.75 
+z
+" id="TimesNewRomanPSMT-32"/>
+      </defs>
+      <g transform="translate(114.1565 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_7">
+      <path clip-path="url(#p9778b8a2e2)" d="M 159.8685 292.644 
+L 159.8685 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_8">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="159.8685" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 0.3 -->
+      <defs>
+       <path d="M 5.078125 53.609375 
+Q 7.90625 60.296875 12.21875 63.9375 
+Q 16.546875 67.578125 23 67.578125 
+Q 30.953125 67.578125 35.203125 62.40625 
+Q 38.421875 58.546875 38.421875 54.15625 
+Q 38.421875 46.921875 29.34375 39.203125 
+Q 35.453125 36.8125 38.578125 32.375 
+Q 41.703125 27.9375 41.703125 21.921875 
+Q 41.703125 13.328125 36.234375 7.03125 
+Q 29.109375 -1.171875 15.578125 -1.171875 
+Q 8.890625 -1.171875 6.46875 0.484375 
+Q 4.046875 2.15625 4.046875 4.046875 
+Q 4.046875 5.46875 5.1875 6.546875 
+Q 6.34375 7.625 7.953125 7.625 
+Q 9.1875 7.625 10.453125 7.234375 
+Q 11.28125 6.984375 14.203125 5.4375 
+Q 17.140625 3.90625 18.265625 3.609375 
+Q 20.0625 3.078125 22.125 3.078125 
+Q 27.09375 3.078125 30.78125 6.9375 
+Q 34.46875 10.796875 34.46875 16.0625 
+Q 34.46875 19.921875 32.765625 23.578125 
+Q 31.5 26.3125 29.984375 27.734375 
+Q 27.875 29.6875 24.21875 31.265625 
+Q 20.5625 32.859375 16.75 32.859375 
+L 15.1875 32.859375 
+L 15.1875 34.328125 
+Q 19.046875 34.8125 22.921875 37.109375 
+Q 26.8125 39.40625 28.5625 42.625 
+Q 30.328125 45.84375 30.328125 49.703125 
+Q 30.328125 54.734375 27.171875 57.828125 
+Q 24.03125 60.9375 19.34375 60.9375 
+Q 11.765625 60.9375 6.6875 52.828125 
+z
+" id="TimesNewRomanPSMT-33"/>
+      </defs>
+      <g transform="translate(149.8685 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_9">
+      <path clip-path="url(#p9778b8a2e2)" d="M 195.5805 292.644 
+L 195.5805 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_10">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="195.5805" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 0.4 -->
+      <defs>
+       <path d="M 46.53125 24.421875 
+L 46.53125 17.484375 
+L 37.640625 17.484375 
+L 37.640625 0 
+L 29.59375 0 
+L 29.59375 17.484375 
+L 1.5625 17.484375 
+L 1.5625 23.734375 
+L 32.28125 67.578125 
+L 37.640625 67.578125 
+L 37.640625 24.421875 
+z
+M 29.59375 24.421875 
+L 29.59375 57.28125 
+L 6.34375 24.421875 
+z
+" id="TimesNewRomanPSMT-34"/>
+      </defs>
+      <g transform="translate(185.5805 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_11">
+      <path clip-path="url(#p9778b8a2e2)" d="M 231.2925 292.644 
+L 231.2925 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_12">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="231.2925" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 0.5 -->
+      <defs>
+       <path d="M 43.40625 66.21875 
+L 39.59375 57.90625 
+L 19.671875 57.90625 
+L 15.328125 49.03125 
+Q 28.265625 47.125 35.84375 39.40625 
+Q 42.328125 32.765625 42.328125 23.78125 
+Q 42.328125 18.5625 40.203125 14.109375 
+Q 38.09375 9.671875 34.859375 6.546875 
+Q 31.640625 3.421875 27.6875 1.515625 
+Q 22.078125 -1.171875 16.15625 -1.171875 
+Q 10.203125 -1.171875 7.484375 0.84375 
+Q 4.78125 2.875 4.78125 5.328125 
+Q 4.78125 6.6875 5.90625 7.734375 
+Q 7.03125 8.796875 8.734375 8.796875 
+Q 10.015625 8.796875 10.96875 8.40625 
+Q 11.921875 8.015625 14.203125 6.390625 
+Q 17.875 3.859375 21.625 3.859375 
+Q 27.34375 3.859375 31.65625 8.171875 
+Q 35.984375 12.5 35.984375 18.703125 
+Q 35.984375 24.703125 32.125 29.90625 
+Q 28.265625 35.109375 21.484375 37.9375 
+Q 16.15625 40.140625 6.984375 40.484375 
+L 19.671875 66.21875 
+z
+" id="TimesNewRomanPSMT-35"/>
+      </defs>
+      <g transform="translate(221.2925 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-35"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_13">
+      <path clip-path="url(#p9778b8a2e2)" d="M 267.0045 292.644 
+L 267.0045 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_14">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="267.0045" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 0.6 -->
+      <defs>
+       <path d="M 44.828125 67.578125 
+L 44.828125 65.765625 
+Q 38.375 65.140625 34.296875 63.203125 
+Q 30.21875 61.28125 26.234375 57.328125 
+Q 22.265625 53.375 19.65625 48.515625 
+Q 17.046875 43.65625 15.28125 36.96875 
+Q 22.3125 41.796875 29.390625 41.796875 
+Q 36.1875 41.796875 41.15625 36.328125 
+Q 46.140625 30.859375 46.140625 22.265625 
+Q 46.140625 13.96875 41.109375 7.125 
+Q 35.0625 -1.171875 25.09375 -1.171875 
+Q 18.3125 -1.171875 13.578125 3.328125 
+Q 4.296875 12.0625 4.296875 25.984375 
+Q 4.296875 34.859375 7.859375 42.859375 
+Q 11.421875 50.875 18.03125 57.078125 
+Q 24.65625 63.28125 30.703125 65.421875 
+Q 36.765625 67.578125 42 67.578125 
+z
+M 14.453125 33.40625 
+Q 13.578125 26.8125 13.578125 22.75 
+Q 13.578125 18.0625 15.3125 12.5625 
+Q 17.046875 7.078125 20.453125 3.859375 
+Q 22.953125 1.5625 26.515625 1.5625 
+Q 30.765625 1.5625 34.109375 5.5625 
+Q 37.453125 9.578125 37.453125 17 
+Q 37.453125 25.34375 34.125 31.4375 
+Q 30.8125 37.546875 24.703125 37.546875 
+Q 22.859375 37.546875 20.734375 36.765625 
+Q 18.609375 35.984375 14.453125 33.40625 
+z
+" id="TimesNewRomanPSMT-36"/>
+      </defs>
+      <g transform="translate(257.0045 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_15">
+      <path clip-path="url(#p9778b8a2e2)" d="M 302.7165 292.644 
+L 302.7165 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_16">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="302.7165" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 0.7 -->
+      <defs>
+       <path d="M 10.0625 66.21875 
+L 45.5625 66.21875 
+L 45.5625 64.359375 
+L 23.484375 -1.375 
+L 18.015625 -1.375 
+L 37.796875 58.25 
+L 19.578125 58.25 
+Q 14.0625 58.25 11.71875 56.9375 
+Q 7.625 54.6875 5.125 50 
+L 3.71875 50.53125 
+z
+" id="TimesNewRomanPSMT-37"/>
+      </defs>
+      <g transform="translate(292.7165 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-37"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_17">
+      <path clip-path="url(#p9778b8a2e2)" d="M 338.4285 292.644 
+L 338.4285 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_18">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="338.4285" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 0.8 -->
+      <defs>
+       <path d="M 19.1875 33.34375 
+Q 11.328125 39.796875 9.046875 43.703125 
+Q 6.78125 47.609375 6.78125 51.8125 
+Q 6.78125 58.25 11.765625 62.90625 
+Q 16.75 67.578125 25 67.578125 
+Q 33.015625 67.578125 37.890625 63.234375 
+Q 42.78125 58.890625 42.78125 53.328125 
+Q 42.78125 49.609375 40.140625 45.75 
+Q 37.5 41.890625 29.15625 36.671875 
+Q 37.75 30.03125 40.53125 26.21875 
+Q 44.234375 21.234375 44.234375 15.71875 
+Q 44.234375 8.734375 38.90625 3.78125 
+Q 33.59375 -1.171875 24.953125 -1.171875 
+Q 15.53125 -1.171875 10.25 4.734375 
+Q 6.0625 9.46875 6.0625 15.09375 
+Q 6.0625 19.484375 9.015625 23.796875 
+Q 11.96875 28.125 19.1875 33.34375 
+z
+M 26.859375 38.578125 
+Q 32.71875 43.84375 34.28125 46.890625 
+Q 35.84375 49.953125 35.84375 53.8125 
+Q 35.84375 58.9375 32.953125 61.84375 
+Q 30.078125 64.75 25.09375 64.75 
+Q 20.125 64.75 17 61.859375 
+Q 13.875 58.984375 13.875 55.125 
+Q 13.875 52.59375 15.15625 50.046875 
+Q 16.453125 47.515625 18.84375 45.21875 
+z
+M 21.484375 31.5 
+Q 17.4375 28.078125 15.484375 24.046875 
+Q 13.53125 20.015625 13.53125 15.328125 
+Q 13.53125 9.03125 16.96875 5.25 
+Q 20.40625 1.46875 25.734375 1.46875 
+Q 31 1.46875 34.171875 4.4375 
+Q 37.359375 7.421875 37.359375 11.671875 
+Q 37.359375 15.1875 35.5 17.96875 
+Q 32.03125 23.140625 21.484375 31.5 
+z
+" id="TimesNewRomanPSMT-38"/>
+      </defs>
+      <g transform="translate(328.4285 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_10">
+     <g id="line2d_19">
+      <path clip-path="url(#p9778b8a2e2)" d="M 374.1405 292.644 
+L 374.1405 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_20">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="374.1405" xlink:href="#m9ad32805f6" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 0.9 -->
+      <defs>
+       <path d="M 5.28125 -1.375 
+L 5.28125 0.4375 
+Q 11.625 0.53125 17.09375 3.390625 
+Q 22.5625 6.25 27.65625 13.375 
+Q 32.765625 20.515625 34.765625 29.046875 
+Q 27.09375 24.125 20.90625 24.125 
+Q 13.921875 24.125 8.9375 29.515625 
+Q 3.953125 34.90625 3.953125 43.84375 
+Q 3.953125 52.546875 8.9375 59.328125 
+Q 14.9375 67.578125 24.609375 67.578125 
+Q 32.765625 67.578125 38.578125 60.84375 
+Q 45.703125 52.484375 45.703125 40.234375 
+Q 45.703125 29.203125 40.28125 19.65625 
+Q 34.859375 10.109375 25.203125 3.8125 
+Q 17.328125 -1.375 8.0625 -1.375 
+z
+M 35.546875 32.671875 
+Q 36.421875 39.015625 36.421875 42.828125 
+Q 36.421875 47.5625 34.8125 53.046875 
+Q 33.203125 58.546875 30.25 61.46875 
+Q 27.296875 64.40625 23.53125 64.40625 
+Q 19.1875 64.40625 15.90625 60.5 
+Q 12.640625 56.59375 12.640625 48.875 
+Q 12.640625 38.578125 17 32.765625 
+Q 20.171875 28.5625 24.8125 28.5625 
+Q 27.046875 28.5625 30.125 29.640625 
+Q 33.203125 30.71875 35.546875 32.671875 
+z
+" id="TimesNewRomanPSMT-39"/>
+      </defs>
+      <g transform="translate(364.1405 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_11">
+     <!-- Recall -->
+     <defs>
+      <path d="M 67.578125 0 
+L 49.90625 0 
+L 27.484375 30.953125 
+Q 25 30.859375 23.4375 30.859375 
+Q 22.796875 30.859375 22.0625 30.875 
+Q 21.34375 30.90625 20.5625 30.953125 
+L 20.5625 11.71875 
+Q 20.5625 5.46875 21.921875 3.953125 
+Q 23.78125 1.8125 27.484375 1.8125 
+L 30.078125 1.8125 
+L 30.078125 0 
+L 1.703125 0 
+L 1.703125 1.8125 
+L 4.203125 1.8125 
+Q 8.40625 1.8125 10.203125 4.546875 
+Q 11.234375 6.0625 11.234375 11.71875 
+L 11.234375 54.5 
+Q 11.234375 60.75 9.859375 62.25 
+Q 7.953125 64.40625 4.203125 64.40625 
+L 1.703125 64.40625 
+L 1.703125 66.21875 
+L 25.828125 66.21875 
+Q 36.375 66.21875 41.375 64.671875 
+Q 46.390625 63.140625 49.875 59.015625 
+Q 53.375 54.890625 53.375 49.171875 
+Q 53.375 43.0625 49.390625 38.5625 
+Q 45.40625 34.078125 37.0625 32.234375 
+L 50.734375 13.234375 
+Q 55.421875 6.6875 58.78125 4.53125 
+Q 62.15625 2.390625 67.578125 1.8125 
+z
+M 20.5625 34.03125 
+Q 21.484375 34.03125 22.171875 34 
+Q 22.859375 33.984375 23.296875 33.984375 
+Q 32.765625 33.984375 37.578125 38.078125 
+Q 42.390625 42.1875 42.390625 48.53125 
+Q 42.390625 54.734375 38.5 58.609375 
+Q 34.625 62.5 28.21875 62.5 
+Q 25.390625 62.5 20.5625 61.578125 
+z
+" id="TimesNewRomanPSMT-52"/>
+      <path d="M 10.640625 27.875 
+Q 10.59375 17.921875 15.484375 12.25 
+Q 20.359375 6.59375 26.953125 6.59375 
+Q 31.34375 6.59375 34.59375 9 
+Q 37.84375 11.421875 40.046875 17.28125 
+L 41.546875 16.3125 
+Q 40.53125 9.625 35.59375 4.125 
+Q 30.671875 -1.375 23.25 -1.375 
+Q 15.1875 -1.375 9.453125 4.90625 
+Q 3.71875 11.1875 3.71875 21.78125 
+Q 3.71875 33.25 9.59375 39.671875 
+Q 15.484375 46.09375 24.359375 46.09375 
+Q 31.890625 46.09375 36.71875 41.140625 
+Q 41.546875 36.1875 41.546875 27.875 
+z
+M 10.640625 30.71875 
+L 31.34375 30.71875 
+Q 31.109375 35.015625 30.328125 36.765625 
+Q 29.109375 39.5 26.6875 41.0625 
+Q 24.265625 42.625 21.625 42.625 
+Q 17.578125 42.625 14.375 39.46875 
+Q 11.1875 36.328125 10.640625 30.71875 
+z
+" id="TimesNewRomanPSMT-65"/>
+      <path d="M 41.109375 17 
+Q 39.3125 8.15625 34.03125 3.390625 
+Q 28.765625 -1.375 22.359375 -1.375 
+Q 14.75 -1.375 9.078125 5.015625 
+Q 3.421875 11.421875 3.421875 22.3125 
+Q 3.421875 32.859375 9.6875 39.453125 
+Q 15.96875 46.046875 24.75 46.046875 
+Q 31.34375 46.046875 35.59375 42.546875 
+Q 39.84375 39.0625 39.84375 35.296875 
+Q 39.84375 33.453125 38.640625 32.296875 
+Q 37.453125 31.15625 35.296875 31.15625 
+Q 32.421875 31.15625 30.953125 33.015625 
+Q 30.125 34.03125 29.859375 36.90625 
+Q 29.59375 39.796875 27.875 41.3125 
+Q 26.171875 42.78125 23.140625 42.78125 
+Q 18.265625 42.78125 15.28125 39.15625 
+Q 11.328125 34.375 11.328125 26.515625 
+Q 11.328125 18.5 15.25 12.375 
+Q 19.1875 6.25 25.875 6.25 
+Q 30.671875 6.25 34.46875 9.515625 
+Q 37.15625 11.765625 39.703125 17.671875 
+z
+" id="TimesNewRomanPSMT-63"/>
+      <path d="M 28.46875 6.453125 
+Q 21.578125 1.125 19.828125 0.296875 
+Q 17.1875 -0.921875 14.203125 -0.921875 
+Q 9.578125 -0.921875 6.5625 2.25 
+Q 3.5625 5.421875 3.5625 10.59375 
+Q 3.5625 13.875 5.03125 16.265625 
+Q 7.03125 19.578125 11.984375 22.5 
+Q 16.9375 25.4375 28.46875 29.640625 
+L 28.46875 31.390625 
+Q 28.46875 38.09375 26.34375 40.578125 
+Q 24.21875 43.0625 20.171875 43.0625 
+Q 17.09375 43.0625 15.28125 41.40625 
+Q 13.421875 39.75 13.421875 37.59375 
+L 13.53125 34.765625 
+Q 13.53125 32.515625 12.375 31.296875 
+Q 11.234375 30.078125 9.375 30.078125 
+Q 7.5625 30.078125 6.421875 31.34375 
+Q 5.28125 32.625 5.28125 34.8125 
+Q 5.28125 39.015625 9.578125 42.53125 
+Q 13.875 46.046875 21.625 46.046875 
+Q 27.59375 46.046875 31.390625 44.046875 
+Q 34.28125 42.53125 35.640625 39.3125 
+Q 36.53125 37.203125 36.53125 30.71875 
+L 36.53125 15.53125 
+Q 36.53125 9.125 36.765625 7.6875 
+Q 37.015625 6.25 37.578125 5.765625 
+Q 38.140625 5.28125 38.875 5.28125 
+Q 39.65625 5.28125 40.234375 5.609375 
+Q 41.265625 6.25 44.1875 9.1875 
+L 44.1875 6.453125 
+Q 38.71875 -0.875 33.734375 -0.875 
+Q 31.34375 -0.875 29.921875 0.78125 
+Q 28.515625 2.4375 28.46875 6.453125 
+z
+M 28.46875 9.625 
+L 28.46875 26.65625 
+Q 21.09375 23.734375 18.953125 22.515625 
+Q 15.09375 20.359375 13.421875 18.015625 
+Q 11.765625 15.671875 11.765625 12.890625 
+Q 11.765625 9.375 13.859375 7.046875 
+Q 15.96875 4.734375 18.703125 4.734375 
+Q 22.40625 4.734375 28.46875 9.625 
+z
+" id="TimesNewRomanPSMT-61"/>
+      <path d="M 18.5 69.4375 
+L 18.5 10.109375 
+Q 18.5 5.90625 19.109375 4.53125 
+Q 19.734375 3.171875 21 2.46875 
+Q 22.265625 1.765625 25.734375 1.765625 
+L 25.734375 0 
+L 3.8125 0 
+L 3.8125 1.765625 
+Q 6.890625 1.765625 8 2.390625 
+Q 9.125 3.03125 9.765625 4.484375 
+Q 10.40625 5.953125 10.40625 10.109375 
+L 10.40625 50.734375 
+Q 10.40625 58.296875 10.0625 60.03125 
+Q 9.71875 61.765625 8.953125 62.390625 
+Q 8.203125 63.03125 7.03125 63.03125 
+Q 5.765625 63.03125 3.8125 62.25 
+L 2.984375 63.96875 
+L 16.3125 69.4375 
+z
+" id="TimesNewRomanPSMT-6c"/>
+     </defs>
+     <g transform="translate(210.8575 329.2865)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-52"/>
+      <use x="66.699219" xlink:href="#TimesNewRomanPSMT-65"/>
+      <use x="111.083984" xlink:href="#TimesNewRomanPSMT-63"/>
+      <use x="155.46875" xlink:href="#TimesNewRomanPSMT-61"/>
+      <use x="199.853516" xlink:href="#TimesNewRomanPSMT-6c"/>
+      <use x="227.636719" xlink:href="#TimesNewRomanPSMT-6c"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_21">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 292.644 
+L 409.8525 292.644 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_22">
+      <defs>
+       <path d="M 0 0 
+L -3.5 0 
+" id="mc00a64c264" style="stroke:#000000;stroke-width:0.8;"/>
+      </defs>
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 0.0 -->
+      <g transform="translate(25.7325 298.199)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_23">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 266.0328 
+L 409.8525 266.0328 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_24">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="266.0328"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 0.1 -->
+      <g transform="translate(25.7325 271.5878)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-31"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_25">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 239.4216 
+L 409.8525 239.4216 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_26">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="239.4216"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 0.2 -->
+      <g transform="translate(25.7325 244.9766)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_27">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 212.8104 
+L 409.8525 212.8104 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_28">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="212.8104"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 0.3 -->
+      <g transform="translate(25.7325 218.3654)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-33"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_29">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 186.1992 
+L 409.8525 186.1992 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_30">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="186.1992"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 0.4 -->
+      <g transform="translate(25.7325 191.7542)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_31">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 159.588 
+L 409.8525 159.588 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_32">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="159.588"/>
+      </g>
+     </g>
+     <g id="text_17">
+      <!-- 0.5 -->
+      <g transform="translate(25.7325 165.143)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-35"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_33">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 132.9768 
+L 409.8525 132.9768 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_34">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="132.9768"/>
+      </g>
+     </g>
+     <g id="text_18">
+      <!-- 0.6 -->
+      <g transform="translate(25.7325 138.5318)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_35">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 106.3656 
+L 409.8525 106.3656 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_36">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="106.3656"/>
+      </g>
+     </g>
+     <g id="text_19">
+      <!-- 0.7 -->
+      <g transform="translate(25.7325 111.9206)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-37"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_9">
+     <g id="line2d_37">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 79.7544 
+L 409.8525 79.7544 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_38">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="79.7544"/>
+      </g>
+     </g>
+     <g id="text_20">
+      <!-- 0.8 -->
+      <g transform="translate(25.7325 85.3094)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-38"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_10">
+     <g id="line2d_39">
+      <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 53.1432 
+L 409.8525 53.1432 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_40">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#mc00a64c264" y="53.1432"/>
+      </g>
+     </g>
+     <g id="text_21">
+      <!-- 0.9 -->
+      <g transform="translate(25.7325 58.6982)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-30"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-2e"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-39"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_22">
+     <!-- Precision -->
+     <defs>
+      <path d="M 20.515625 31 
+L 20.515625 11.71875 
+Q 20.515625 5.46875 21.875 3.953125 
+Q 23.734375 1.8125 27.484375 1.8125 
+L 30.03125 1.8125 
+L 30.03125 0 
+L 1.65625 0 
+L 1.65625 1.8125 
+L 4.15625 1.8125 
+Q 8.34375 1.8125 10.15625 4.546875 
+Q 11.140625 6.0625 11.140625 11.71875 
+L 11.140625 54.5 
+Q 11.140625 60.75 9.8125 62.25 
+Q 7.90625 64.40625 4.15625 64.40625 
+L 1.65625 64.40625 
+L 1.65625 66.21875 
+L 25.921875 66.21875 
+Q 34.8125 66.21875 39.9375 64.375 
+Q 45.0625 62.546875 48.578125 58.203125 
+Q 52.09375 53.859375 52.09375 47.90625 
+Q 52.09375 39.796875 46.75 34.71875 
+Q 41.40625 29.640625 31.640625 29.640625 
+Q 29.25 29.640625 26.46875 29.984375 
+Q 23.6875 30.328125 20.515625 31 
+z
+M 20.515625 33.796875 
+Q 23.09375 33.296875 25.09375 33.046875 
+Q 27.09375 32.8125 28.515625 32.8125 
+Q 33.59375 32.8125 37.28125 36.734375 
+Q 40.96875 40.671875 40.96875 46.921875 
+Q 40.96875 51.21875 39.203125 54.90625 
+Q 37.453125 58.59375 34.21875 60.421875 
+Q 31 62.25 26.90625 62.25 
+Q 24.421875 62.25 20.515625 61.328125 
+z
+" id="TimesNewRomanPSMT-50"/>
+      <path d="M 16.21875 46.046875 
+L 16.21875 35.984375 
+Q 21.828125 46.046875 27.734375 46.046875 
+Q 30.421875 46.046875 32.171875 44.40625 
+Q 33.9375 42.78125 33.9375 40.625 
+Q 33.9375 38.71875 32.65625 37.390625 
+Q 31.390625 36.078125 29.640625 36.078125 
+Q 27.9375 36.078125 25.8125 37.765625 
+Q 23.6875 39.453125 22.65625 39.453125 
+Q 21.78125 39.453125 20.75 38.484375 
+Q 18.5625 36.46875 16.21875 31.890625 
+L 16.21875 10.453125 
+Q 16.21875 6.734375 17.140625 4.828125 
+Q 17.78125 3.515625 19.390625 2.640625 
+Q 21 1.765625 24.03125 1.765625 
+L 24.03125 0 
+L 1.125 0 
+L 1.125 1.765625 
+Q 4.546875 1.765625 6.203125 2.828125 
+Q 7.421875 3.609375 7.90625 5.328125 
+Q 8.15625 6.15625 8.15625 10.0625 
+L 8.15625 27.390625 
+Q 8.15625 35.203125 7.828125 36.6875 
+Q 7.515625 38.1875 6.65625 38.859375 
+Q 5.8125 39.546875 4.546875 39.546875 
+Q 3.03125 39.546875 1.125 38.8125 
+L 0.640625 40.578125 
+L 14.15625 46.046875 
+z
+" id="TimesNewRomanPSMT-72"/>
+      <path d="M 14.5 69.4375 
+Q 16.546875 69.4375 17.984375 67.984375 
+Q 19.4375 66.546875 19.4375 64.5 
+Q 19.4375 62.453125 17.984375 60.984375 
+Q 16.546875 59.515625 14.5 59.515625 
+Q 12.453125 59.515625 10.984375 60.984375 
+Q 9.515625 62.453125 9.515625 64.5 
+Q 9.515625 66.546875 10.953125 67.984375 
+Q 12.40625 69.4375 14.5 69.4375 
+z
+M 18.5625 46.046875 
+L 18.5625 10.109375 
+Q 18.5625 5.90625 19.171875 4.515625 
+Q 19.78125 3.125 20.96875 2.4375 
+Q 22.171875 1.765625 25.34375 1.765625 
+L 25.34375 0 
+L 3.609375 0 
+L 3.609375 1.765625 
+Q 6.890625 1.765625 8 2.390625 
+Q 9.125 3.03125 9.78125 4.484375 
+Q 10.453125 5.953125 10.453125 10.109375 
+L 10.453125 27.34375 
+Q 10.453125 34.625 10.015625 36.765625 
+Q 9.671875 38.328125 8.9375 38.9375 
+Q 8.203125 39.546875 6.9375 39.546875 
+Q 5.5625 39.546875 3.609375 38.8125 
+L 2.9375 40.578125 
+L 16.40625 46.046875 
+z
+" id="TimesNewRomanPSMT-69"/>
+      <path d="M 32.03125 46.046875 
+L 32.03125 30.8125 
+L 30.421875 30.8125 
+Q 28.5625 37.984375 25.65625 40.578125 
+Q 22.75 43.171875 18.265625 43.171875 
+Q 14.84375 43.171875 12.734375 41.359375 
+Q 10.640625 39.546875 10.640625 37.359375 
+Q 10.640625 34.625 12.203125 32.671875 
+Q 13.71875 30.671875 18.359375 28.421875 
+L 25.484375 24.953125 
+Q 35.40625 20.125 35.40625 12.203125 
+Q 35.40625 6.109375 30.78125 2.359375 
+Q 26.171875 -1.375 20.453125 -1.375 
+Q 16.359375 -1.375 11.078125 0.09375 
+Q 9.46875 0.59375 8.453125 0.59375 
+Q 7.328125 0.59375 6.6875 -0.6875 
+L 5.078125 -0.6875 
+L 5.078125 15.28125 
+L 6.6875 15.28125 
+Q 8.0625 8.453125 11.90625 4.984375 
+Q 15.765625 1.515625 20.5625 1.515625 
+Q 23.921875 1.515625 26.046875 3.484375 
+Q 28.171875 5.46875 28.171875 8.25 
+Q 28.171875 11.625 25.796875 13.921875 
+Q 23.4375 16.21875 16.359375 19.734375 
+Q 9.28125 23.25 7.078125 26.078125 
+Q 4.890625 28.859375 4.890625 33.109375 
+Q 4.890625 38.625 8.671875 42.328125 
+Q 12.453125 46.046875 18.453125 46.046875 
+Q 21.09375 46.046875 24.859375 44.921875 
+Q 27.34375 44.1875 28.171875 44.1875 
+Q 28.953125 44.1875 29.390625 44.53125 
+Q 29.828125 44.875 30.421875 46.046875 
+z
+" id="TimesNewRomanPSMT-73"/>
+      <path d="M 25 46.046875 
+Q 35.15625 46.046875 41.3125 38.328125 
+Q 46.53125 31.734375 46.53125 23.1875 
+Q 46.53125 17.1875 43.640625 11.03125 
+Q 40.765625 4.890625 35.71875 1.75 
+Q 30.671875 -1.375 24.46875 -1.375 
+Q 14.359375 -1.375 8.40625 6.6875 
+Q 3.375 13.484375 3.375 21.921875 
+Q 3.375 28.078125 6.421875 34.15625 
+Q 9.46875 40.234375 14.453125 43.140625 
+Q 19.4375 46.046875 25 46.046875 
+z
+M 23.484375 42.875 
+Q 20.90625 42.875 18.28125 41.328125 
+Q 15.671875 39.796875 14.0625 35.9375 
+Q 12.453125 32.078125 12.453125 26.03125 
+Q 12.453125 16.265625 16.328125 9.171875 
+Q 20.21875 2.09375 26.5625 2.09375 
+Q 31.296875 2.09375 34.375 6 
+Q 37.453125 9.90625 37.453125 19.4375 
+Q 37.453125 31.34375 32.328125 38.1875 
+Q 28.859375 42.875 23.484375 42.875 
+z
+" id="TimesNewRomanPSMT-6f"/>
+      <path d="M 16.15625 36.578125 
+Q 24.03125 46.046875 31.15625 46.046875 
+Q 34.8125 46.046875 37.453125 44.21875 
+Q 40.09375 42.390625 41.65625 38.1875 
+Q 42.71875 35.25 42.71875 29.203125 
+L 42.71875 10.109375 
+Q 42.71875 5.859375 43.40625 4.34375 
+Q 43.953125 3.125 45.140625 2.4375 
+Q 46.34375 1.765625 49.5625 1.765625 
+L 49.5625 0 
+L 27.4375 0 
+L 27.4375 1.765625 
+L 28.375 1.765625 
+Q 31.5 1.765625 32.734375 2.703125 
+Q 33.984375 3.65625 34.46875 5.515625 
+Q 34.671875 6.25 34.671875 10.109375 
+L 34.671875 28.421875 
+Q 34.671875 34.515625 33.078125 37.28125 
+Q 31.5 40.046875 27.734375 40.046875 
+Q 21.921875 40.046875 16.15625 33.6875 
+L 16.15625 10.109375 
+Q 16.15625 5.5625 16.703125 4.5 
+Q 17.390625 3.078125 18.578125 2.421875 
+Q 19.78125 1.765625 23.4375 1.765625 
+L 23.4375 0 
+L 1.3125 0 
+L 1.3125 1.765625 
+L 2.296875 1.765625 
+Q 5.71875 1.765625 6.90625 3.484375 
+Q 8.109375 5.21875 8.109375 10.109375 
+L 8.109375 26.703125 
+Q 8.109375 34.765625 7.734375 36.515625 
+Q 7.375 38.28125 6.609375 38.90625 
+Q 5.859375 39.546875 4.59375 39.546875 
+Q 3.21875 39.546875 1.3125 38.8125 
+L 0.59375 40.578125 
+L 14.0625 46.046875 
+L 16.15625 46.046875 
+z
+" id="TimesNewRomanPSMT-6e"/>
+     </defs>
+     <g transform="translate(18.31 189.36175)rotate(-90)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-50"/>
+      <use x="55.615234" xlink:href="#TimesNewRomanPSMT-72"/>
+      <use x="88.916016" xlink:href="#TimesNewRomanPSMT-65"/>
+      <use x="133.300781" xlink:href="#TimesNewRomanPSMT-63"/>
+      <use x="177.685547" xlink:href="#TimesNewRomanPSMT-69"/>
+      <use x="205.46875" xlink:href="#TimesNewRomanPSMT-73"/>
+      <use x="244.384766" xlink:href="#TimesNewRomanPSMT-69"/>
+      <use x="272.167969" xlink:href="#TimesNewRomanPSMT-6f"/>
+      <use x="322.167969" xlink:href="#TimesNewRomanPSMT-6e"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_41">
+    <path clip-path="url(#p9778b8a2e2)" d="M 55.799054 64.092124 
+L 58.865608 65.799941 
+L 61.932162 68.189646 
+L 64.998715 70.608743 
+L 68.065269 72.611665 
+L 71.131823 74.229962 
+L 74.198377 75.562199 
+L 77.264931 76.706941 
+L 80.331485 77.762369 
+L 83.398039 78.793517 
+L 86.464593 79.807216 
+L 89.531146 80.804401 
+L 92.5977 81.786004 
+L 95.664254 82.752961 
+L 98.730808 83.706204 
+L 101.797362 84.646667 
+L 104.863916 85.575285 
+L 107.93047 86.492991 
+L 110.997023 87.400613 
+L 114.063577 88.298622 
+L 117.130131 89.187418 
+L 120.196685 90.067399 
+L 123.263239 90.938965 
+L 126.329793 91.802514 
+L 129.396347 92.658447 
+L 132.4629 93.50716 
+L 135.529454 94.349055 
+L 138.596008 95.184528 
+L 141.662562 96.013981 
+L 144.729116 96.837811 
+L 147.79567 97.656417 
+L 150.862224 98.470199 
+L 153.928778 99.279555 
+L 156.995331 100.084885 
+L 160.061885 100.886587 
+L 163.128439 101.68506 
+L 166.194993 102.480704 
+L 169.261547 103.273917 
+L 172.328101 104.065099 
+L 175.394655 104.854648 
+L 178.461208 105.642963 
+L 181.527762 106.430444 
+L 184.594316 107.217488 
+L 187.66087 108.004497 
+L 190.727424 108.791867 
+L 193.793978 109.579998 
+L 196.860532 110.36929 
+L 199.927086 111.160141 
+L 202.993639 111.95295 
+L 206.060193 112.748117 
+L 209.126747 113.546039 
+L 212.193301 114.347117 
+L 215.259855 115.151749 
+L 218.326409 115.960334 
+L 221.392963 116.773271 
+L 224.459516 117.590959 
+L 227.52607 118.413797 
+L 230.592624 119.242184 
+L 233.659178 120.076519 
+L 236.725732 120.917201 
+L 239.792286 121.764629 
+L 242.85884 122.619202 
+L 245.925394 123.481319 
+L 248.991947 124.351379 
+L 252.058501 125.229781 
+L 255.125055 126.116924 
+L 258.191609 127.013207 
+L 261.258163 127.919028 
+L 264.324717 128.834788 
+L 267.391271 129.760884 
+L 270.457824 130.697716 
+L 273.524378 131.645964 
+L 276.590932 132.607412 
+L 279.657486 133.584113 
+L 282.72404 134.57812 
+L 285.790594 135.591485 
+L 288.857148 136.626263 
+L 291.923701 137.684506 
+L 294.990255 138.768267 
+L 298.056809 139.8796 
+L 301.123363 141.020558 
+L 304.189917 142.193193 
+L 307.256471 143.399559 
+L 310.323025 144.641709 
+L 313.389579 145.921697 
+L 316.456132 147.241574 
+L 319.522686 148.603395 
+L 322.58924 150.009213 
+L 325.655794 151.46108 
+L 328.722348 152.961051 
+L 331.788902 154.511177 
+L 334.855456 156.113512 
+L 337.922009 157.77011 
+L 340.988563 159.483022 
+L 344.055117 161.254304 
+L 347.121671 163.086007 
+L 350.188225 164.980184 
+L 353.254779 166.93889 
+L 356.321333 168.964176 
+" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:3;"/>
+   </g>
+   <g id="line2d_42">
+    <path clip-path="url(#p9778b8a2e2)" d="M 52.7325 68.834926 
+L 55.893305 68.836233 
+L 59.054111 68.837483 
+L 62.214916 68.838677 
+L 65.375721 68.839814 
+L 68.536526 68.840894 
+L 71.697332 68.841918 
+L 74.858137 68.842885 
+L 78.018942 68.843795 
+L 81.179748 68.844649 
+L 84.340553 68.845446 
+L 87.501358 68.846187 
+L 90.662164 68.846871 
+L 93.822969 68.847498 
+L 96.983774 68.848069 
+L 100.144579 68.848583 
+L 103.305385 68.849041 
+L 106.46619 68.849442 
+L 109.626995 68.849786 
+L 112.787801 68.850074 
+L 115.948606 68.850305 
+L 119.109411 68.850479 
+L 122.270216 68.850597 
+L 125.431022 68.850658 
+L 128.591827 68.850662 
+L 131.752632 68.85061 
+L 134.913438 68.850502 
+L 138.074243 68.850336 
+L 141.235048 68.850114 
+L 144.395854 68.849836 
+L 147.556659 68.8495 
+L 150.717464 68.849109 
+L 153.878269 68.84866 
+L 157.039075 68.848155 
+L 160.19988 68.847593 
+L 163.360685 68.846975 
+L 166.521491 68.8463 
+L 169.682296 68.845568 
+L 172.843101 68.84478 
+L 176.003907 68.843935 
+L 179.164712 68.843034 
+L 182.325517 68.842076 
+L 185.486322 68.841061 
+L 188.647128 68.83999 
+L 191.807933 68.838862 
+L 194.968738 68.837677 
+L 198.129544 68.836436 
+L 201.290349 68.835138 
+L 204.451154 69.211515 
+L 207.611959 69.209197 
+L 210.772765 69.252573 
+L 213.93357 69.279175 
+L 217.094375 69.284816 
+L 220.255181 69.279768 
+L 223.415986 69.268805 
+L 226.576791 69.251928 
+L 229.737597 69.236121 
+L 232.898402 69.304815 
+L 236.059207 69.48233 
+L 239.220012 69.768668 
+L 242.380818 70.15271 
+L 245.541623 70.569104 
+L 248.702428 71.007177 
+L 251.863234 71.466931 
+L 255.024039 71.948364 
+L 258.184844 72.485349 
+L 261.345649 73.141953 
+L 264.506455 73.919693 
+L 267.66726 74.818571 
+L 270.828065 75.838585 
+L 273.988871 76.970205 
+L 277.149676 78.198376 
+L 280.310481 79.52291 
+L 283.471287 80.943808 
+L 286.632092 82.46107 
+L 289.792897 84.074696 
+L 292.953702 85.799655 
+L 296.114508 87.704173 
+L 299.275313 89.796651 
+L 302.436118 92.077089 
+L 305.596924 94.545487 
+L 308.757729 97.201846 
+L 311.918534 100.046164 
+L 315.07934 103.078443 
+L 318.240145 106.298681 
+L 321.40095 109.708413 
+L 324.561755 113.347437 
+L 327.722561 117.233281 
+L 330.883366 121.365945 
+L 334.044171 125.745431 
+L 337.204977 130.371737 
+L 340.365782 135.244863 
+L 343.526587 140.36481 
+L 346.687392 145.731578 
+L 349.848198 151.344197 
+L 353.009003 157.196136 
+L 356.169808 163.286181 
+L 359.330614 169.614331 
+L 362.491419 176.180586 
+L 365.652224 183.018472 
+" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:3;"/>
+   </g>
+   <g id="line2d_43">
+    <path clip-path="url(#p9778b8a2e2)" d="M 55.488273 31.95034 
+L 58.244046 33.715721 
+L 60.999819 35.078948 
+L 63.755592 36.09896 
+L 66.511365 36.834692 
+L 69.267138 37.345081 
+L 72.022912 37.689063 
+L 74.778685 37.925575 
+L 77.534458 38.113549 
+L 80.290231 38.298821 
+L 83.046004 38.485733 
+L 85.801777 38.670426 
+L 88.55755 38.84904 
+L 91.313323 39.017718 
+L 94.069096 39.172598 
+L 96.824869 39.311158 
+L 99.580642 39.439421 
+L 102.336415 39.566784 
+L 105.092189 39.702654 
+L 107.847962 39.856434 
+L 110.603735 40.037531 
+L 113.359508 40.255242 
+L 116.115281 40.513087 
+L 118.871054 40.805984 
+L 121.626827 41.128152 
+L 124.3826 41.473808 
+L 127.138373 41.83717 
+L 129.894146 42.212457 
+L 132.649919 42.593886 
+L 135.405692 42.975675 
+L 138.161466 43.352042 
+L 140.917239 43.717206 
+L 143.673012 44.065384 
+L 146.428785 44.390795 
+L 149.184558 44.688412 
+L 151.940331 44.959425 
+L 154.696104 45.208073 
+L 157.451877 45.438616 
+L 160.20765 45.655314 
+L 162.963423 45.862429 
+L 165.719196 46.06422 
+L 168.474969 46.264947 
+L 171.230743 46.468872 
+L 173.986516 46.680254 
+L 176.742289 46.903353 
+L 179.498062 47.142331 
+L 182.253835 47.399086 
+L 185.009608 47.673276 
+L 187.765381 47.964463 
+L 190.521154 48.272207 
+L 193.276927 48.596072 
+L 196.0327 48.935618 
+L 198.788473 49.290408 
+L 201.544246 49.660003 
+L 204.300019 50.043949 
+L 207.055793 50.440641 
+L 209.811566 50.84658 
+L 212.567339 51.258092 
+L 215.323112 51.671502 
+L 218.078885 52.083136 
+L 220.834658 52.489319 
+L 223.590431 52.886377 
+L 226.346204 53.272088 
+L 229.101977 53.649027 
+L 231.85775 54.020756 
+L 234.613523 54.390838 
+L 237.369296 54.762838 
+L 240.12507 55.140324 
+L 242.880843 55.527506 
+L 245.636616 55.929747 
+L 248.392389 56.352531 
+L 251.148162 56.801343 
+L 253.903935 57.281355 
+L 256.659708 57.78942 
+L 259.415481 58.313367 
+L 262.171254 58.840572 
+L 264.927027 59.35893 
+L 267.6828 59.867083 
+L 270.438573 60.373785 
+L 273.194347 60.888184 
+L 275.95012 61.41943 
+L 278.705893 61.976671 
+L 281.461666 62.569055 
+L 284.217439 63.205731 
+L 286.973212 63.895847 
+L 289.728985 64.648552 
+L 292.484758 65.472995 
+L 295.240531 66.378323 
+L 297.996304 67.373848 
+L 300.752077 68.469588 
+L 303.50785 69.675761 
+L 306.263624 71.002582 
+L 309.019397 72.460308 
+L 311.77517 74.091063 
+L 314.530943 76.026087 
+L 317.286716 78.409122 
+L 320.042489 81.299856 
+L 322.798262 84.696599 
+L 325.554035 88.812716 
+" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:3;"/>
+   </g>
+   <g id="line2d_44">
+    <path clip-path="url(#p9778b8a2e2)" d="M 56.146516 27.493391 
+L 59.560531 28.348933 
+L 62.974547 29.090527 
+L 66.388562 29.728874 
+L 69.802578 30.274675 
+L 73.216593 30.738632 
+L 76.630609 31.131445 
+L 80.044624 31.463815 
+L 83.45864 31.746444 
+L 86.872655 31.990033 
+L 90.286671 32.205284 
+L 93.700687 32.402896 
+L 97.114702 32.593572 
+L 100.528718 32.788006 
+L 103.942733 32.994128 
+L 107.356749 33.212843 
+L 110.770764 33.443958 
+L 114.18478 33.687279 
+L 117.598795 33.942611 
+L 121.012811 34.20976 
+L 124.426826 34.488533 
+L 127.840842 34.778736 
+L 131.254858 35.080174 
+L 134.668873 35.392654 
+L 138.082889 35.715982 
+L 141.496904 36.049963 
+L 144.91092 36.394404 
+L 148.324935 36.74911 
+L 151.738951 37.113888 
+L 155.152966 37.488544 
+L 158.566982 37.872884 
+L 161.980997 38.266713 
+L 165.395013 38.669838 
+L 168.809029 39.082065 
+L 172.223044 39.5032 
+L 175.63706 39.933048 
+L 179.051075 40.371416 
+L 182.465091 40.81811 
+L 185.879106 41.272936 
+L 189.293122 41.7357 
+L 192.707137 42.206208 
+L 196.121153 42.684265 
+L 199.535168 43.169679 
+L 202.949184 43.662254 
+L 206.3632 44.161798 
+L 209.777215 44.668115 
+L 213.191231 45.181012 
+L 216.605246 45.700296 
+L 220.019262 46.225771 
+L 223.433277 46.757244 
+L 226.847293 47.294522 
+L 230.261308 47.837409 
+L 233.675324 48.385712 
+L 237.089339 48.939238 
+L 240.503355 49.497806 
+L 243.917371 50.061737 
+L 247.331386 50.631987 
+L 250.745402 51.209548 
+L 254.159417 51.795413 
+L 257.573433 52.390577 
+L 260.987448 52.996034 
+L 264.401464 53.612775 
+L 267.815479 54.241796 
+L 271.229495 54.88409 
+L 274.64351 55.54065 
+L 278.057526 56.21247 
+L 281.471542 56.900543 
+L 284.885557 57.605864 
+L 288.299573 58.329425 
+L 291.713588 59.072221 
+L 295.127604 59.835244 
+L 298.541619 60.619968 
+L 301.955635 61.431803 
+L 305.36965 62.278088 
+L 308.783666 63.166174 
+L 312.197681 64.103415 
+L 315.611697 65.097163 
+L 319.025713 66.154769 
+L 322.439728 67.283586 
+L 325.853744 68.490967 
+L 329.267759 69.784265 
+L 332.681775 71.17083 
+L 336.09579 72.658016 
+L 339.509806 74.253175 
+L 342.923821 75.96366 
+L 346.337837 77.796822 
+L 349.751852 79.760014 
+L 353.165868 81.860589 
+L 356.579884 84.110092 
+L 359.993899 86.550805 
+L 363.407915 89.238683 
+L 366.82193 92.229742 
+L 370.235946 95.582001 
+L 373.649961 99.386586 
+L 377.063977 103.761839 
+L 380.477992 108.826935 
+L 383.892008 114.946996 
+L 387.306023 123.332836 
+L 390.720039 135.190371 
+" style="fill:none;stroke:#d62728;stroke-linecap:square;stroke-width:3;"/>
+   </g>
+   <g id="line2d_45">
+    <path clip-path="url(#p9778b8a2e2)" d="M 92.380108 24.5608 
+L 99.59539 180.807388 
+L 106.810671 214.2888 
+L 114.025953 228.883262 
+L 121.241235 237.05616 
+L 128.456516 242.281456 
+L 135.671798 245.910133 
+L 142.88708 248.576993 
+L 150.102361 250.619694 
+L 157.317643 252.2344 
+L 164.532924 253.542869 
+L 171.748206 254.624674 
+L 178.963488 255.534017 
+L 186.178769 256.309095 
+L 193.394051 256.9776 
+L 200.609333 257.560098 
+L 207.824614 258.072185 
+L 215.039896 258.525898 
+L 222.255178 258.930682 
+L 229.470459 259.294047 
+L 236.685741 259.622039 
+L 243.901022 259.919585 
+L 251.116304 260.190735 
+L 258.331586 260.438854 
+L 265.546867 260.666756 
+L 272.762149 260.876814 
+L 279.977431 261.071047 
+L 287.192712 261.251176 
+L 294.407994 261.418685 
+L 301.623276 261.574855 
+L 308.838557 261.7208 
+L 316.053839 261.857492 
+L 323.26912 261.985783 
+L 330.484402 262.106426 
+L 337.699684 262.220084 
+L 344.914965 262.327347 
+L 352.130247 262.42874 
+L 359.345529 262.524732 
+L 366.56081 262.615743 
+L 373.776092 262.702152 
+L 380.991373 262.784298 
+L 388.206655 262.862489 
+L 395.421937 262.937005 
+L 402.637218 263.008099 
+L 409.8525 263.076 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_46">
+    <path clip-path="url(#p9778b8a2e2)" d="M 112.940971 -1 
+L 114.025953 65.896085 
+L 121.241235 143.748 
+L 128.456516 176.128885 
+L 135.671798 193.871836 
+L 142.88708 205.072693 
+L 150.102361 212.786491 
+L 157.317643 218.422286 
+L 164.532924 222.720086 
+L 171.748206 226.105814 
+L 178.963488 228.841953 
+L 186.178769 231.099088 
+L 193.394051 232.992878 
+L 200.609333 234.604524 
+L 207.824614 235.992706 
+L 215.039896 237.200888 
+L 222.255178 238.261948 
+L 229.470459 239.201217 
+L 236.685741 240.038526 
+L 243.901022 240.789622 
+L 251.116304 241.467169 
+L 258.331586 242.081465 
+L 265.546867 242.640973 
+L 272.762149 243.152709 
+L 279.977431 243.622541 
+L 287.192712 244.055414 
+L 294.407994 244.455523 
+L 301.623276 244.826453 
+L 308.838557 245.171284 
+L 316.053839 245.492676 
+L 323.26912 245.79294 
+L 330.484402 246.074095 
+L 337.699684 246.337907 
+L 344.914965 246.585933 
+L 352.130247 246.819549 
+L 359.345529 247.039976 
+L 366.56081 247.2483 
+L 373.776092 247.44549 
+L 380.991373 247.632416 
+L 388.206655 247.80986 
+L 395.421937 247.978525 
+L 402.637218 248.139046 
+L 409.8525 248.292 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_47">
+    <path clip-path="url(#p9778b8a2e2)" d="M 133.432847 -1 
+L 135.671798 45.973516 
+L 142.88708 105.69131 
+L 150.102361 137.652946 
+L 157.317643 157.56048 
+L 164.532924 171.1512 
+L 171.748206 181.01998 
+L 178.963488 188.511609 
+L 186.178769 194.392659 
+L 193.394051 199.132094 
+L 200.609333 203.032916 
+L 207.824614 206.299614 
+L 215.039896 209.075191 
+L 222.255178 211.462658 
+L 229.470459 213.538099 
+L 236.685741 215.358932 
+L 243.901022 216.969302 
+L 251.116304 218.403703 
+L 258.331586 219.689486 
+L 265.546867 220.848609 
+L 272.762149 221.89891 
+L 279.977431 222.855026 
+L 287.192712 223.729083 
+L 294.407994 224.53121 
+L 301.623276 225.269935 
+L 308.838557 225.95249 
+L 316.053839 226.585047 
+L 323.26912 227.172904 
+L 330.484402 227.72064 
+L 337.699684 228.232224 
+L 344.914965 228.711123 
+L 352.130247 229.160371 
+L 359.345529 229.582639 
+L 366.56081 229.980288 
+L 373.776092 230.355409 
+L 380.991373 230.709864 
+L 388.206655 231.045315 
+L 395.421937 231.363251 
+L 402.637218 231.665007 
+L 409.8525 231.951789 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_48">
+    <path clip-path="url(#p9778b8a2e2)" d="M 156.11298 -1 
+L 157.317643 15.5496 
+L 164.532924 67.266052 
+L 171.748206 99.021768 
+L 178.963488 120.503576 
+L 186.178769 136.003109 
+L 193.394051 147.713867 
+L 200.609333 156.873766 
+L 207.824614 164.2344 
+L 215.039896 170.278498 
+L 222.255178 175.330281 
+L 229.470459 179.615586 
+L 236.685741 183.296554 
+L 243.901022 186.492604 
+L 251.116304 189.293636 
+L 258.331586 191.768622 
+L 265.546867 193.97136 
+L 272.762149 195.944428 
+L 279.977431 197.721968 
+L 287.192712 199.33167 
+L 294.407994 200.796236 
+L 301.623276 202.134447 
+L 308.838557 203.361979 
+L 316.053839 204.492017 
+L 323.26912 205.535733 
+L 330.484402 206.502654 
+L 337.699684 207.400955 
+L 344.914965 208.23769 
+L 352.130247 209.018978 
+L 359.345529 209.750155 
+L 366.56081 210.435892 
+L 373.776092 211.080296 
+L 380.991373 211.686996 
+L 388.206655 212.259206 
+L 395.421937 212.799787 
+L 402.637218 213.31129 
+L 409.8525 213.796 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_49">
+    <path clip-path="url(#p9778b8a2e2)" d="M 181.646211 -1 
+L 186.178769 28.664235 
+L 193.394051 60.30288 
+L 200.609333 82.979506 
+L 207.824614 100.0296 
+L 215.039896 113.316128 
+L 222.255178 123.961359 
+L 229.470459 132.681699 
+L 236.685741 139.955952 
+L 243.901022 146.116282 
+L 251.116304 151.400359 
+L 258.331586 155.982727 
+L 265.546867 159.99446 
+L 272.762149 163.535902 
+L 279.977431 166.68517 
+L 287.192712 169.503991 
+L 294.407994 172.041781 
+L 301.623276 174.338573 
+L 308.838557 176.427138 
+L 316.053839 178.334567 
+L 323.26912 180.083444 
+L 330.484402 181.692749 
+L 337.699684 183.178549 
+L 344.914965 184.554536 
+L 352.130247 185.832451 
+L 359.345529 187.022418 
+L 366.56081 188.133213 
+L 373.776092 189.172484 
+L 380.991373 190.146923 
+L 388.206655 191.062414 
+L 395.421937 191.924148 
+L 402.637218 192.736725 
+L 409.8525 193.504235 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_50">
+    <path clip-path="url(#p9778b8a2e2)" d="M 209.89003 -1 
+L 215.039896 21.529603 
+L 222.255178 45.143395 
+L 229.470459 63.474102 
+L 236.685741 78.116312 
+L 243.901022 90.081553 
+L 251.116304 100.042465 
+L 258.331586 108.463751 
+L 265.546867 115.676765 
+L 272.762149 121.924143 
+L 279.977431 127.387629 
+L 287.192712 132.206052 
+L 294.407994 136.487286 
+L 301.623276 140.316422 
+L 308.838557 143.761481 
+L 316.053839 146.877489 
+L 323.26912 149.709441 
+L 330.484402 152.294486 
+L 337.699684 154.663565 
+L 344.914965 156.842657 
+L 352.130247 158.853735 
+L 359.345529 160.715509 
+L 366.56081 162.44401 
+L 373.776092 164.053055 
+L 380.991373 165.554614 
+L 388.206655 166.959108 
+L 395.421937 168.275654 
+L 402.637218 169.512263 
+L 409.8525 170.676 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_51">
+    <path clip-path="url(#p9778b8a2e2)" d="M 241.50606 -1 
+L 243.901022 7.088536 
+L 251.116304 26.492889 
+L 258.331586 42.309882 
+L 265.546867 55.450154 
+L 272.762149 66.54017 
+L 279.977431 76.025053 
+L 287.192712 84.229767 
+L 294.407994 91.397103 
+L 301.623276 97.712108 
+L 308.838557 103.318286 
+L 316.053839 108.328638 
+L 323.26912 112.833358 
+L 330.484402 116.90531 
+L 337.699684 120.604 
+L 344.914965 123.978502 
+L 352.130247 127.069649 
+L 359.345529 129.911692 
+L 366.56081 132.533577 
+L 373.776092 134.959932 
+L 380.991373 137.211843 
+L 388.206655 139.30747 
+L 395.421937 141.262537 
+L 402.637218 143.090726 
+L 409.8525 144.804 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_52">
+    <path clip-path="url(#p9778b8a2e2)" d="M 276.964303 -1 
+L 279.977431 6.033563 
+L 287.192712 20.223219 
+L 294.407994 32.340935 
+L 301.623276 42.809641 
+L 308.838557 51.944497 
+L 316.053839 59.98516 
+L 323.26912 67.117118 
+L 330.484402 73.486176 
+L 337.699684 79.208529 
+L 344.914965 84.377917 
+L 352.130247 89.070798 
+L 359.345529 93.350153 
+L 366.56081 97.268336 
+L 373.776092 100.869217 
+L 380.991373 104.189842 
+L 388.206655 107.261702 
+L 395.421937 110.111743 
+L 402.637218 112.763154 
+L 409.8525 115.236 
+" style="fill:none;opacity:0.3;stroke:#008000;stroke-linecap:square;stroke-width:1.5;"/>
+   </g>
+   <g id="patch_3">
+    <path d="M 52.7325 292.644 
+L 52.7325 26.532 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 409.8525 292.644 
+L 409.8525 26.532 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 52.7325 292.644 
+L 409.8525 292.644 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 52.7325 26.532 
+L 409.8525 26.532 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="text_23">
+    <!-- f=0.2 -->
+    <defs>
+     <path d="M 20.609375 41.21875 
+L 20.609375 11.8125 
+Q 20.609375 5.5625 21.96875 3.90625 
+Q 23.78125 1.765625 26.8125 1.765625 
+L 30.859375 1.765625 
+L 30.859375 0 
+L 4.15625 0 
+L 4.15625 1.765625 
+L 6.15625 1.765625 
+Q 8.109375 1.765625 9.71875 2.734375 
+Q 11.328125 3.71875 11.9375 5.375 
+Q 12.546875 7.03125 12.546875 11.8125 
+L 12.546875 41.21875 
+L 3.859375 41.21875 
+L 3.859375 44.734375 
+L 12.546875 44.734375 
+L 12.546875 47.65625 
+Q 12.546875 54.34375 14.6875 58.984375 
+Q 16.84375 63.625 21.265625 66.484375 
+Q 25.6875 69.34375 31.203125 69.34375 
+Q 36.328125 69.34375 40.625 66.015625 
+Q 43.453125 63.8125 43.453125 61.078125 
+Q 43.453125 59.625 42.1875 58.328125 
+Q 40.921875 57.03125 39.453125 57.03125 
+Q 38.328125 57.03125 37.078125 57.828125 
+Q 35.84375 58.640625 34.03125 61.296875 
+Q 32.234375 63.96875 30.71875 64.890625 
+Q 29.203125 65.828125 27.34375 65.828125 
+Q 25.09375 65.828125 23.53125 64.625 
+Q 21.96875 63.421875 21.28125 60.90625 
+Q 20.609375 58.40625 20.609375 47.953125 
+L 20.609375 44.734375 
+L 32.125 44.734375 
+L 32.125 41.21875 
+z
+" id="TimesNewRomanPSMT-66"/>
+     <path d="M 1.8125 43.109375 
+L 54.5 43.109375 
+L 54.5 39.109375 
+L 1.8125 39.109375 
+z
+M 1.8125 27.203125 
+L 54.5 27.203125 
+L 54.5 23.1875 
+L 1.8125 23.1875 
+z
+" id="TimesNewRomanPSMT-3d"/>
+    </defs>
+    <g style="opacity:0.4;" transform="translate(374.1405 257.462058)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-32"/>
+    </g>
+   </g>
+   <g id="text_24">
+    <!-- f=0.3 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 242.310176)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-33"/>
+    </g>
+   </g>
+   <g id="text_25">
+    <!-- f=0.4 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 225.387624)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-34"/>
+    </g>
+   </g>
+   <g id="text_26">
+    <!-- f=0.5 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 206.364756)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-35"/>
+    </g>
+   </g>
+   <g id="text_27">
+    <!-- f=0.5 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 184.824683)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-35"/>
+    </g>
+   </g>
+   <g id="text_28">
+    <!-- f=0.6 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 160.232374)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-36"/>
+    </g>
+   </g>
+   <g id="text_29">
+    <!-- f=0.7 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 131.889603)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-37"/>
+    </g>
+   </g>
+   <g id="text_30">
+    <!-- f=0.8 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 98.867602)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-3d"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-30"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-2e"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-38"/>
+    </g>
+   </g>
+   <g id="text_31">
+    <!-- PR Curve for APH -->
+    <defs>
+     <path id="TimesNewRomanPSMT-20"/>
+     <path d="M 60.203125 67.71875 
+L 61.71875 45.21875 
+L 60.203125 45.21875 
+Q 57.171875 55.328125 51.5625 59.765625 
+Q 45.953125 64.203125 38.09375 64.203125 
+Q 31.5 64.203125 26.171875 60.859375 
+Q 20.84375 57.515625 17.796875 50.1875 
+Q 14.75 42.875 14.75 31.984375 
+Q 14.75 23 17.625 16.40625 
+Q 20.515625 9.8125 26.296875 6.296875 
+Q 32.078125 2.78125 39.5 2.78125 
+Q 45.953125 2.78125 50.875 5.53125 
+Q 55.8125 8.296875 61.71875 16.5 
+L 63.234375 15.53125 
+Q 58.25 6.6875 51.609375 2.578125 
+Q 44.96875 -1.515625 35.84375 -1.515625 
+Q 19.390625 -1.515625 10.359375 10.6875 
+Q 3.609375 19.78125 3.609375 32.078125 
+Q 3.609375 42 8.046875 50.296875 
+Q 12.5 58.59375 20.28125 63.15625 
+Q 28.078125 67.71875 37.3125 67.71875 
+Q 44.484375 67.71875 51.46875 64.203125 
+Q 53.515625 63.140625 54.390625 63.140625 
+Q 55.71875 63.140625 56.6875 64.0625 
+Q 57.953125 65.375 58.5 67.71875 
+z
+" id="TimesNewRomanPSMT-43"/>
+     <path d="M 42.328125 44.734375 
+L 42.328125 17.625 
+Q 42.328125 9.859375 42.6875 8.125 
+Q 43.0625 6.390625 43.859375 5.703125 
+Q 44.671875 5.03125 45.75 5.03125 
+Q 47.265625 5.03125 49.171875 5.859375 
+L 49.859375 4.15625 
+L 36.46875 -1.375 
+L 34.28125 -1.375 
+L 34.28125 8.109375 
+Q 28.515625 1.859375 25.484375 0.234375 
+Q 22.46875 -1.375 19.09375 -1.375 
+Q 15.328125 -1.375 12.5625 0.796875 
+Q 9.8125 2.984375 8.734375 6.390625 
+Q 7.671875 9.8125 7.671875 16.0625 
+L 7.671875 36.03125 
+Q 7.671875 39.203125 6.984375 40.421875 
+Q 6.296875 41.65625 4.953125 42.3125 
+Q 3.609375 42.96875 0.09375 42.921875 
+L 0.09375 44.734375 
+L 15.765625 44.734375 
+L 15.765625 14.796875 
+Q 15.765625 8.546875 17.9375 6.59375 
+Q 20.125 4.640625 23.1875 4.640625 
+Q 25.296875 4.640625 27.953125 5.953125 
+Q 30.609375 7.28125 34.28125 10.984375 
+L 34.28125 36.328125 
+Q 34.28125 40.140625 32.890625 41.484375 
+Q 31.5 42.828125 27.09375 42.921875 
+L 27.09375 44.734375 
+z
+" id="TimesNewRomanPSMT-75"/>
+     <path d="M 0.828125 44.734375 
+L 21.875 44.734375 
+L 21.875 42.921875 
+L 20.515625 42.921875 
+Q 18.609375 42.921875 17.609375 41.984375 
+Q 16.609375 41.0625 16.609375 39.5 
+Q 16.609375 37.796875 17.625 35.453125 
+L 28.03125 10.75 
+L 38.484375 36.375 
+Q 39.59375 39.109375 39.59375 40.53125 
+Q 39.59375 41.21875 39.203125 41.65625 
+Q 38.671875 42.390625 37.84375 42.65625 
+Q 37.015625 42.921875 34.46875 42.921875 
+L 34.46875 44.734375 
+L 49.078125 44.734375 
+L 49.078125 42.921875 
+Q 46.53125 42.71875 45.5625 41.890625 
+Q 43.84375 40.4375 42.484375 37.015625 
+L 26.609375 -1.375 
+L 24.609375 -1.375 
+L 8.640625 36.375 
+Q 7.5625 39.015625 6.578125 40.15625 
+Q 5.609375 41.3125 4.109375 42.09375 
+Q 3.265625 42.53125 0.828125 42.921875 
+z
+" id="TimesNewRomanPSMT-76"/>
+     <path d="M 45.75 22.171875 
+L 20.125 22.171875 
+L 15.625 11.71875 
+Q 13.96875 7.859375 13.96875 5.953125 
+Q 13.96875 4.4375 15.40625 3.296875 
+Q 16.84375 2.15625 21.625 1.8125 
+L 21.625 0 
+L 0.78125 0 
+L 0.78125 1.8125 
+Q 4.9375 2.546875 6.15625 3.71875 
+Q 8.640625 6.0625 11.671875 13.234375 
+L 34.96875 67.71875 
+L 36.671875 67.71875 
+L 59.71875 12.640625 
+Q 62.5 6 64.765625 4.015625 
+Q 67.046875 2.046875 71.09375 1.8125 
+L 71.09375 0 
+L 44.96875 0 
+L 44.96875 1.8125 
+Q 48.921875 2 50.3125 3.125 
+Q 51.703125 4.25 51.703125 5.859375 
+Q 51.703125 8.015625 49.75 12.640625 
+z
+M 44.390625 25.78125 
+L 33.15625 52.546875 
+L 21.625 25.78125 
+z
+" id="TimesNewRomanPSMT-41"/>
+     <path d="M 20.5625 35.5 
+L 51.3125 35.5 
+L 51.3125 54.4375 
+Q 51.3125 59.515625 50.6875 61.140625 
+Q 50.203125 62.359375 48.640625 63.234375 
+Q 46.53125 64.40625 44.1875 64.40625 
+L 41.84375 64.40625 
+L 41.84375 66.21875 
+L 70.171875 66.21875 
+L 70.171875 64.40625 
+L 67.828125 64.40625 
+Q 65.484375 64.40625 63.375 63.28125 
+Q 61.8125 62.5 61.25 60.90625 
+Q 60.6875 59.328125 60.6875 54.4375 
+L 60.6875 11.71875 
+Q 60.6875 6.6875 61.328125 5.078125 
+Q 61.8125 3.859375 63.328125 2.984375 
+Q 65.484375 1.8125 67.828125 1.8125 
+L 70.171875 1.8125 
+L 70.171875 0 
+L 41.84375 0 
+L 41.84375 1.8125 
+L 44.1875 1.8125 
+Q 48.25 1.8125 50.09375 4.203125 
+Q 51.3125 5.765625 51.3125 11.71875 
+L 51.3125 31.890625 
+L 20.5625 31.890625 
+L 20.5625 11.71875 
+Q 20.5625 6.6875 21.1875 5.078125 
+Q 21.6875 3.859375 23.25 2.984375 
+Q 25.34375 1.8125 27.6875 1.8125 
+L 30.078125 1.8125 
+L 30.078125 0 
+L 1.703125 0 
+L 1.703125 1.8125 
+L 4.046875 1.8125 
+Q 8.15625 1.8125 10.015625 4.203125 
+Q 11.1875 5.765625 11.1875 11.71875 
+L 11.1875 54.4375 
+Q 11.1875 59.515625 10.546875 61.140625 
+Q 10.0625 62.359375 8.546875 63.234375 
+Q 6.390625 64.40625 4.046875 64.40625 
+L 1.703125 64.40625 
+L 1.703125 66.21875 
+L 30.078125 66.21875 
+L 30.078125 64.40625 
+L 27.6875 64.40625 
+Q 25.34375 64.40625 23.25 63.28125 
+Q 21.734375 62.5 21.140625 60.90625 
+Q 20.5625 59.328125 20.5625 54.4375 
+z
+" id="TimesNewRomanPSMT-48"/>
+    </defs>
+    <g transform="translate(158.499 20.532)scale(0.192 -0.192)">
+     <use xlink:href="#TimesNewRomanPSMT-50"/>
+     <use x="55.615234" xlink:href="#TimesNewRomanPSMT-52"/>
+     <use x="122.314453" xlink:href="#TimesNewRomanPSMT-20"/>
+     <use x="147.314453" xlink:href="#TimesNewRomanPSMT-43"/>
+     <use x="214.013672" xlink:href="#TimesNewRomanPSMT-75"/>
+     <use x="264.013672" xlink:href="#TimesNewRomanPSMT-72"/>
+     <use x="297.314453" xlink:href="#TimesNewRomanPSMT-76"/>
+     <use x="347.314453" xlink:href="#TimesNewRomanPSMT-65"/>
+     <use x="391.699219" xlink:href="#TimesNewRomanPSMT-20"/>
+     <use x="416.699219" xlink:href="#TimesNewRomanPSMT-66"/>
+     <use x="450" xlink:href="#TimesNewRomanPSMT-6f"/>
+     <use x="500" xlink:href="#TimesNewRomanPSMT-72"/>
+     <use x="533.300781" xlink:href="#TimesNewRomanPSMT-20"/>
+     <use x="558.222656" xlink:href="#TimesNewRomanPSMT-41"/>
+     <use x="630.439453" xlink:href="#TimesNewRomanPSMT-50"/>
+     <use x="686.054688" xlink:href="#TimesNewRomanPSMT-48"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 63.9325 284.644 
+L 184.405 284.644 
+Q 187.605 284.644 187.605 281.444 
+L 187.605 192.554 
+Q 187.605 189.354 184.405 189.354 
+L 63.9325 189.354 
+Q 60.7325 189.354 60.7325 192.554 
+L 60.7325 281.444 
+Q 60.7325 284.644 63.9325 284.644 
+z
+" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
+    </g>
+    <g id="line2d_53">
+     <path d="M 67.1325 201.354 
+L 99.1325 201.354 
+" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:3;"/>
+    </g>
+    <g id="line2d_54"/>
+    <g id="text_32">
+     <!-- LSD -->
+     <defs>
+      <path d="M 57.328125 18.3125 
+L 58.9375 17.96875 
+L 53.265625 0 
+L 2 0 
+L 2 1.8125 
+L 4.5 1.8125 
+Q 8.6875 1.8125 10.5 4.546875 
+Q 11.53125 6.109375 11.53125 11.765625 
+L 11.53125 54.5 
+Q 11.53125 60.6875 10.15625 62.25 
+Q 8.25 64.40625 4.5 64.40625 
+L 2 64.40625 
+L 2 66.21875 
+L 31.984375 66.21875 
+L 31.984375 64.40625 
+Q 26.703125 64.453125 24.578125 63.421875 
+Q 22.46875 62.40625 21.6875 60.84375 
+Q 20.90625 59.28125 20.90625 53.375 
+L 20.90625 11.765625 
+Q 20.90625 7.71875 21.6875 6.203125 
+Q 22.265625 5.171875 23.484375 4.6875 
+Q 24.703125 4.203125 31.109375 4.203125 
+L 35.9375 4.203125 
+Q 43.5625 4.203125 46.625 5.328125 
+Q 49.703125 6.453125 52.234375 9.296875 
+Q 54.78125 12.15625 57.328125 18.3125 
+z
+" id="TimesNewRomanPSMT-4c"/>
+      <path d="M 45.84375 67.71875 
+L 45.84375 44.828125 
+L 44.046875 44.828125 
+Q 43.171875 51.421875 40.890625 55.328125 
+Q 38.625 59.234375 34.421875 61.515625 
+Q 30.21875 63.8125 25.734375 63.8125 
+Q 20.65625 63.8125 17.328125 60.71875 
+Q 14.015625 57.625 14.015625 53.65625 
+Q 14.015625 50.640625 16.109375 48.140625 
+Q 19.140625 44.484375 30.515625 38.375 
+Q 39.796875 33.40625 43.1875 30.734375 
+Q 46.578125 28.078125 48.40625 24.453125 
+Q 50.25 20.84375 50.25 16.890625 
+Q 50.25 9.375 44.40625 3.921875 
+Q 38.578125 -1.515625 29.390625 -1.515625 
+Q 26.515625 -1.515625 23.96875 -1.078125 
+Q 22.46875 -0.828125 17.703125 0.703125 
+Q 12.9375 2.25 11.671875 2.25 
+Q 10.453125 2.25 9.734375 1.515625 
+Q 9.03125 0.78125 8.6875 -1.515625 
+L 6.890625 -1.515625 
+L 6.890625 21.1875 
+L 8.6875 21.1875 
+Q 9.96875 14.0625 12.109375 10.515625 
+Q 14.265625 6.984375 18.671875 4.640625 
+Q 23.09375 2.296875 28.375 2.296875 
+Q 34.46875 2.296875 38 5.515625 
+Q 41.546875 8.734375 41.546875 13.140625 
+Q 41.546875 15.578125 40.203125 18.0625 
+Q 38.875 20.5625 36.03125 22.703125 
+Q 34.125 24.171875 25.625 28.921875 
+Q 17.140625 33.6875 13.546875 36.515625 
+Q 9.96875 39.359375 8.109375 42.765625 
+Q 6.25 46.1875 6.25 50.296875 
+Q 6.25 57.421875 11.71875 62.5625 
+Q 17.1875 67.71875 25.640625 67.71875 
+Q 30.90625 67.71875 36.8125 65.140625 
+Q 39.546875 63.921875 40.671875 63.921875 
+Q 41.9375 63.921875 42.75 64.671875 
+Q 43.5625 65.4375 44.046875 67.71875 
+z
+" id="TimesNewRomanPSMT-53"/>
+      <path d="M 1.703125 0 
+L 1.703125 1.8125 
+L 4.203125 1.8125 
+Q 8.40625 1.8125 10.15625 4.5 
+Q 11.234375 6.109375 11.234375 11.71875 
+L 11.234375 54.5 
+Q 11.234375 60.6875 9.859375 62.25 
+Q 7.953125 64.40625 4.203125 64.40625 
+L 1.703125 64.40625 
+L 1.703125 66.21875 
+L 28.65625 66.21875 
+Q 43.5 66.21875 51.234375 62.84375 
+Q 58.984375 59.46875 63.6875 51.609375 
+Q 68.40625 43.75 68.40625 33.453125 
+Q 68.40625 19.625 60.015625 10.359375 
+Q 50.59375 0 31.296875 0 
+z
+M 20.609375 4.78125 
+Q 26.8125 3.421875 31 3.421875 
+Q 42.328125 3.421875 49.796875 11.375 
+Q 57.28125 19.34375 57.28125 32.953125 
+Q 57.28125 46.6875 49.796875 54.59375 
+Q 42.328125 62.5 30.609375 62.5 
+Q 26.21875 62.5 20.609375 61.078125 
+z
+" id="TimesNewRomanPSMT-44"/>
+     </defs>
+     <g transform="translate(111.9325 206.954)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-4c"/>
+      <use x="61.083984" xlink:href="#TimesNewRomanPSMT-53"/>
+      <use x="116.699219" xlink:href="#TimesNewRomanPSMT-44"/>
+     </g>
+    </g>
+    <g id="line2d_55">
+     <path d="M 67.1325 223.9765 
+L 99.1325 223.9765 
+" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:3;"/>
+    </g>
+    <g id="line2d_56"/>
+    <g id="text_33">
+     <!-- Wireframe -->
+     <defs>
+      <path d="M 93.609375 66.21875 
+L 93.609375 64.40625 
+Q 91.015625 64.40625 89.40625 63.46875 
+Q 87.796875 62.546875 86.328125 60.015625 
+Q 85.359375 58.296875 83.25 51.859375 
+L 64.796875 -1.515625 
+L 62.84375 -1.515625 
+L 47.75 40.828125 
+L 32.765625 -1.515625 
+L 31 -1.515625 
+L 11.328125 53.46875 
+Q 9.125 59.625 8.546875 60.75 
+Q 7.5625 62.59375 5.875 63.5 
+Q 4.203125 64.40625 1.3125 64.40625 
+L 1.3125 66.21875 
+L 25.828125 66.21875 
+L 25.828125 64.40625 
+L 24.65625 64.40625 
+Q 22.078125 64.40625 20.703125 63.234375 
+Q 19.34375 62.0625 19.34375 60.40625 
+Q 19.34375 58.6875 21.484375 52.546875 
+L 34.515625 15.375 
+L 45.515625 46.96875 
+L 43.5625 52.546875 
+L 42 56.984375 
+Q 40.96875 59.421875 39.703125 61.28125 
+Q 39.0625 62.203125 38.140625 62.84375 
+Q 36.921875 63.71875 35.6875 64.109375 
+Q 34.765625 64.40625 32.765625 64.40625 
+L 32.765625 66.21875 
+L 58.546875 66.21875 
+L 58.546875 64.40625 
+L 56.78125 64.40625 
+Q 54.046875 64.40625 52.78125 63.234375 
+Q 51.515625 62.0625 51.515625 60.0625 
+Q 51.515625 57.5625 53.71875 51.375 
+L 66.40625 15.375 
+L 79 51.859375 
+Q 81.15625 57.90625 81.15625 60.25 
+Q 81.15625 61.375 80.4375 62.34375 
+Q 79.734375 63.328125 78.65625 63.71875 
+Q 76.8125 64.40625 73.828125 64.40625 
+L 73.828125 66.21875 
+z
+" id="TimesNewRomanPSMT-57"/>
+      <path d="M 16.40625 36.53125 
+Q 21.296875 41.40625 22.171875 42.140625 
+Q 24.359375 44 26.890625 45.015625 
+Q 29.4375 46.046875 31.9375 46.046875 
+Q 36.140625 46.046875 39.15625 43.59375 
+Q 42.1875 41.15625 43.21875 36.53125 
+Q 48.25 42.390625 51.703125 44.21875 
+Q 55.171875 46.046875 58.84375 46.046875 
+Q 62.40625 46.046875 65.15625 44.21875 
+Q 67.921875 42.390625 69.53125 38.234375 
+Q 70.609375 35.40625 70.609375 29.34375 
+L 70.609375 10.109375 
+Q 70.609375 5.90625 71.234375 4.34375 
+Q 71.734375 3.265625 73.046875 2.515625 
+Q 74.359375 1.765625 77.34375 1.765625 
+L 77.34375 0 
+L 55.28125 0 
+L 55.28125 1.765625 
+L 56.203125 1.765625 
+Q 59.078125 1.765625 60.6875 2.875 
+Q 61.8125 3.65625 62.3125 5.375 
+Q 62.5 6.203125 62.5 10.109375 
+L 62.5 29.34375 
+Q 62.5 34.8125 61.1875 37.0625 
+Q 59.28125 40.1875 55.078125 40.1875 
+Q 52.484375 40.1875 49.875 38.890625 
+Q 47.265625 37.59375 43.5625 34.078125 
+L 43.453125 33.546875 
+L 43.5625 31.453125 
+L 43.5625 10.109375 
+Q 43.5625 5.515625 44.0625 4.390625 
+Q 44.578125 3.265625 45.984375 2.515625 
+Q 47.40625 1.765625 50.828125 1.765625 
+L 50.828125 0 
+L 28.21875 0 
+L 28.21875 1.765625 
+Q 31.9375 1.765625 33.328125 2.640625 
+Q 34.71875 3.515625 35.25 5.28125 
+Q 35.5 6.109375 35.5 10.109375 
+L 35.5 29.34375 
+Q 35.5 34.8125 33.890625 37.203125 
+Q 31.734375 40.328125 27.875 40.328125 
+Q 25.25 40.328125 22.65625 38.921875 
+Q 18.609375 36.765625 16.40625 34.078125 
+L 16.40625 10.109375 
+Q 16.40625 5.71875 17.015625 4.390625 
+Q 17.625 3.078125 18.8125 2.421875 
+Q 20.015625 1.765625 23.6875 1.765625 
+L 23.6875 0 
+L 1.5625 0 
+L 1.5625 1.765625 
+Q 4.640625 1.765625 5.859375 2.421875 
+Q 7.078125 3.078125 7.703125 4.515625 
+Q 8.34375 5.953125 8.34375 10.109375 
+L 8.34375 27.203125 
+Q 8.34375 34.578125 7.90625 36.71875 
+Q 7.5625 38.328125 6.828125 38.9375 
+Q 6.109375 39.546875 4.828125 39.546875 
+Q 3.46875 39.546875 1.5625 38.8125 
+L 0.828125 40.578125 
+L 14.3125 46.046875 
+L 16.40625 46.046875 
+z
+" id="TimesNewRomanPSMT-6d"/>
+     </defs>
+     <g transform="translate(111.9325 229.5765)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-57"/>
+      <use x="94.322266" xlink:href="#TimesNewRomanPSMT-69"/>
+      <use x="122.105469" xlink:href="#TimesNewRomanPSMT-72"/>
+      <use x="155.40625" xlink:href="#TimesNewRomanPSMT-65"/>
+      <use x="199.791016" xlink:href="#TimesNewRomanPSMT-66"/>
+      <use x="233.091797" xlink:href="#TimesNewRomanPSMT-72"/>
+      <use x="266.392578" xlink:href="#TimesNewRomanPSMT-61"/>
+      <use x="310.777344" xlink:href="#TimesNewRomanPSMT-6d"/>
+      <use x="388.560547" xlink:href="#TimesNewRomanPSMT-65"/>
+     </g>
+    </g>
+    <g id="line2d_57">
+     <path d="M 67.1325 246.599 
+L 99.1325 246.599 
+" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:3;"/>
+    </g>
+    <g id="line2d_58"/>
+    <g id="text_34">
+     <!-- AFM -->
+     <defs>
+      <path d="M 20.453125 62.59375 
+L 20.453125 36.578125 
+L 32.515625 36.578125 
+Q 36.671875 36.578125 38.59375 38.40625 
+Q 40.53125 40.234375 41.15625 45.65625 
+L 42.96875 45.65625 
+L 42.96875 23.25 
+L 41.15625 23.25 
+Q 41.109375 27.09375 40.15625 28.90625 
+Q 39.203125 30.71875 37.515625 31.609375 
+Q 35.84375 32.515625 32.515625 32.515625 
+L 20.453125 32.515625 
+L 20.453125 11.71875 
+Q 20.453125 6.6875 21.09375 5.078125 
+Q 21.578125 3.859375 23.140625 2.984375 
+Q 25.296875 1.8125 27.640625 1.8125 
+L 30.03125 1.8125 
+L 30.03125 0 
+L 1.609375 0 
+L 1.609375 1.8125 
+L 3.953125 1.8125 
+Q 8.0625 1.8125 9.90625 4.203125 
+Q 11.078125 5.765625 11.078125 11.71875 
+L 11.078125 54.5 
+Q 11.078125 59.515625 10.453125 61.140625 
+Q 9.96875 62.359375 8.453125 63.234375 
+Q 6.34375 64.40625 3.953125 64.40625 
+L 1.609375 64.40625 
+L 1.609375 66.21875 
+L 50.875 66.21875 
+L 51.515625 51.65625 
+L 49.8125 51.65625 
+Q 48.53125 56.296875 46.84375 58.46875 
+Q 45.171875 60.640625 42.703125 61.609375 
+Q 40.234375 62.59375 35.0625 62.59375 
+z
+" id="TimesNewRomanPSMT-46"/>
+      <path d="M 40.921875 0 
+L 15.328125 55.71875 
+L 15.328125 11.46875 
+Q 15.328125 5.375 16.65625 3.859375 
+Q 18.453125 1.8125 22.359375 1.8125 
+L 24.703125 1.8125 
+L 24.703125 0 
+L 1.65625 0 
+L 1.65625 1.8125 
+L 4 1.8125 
+Q 8.203125 1.8125 9.96875 4.34375 
+Q 11.03125 5.90625 11.03125 11.46875 
+L 11.03125 54.734375 
+Q 11.03125 59.125 10.0625 61.078125 
+Q 9.375 62.5 7.546875 63.453125 
+Q 5.71875 64.40625 1.65625 64.40625 
+L 1.65625 66.21875 
+L 20.40625 66.21875 
+L 44.4375 14.40625 
+L 68.0625 66.21875 
+L 86.8125 66.21875 
+L 86.8125 64.40625 
+L 84.515625 64.40625 
+Q 80.28125 64.40625 78.515625 61.859375 
+Q 77.4375 60.296875 77.4375 54.734375 
+L 77.4375 11.46875 
+Q 77.4375 5.375 78.8125 3.859375 
+Q 80.609375 1.8125 84.515625 1.8125 
+L 86.8125 1.8125 
+L 86.8125 0 
+L 58.6875 0 
+L 58.6875 1.8125 
+L 61.03125 1.8125 
+Q 65.28125 1.8125 67 4.34375 
+Q 68.0625 5.90625 68.0625 11.46875 
+L 68.0625 55.71875 
+L 42.53125 0 
+z
+" id="TimesNewRomanPSMT-4d"/>
+     </defs>
+     <g transform="translate(111.9325 252.199)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-41"/>
+      <use x="72.216797" xlink:href="#TimesNewRomanPSMT-46"/>
+      <use x="127.832031" xlink:href="#TimesNewRomanPSMT-4d"/>
+     </g>
+    </g>
+    <g id="line2d_59">
+     <path d="M 67.1325 269.2215 
+L 99.1325 269.2215 
+" style="fill:none;stroke:#d62728;stroke-linecap:square;stroke-width:3;"/>
+    </g>
+    <g id="line2d_60"/>
+    <g id="text_35">
+     <!-- L-CNN -->
+     <defs>
+      <path d="M 4.046875 26.125 
+L 29.296875 26.125 
+L 29.296875 18.75 
+L 4.046875 18.75 
+z
+" id="TimesNewRomanPSMT-2d"/>
+      <path d="M -1.3125 66.21875 
+L 16.65625 66.21875 
+L 57.125 16.546875 
+L 57.125 54.734375 
+Q 57.125 60.84375 55.765625 62.359375 
+Q 53.953125 64.40625 50.046875 64.40625 
+L 47.75 64.40625 
+L 47.75 66.21875 
+L 70.796875 66.21875 
+L 70.796875 64.40625 
+L 68.453125 64.40625 
+Q 64.265625 64.40625 62.5 61.859375 
+Q 61.421875 60.296875 61.421875 54.734375 
+L 61.421875 -1.078125 
+L 59.671875 -1.078125 
+L 16.015625 52.25 
+L 16.015625 11.46875 
+Q 16.015625 5.375 17.328125 3.859375 
+Q 19.1875 1.8125 23.046875 1.8125 
+L 25.390625 1.8125 
+L 25.390625 0 
+L 2.34375 0 
+L 2.34375 1.8125 
+L 4.640625 1.8125 
+Q 8.890625 1.8125 10.640625 4.34375 
+Q 11.71875 5.90625 11.71875 11.46875 
+L 11.71875 57.515625 
+Q 8.84375 60.890625 7.34375 61.953125 
+Q 5.859375 63.03125 2.984375 63.96875 
+Q 1.5625 64.40625 -1.3125 64.40625 
+z
+" id="TimesNewRomanPSMT-4e"/>
+     </defs>
+     <g transform="translate(111.9325 274.8215)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-4c"/>
+      <use x="61.083984" xlink:href="#TimesNewRomanPSMT-2d"/>
+      <use x="94.384766" xlink:href="#TimesNewRomanPSMT-43"/>
+      <use x="161.083984" xlink:href="#TimesNewRomanPSMT-4e"/>
+      <use x="233.300781" xlink:href="#TimesNewRomanPSMT-4e"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p9778b8a2e2">
+   <rect height="266.112" width="357.12" x="52.7325" y="26.532"/>
+  </clipPath>
+ </defs>
+</svg>

+ 9294 - 0
figs/PR-sAP10.svg

@@ -0,0 +1,9294 @@
+<?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">
+<!-- Created with matplotlib (https://matplotlib.org/) -->
+<svg height="339.909pt" version="1.1" viewBox="0 0 420.5525 339.909" width="420.5525pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+  <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+  </style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 339.909 
+L 420.5525 339.909 
+L 420.5525 0 
+L 0 0 
+z
+" style="fill:#ffffff;"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 52.7325 292.644 
+L 409.8525 292.644 
+L 409.8525 26.532 
+L 52.7325 26.532 
+z
+" style="fill:#ffffff;"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 292.644 
+L 52.7325 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_2">
+      <defs>
+       <path d="M 0 0 
+L 0 3.5 
+" id="m50cda0959b" style="stroke:#000000;stroke-width:0.8;"/>
+      </defs>
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 0.0 -->
+      <defs>
+       <path d="M 3.609375 32.71875 
+Q 3.609375 44.046875 7.03125 52.21875 
+Q 10.453125 60.40625 16.109375 64.40625 
+Q 20.515625 67.578125 25.203125 67.578125 
+Q 32.8125 67.578125 38.875 59.8125 
+Q 46.4375 50.203125 46.4375 33.734375 
+Q 46.4375 22.21875 43.109375 14.15625 
+Q 39.796875 6.109375 34.640625 2.46875 
+Q 29.5 -1.171875 24.703125 -1.171875 
+Q 15.234375 -1.171875 8.9375 10.015625 
+Q 3.609375 19.4375 3.609375 32.71875 
+z
+M 13.1875 31.5 
+Q 13.1875 17.828125 16.546875 9.1875 
+Q 19.34375 1.90625 24.859375 1.90625 
+Q 27.484375 1.90625 30.3125 4.265625 
+Q 33.15625 6.640625 34.625 12.203125 
+Q 36.859375 20.609375 36.859375 35.890625 
+Q 36.859375 47.21875 34.515625 54.78125 
+Q 32.765625 60.40625 29.984375 62.75 
+Q 27.984375 64.359375 25.140625 64.359375 
+Q 21.828125 64.359375 19.234375 61.375 
+Q 15.71875 57.328125 14.453125 48.625 
+Q 13.1875 39.9375 13.1875 31.5 
+z
+" id="TimesNewRomanPSMT-48"/>
+       <path d="M 12.5 9.46875 
+Q 14.796875 9.46875 16.359375 7.875 
+Q 17.921875 6.296875 17.921875 4.046875 
+Q 17.921875 1.8125 16.328125 0.21875 
+Q 14.75 -1.375 12.5 -1.375 
+Q 10.25 -1.375 8.65625 0.21875 
+Q 7.078125 1.8125 7.078125 4.046875 
+Q 7.078125 6.34375 8.65625 7.90625 
+Q 10.25 9.46875 12.5 9.46875 
+z
+" id="TimesNewRomanPSMT-46"/>
+      </defs>
+      <g transform="translate(42.7325 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-48"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_3">
+      <path clip-path="url(#pc39f415831)" d="M 88.4445 292.644 
+L 88.4445 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_4">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="88.4445" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 0.1 -->
+      <defs>
+       <path d="M 11.71875 59.71875 
+L 27.828125 67.578125 
+L 29.4375 67.578125 
+L 29.4375 11.671875 
+Q 29.4375 6.109375 29.90625 4.734375 
+Q 30.375 3.375 31.828125 2.640625 
+Q 33.296875 1.90625 37.796875 1.8125 
+L 37.796875 0 
+L 12.890625 0 
+L 12.890625 1.8125 
+Q 17.578125 1.90625 18.9375 2.609375 
+Q 20.3125 3.328125 20.84375 4.515625 
+Q 21.390625 5.71875 21.390625 11.671875 
+L 21.390625 47.40625 
+Q 21.390625 54.640625 20.90625 56.6875 
+Q 20.5625 58.25 19.65625 58.984375 
+Q 18.75 59.71875 17.484375 59.71875 
+Q 15.671875 59.71875 12.453125 58.203125 
+z
+" id="TimesNewRomanPSMT-49"/>
+      </defs>
+      <g transform="translate(78.4445 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-49"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_5">
+      <path clip-path="url(#pc39f415831)" d="M 124.1565 292.644 
+L 124.1565 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_6">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="124.1565" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 0.2 -->
+      <defs>
+       <path d="M 45.84375 12.75 
+L 41.21875 0 
+L 2.15625 0 
+L 2.15625 1.8125 
+Q 19.390625 17.53125 26.421875 27.484375 
+Q 33.453125 37.453125 33.453125 45.703125 
+Q 33.453125 52 29.59375 56.046875 
+Q 25.734375 60.109375 20.359375 60.109375 
+Q 15.484375 60.109375 11.59375 57.25 
+Q 7.71875 54.390625 5.859375 48.875 
+L 4.046875 48.875 
+Q 5.28125 57.90625 10.328125 62.734375 
+Q 15.375 67.578125 22.953125 67.578125 
+Q 31 67.578125 36.390625 62.40625 
+Q 41.796875 57.234375 41.796875 50.203125 
+Q 41.796875 45.171875 39.453125 40.140625 
+Q 35.84375 32.234375 27.734375 23.390625 
+Q 15.578125 10.109375 12.546875 7.375 
+L 29.828125 7.375 
+Q 35.109375 7.375 37.234375 7.765625 
+Q 39.359375 8.15625 41.0625 9.34375 
+Q 42.78125 10.546875 44.046875 12.75 
+z
+" id="TimesNewRomanPSMT-50"/>
+      </defs>
+      <g transform="translate(114.1565 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-50"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_7">
+      <path clip-path="url(#pc39f415831)" d="M 159.8685 292.644 
+L 159.8685 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_8">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="159.8685" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 0.3 -->
+      <defs>
+       <path d="M 5.078125 53.609375 
+Q 7.90625 60.296875 12.21875 63.9375 
+Q 16.546875 67.578125 23 67.578125 
+Q 30.953125 67.578125 35.203125 62.40625 
+Q 38.421875 58.546875 38.421875 54.15625 
+Q 38.421875 46.921875 29.34375 39.203125 
+Q 35.453125 36.8125 38.578125 32.375 
+Q 41.703125 27.9375 41.703125 21.921875 
+Q 41.703125 13.328125 36.234375 7.03125 
+Q 29.109375 -1.171875 15.578125 -1.171875 
+Q 8.890625 -1.171875 6.46875 0.484375 
+Q 4.046875 2.15625 4.046875 4.046875 
+Q 4.046875 5.46875 5.1875 6.546875 
+Q 6.34375 7.625 7.953125 7.625 
+Q 9.1875 7.625 10.453125 7.234375 
+Q 11.28125 6.984375 14.203125 5.4375 
+Q 17.140625 3.90625 18.265625 3.609375 
+Q 20.0625 3.078125 22.125 3.078125 
+Q 27.09375 3.078125 30.78125 6.9375 
+Q 34.46875 10.796875 34.46875 16.0625 
+Q 34.46875 19.921875 32.765625 23.578125 
+Q 31.5 26.3125 29.984375 27.734375 
+Q 27.875 29.6875 24.21875 31.265625 
+Q 20.5625 32.859375 16.75 32.859375 
+L 15.1875 32.859375 
+L 15.1875 34.328125 
+Q 19.046875 34.8125 22.921875 37.109375 
+Q 26.8125 39.40625 28.5625 42.625 
+Q 30.328125 45.84375 30.328125 49.703125 
+Q 30.328125 54.734375 27.171875 57.828125 
+Q 24.03125 60.9375 19.34375 60.9375 
+Q 11.765625 60.9375 6.6875 52.828125 
+z
+" id="TimesNewRomanPSMT-51"/>
+      </defs>
+      <g transform="translate(149.8685 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-51"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_9">
+      <path clip-path="url(#pc39f415831)" d="M 195.5805 292.644 
+L 195.5805 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_10">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="195.5805" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 0.4 -->
+      <defs>
+       <path d="M 46.53125 24.421875 
+L 46.53125 17.484375 
+L 37.640625 17.484375 
+L 37.640625 0 
+L 29.59375 0 
+L 29.59375 17.484375 
+L 1.5625 17.484375 
+L 1.5625 23.734375 
+L 32.28125 67.578125 
+L 37.640625 67.578125 
+L 37.640625 24.421875 
+z
+M 29.59375 24.421875 
+L 29.59375 57.28125 
+L 6.34375 24.421875 
+z
+" id="TimesNewRomanPSMT-52"/>
+      </defs>
+      <g transform="translate(185.5805 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-52"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_11">
+      <path clip-path="url(#pc39f415831)" d="M 231.2925 292.644 
+L 231.2925 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_12">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="231.2925" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 0.5 -->
+      <defs>
+       <path d="M 43.40625 66.21875 
+L 39.59375 57.90625 
+L 19.671875 57.90625 
+L 15.328125 49.03125 
+Q 28.265625 47.125 35.84375 39.40625 
+Q 42.328125 32.765625 42.328125 23.78125 
+Q 42.328125 18.5625 40.203125 14.109375 
+Q 38.09375 9.671875 34.859375 6.546875 
+Q 31.640625 3.421875 27.6875 1.515625 
+Q 22.078125 -1.171875 16.15625 -1.171875 
+Q 10.203125 -1.171875 7.484375 0.84375 
+Q 4.78125 2.875 4.78125 5.328125 
+Q 4.78125 6.6875 5.90625 7.734375 
+Q 7.03125 8.796875 8.734375 8.796875 
+Q 10.015625 8.796875 10.96875 8.40625 
+Q 11.921875 8.015625 14.203125 6.390625 
+Q 17.875 3.859375 21.625 3.859375 
+Q 27.34375 3.859375 31.65625 8.171875 
+Q 35.984375 12.5 35.984375 18.703125 
+Q 35.984375 24.703125 32.125 29.90625 
+Q 28.265625 35.109375 21.484375 37.9375 
+Q 16.15625 40.140625 6.984375 40.484375 
+L 19.671875 66.21875 
+z
+" id="TimesNewRomanPSMT-53"/>
+      </defs>
+      <g transform="translate(221.2925 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-53"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_13">
+      <path clip-path="url(#pc39f415831)" d="M 267.0045 292.644 
+L 267.0045 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_14">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="267.0045" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 0.6 -->
+      <defs>
+       <path d="M 44.828125 67.578125 
+L 44.828125 65.765625 
+Q 38.375 65.140625 34.296875 63.203125 
+Q 30.21875 61.28125 26.234375 57.328125 
+Q 22.265625 53.375 19.65625 48.515625 
+Q 17.046875 43.65625 15.28125 36.96875 
+Q 22.3125 41.796875 29.390625 41.796875 
+Q 36.1875 41.796875 41.15625 36.328125 
+Q 46.140625 30.859375 46.140625 22.265625 
+Q 46.140625 13.96875 41.109375 7.125 
+Q 35.0625 -1.171875 25.09375 -1.171875 
+Q 18.3125 -1.171875 13.578125 3.328125 
+Q 4.296875 12.0625 4.296875 25.984375 
+Q 4.296875 34.859375 7.859375 42.859375 
+Q 11.421875 50.875 18.03125 57.078125 
+Q 24.65625 63.28125 30.703125 65.421875 
+Q 36.765625 67.578125 42 67.578125 
+z
+M 14.453125 33.40625 
+Q 13.578125 26.8125 13.578125 22.75 
+Q 13.578125 18.0625 15.3125 12.5625 
+Q 17.046875 7.078125 20.453125 3.859375 
+Q 22.953125 1.5625 26.515625 1.5625 
+Q 30.765625 1.5625 34.109375 5.5625 
+Q 37.453125 9.578125 37.453125 17 
+Q 37.453125 25.34375 34.125 31.4375 
+Q 30.8125 37.546875 24.703125 37.546875 
+Q 22.859375 37.546875 20.734375 36.765625 
+Q 18.609375 35.984375 14.453125 33.40625 
+z
+" id="TimesNewRomanPSMT-54"/>
+      </defs>
+      <g transform="translate(257.0045 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-54"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_8">
+     <g id="line2d_15">
+      <path clip-path="url(#pc39f415831)" d="M 302.7165 292.644 
+L 302.7165 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_16">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="302.7165" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 0.7 -->
+      <defs>
+       <path d="M 10.0625 66.21875 
+L 45.5625 66.21875 
+L 45.5625 64.359375 
+L 23.484375 -1.375 
+L 18.015625 -1.375 
+L 37.796875 58.25 
+L 19.578125 58.25 
+Q 14.0625 58.25 11.71875 56.9375 
+Q 7.625 54.6875 5.125 50 
+L 3.71875 50.53125 
+z
+" id="TimesNewRomanPSMT-55"/>
+      </defs>
+      <g transform="translate(292.7165 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-55"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_17">
+      <path clip-path="url(#pc39f415831)" d="M 338.4285 292.644 
+L 338.4285 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_18">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="338.4285" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 0.8 -->
+      <defs>
+       <path d="M 19.1875 33.34375 
+Q 11.328125 39.796875 9.046875 43.703125 
+Q 6.78125 47.609375 6.78125 51.8125 
+Q 6.78125 58.25 11.765625 62.90625 
+Q 16.75 67.578125 25 67.578125 
+Q 33.015625 67.578125 37.890625 63.234375 
+Q 42.78125 58.890625 42.78125 53.328125 
+Q 42.78125 49.609375 40.140625 45.75 
+Q 37.5 41.890625 29.15625 36.671875 
+Q 37.75 30.03125 40.53125 26.21875 
+Q 44.234375 21.234375 44.234375 15.71875 
+Q 44.234375 8.734375 38.90625 3.78125 
+Q 33.59375 -1.171875 24.953125 -1.171875 
+Q 15.53125 -1.171875 10.25 4.734375 
+Q 6.0625 9.46875 6.0625 15.09375 
+Q 6.0625 19.484375 9.015625 23.796875 
+Q 11.96875 28.125 19.1875 33.34375 
+z
+M 26.859375 38.578125 
+Q 32.71875 43.84375 34.28125 46.890625 
+Q 35.84375 49.953125 35.84375 53.8125 
+Q 35.84375 58.9375 32.953125 61.84375 
+Q 30.078125 64.75 25.09375 64.75 
+Q 20.125 64.75 17 61.859375 
+Q 13.875 58.984375 13.875 55.125 
+Q 13.875 52.59375 15.15625 50.046875 
+Q 16.453125 47.515625 18.84375 45.21875 
+z
+M 21.484375 31.5 
+Q 17.4375 28.078125 15.484375 24.046875 
+Q 13.53125 20.015625 13.53125 15.328125 
+Q 13.53125 9.03125 16.96875 5.25 
+Q 20.40625 1.46875 25.734375 1.46875 
+Q 31 1.46875 34.171875 4.4375 
+Q 37.359375 7.421875 37.359375 11.671875 
+Q 37.359375 15.1875 35.5 17.96875 
+Q 32.03125 23.140625 21.484375 31.5 
+z
+" id="TimesNewRomanPSMT-56"/>
+      </defs>
+      <g transform="translate(328.4285 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-56"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_10">
+     <g id="line2d_19">
+      <path clip-path="url(#pc39f415831)" d="M 374.1405 292.644 
+L 374.1405 26.532 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_20">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="374.1405" xlink:href="#m50cda0959b" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 0.9 -->
+      <defs>
+       <path d="M 5.28125 -1.375 
+L 5.28125 0.4375 
+Q 11.625 0.53125 17.09375 3.390625 
+Q 22.5625 6.25 27.65625 13.375 
+Q 32.765625 20.515625 34.765625 29.046875 
+Q 27.09375 24.125 20.90625 24.125 
+Q 13.921875 24.125 8.9375 29.515625 
+Q 3.953125 34.90625 3.953125 43.84375 
+Q 3.953125 52.546875 8.9375 59.328125 
+Q 14.9375 67.578125 24.609375 67.578125 
+Q 32.765625 67.578125 38.578125 60.84375 
+Q 45.703125 52.484375 45.703125 40.234375 
+Q 45.703125 29.203125 40.28125 19.65625 
+Q 34.859375 10.109375 25.203125 3.8125 
+Q 17.328125 -1.375 8.0625 -1.375 
+z
+M 35.546875 32.671875 
+Q 36.421875 39.015625 36.421875 42.828125 
+Q 36.421875 47.5625 34.8125 53.046875 
+Q 33.203125 58.546875 30.25 61.46875 
+Q 27.296875 64.40625 23.53125 64.40625 
+Q 19.1875 64.40625 15.90625 60.5 
+Q 12.640625 56.59375 12.640625 48.875 
+Q 12.640625 38.578125 17 32.765625 
+Q 20.171875 28.5625 24.8125 28.5625 
+Q 27.046875 28.5625 30.125 29.640625 
+Q 33.203125 30.71875 35.546875 32.671875 
+z
+" id="TimesNewRomanPSMT-57"/>
+      </defs>
+      <g transform="translate(364.1405 310.754)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-57"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_11">
+     <!-- Recall -->
+     <defs>
+      <path d="M 67.578125 0 
+L 49.90625 0 
+L 27.484375 30.953125 
+Q 25 30.859375 23.4375 30.859375 
+Q 22.796875 30.859375 22.0625 30.875 
+Q 21.34375 30.90625 20.5625 30.953125 
+L 20.5625 11.71875 
+Q 20.5625 5.46875 21.921875 3.953125 
+Q 23.78125 1.8125 27.484375 1.8125 
+L 30.078125 1.8125 
+L 30.078125 0 
+L 1.703125 0 
+L 1.703125 1.8125 
+L 4.203125 1.8125 
+Q 8.40625 1.8125 10.203125 4.546875 
+Q 11.234375 6.0625 11.234375 11.71875 
+L 11.234375 54.5 
+Q 11.234375 60.75 9.859375 62.25 
+Q 7.953125 64.40625 4.203125 64.40625 
+L 1.703125 64.40625 
+L 1.703125 66.21875 
+L 25.828125 66.21875 
+Q 36.375 66.21875 41.375 64.671875 
+Q 46.390625 63.140625 49.875 59.015625 
+Q 53.375 54.890625 53.375 49.171875 
+Q 53.375 43.0625 49.390625 38.5625 
+Q 45.40625 34.078125 37.0625 32.234375 
+L 50.734375 13.234375 
+Q 55.421875 6.6875 58.78125 4.53125 
+Q 62.15625 2.390625 67.578125 1.8125 
+z
+M 20.5625 34.03125 
+Q 21.484375 34.03125 22.171875 34 
+Q 22.859375 33.984375 23.296875 33.984375 
+Q 32.765625 33.984375 37.578125 38.078125 
+Q 42.390625 42.1875 42.390625 48.53125 
+Q 42.390625 54.734375 38.5 58.609375 
+Q 34.625 62.5 28.21875 62.5 
+Q 25.390625 62.5 20.5625 61.578125 
+z
+" id="TimesNewRomanPSMT-82"/>
+      <path d="M 10.640625 27.875 
+Q 10.59375 17.921875 15.484375 12.25 
+Q 20.359375 6.59375 26.953125 6.59375 
+Q 31.34375 6.59375 34.59375 9 
+Q 37.84375 11.421875 40.046875 17.28125 
+L 41.546875 16.3125 
+Q 40.53125 9.625 35.59375 4.125 
+Q 30.671875 -1.375 23.25 -1.375 
+Q 15.1875 -1.375 9.453125 4.90625 
+Q 3.71875 11.1875 3.71875 21.78125 
+Q 3.71875 33.25 9.59375 39.671875 
+Q 15.484375 46.09375 24.359375 46.09375 
+Q 31.890625 46.09375 36.71875 41.140625 
+Q 41.546875 36.1875 41.546875 27.875 
+z
+M 10.640625 30.71875 
+L 31.34375 30.71875 
+Q 31.109375 35.015625 30.328125 36.765625 
+Q 29.109375 39.5 26.6875 41.0625 
+Q 24.265625 42.625 21.625 42.625 
+Q 17.578125 42.625 14.375 39.46875 
+Q 11.1875 36.328125 10.640625 30.71875 
+z
+" id="TimesNewRomanPSMT-101"/>
+      <path d="M 41.109375 17 
+Q 39.3125 8.15625 34.03125 3.390625 
+Q 28.765625 -1.375 22.359375 -1.375 
+Q 14.75 -1.375 9.078125 5.015625 
+Q 3.421875 11.421875 3.421875 22.3125 
+Q 3.421875 32.859375 9.6875 39.453125 
+Q 15.96875 46.046875 24.75 46.046875 
+Q 31.34375 46.046875 35.59375 42.546875 
+Q 39.84375 39.0625 39.84375 35.296875 
+Q 39.84375 33.453125 38.640625 32.296875 
+Q 37.453125 31.15625 35.296875 31.15625 
+Q 32.421875 31.15625 30.953125 33.015625 
+Q 30.125 34.03125 29.859375 36.90625 
+Q 29.59375 39.796875 27.875 41.3125 
+Q 26.171875 42.78125 23.140625 42.78125 
+Q 18.265625 42.78125 15.28125 39.15625 
+Q 11.328125 34.375 11.328125 26.515625 
+Q 11.328125 18.5 15.25 12.375 
+Q 19.1875 6.25 25.875 6.25 
+Q 30.671875 6.25 34.46875 9.515625 
+Q 37.15625 11.765625 39.703125 17.671875 
+z
+" id="TimesNewRomanPSMT-99"/>
+      <path d="M 28.46875 6.453125 
+Q 21.578125 1.125 19.828125 0.296875 
+Q 17.1875 -0.921875 14.203125 -0.921875 
+Q 9.578125 -0.921875 6.5625 2.25 
+Q 3.5625 5.421875 3.5625 10.59375 
+Q 3.5625 13.875 5.03125 16.265625 
+Q 7.03125 19.578125 11.984375 22.5 
+Q 16.9375 25.4375 28.46875 29.640625 
+L 28.46875 31.390625 
+Q 28.46875 38.09375 26.34375 40.578125 
+Q 24.21875 43.0625 20.171875 43.0625 
+Q 17.09375 43.0625 15.28125 41.40625 
+Q 13.421875 39.75 13.421875 37.59375 
+L 13.53125 34.765625 
+Q 13.53125 32.515625 12.375 31.296875 
+Q 11.234375 30.078125 9.375 30.078125 
+Q 7.5625 30.078125 6.421875 31.34375 
+Q 5.28125 32.625 5.28125 34.8125 
+Q 5.28125 39.015625 9.578125 42.53125 
+Q 13.875 46.046875 21.625 46.046875 
+Q 27.59375 46.046875 31.390625 44.046875 
+Q 34.28125 42.53125 35.640625 39.3125 
+Q 36.53125 37.203125 36.53125 30.71875 
+L 36.53125 15.53125 
+Q 36.53125 9.125 36.765625 7.6875 
+Q 37.015625 6.25 37.578125 5.765625 
+Q 38.140625 5.28125 38.875 5.28125 
+Q 39.65625 5.28125 40.234375 5.609375 
+Q 41.265625 6.25 44.1875 9.1875 
+L 44.1875 6.453125 
+Q 38.71875 -0.875 33.734375 -0.875 
+Q 31.34375 -0.875 29.921875 0.78125 
+Q 28.515625 2.4375 28.46875 6.453125 
+z
+M 28.46875 9.625 
+L 28.46875 26.65625 
+Q 21.09375 23.734375 18.953125 22.515625 
+Q 15.09375 20.359375 13.421875 18.015625 
+Q 11.765625 15.671875 11.765625 12.890625 
+Q 11.765625 9.375 13.859375 7.046875 
+Q 15.96875 4.734375 18.703125 4.734375 
+Q 22.40625 4.734375 28.46875 9.625 
+z
+" id="TimesNewRomanPSMT-97"/>
+      <path d="M 18.5 69.4375 
+L 18.5 10.109375 
+Q 18.5 5.90625 19.109375 4.53125 
+Q 19.734375 3.171875 21 2.46875 
+Q 22.265625 1.765625 25.734375 1.765625 
+L 25.734375 0 
+L 3.8125 0 
+L 3.8125 1.765625 
+Q 6.890625 1.765625 8 2.390625 
+Q 9.125 3.03125 9.765625 4.484375 
+Q 10.40625 5.953125 10.40625 10.109375 
+L 10.40625 50.734375 
+Q 10.40625 58.296875 10.0625 60.03125 
+Q 9.71875 61.765625 8.953125 62.390625 
+Q 8.203125 63.03125 7.03125 63.03125 
+Q 5.765625 63.03125 3.8125 62.25 
+L 2.984375 63.96875 
+L 16.3125 69.4375 
+z
+" id="TimesNewRomanPSMT-108"/>
+     </defs>
+     <g transform="translate(210.8575 329.2865)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-82"/>
+      <use x="66.699219" xlink:href="#TimesNewRomanPSMT-101"/>
+      <use x="111.083984" xlink:href="#TimesNewRomanPSMT-99"/>
+      <use x="155.46875" xlink:href="#TimesNewRomanPSMT-97"/>
+      <use x="199.853516" xlink:href="#TimesNewRomanPSMT-108"/>
+      <use x="227.636719" xlink:href="#TimesNewRomanPSMT-108"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_21">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 292.644 
+L 409.8525 292.644 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_22">
+      <defs>
+       <path d="M 0 0 
+L -3.5 0 
+" id="ma2e034f377" style="stroke:#000000;stroke-width:0.8;"/>
+      </defs>
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="292.644"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 0.0 -->
+      <g transform="translate(25.7325 298.199)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-48"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_23">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 266.0328 
+L 409.8525 266.0328 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_24">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="266.0328"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 0.1 -->
+      <g transform="translate(25.7325 271.5878)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-49"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_25">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 239.4216 
+L 409.8525 239.4216 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_26">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="239.4216"/>
+      </g>
+     </g>
+     <g id="text_14">
+      <!-- 0.2 -->
+      <g transform="translate(25.7325 244.9766)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-50"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_27">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 212.8104 
+L 409.8525 212.8104 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_28">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="212.8104"/>
+      </g>
+     </g>
+     <g id="text_15">
+      <!-- 0.3 -->
+      <g transform="translate(25.7325 218.3654)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-51"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_29">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 186.1992 
+L 409.8525 186.1992 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_30">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="186.1992"/>
+      </g>
+     </g>
+     <g id="text_16">
+      <!-- 0.4 -->
+      <g transform="translate(25.7325 191.7542)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-52"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_31">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 159.588 
+L 409.8525 159.588 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_32">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="159.588"/>
+      </g>
+     </g>
+     <g id="text_17">
+      <!-- 0.5 -->
+      <g transform="translate(25.7325 165.143)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-53"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_7">
+     <g id="line2d_33">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 132.9768 
+L 409.8525 132.9768 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_34">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="132.9768"/>
+      </g>
+     </g>
+     <g id="text_18">
+      <!-- 0.6 -->
+      <g transform="translate(25.7325 138.5318)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-54"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_35">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 106.3656 
+L 409.8525 106.3656 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_36">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="106.3656"/>
+      </g>
+     </g>
+     <g id="text_19">
+      <!-- 0.7 -->
+      <g transform="translate(25.7325 111.9206)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-55"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_9">
+     <g id="line2d_37">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 79.7544 
+L 409.8525 79.7544 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_38">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="79.7544"/>
+      </g>
+     </g>
+     <g id="text_20">
+      <!-- 0.8 -->
+      <g transform="translate(25.7325 85.3094)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-56"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_10">
+     <g id="line2d_39">
+      <path clip-path="url(#pc39f415831)" d="M 52.7325 53.1432 
+L 409.8525 53.1432 
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+     </g>
+     <g id="line2d_40">
+      <g>
+       <use style="stroke:#000000;stroke-width:0.8;" x="52.7325" xlink:href="#ma2e034f377" y="53.1432"/>
+      </g>
+     </g>
+     <g id="text_21">
+      <!-- 0.9 -->
+      <g transform="translate(25.7325 58.6982)scale(0.16 -0.16)">
+       <use xlink:href="#TimesNewRomanPSMT-48"/>
+       <use x="50" xlink:href="#TimesNewRomanPSMT-46"/>
+       <use x="75" xlink:href="#TimesNewRomanPSMT-57"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_22">
+     <!-- Precision -->
+     <defs>
+      <path d="M 20.515625 31 
+L 20.515625 11.71875 
+Q 20.515625 5.46875 21.875 3.953125 
+Q 23.734375 1.8125 27.484375 1.8125 
+L 30.03125 1.8125 
+L 30.03125 0 
+L 1.65625 0 
+L 1.65625 1.8125 
+L 4.15625 1.8125 
+Q 8.34375 1.8125 10.15625 4.546875 
+Q 11.140625 6.0625 11.140625 11.71875 
+L 11.140625 54.5 
+Q 11.140625 60.75 9.8125 62.25 
+Q 7.90625 64.40625 4.15625 64.40625 
+L 1.65625 64.40625 
+L 1.65625 66.21875 
+L 25.921875 66.21875 
+Q 34.8125 66.21875 39.9375 64.375 
+Q 45.0625 62.546875 48.578125 58.203125 
+Q 52.09375 53.859375 52.09375 47.90625 
+Q 52.09375 39.796875 46.75 34.71875 
+Q 41.40625 29.640625 31.640625 29.640625 
+Q 29.25 29.640625 26.46875 29.984375 
+Q 23.6875 30.328125 20.515625 31 
+z
+M 20.515625 33.796875 
+Q 23.09375 33.296875 25.09375 33.046875 
+Q 27.09375 32.8125 28.515625 32.8125 
+Q 33.59375 32.8125 37.28125 36.734375 
+Q 40.96875 40.671875 40.96875 46.921875 
+Q 40.96875 51.21875 39.203125 54.90625 
+Q 37.453125 58.59375 34.21875 60.421875 
+Q 31 62.25 26.90625 62.25 
+Q 24.421875 62.25 20.515625 61.328125 
+z
+" id="TimesNewRomanPSMT-80"/>
+      <path d="M 16.21875 46.046875 
+L 16.21875 35.984375 
+Q 21.828125 46.046875 27.734375 46.046875 
+Q 30.421875 46.046875 32.171875 44.40625 
+Q 33.9375 42.78125 33.9375 40.625 
+Q 33.9375 38.71875 32.65625 37.390625 
+Q 31.390625 36.078125 29.640625 36.078125 
+Q 27.9375 36.078125 25.8125 37.765625 
+Q 23.6875 39.453125 22.65625 39.453125 
+Q 21.78125 39.453125 20.75 38.484375 
+Q 18.5625 36.46875 16.21875 31.890625 
+L 16.21875 10.453125 
+Q 16.21875 6.734375 17.140625 4.828125 
+Q 17.78125 3.515625 19.390625 2.640625 
+Q 21 1.765625 24.03125 1.765625 
+L 24.03125 0 
+L 1.125 0 
+L 1.125 1.765625 
+Q 4.546875 1.765625 6.203125 2.828125 
+Q 7.421875 3.609375 7.90625 5.328125 
+Q 8.15625 6.15625 8.15625 10.0625 
+L 8.15625 27.390625 
+Q 8.15625 35.203125 7.828125 36.6875 
+Q 7.515625 38.1875 6.65625 38.859375 
+Q 5.8125 39.546875 4.546875 39.546875 
+Q 3.03125 39.546875 1.125 38.8125 
+L 0.640625 40.578125 
+L 14.15625 46.046875 
+z
+" id="TimesNewRomanPSMT-114"/>
+      <path d="M 14.5 69.4375 
+Q 16.546875 69.4375 17.984375 67.984375 
+Q 19.4375 66.546875 19.4375 64.5 
+Q 19.4375 62.453125 17.984375 60.984375 
+Q 16.546875 59.515625 14.5 59.515625 
+Q 12.453125 59.515625 10.984375 60.984375 
+Q 9.515625 62.453125 9.515625 64.5 
+Q 9.515625 66.546875 10.953125 67.984375 
+Q 12.40625 69.4375 14.5 69.4375 
+z
+M 18.5625 46.046875 
+L 18.5625 10.109375 
+Q 18.5625 5.90625 19.171875 4.515625 
+Q 19.78125 3.125 20.96875 2.4375 
+Q 22.171875 1.765625 25.34375 1.765625 
+L 25.34375 0 
+L 3.609375 0 
+L 3.609375 1.765625 
+Q 6.890625 1.765625 8 2.390625 
+Q 9.125 3.03125 9.78125 4.484375 
+Q 10.453125 5.953125 10.453125 10.109375 
+L 10.453125 27.34375 
+Q 10.453125 34.625 10.015625 36.765625 
+Q 9.671875 38.328125 8.9375 38.9375 
+Q 8.203125 39.546875 6.9375 39.546875 
+Q 5.5625 39.546875 3.609375 38.8125 
+L 2.9375 40.578125 
+L 16.40625 46.046875 
+z
+" id="TimesNewRomanPSMT-105"/>
+      <path d="M 32.03125 46.046875 
+L 32.03125 30.8125 
+L 30.421875 30.8125 
+Q 28.5625 37.984375 25.65625 40.578125 
+Q 22.75 43.171875 18.265625 43.171875 
+Q 14.84375 43.171875 12.734375 41.359375 
+Q 10.640625 39.546875 10.640625 37.359375 
+Q 10.640625 34.625 12.203125 32.671875 
+Q 13.71875 30.671875 18.359375 28.421875 
+L 25.484375 24.953125 
+Q 35.40625 20.125 35.40625 12.203125 
+Q 35.40625 6.109375 30.78125 2.359375 
+Q 26.171875 -1.375 20.453125 -1.375 
+Q 16.359375 -1.375 11.078125 0.09375 
+Q 9.46875 0.59375 8.453125 0.59375 
+Q 7.328125 0.59375 6.6875 -0.6875 
+L 5.078125 -0.6875 
+L 5.078125 15.28125 
+L 6.6875 15.28125 
+Q 8.0625 8.453125 11.90625 4.984375 
+Q 15.765625 1.515625 20.5625 1.515625 
+Q 23.921875 1.515625 26.046875 3.484375 
+Q 28.171875 5.46875 28.171875 8.25 
+Q 28.171875 11.625 25.796875 13.921875 
+Q 23.4375 16.21875 16.359375 19.734375 
+Q 9.28125 23.25 7.078125 26.078125 
+Q 4.890625 28.859375 4.890625 33.109375 
+Q 4.890625 38.625 8.671875 42.328125 
+Q 12.453125 46.046875 18.453125 46.046875 
+Q 21.09375 46.046875 24.859375 44.921875 
+Q 27.34375 44.1875 28.171875 44.1875 
+Q 28.953125 44.1875 29.390625 44.53125 
+Q 29.828125 44.875 30.421875 46.046875 
+z
+" id="TimesNewRomanPSMT-115"/>
+      <path d="M 25 46.046875 
+Q 35.15625 46.046875 41.3125 38.328125 
+Q 46.53125 31.734375 46.53125 23.1875 
+Q 46.53125 17.1875 43.640625 11.03125 
+Q 40.765625 4.890625 35.71875 1.75 
+Q 30.671875 -1.375 24.46875 -1.375 
+Q 14.359375 -1.375 8.40625 6.6875 
+Q 3.375 13.484375 3.375 21.921875 
+Q 3.375 28.078125 6.421875 34.15625 
+Q 9.46875 40.234375 14.453125 43.140625 
+Q 19.4375 46.046875 25 46.046875 
+z
+M 23.484375 42.875 
+Q 20.90625 42.875 18.28125 41.328125 
+Q 15.671875 39.796875 14.0625 35.9375 
+Q 12.453125 32.078125 12.453125 26.03125 
+Q 12.453125 16.265625 16.328125 9.171875 
+Q 20.21875 2.09375 26.5625 2.09375 
+Q 31.296875 2.09375 34.375 6 
+Q 37.453125 9.90625 37.453125 19.4375 
+Q 37.453125 31.34375 32.328125 38.1875 
+Q 28.859375 42.875 23.484375 42.875 
+z
+" id="TimesNewRomanPSMT-111"/>
+      <path d="M 16.15625 36.578125 
+Q 24.03125 46.046875 31.15625 46.046875 
+Q 34.8125 46.046875 37.453125 44.21875 
+Q 40.09375 42.390625 41.65625 38.1875 
+Q 42.71875 35.25 42.71875 29.203125 
+L 42.71875 10.109375 
+Q 42.71875 5.859375 43.40625 4.34375 
+Q 43.953125 3.125 45.140625 2.4375 
+Q 46.34375 1.765625 49.5625 1.765625 
+L 49.5625 0 
+L 27.4375 0 
+L 27.4375 1.765625 
+L 28.375 1.765625 
+Q 31.5 1.765625 32.734375 2.703125 
+Q 33.984375 3.65625 34.46875 5.515625 
+Q 34.671875 6.25 34.671875 10.109375 
+L 34.671875 28.421875 
+Q 34.671875 34.515625 33.078125 37.28125 
+Q 31.5 40.046875 27.734375 40.046875 
+Q 21.921875 40.046875 16.15625 33.6875 
+L 16.15625 10.109375 
+Q 16.15625 5.5625 16.703125 4.5 
+Q 17.390625 3.078125 18.578125 2.421875 
+Q 19.78125 1.765625 23.4375 1.765625 
+L 23.4375 0 
+L 1.3125 0 
+L 1.3125 1.765625 
+L 2.296875 1.765625 
+Q 5.71875 1.765625 6.90625 3.484375 
+Q 8.109375 5.21875 8.109375 10.109375 
+L 8.109375 26.703125 
+Q 8.109375 34.765625 7.734375 36.515625 
+Q 7.375 38.28125 6.609375 38.90625 
+Q 5.859375 39.546875 4.59375 39.546875 
+Q 3.21875 39.546875 1.3125 38.8125 
+L 0.59375 40.578125 
+L 14.0625 46.046875 
+L 16.15625 46.046875 
+z
+" id="TimesNewRomanPSMT-110"/>
+     </defs>
+     <g transform="translate(18.31 189.36175)rotate(-90)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-80"/>
+      <use x="55.615234" xlink:href="#TimesNewRomanPSMT-114"/>
+      <use x="88.916016" xlink:href="#TimesNewRomanPSMT-101"/>
+      <use x="133.300781" xlink:href="#TimesNewRomanPSMT-99"/>
+      <use x="177.685547" xlink:href="#TimesNewRomanPSMT-105"/>
+      <use x="205.46875" xlink:href="#TimesNewRomanPSMT-115"/>
+      <use x="244.384766" xlink:href="#TimesNewRomanPSMT-105"/>
+      <use x="272.167969" xlink:href="#TimesNewRomanPSMT-111"/>
+      <use x="322.167969" xlink:href="#TimesNewRomanPSMT-110"/>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_41">
+    <path clip-path="url(#pc39f415831)" d="M 54.5181 257.864798 
+L 142.798901 257.864798 
+L 142.798901 257.864798 
+L 142.798901 257.864798 
+L 142.798901 257.864798 
+L 142.798901 257.864798 
+L 142.798901 257.864798 
+L 142.798901 257.864798 
+L 142.798901 257.864798 
+L 142.871813 257.864798 
+L 143.850909 257.864798 
+L 145.152898 257.864798 
+L 150.058793 257.864798 
+L 156.318757 257.864798 
+L 160.818431 257.864798 
+L 168.755357 257.864798 
+L 173.588341 257.864798 
+L 182.421035 258.58046 
+L 189.920493 261.255539 
+L 192.68071 264.83353 
+L 192.576551 266.235594 
+L 192.597382 266.56704 
+L 192.597382 266.634232 
+" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:3;"/>
+   </g>
+   <g id="line2d_42">
+    <path clip-path="url(#pc39f415831)" d="M 54.524037 107.335239 
+L 54.565701 106.047538 
+L 54.586533 108.332965 
+L 54.596948 108.015907 
+L 54.638612 110.252629 
+L 54.701108 109.084993 
+L 54.815683 107.200098 
+L 54.721939 109.15161 
+L 54.84693 107.641479 
+L 54.940674 108.278824 
+L 54.930258 106.718066 
+L 54.95109 108.012547 
+L 54.971921 107.485165 
+L 54.971921 109.851412 
+L 54.971921 111.012 
+L 55.07608 108.977742 
+L 55.273983 106.059724 
+L 55.107328 109.892386 
+L 55.273983 106.59435 
+L 55.336478 108.355911 
+L 55.378142 107.96518 
+L 55.388558 107.743292 
+L 55.430222 108.849312 
+L 55.440637 108.630383 
+L 55.440637 109.118483 
+L 55.544797 107.462969 
+L 55.63854 106.098151 
+L 55.555212 107.730277 
+L 55.690619 106.49669 
+L 55.732283 107.968684 
+L 55.794778 107.248436 
+L 55.846858 106.738654 
+L 55.857274 107.844 
+L 55.888522 108.552822 
+L 55.961433 107.67826 
+L 56.023929 107.011788 
+L 55.971849 107.91 
+L 56.086424 107.172 
+L 56.117672 108.23803 
+L 56.190583 107.813071 
+L 56.200999 107.643382 
+L 56.232247 108.665333 
+L 56.263495 108.161448 
+L 56.27391 108.745463 
+L 56.336406 107.75494 
+L 56.367654 108.005654 
+L 56.388486 107.682986 
+L 56.430149 108.492421 
+L 56.461397 108.015907 
+L 56.565556 109.940239 
+L 56.586388 109.969714 
+L 56.825954 107.543087 
+L 56.83637 108.699916 
+L 56.930113 107.422694 
+L 56.950945 107.144241 
+L 57.003024 107.718712 
+L 57.034272 107.307987 
+L 57.075936 107.69616 
+L 57.138431 107.19857 
+L 57.159263 106.933655 
+L 57.190511 107.748 
+L 57.211343 108.082452 
+L 57.263422 107.430048 
+L 57.29467 107.6328 
+L 57.305086 107.504273 
+L 57.336334 108.284276 
+L 57.357165 108.0288 
+L 57.450909 108.880683 
+L 57.461325 108.755342 
+L 57.471741 108.630383 
+L 57.502988 109.366863 
+L 57.596731 109.887671 
+L 57.596731 109.07782 
+L 57.607147 109.765269 
+L 57.627979 109.789263 
+L 57.794634 108.67468 
+L 57.846713 109.645412 
+L 57.898793 109.067433 
+L 57.930041 108.724488 
+L 57.940457 109.623367 
+L 57.971704 109.281896 
+L 58.0342 109.849117 
+L 58.023784 108.96887 
+L 58.075863 109.64741 
+L 58.117527 109.692 
+L 58.232102 108.974541 
+L 58.252934 110.186872 
+L 58.336261 109.798207 
+L 58.377925 109.839559 
+L 58.596659 108.13531 
+L 58.679986 109.129565 
+L 58.700818 108.930535 
+L 58.794561 108.704352 
+L 58.72165 109.173496 
+L 58.794561 108.922548 
+L 58.867473 109.750222 
+L 58.898721 109.459926 
+L 58.971632 108.790381 
+L 59.013296 109.254816 
+L 59.117455 110.37958 
+L 59.242446 109.874769 
+L 59.138287 110.395804 
+L 59.242446 110.075394 
+L 59.336189 110.839034 
+L 59.346605 110.748284 
+L 59.367437 110.567368 
+L 59.398684 111.075045 
+L 59.492428 112.177241 
+L 59.502844 112.087841 
+L 59.544507 111.7321 
+L 59.575755 112.40113 
+L 59.607003 113.425714 
+L 59.679914 113.173116 
+L 59.752825 112.744814 
+L 59.763241 113.376934 
+L 59.773657 113.647272 
+L 59.867401 113.051172 
+L 59.867401 113.227937 
+L 60.013223 112.74817 
+L 59.898648 113.32465 
+L 60.034055 112.755367 
+L 60.138214 113.810699 
+L 60.190294 113.400169 
+L 60.284037 113.506396 
+L 60.346533 113.85 
+L 60.336117 113.27026 
+L 60.388196 113.694027 
+L 60.42986 113.86512 
+L 60.575683 113.089935 
+L 60.617346 113.897963 
+L 60.679842 113.593333 
+L 60.700674 113.440056 
+L 60.721505 113.915538 
+L 60.773585 113.690634 
+L 60.877744 114.170943 
+L 60.898576 114.020877 
+L 60.919408 114.480429 
+L 60.971487 114.258753 
+L 61.075646 115.751293 
+L 61.200637 115.453946 
+L 61.096478 116.0424 
+L 61.200637 115.598946 
+L 61.211053 116.534107 
+L 61.304797 116.165212 
+L 61.356876 115.805528 
+L 61.388124 116.297053 
+L 61.419372 116.082816 
+L 61.513115 115.865106 
+L 61.523531 116.488292 
+L 61.565194 116.206959 
+L 61.57561 116.823698 
+L 61.57561 117.233217 
+L 61.679769 117.075484 
+L 61.700601 116.936613 
+L 61.721433 117.201176 
+L 61.783929 117.054533 
+L 61.877672 117.628018 
+L 61.888088 117.559832 
+L 61.960999 117.085376 
+L 61.971415 117.668949 
+L 61.981831 117.60144 
+L 61.981831 117.860379 
+L 62.08599 117.189833 
+L 62.08599 117.703608 
+L 62.179733 117.361804 
+L 62.179733 117.742852 
+L 62.263061 117.595488 
+L 62.283892 118.091279 
+L 62.346388 117.7 
+L 62.36722 118.190704 
+L 62.377636 118.12579 
+L 62.398467 118.488897 
+L 62.481795 118.4616 
+L 62.617202 117.996498 
+L 62.638033 118.111233 
+L 62.638033 118.351636 
+L 62.742193 118.081794 
+L 62.846352 117.816698 
+L 62.877599 117.867811 
+L 62.940095 118.085928 
+L 62.940095 117.734704 
+L 62.981759 117.841458 
+L 62.992175 117.780544 
+L 63.023422 118.179066 
+L 63.033838 118.349452 
+L 63.096334 117.986058 
+L 63.127581 118.264633 
+L 63.179661 118.420543 
+L 63.28382 117.937936 
+L 63.28382 118.164093 
+L 63.367147 117.692067 
+L 63.387979 118.135938 
+L 63.419227 118.183353 
+L 63.533802 117.876334 
+L 63.606713 118.4616 
+L 63.637961 118.398056 
+L 63.669209 118.226022 
+L 63.669209 118.660438 
+L 63.700457 118.596835 
+L 63.700457 118.704872 
+L 63.7942 118.515261 
+L 63.804616 118.565812 
+L 63.919191 118.266765 
+L 63.919191 118.479291 
+L 63.981686 118.882839 
+L 64.02335 118.660039 
+L 64.221252 118.032735 
+L 64.221252 118.136547 
+L 64.294164 118.888518 
+L 64.325411 118.827887 
+L 64.346243 118.719686 
+L 64.346243 119.126526 
+L 64.377491 119.065694 
+L 64.439986 119.847993 
+L 64.48165 119.732516 
+L 64.554561 119.358217 
+L 64.564977 119.800528 
+L 64.585809 119.989806 
+L 64.637889 119.72415 
+L 64.669137 119.761714 
+L 64.679552 119.904632 
+L 64.814959 119.514488 
+L 64.814959 119.805299 
+L 64.919118 119.382431 
+L 64.929534 119.33079 
+L 64.960782 119.656465 
+L 65.012862 119.399357 
+L 65.044109 119.627287 
+L 65.117021 119.365157 
+L 65.117021 119.55474 
+L 65.127437 119.50388 
+L 65.137853 119.924985 
+L 65.148269 119.874118 
+L 65.210764 120.2253 
+L 65.210764 119.851493 
+L 65.252428 120.116155 
+L 65.471162 119.529651 
+L 65.523241 120.015613 
+L 65.491994 119.52281 
+L 65.575321 119.769345 
+L 65.585737 119.720246 
+L 65.616985 120.027039 
+L 65.616985 120.117509 
+L 65.689896 119.865645 
+L 65.721144 119.989648 
+L 65.877382 119.355381 
+L 65.919046 119.520777 
+L 65.929462 119.650719 
+L 65.991958 119.364933 
+L 66.023205 119.488002 
+L 66.200276 118.952523 
+L 66.210692 119.081032 
+L 66.262771 119.371074 
+L 66.231524 119.075227 
+L 66.314851 119.312308 
+L 66.356514 119.213758 
+L 66.377346 119.380223 
+L 66.41901 119.281993 
+L 66.450258 119.998924 
+L 66.523169 119.932094 
+L 66.554417 120.216937 
+L 66.637744 119.852405 
+L 66.679408 120.006419 
+L 66.741903 119.735478 
+L 66.741903 119.985708 
+L 66.773151 119.933853 
+L 66.783567 120.137951 
+L 66.825231 120.041154 
+L 66.825231 120.123858 
+L 66.887726 119.938074 
+L 66.92939 120.006848 
+L 66.939806 119.962379 
+L 66.960637 120.283169 
+L 67.002301 120.105694 
+L 67.012717 120.549872 
+L 67.10646 120.395144 
+L 67.168956 120.292957 
+L 67.179372 120.490388 
+L 67.189788 120.446585 
+L 67.231451 120.831429 
+L 67.293947 120.808168 
+L 67.38769 120.497065 
+L 67.439769 120.675971 
+L 67.543929 121.106709 
+L 67.606424 120.927807 
+L 67.606424 121.314904 
+L 67.679335 121.01671 
+L 67.783495 122.195489 
+L 67.856406 122.125631 
+L 67.814742 122.294674 
+L 67.877238 122.2667 
+L 67.970981 122.634456 
+L 67.981397 122.592508 
+L 68.12722 122.3784 
+L 68.033476 122.605493 
+L 68.137636 122.410588 
+L 68.220963 123.537785 
+L 68.168883 122.359896 
+L 68.241795 123.527155 
+L 68.262627 123.44443 
+L 68.283458 123.793504 
+L 68.387618 124.095186 
+L 68.439697 123.960984 
+L 68.460529 124.232801 
+L 68.470945 124.191871 
+L 68.575104 124.135943 
+L 68.575104 124.555814 
+L 68.825086 123.796756 
+L 68.86675 123.844865 
+L 68.950077 124.419727 
+L 68.970909 124.408555 
+L 69.002156 124.289628 
+L 69.022988 124.618498 
+L 69.033404 124.578915 
+L 69.04382 124.674878 
+L 69.137563 124.455236 
+L 69.137563 124.5227 
+L 69.189643 124.595655 
+L 69.314634 124.261526 
+L 69.32505 124.4232 
+L 69.387545 124.190679 
+L 69.418793 124.274559 
+L 69.50212 124.099421 
+L 69.522952 124.287429 
+L 69.533368 124.578747 
+L 69.627111 124.365768 
+L 69.73127 124.182098 
+L 69.658359 124.382521 
+L 69.73127 124.377908 
+L 69.835429 125.099558 
+L 69.887509 125.039234 
+L 69.918757 125.182215 
+L 69.929173 125.144605 
+L 69.970836 125.121992 
+L 70.033332 125.405244 
+L 70.06458 125.293143 
+L 70.095827 125.559742 
+L 70.106243 125.522458 
+L 70.106243 125.648208 
+L 70.210402 125.46469 
+L 70.210402 125.527257 
+L 70.335393 125.209421 
+L 70.377057 125.31151 
+L 70.387473 125.398972 
+L 70.481216 125.13205 
+L 70.512464 125.022899 
+L 70.533296 125.258866 
+L 70.595791 125.102855 
+L 70.679118 125.243133 
+L 70.668703 125.095604 
+L 70.69995 125.171107 
+L 70.710366 125.135133 
+L 70.710366 125.379138 
+L 70.762446 125.321126 
+L 70.856189 125.483394 
+L 70.793693 125.27432 
+L 70.866605 125.447684 
+L 71.043675 125.204882 
+L 71.137419 125.424973 
+L 71.064507 125.194189 
+L 71.147835 125.389817 
+L 71.189498 125.546033 
+L 71.272825 125.325258 
+L 71.304073 125.39772 
+L 71.345737 125.258522 
+L 71.376985 125.272082 
+L 71.397816 125.320244 
+L 71.543639 125.071381 
+L 71.564471 125.061103 
+L 71.647798 125.252454 
+L 71.689462 125.115864 
+L 71.710294 125.33687 
+L 71.762373 125.224364 
+L 71.762373 125.339587 
+L 71.814453 125.169873 
+L 71.866533 125.173036 
+L 71.970692 125.122233 
+L 71.89778 125.300842 
+L 71.970692 125.17931 
+L 71.991524 125.623943 
+L 72.074851 125.525304 
+L 72.137346 125.324845 
+L 72.199842 125.463049 
+L 72.199842 125.519226 
+L 72.304001 125.299807 
+L 72.314417 125.266763 
+L 72.345665 125.447171 
+L 72.376912 125.404003 
+L 72.481071 125.906276 
+L 72.543567 125.819668 
+L 72.553983 126.006575 
+L 72.564399 125.973853 
+L 72.585231 126.182079 
+L 72.658142 125.953674 
+L 72.668558 126.030206 
+L 72.678974 125.997669 
+L 72.720637 126.193893 
+L 72.762301 126.064125 
+L 72.824797 126.140579 
+L 72.814381 126.010698 
+L 72.86646 126.065472 
+L 72.887292 126.216489 
+L 73.022699 125.906729 
+L 73.126858 126.122013 
+L 73.137274 126.090196 
+L 73.178938 126.228627 
+L 73.199769 126.218131 
+L 73.231017 126.703437 
+L 73.303929 126.481749 
+L 73.356008 126.376483 
+L 73.408088 126.480955 
+L 73.512247 127.050288 
+L 73.574742 126.914118 
+L 73.626822 127.015495 
+L 73.689317 127.13632 
+L 73.647654 127.004541 
+L 73.730981 127.012079 
+L 73.751813 127.052259 
+L 73.88722 126.854591 
+L 73.928883 126.833247 
+L 73.991379 127.054185 
+L 74.168449 126.837613 
+L 74.262193 127.214375 
+L 74.189281 126.827085 
+L 74.272608 127.184103 
+L 74.283024 127.203577 
+L 74.480927 126.879723 
+L 74.480927 126.929161 
+L 74.533006 126.779671 
+L 74.585086 126.877083 
+L 74.751741 126.696871 
+L 74.751741 126.794717 
+L 74.8559 126.597617 
+L 74.8559 126.646382 
+L 74.887147 126.558254 
+L 74.907979 126.742844 
+L 74.949643 126.674147 
+L 74.991307 126.750959 
+L 75.053802 126.624199 
+L 75.126713 126.46892 
+L 75.137129 126.680848 
+L 75.147545 126.94 
+L 75.241288 126.6792 
+L 75.26212 126.621428 
+L 75.272536 126.879358 
+L 75.282952 126.850481 
+L 75.282952 126.898177 
+L 75.376695 126.686602 
+L 75.387111 126.705468 
+L 75.418359 126.809397 
+L 75.522518 126.618036 
+L 75.532934 126.778633 
+L 75.626677 126.7109 
+L 75.751668 126.605739 
+L 75.699589 126.747206 
+L 75.762084 126.624352 
+L 75.814164 126.857047 
+L 75.866243 126.71622 
+L 75.876659 126.688102 
+L 75.897491 126.910847 
+L 75.907907 126.882746 
+L 75.907907 127.021846 
+L 76.012066 126.74154 
+L 76.012066 126.787804 
+L 76.084977 126.823237 
+L 76.157889 126.674536 
+L 76.241216 126.590701 
+L 76.262048 126.764583 
+L 76.387039 126.616431 
+L 76.272464 126.782687 
+L 76.397455 126.680107 
+L 76.428703 126.643232 
+L 76.501614 126.99545 
+L 76.595357 126.974817 
+L 76.543278 127.111474 
+L 76.595357 127.019824 
+L 76.626605 127.207434 
+L 76.616189 127.010228 
+L 76.699516 127.106365 
+L 76.730764 127.024862 
+L 76.772428 127.184276 
+L 76.793259 127.130074 
+L 76.793259 127.219156 
+L 76.887003 127.020348 
+L 76.897419 127.03782 
+L 76.928666 126.957006 
+L 76.928666 127.223027 
+L 76.97033 127.292164 
+L 77.032825 127.130991 
+L 77.147401 126.924944 
+L 77.157816 127.074183 
+L 77.157816 127.118101 
+L 77.261976 126.939674 
+L 77.345303 126.771498 
+L 77.386967 126.884236 
+L 77.491126 127.444673 
+L 77.65778 127.23984 
+L 77.65778 127.282791 
+L 77.689028 127.504308 
+L 77.761939 127.4497 
+L 77.814019 127.319517 
+L 77.897346 127.409718 
+L 77.949426 127.576833 
+L 78.001505 127.574271 
+L 78.095249 127.552861 
+L 78.022337 127.691246 
+L 78.095249 127.636941 
+L 78.095249 127.762901 
+L 78.188992 127.573511 
+L 78.199408 127.631613 
+L 78.313983 127.475672 
+L 78.324399 127.616947 
+L 78.355646 127.582094 
+L 78.428558 127.777525 
+L 78.501469 127.599857 
+L 78.553549 127.762308 
+L 78.647292 127.822826 
+L 78.62646 127.708963 
+L 78.657708 127.797617 
+L 78.782699 127.578 
+L 78.813947 127.707255 
+L 78.813947 127.748071 
+L 78.918106 127.498217 
+L 79.032681 127.346878 
+L 79.043097 127.484562 
+L 79.043097 127.606212 
+L 79.147256 127.480018 
+L 79.178504 127.527097 
+L 79.303495 127.392853 
+L 79.355574 127.591277 
+L 79.407654 127.548837 
+L 79.41807 127.524372 
+L 79.41807 127.724081 
+L 79.490981 127.632721 
+L 79.574308 127.795292 
+L 79.59514 127.746631 
+L 79.730547 127.510578 
+L 79.761795 127.635484 
+L 79.793042 127.72058 
+L 79.855538 127.575956 
+L 79.865954 127.5912 
+L 79.886786 127.660888 
+L 80.05344 127.434112 
+L 80.05344 127.473206 
+L 80.157599 127.312972 
+L 80.168015 127.289197 
+L 80.168015 127.445082 
+L 80.240927 127.395518 
+L 80.324254 127.438777 
+L 80.313838 127.346187 
+L 80.345086 127.391502 
+L 80.376334 127.320674 
+L 80.397165 127.543913 
+L 80.417997 127.496744 
+L 80.428413 127.550251 
+L 80.511741 127.362048 
+L 80.522156 127.415511 
+L 80.605484 127.266454 
+L 80.647147 127.402999 
+L 80.751307 127.665599 
+L 80.782554 127.633727 
+L 80.79297 127.80019 
+L 80.813802 127.791529 
+L 80.886713 128.081946 
+L 80.917961 128.049926 
+L 80.970041 127.971635 
+L 81.001288 128.127379 
+L 81.011704 128.104241 
+L 81.02212 128.156018 
+L 81.105448 128.008731 
+L 81.115863 128.097778 
+L 81.230439 128.031196 
+L 81.136695 128.126334 
+L 81.240854 128.082648 
+L 81.240854 128.11982 
+L 81.334598 127.95084 
+L 81.345014 128.076313 
+L 81.355429 128.053458 
+L 81.386677 128.243795 
+L 81.449173 128.438363 
+L 81.417925 128.212219 
+L 81.490836 128.383944 
+L 81.699155 128.186784 
+L 81.730402 128.37442 
+L 81.803314 128.289366 
+L 81.824146 128.24435 
+L 81.855393 128.394739 
+L 81.907473 128.318667 
+L 81.917889 128.368648 
+L 82.001216 128.225636 
+L 82.011632 128.311656 
+L 82.094959 128.169164 
+L 82.157455 128.25161 
+L 82.157455 128.287551 
+L 82.261614 128.173209 
+L 82.27203 128.151055 
+L 82.324109 128.290915 
+L 82.334525 128.447234 
+L 82.428269 128.284097 
+L 82.428269 128.355279 
+L 82.438684 128.3688 
+L 82.647003 128.142566 
+L 82.73033 128.179931 
+L 82.688666 128.090547 
+L 82.751162 128.136324 
+L 82.761578 128.114535 
+L 82.803241 128.274008 
+L 82.824073 128.230491 
+L 82.855321 128.481051 
+L 82.928232 128.364041 
+L 82.949064 128.32069 
+L 82.980312 128.50015 
+L 83.042807 128.370364 
+L 83.074055 128.340427 
+L 83.146967 128.502251 
+L 83.18863 128.416164 
+L 83.24071 128.550937 
+L 83.251126 128.529464 
+L 83.251126 128.564 
+L 83.355285 128.41871 
+L 83.355285 128.487626 
+L 83.396948 128.402128 
+L 83.41778 128.600068 
+L 83.501108 128.840114 
+L 83.521939 128.797495 
+L 83.553187 128.733632 
+L 83.605267 128.865767 
+L 83.626099 128.823288 
+L 83.730258 129.119467 
+L 83.75109 129.07712 
+L 83.771921 129.270749 
+L 83.813585 129.186156 
+L 83.824001 129.23229 
+L 83.917744 129.109655 
+L 83.917744 129.143214 
+L 83.959408 129.059055 
+L 83.959408 129.193114 
+L 84.042735 129.125465 
+L 84.053151 129.171317 
+L 84.136478 129.003845 
+L 84.146894 129.049668 
+L 84.271885 128.932676 
+L 84.15731 129.062112 
+L 84.282301 129.011591 
+L 84.282301 129.078 
+L 84.376044 128.957372 
+L 84.38646 129.035995 
+L 84.542699 128.956981 
+L 84.61561 129.240022 
+L 84.594778 128.952746 
+L 84.646858 129.211014 
+L 84.834344 129.037939 
+L 84.834344 129.070569 
+L 84.876008 129.021439 
+L 84.938504 129.289165 
+L 85.105158 129.125594 
+L 85.105158 129.190226 
+L 85.115574 129.266787 
+L 85.209317 129.11676 
+L 85.250981 129.100365 
+L 85.282229 129.200604 
+L 85.292645 129.180429 
+L 85.292645 129.212544 
+L 85.375972 129.083496 
+L 85.396804 129.203492 
+L 85.500963 129.098708 
+L 85.40722 129.247378 
+L 85.521795 129.186327 
+L 85.615538 129.483079 
+L 85.625954 129.463088 
+L 85.646786 129.42313 
+L 85.657202 129.624614 
+L 85.698865 129.670997 
+L 85.698865 129.576337 
+L 85.761361 129.582908 
+L 85.834272 129.53813 
+L 85.844688 129.643991 
+L 85.844688 129.675391 
+L 85.928015 129.548049 
+L 85.948847 129.571139 
+L 86.04259 129.549677 
+L 85.990511 129.648486 
+L 86.04259 129.612166 
+L 86.105086 129.960762 
+L 86.14675 129.91291 
+L 86.167581 129.93552 
+L 86.365484 129.717256 
+L 86.469643 129.983731 
+L 86.480059 129.9949 
+L 86.677961 129.809038 
+L 86.730041 130.047675 
+L 86.78212 129.981298 
+L 86.896695 129.951109 
+L 86.813368 130.044847 
+L 86.896695 129.981428 
+L 86.990439 130.201096 
+L 87.000854 130.181859 
+L 87.021686 130.143406 
+L 87.073766 130.258054 
+L 87.084182 130.23886 
+L 87.146677 130.363814 
+L 87.188341 130.287214 
+L 87.34458 130.150399 
+L 87.34458 130.210096 
+L 87.365411 130.261471 
+L 87.448739 130.16895 
+L 87.625809 130.055052 
+L 87.709137 130.347579 
+L 87.729968 130.339349 
+L 87.80288 130.207614 
+L 87.865375 130.30076 
+L 87.969534 130.581552 
+L 88.021614 130.633675 
+L 88.084109 130.579739 
+L 88.136189 130.660711 
+L 88.125773 130.563237 
+L 88.188269 130.59655 
+L 88.198684 130.577937 
+L 88.2091 130.761972 
+L 88.240348 130.706155 
+L 88.271596 130.679294 
+L 88.344507 130.837682 
+L 88.407003 130.755261 
+L 88.417419 130.909086 
+L 88.448666 130.853566 
+L 88.552825 131.126321 
+L 88.636153 131.064281 
+L 88.573657 131.174878 
+L 88.646569 131.159633 
+L 88.740312 131.306016 
+L 88.750728 131.287644 
+L 88.896551 131.172336 
+L 88.917382 131.192186 
+L 88.927798 131.28661 
+L 89.021542 131.150496 
+L 89.167364 131.064452 
+L 89.17778 131.074351 
+L 89.209028 131.047984 
+L 89.281939 131.145036 
+L 89.386099 131.076 
+L 89.396514 131.141545 
+L 89.469426 131.237805 
+L 89.427762 131.1153 
+L 89.500674 131.183814 
+L 89.63608 130.978222 
+L 89.656912 131.108548 
+L 89.677744 131.210912 
+L 89.74024 131.103604 
+L 89.761071 131.123058 
+L 89.875646 131.09218 
+L 89.792319 131.152188 
+L 89.875646 131.119678 
+L 89.875646 131.147167 
+L 89.96939 130.987178 
+L 89.979806 131.051792 
+L 90.042301 131.055055 
+L 90.011053 131.108239 
+L 90.073549 131.111403 
+L 90.136044 131.359917 
+L 90.177708 131.289195 
+L 90.281867 131.14 
+L 90.333947 131.242065 
+L 90.344363 131.441109 
+L 90.438106 131.364 
+L 90.500601 131.366696 
+L 90.511017 131.456922 
+L 90.60476 131.728778 
+L 90.615176 131.711286 
+L 90.636008 131.729815 
+L 90.813079 131.593599 
+L 90.88599 131.764605 
+L 90.917238 131.73907 
+L 90.927654 131.748253 
+L 91.125556 131.604954 
+L 91.125556 131.657814 
+L 91.229715 131.538357 
+L 91.365122 131.499607 
+L 91.375538 131.508776 
+L 91.375538 131.561357 
+L 91.427618 131.475744 
+L 91.479697 131.5215 
+L 91.490113 131.504415 
+L 91.521361 131.662667 
+L 91.542193 131.628522 
+L 91.615104 131.665861 
+L 91.615104 131.587564 
+L 91.646352 131.640853 
+L 91.85467 131.509602 
+L 91.958829 131.677442 
+L 92.146316 131.580691 
+L 92.250475 131.74696 
+L 92.427545 131.590668 
+L 92.260891 131.807077 
+L 92.437961 131.650674 
+L 92.469209 131.855707 
+L 92.54212 131.8154 
+L 92.5942 131.757645 
+L 92.615032 131.876747 
+L 92.635863 131.868874 
+L 92.635863 131.944903 
+L 92.740023 131.854918 
+L 92.740023 131.930762 
+L 92.792102 131.873225 
+L 92.802518 131.982847 
+L 92.844182 131.967093 
+L 92.937925 132.1452 
+L 92.875429 131.942708 
+L 92.948341 132.128701 
+L 93.167075 131.933548 
+L 93.177491 131.967139 
+L 93.271234 132.069131 
+L 93.28165 132.052771 
+L 93.312898 132.003722 
+L 93.323314 132.161415 
+L 93.344146 132.153561 
+L 93.427473 132.246039 
+L 93.364977 132.145714 
+L 93.448305 132.213431 
+L 93.625375 132.060583 
+L 93.469137 132.230308 
+L 93.635791 132.118374 
+L 93.667039 132.389608 
+L 93.73995 132.349792 
+L 93.771198 132.301244 
+L 93.79203 132.440349 
+L 93.854525 132.367848 
+L 93.937853 132.409742 
+L 93.927437 132.352657 
+L 93.958684 132.377522 
+L 94.177419 132.21072 
+L 94.187835 132.219014 
+L 94.229498 132.300653 
+L 94.291994 132.204762 
+L 94.291994 132.229001 
+L 94.333657 132.165164 
+L 94.364905 132.310918 
+L 94.385737 132.279038 
+L 94.396153 132.407962 
+L 94.489896 132.31292 
+L 94.500312 132.297025 
+L 94.53156 132.441861 
+L 94.541976 132.570035 
+L 94.635719 132.499112 
+L 94.729462 132.380582 
+L 94.781542 132.468938 
+L 94.823205 132.6204 
+L 94.885701 132.525763 
+L 94.896117 132.581388 
+L 95.104435 132.385878 
+L 95.187762 132.544736 
+L 95.135683 132.362605 
+L 95.208594 132.537075 
+L 95.229426 132.505805 
+L 95.250258 132.61613 
+L 95.312753 132.569566 
+L 95.312753 132.593116 
+L 95.416912 132.484362 
+L 95.44816 132.461215 
+L 95.479408 132.578978 
+L 95.489824 132.563437 
+L 95.552319 132.634283 
+L 95.531487 132.548216 
+L 95.593983 132.619028 
+L 95.635646 132.6038 
+L 95.646062 132.681724 
+L 95.687726 132.666465 
+L 95.760637 132.837535 
+L 95.791885 132.791194 
+L 96.021035 132.614848 
+L 96.021035 132.638 
+L 96.104363 132.723323 
+L 96.041867 132.63045 
+L 96.125194 132.715755 
+L 96.229354 132.585853 
+L 96.302265 132.640191 
+L 96.343929 132.60221 
+L 96.406424 132.877732 
+L 96.573079 132.794505 
+L 96.573079 132.817315 
+L 96.573079 132.885705 
+L 96.677238 132.848024 
+L 96.687654 132.832894 
+L 96.729317 132.954117 
+L 96.791813 133.06734 
+L 96.833476 133.029578 
+L 96.843892 133.014493 
+L 96.864724 133.142438 
+L 96.906388 133.104702 
+L 96.989715 133.276856 
+L 97.010547 133.269231 
+L 97.020963 133.254195 
+L 97.073042 133.358457 
+L 97.177202 133.521256 
+L 97.406352 133.370435 
+L 97.510511 133.598332 
+L 97.812572 133.234625 
+L 97.822988 133.330095 
+L 97.927147 133.534179 
+L 97.947979 133.526618 
+L 97.947979 133.614238 
+L 97.979227 133.635674 
+L 97.979227 133.701263 
+L 98.083386 133.575954 
+L 98.083386 133.685069 
+L 98.197961 133.632517 
+L 98.208377 133.683131 
+L 98.208377 133.704877 
+L 98.281288 133.602347 
+L 98.312536 133.623638 
+L 98.468775 133.578142 
+L 98.541686 133.713992 
+L 98.572934 133.691922 
+L 98.593766 133.68441 
+L 98.593766 133.835226 
+L 98.604182 133.820684 
+L 98.677093 133.890953 
+L 98.708341 133.847411 
+L 98.729173 133.818403 
+L 98.739589 133.911157 
+L 98.791668 133.902969 
+L 98.86458 133.994108 
+L 98.895827 133.95073 
+L 99.010402 133.8773 
+L 99.020818 133.948116 
+L 99.09373 134.081147 
+L 99.124977 134.037972 
+L 99.291632 133.914264 
+L 99.312464 133.949125 
+L 99.312464 133.991438 
+L 99.416623 133.911769 
+L 99.531198 133.775914 
+L 99.562446 133.88079 
+L 99.562446 133.943967 
+L 99.666605 133.822719 
+L 99.7291 133.8846 
+L 99.812428 133.792146 
+L 99.864507 133.951749 
+L 99.843675 133.791608 
+L 99.916587 133.943716 
+L 99.95825 133.908069 
+L 99.989498 134.011738 
+L 100.072825 134.065392 
+L 100.06241 133.996279 
+L 100.093657 134.037202 
+L 100.301976 133.922111 
+L 100.354055 133.976282 
+L 100.343639 133.90748 
+L 100.406135 133.926952 
+L 100.416551 133.912959 
+L 100.458214 134.042909 
+L 100.46863 134.070174 
+L 100.551958 133.97904 
+L 100.562373 134.026879 
+L 100.69778 134.030777 
+L 100.74986 134.125287 
+L 100.801939 134.055818 
+L 100.833187 134.01418 
+L 100.885267 134.128889 
+L 100.906099 134.101169 
+L 100.999842 134.241558 
+L 100.937346 134.080032 
+L 101.010258 134.227725 
+L 101.072753 134.22612 
+L 101.093585 134.300028 
+L 101.104001 134.286218 
+L 101.197744 134.465776 
+L 101.20816 134.45199 
+L 101.322735 134.361139 
+L 101.353983 134.44089 
+L 101.426894 134.545944 
+L 101.458142 134.544948 
+L 101.520637 134.643162 
+L 101.593549 134.547319 
+L 101.66646 134.831052 
+L 101.697708 134.790055 
+L 101.728956 134.788912 
+L 101.728956 134.88838 
+L 101.760203 134.887176 
+L 101.801867 135.031021 
+L 101.864363 135.008648 
+L 101.937274 135.091288 
+L 102.010185 134.996132 
+L 102.041433 135.093449 
+L 102.114344 135.03788 
+L 102.156008 135.023049 
+L 102.156008 135.101712 
+L 102.197672 135.106492 
+L 102.280999 135.174814 
+L 102.239335 135.072013 
+L 102.301831 135.147792 
+L 102.437238 135.050743 
+L 102.437238 135.148469 
+L 102.541397 135.403473 
+L 102.551813 135.42887 
+L 102.697636 135.376627 
+L 102.801795 135.763894 
+L 102.812211 135.865848 
+L 102.926786 135.776266 
+L 102.926786 135.833811 
+L 103.030945 135.719486 
+L 103.187184 135.672918 
+L 103.051777 135.769434 
+L 103.187184 135.69203 
+L 103.291343 135.883363 
+L 103.447581 135.798663 
+L 103.447581 135.855601 
+L 103.478829 135.910723 
+L 103.551741 135.837183 
+L 103.718395 135.79653 
+L 103.822554 135.985411 
+L 103.989209 135.944568 
+L 104.082952 136.051477 
+L 104.093368 136.038406 
+L 104.207943 136.044154 
+L 104.103784 136.081387 
+L 104.207943 136.062799 
+L 104.280854 136.176341 
+L 104.312102 136.137275 
+L 104.364182 136.183653 
+L 104.510005 136.0575 
+L 104.614164 136.242363 
+L 104.655827 136.30124 
+L 104.728739 136.266001 
+L 104.759986 136.337622 
+L 104.832898 136.284054 
+L 104.916225 136.291107 
+L 104.884977 136.329736 
+L 104.937057 136.320354 
+L 104.957889 136.367874 
+L 105.0308 136.296194 
+L 105.041216 136.338215 
+L 105.134959 136.314076 
+L 105.145375 136.374239 
+L 105.249534 136.464661 
+L 105.270366 136.439074 
+L 105.280782 136.589712 
+L 105.301614 136.564132 
+L 105.332862 136.634527 
+L 105.405773 136.599429 
+L 105.478684 136.564411 
+L 105.426605 136.628169 
+L 105.530764 136.609098 
+L 105.624507 136.710843 
+L 105.634923 136.698131 
+L 105.645339 136.685421 
+L 105.655755 136.780591 
+L 105.687003 136.796355 
+L 105.759914 136.922599 
+L 105.749498 136.79196 
+L 105.791162 136.902441 
+L 105.947401 136.873353 
+L 105.989064 136.91198 
+L 106.05156 136.854049 
+L 106.05156 136.871864 
+L 106.176551 136.880747 
+L 106.207798 137.002737 
+L 106.28071 136.967874 
+L 106.416117 136.946276 
+L 106.416117 136.963949 
+L 106.468196 137.042526 
+L 106.520276 136.997566 
+L 106.655683 136.993585 
+L 106.718178 137.094378 
+L 106.759842 137.079597 
+L 106.874417 137.082802 
+L 106.79109 137.147346 
+L 106.874417 137.100294 
+L 106.96816 137.215488 
+L 106.978576 137.203074 
+L 107.061903 137.225772 
+L 106.999408 137.247954 
+L 107.061903 137.260569 
+L 107.061903 137.29535 
+L 107.124399 137.22102 
+L 107.166062 137.293094 
+L 107.238974 137.275921 
+L 107.186894 137.320394 
+L 107.24939 137.350187 
+L 107.24939 137.419414 
+L 107.353549 137.347836 
+L 107.520203 137.306177 
+L 107.613947 137.384989 
+L 107.551451 137.303776 
+L 107.624363 137.372716 
+L 107.780601 137.343435 
+L 107.780601 137.360582 
+L 107.88476 137.306877 
+L 107.88476 137.324 
+L 108.061831 137.253548 
+L 107.926424 137.360718 
+L 108.061831 137.270627 
+L 108.124326 137.572379 
+L 108.16599 137.52373 
+L 108.343061 137.402308 
+L 108.343061 137.487074 
+L 108.405556 137.651231 
+L 108.44722 137.636585 
+L 108.478467 137.667784 
+L 108.593042 137.636 
+L 108.634706 137.705499 
+L 108.613874 137.628704 
+L 108.697202 137.649986 
+L 108.759697 137.661708 
+L 108.718033 137.709858 
+L 108.770113 137.73353 
+L 108.874272 137.931059 
+L 108.936768 137.942389 
+L 108.895104 137.973751 
+L 108.947184 138.013674 
+L 109.040927 138.105223 
+L 109.051343 138.093239 
+L 109.165918 138.061088 
+L 109.061759 138.11445 
+L 109.176334 138.115396 
+L 109.207581 138.096093 
+L 109.280493 138.260366 
+L 109.311741 138.241054 
+L 109.342988 138.32062 
+L 109.384652 138.30585 
+L 109.395068 138.343288 
+L 109.467979 138.259927 
+L 109.488811 138.285443 
+L 109.499227 138.273548 
+L 109.530475 138.385603 
+L 109.551307 138.378223 
+L 109.582554 138.473605 
+L 109.572138 138.370848 
+L 109.655466 138.423207 
+L 109.728377 138.487228 
+L 109.790873 138.432476 
+L 109.801288 138.485864 
+L 109.895032 138.412016 
+L 110.082518 138.362367 
+L 110.186677 138.520334 
+L 110.270005 138.539514 
+L 110.28042 138.576223 
+L 110.3325 138.903992 
+L 110.38458 138.861381 
+L 110.519986 138.837418 
+L 110.519986 138.869458 
+L 110.519986 138.949499 
+L 110.624146 138.880563 
+L 110.697057 138.798864 
+L 110.728305 138.923529 
+L 110.822048 139.10514 
+L 110.832464 139.093495 
+L 110.915791 139.048047 
+L 110.957455 139.112564 
+L 111.030366 139.173741 
+L 111.061614 139.17055 
+L 111.07203 139.158951 
+L 111.07203 139.316841 
+L 111.113693 139.270451 
+L 111.217853 139.343612 
+L 111.426171 139.222564 
+L 111.447003 139.246583 
+L 111.509498 139.349797 
+L 111.467835 139.239219 
+L 111.551162 139.319394 
+L 111.717816 139.260564 
+L 111.717816 139.291781 
+L 111.728232 139.342701 
+L 111.801144 139.278029 
+L 111.821976 139.286282 
+L 111.853223 139.25193 
+L 111.884471 139.373204 
+L 111.894887 139.361761 
+L 111.978214 139.332438 
+L 111.999046 139.46471 
+L 112.124037 139.436142 
+L 112.144869 139.459738 
+L 112.186533 139.475976 
+L 112.228196 139.430438 
+L 112.249028 139.453997 
+L 112.311524 139.401209 
+L 112.332355 139.517204 
+L 112.342771 139.536633 
+L 112.415683 139.487937 
+L 112.436514 139.526756 
+L 112.582337 139.506338 
+L 112.582337 139.521674 
+L 112.582337 139.552335 
+L 112.665665 139.461882 
+L 112.686496 139.531178 
+L 112.72816 139.577781 
+L 112.821903 139.537375 
+L 112.905231 139.599797 
+L 112.894815 139.519582 
+L 112.926062 139.577289 
+L 113.051053 139.57938 
+L 112.978142 139.627616 
+L 113.051053 139.594582 
+L 113.134381 139.641473 
+L 113.113549 139.572829 
+L 113.155212 139.634216 
+L 113.280203 139.575619 
+L 113.280203 139.651313 
+L 113.280203 139.666443 
+L 113.342699 139.614479 
+L 113.384363 139.630257 
+L 113.530185 139.594858 
+L 113.530185 139.625012 
+L 113.540601 139.644014 
+L 113.623929 139.585091 
+L 113.634344 139.589026 
+L 113.811415 139.550625 
+L 113.87391 139.649148 
+L 113.915574 139.63481 
+L 113.936406 139.612672 
+L 113.957238 139.740155 
+L 113.967654 139.72909 
+L 113.967654 139.744034 
+L 114.061397 139.674415 
+L 114.071813 139.708158 
+L 114.248883 139.639963 
+L 114.259299 139.658736 
+L 114.353042 139.782694 
+L 114.363458 139.771699 
+L 114.519697 139.740437 
+L 114.519697 139.755246 
+L 114.592608 139.826444 
+L 114.540529 139.748124 
+L 114.623856 139.793589 
+L 114.728015 139.787541 
+L 114.644688 139.830772 
+L 114.728015 139.831784 
+L 114.728015 139.846525 
+L 114.821759 139.748228 
+L 114.832175 139.766784 
+L 114.998829 139.710186 
+L 114.998829 139.739585 
+L 115.061325 139.835804 
+L 115.030077 139.721645 
+L 115.102988 139.79233 
+L 115.12382 139.770606 
+L 115.134236 139.891581 
+L 115.196731 139.841083 
+L 115.238395 139.856197 
+L 115.300891 139.805795 
+L 115.300891 139.820407 
+L 115.342554 139.820915 
+L 115.35297 139.912225 
+L 115.363386 139.901402 
+L 115.436297 140.014976 
+L 115.384218 139.894341 
+L 115.467545 139.997088 
+L 115.540457 140.023174 
+L 115.498793 140.051849 
+L 115.561288 140.059629 
+L 115.6342 140.288068 
+L 115.665448 140.255724 
+L 115.717527 140.346133 
+L 115.800854 140.274434 
+L 115.905014 140.354013 
+L 116.050836 140.361702 
+L 116.113332 140.454947 
+L 116.154995 140.440734 
+L 116.207075 140.515808 
+L 116.259155 140.490903 
+L 116.311234 140.551524 
+L 116.363314 140.526642 
+L 116.384146 140.519544 
+L 116.394561 140.651051 
+L 116.394561 140.69365 
+L 116.498721 140.629662 
+L 116.498721 140.658025 
+L 116.623712 140.64372 
+L 116.644543 140.66492 
+L 116.665375 140.784995 
+L 116.748703 140.756523 
+L 116.852862 140.791435 
+L 116.769534 140.777614 
+L 116.852862 140.80551 
+L 116.915357 140.994861 
+L 116.957021 140.952534 
+L 117.092428 140.899256 
+L 117.092428 140.969242 
+L 117.154923 140.933914 
+L 117.196587 141.059355 
+L 117.34241 140.953802 
+L 117.384073 141.023183 
+L 117.446569 141.099192 
+L 117.425737 141.022898 
+L 117.488232 141.084976 
+L 117.623639 141.08739 
+L 117.51948 141.136756 
+L 117.623639 141.101243 
+L 117.623639 141.115094 
+L 117.727798 141.03815 
+L 117.727798 141.079663 
+L 117.873621 141.016408 
+L 117.884037 141.075018 
+L 117.904869 141.123135 
+L 117.988196 141.108672 
+L 118.134019 141.08688 
+L 118.144435 141.103978 
+L 118.238178 141.271137 
+L 118.248594 141.26076 
+L 118.394417 141.252425 
+L 118.394417 141.266086 
+L 118.394417 141.279744 
+L 118.48816 141.213943 
+L 118.498576 141.244544 
+L 118.581903 141.270951 
+L 118.508992 141.288755 
+L 118.592319 141.301477 
+L 118.686062 141.521024 
+L 118.696478 141.510712 
+L 118.811053 141.505725 
+L 118.821469 141.536014 
+L 118.915212 141.63251 
+L 118.873549 141.52513 
+L 118.925628 141.622232 
+L 119.092283 141.565801 
+L 119.092283 141.606178 
+L 119.123531 141.629231 
+L 119.196442 141.570986 
+L 119.196442 141.597863 
+L 119.269354 141.620239 
+L 119.22769 141.63431 
+L 119.279769 141.663664 
+L 119.279769 141.690474 
+L 119.331849 141.639374 
+L 119.383929 141.68206 
+L 119.415176 141.691579 
+L 119.436008 141.778096 
+L 119.540167 141.849551 
+L 119.675574 141.863622 
+L 119.727654 141.839385 
+L 119.779733 141.881551 
+L 119.810981 141.851103 
+L 119.842229 141.96647 
+L 119.894308 141.942246 
+L 119.946388 142.050232 
+L 120.050547 142.028197 
+L 120.060963 142.084003 
+L 120.092211 142.066845 
+L 120.165122 142.140891 
+L 120.175538 142.130792 
+L 120.19637 142.215703 
+L 120.217202 142.234888 
+L 120.248449 142.296403 
+L 120.321361 142.278207 
+L 120.331777 142.320484 
+L 120.456768 142.291182 
+L 120.508847 142.384473 
+L 120.560927 142.347266 
+L 120.581759 142.379301 
+L 120.665086 142.390129 
+L 120.696334 142.386056 
+L 120.769245 142.51068 
+L 120.810909 142.587229 
+L 120.873404 142.553069 
+L 120.967147 142.631117 
+L 120.977563 142.621128 
+L 121.144218 142.564692 
+L 121.154634 142.59338 
+L 121.248377 142.683858 
+L 121.258793 142.673909 
+L 121.415032 142.62754 
+L 121.425448 142.656081 
+L 121.519191 142.630885 
+L 121.529607 142.723345 
+L 121.685845 142.715367 
+L 121.727509 142.790571 
+L 121.790005 142.769505 
+L 121.946243 142.736045 
+L 121.956659 142.764309 
+L 121.998323 142.763014 
+L 122.060818 142.894129 
+L 122.185809 142.927934 
+L 122.279552 142.978415 
+L 122.237889 142.916734 
+L 122.289968 142.968607 
+L 122.425375 142.967185 
+L 122.300384 142.984009 
+L 122.425375 142.992345 
+L 122.519118 143.10526 
+L 122.456623 142.988138 
+L 122.529534 143.095483 
+L 122.59203 143.049399 
+L 122.633693 143.148133 
+L 122.727437 143.272747 
+L 122.737853 143.262997 
+L 122.904507 143.244288 
+L 122.7691 143.308573 
+L 122.904507 143.256737 
+L 122.977419 143.35032 
+L 123.008666 143.321174 
+L 123.258648 143.237337 
+L 123.33156 143.206789 
+L 123.362807 143.264408 
+L 123.404471 143.238132 
+L 123.414887 143.364341 
+L 123.425303 143.354684 
+L 123.466967 143.35308 
+L 123.529462 143.455344 
+L 123.664869 143.465311 
+L 123.539878 143.494905 
+L 123.664869 143.47759 
+L 123.716948 143.60116 
+L 123.769028 143.577566 
+L 123.925267 143.568062 
+L 123.779444 143.604674 
+L 123.925267 143.580279 
+L 123.925267 143.592495 
+L 124.01901 143.542852 
+L 124.029426 143.545478 
+L 124.123169 143.56908 
+L 124.060674 143.626503 
+L 124.123169 143.605624 
+L 124.227328 143.741027 
+L 124.373151 143.668065 
+L 124.393983 143.733828 
+L 124.47731 143.8632 
+L 124.498142 143.844156 
+L 124.654381 143.846254 
+L 124.70646 143.83491 
+L 124.75854 143.94384 
+L 124.789788 143.999445 
+L 124.914778 143.945713 
+L 124.914778 143.957702 
+L 125.018938 143.923008 
+L 125.018938 143.934983 
+L 125.039769 143.916079 
+L 125.050185 144.014315 
+L 125.081433 144.021828 
+L 125.081433 144.045724 
+L 125.185592 143.975213 
+L 125.310583 143.933725 
+L 125.320999 143.995833 
+L 125.373079 143.9726 
+L 125.425158 144.092116 
+L 125.49807 144.10945 
+L 125.435574 144.106474 
+L 125.508486 144.159369 
+L 125.602229 144.20519 
+L 125.570981 144.138596 
+L 125.612645 144.195809 
+L 125.67514 144.21052 
+L 125.695972 144.262677 
+L 125.748052 144.380996 
+L 125.800131 144.369522 
+L 125.820963 144.350806 
+L 125.862627 144.454569 
+L 125.966786 144.548902 
+L 126.13344 144.528427 
+L 126.13344 144.540125 
+L 126.216768 144.652501 
+L 126.237599 144.645546 
+L 126.456334 144.566898 
+L 126.46675 144.580898 
+L 126.487581 144.597247 
+L 126.570909 144.546342 
+L 126.737563 144.502829 
+L 126.737563 144.537642 
+L 126.737563 144.560842 
+L 126.831307 144.500893 
+L 126.841722 144.503254 
+L 126.956297 144.529174 
+L 126.956297 144.540742 
+L 127.060457 144.725692 
+L 127.237527 144.695987 
+L 127.237527 144.707485 
+L 127.310439 144.769579 
+L 127.341686 144.742056 
+L 127.508341 144.675752 
+L 127.508341 144.733033 
+L 127.6125 144.881648 
+L 127.789571 144.783481 
+L 127.799986 144.854127 
+L 127.89373 144.976806 
+L 127.904146 144.967698 
+L 128.102048 144.919686 
+L 128.102048 144.931018 
+L 128.195791 144.905959 
+L 128.206207 144.964782 
+L 128.331198 144.980323 
+L 128.331198 145.002898 
+L 128.435357 145.081475 
+L 128.560348 145.018049 
+L 128.58118 145.101166 
+L 128.654091 145.195093 
+L 128.685339 145.168038 
+L 128.779082 145.198928 
+L 128.789498 145.223484 
+L 128.893657 145.401401 
+L 129.143639 145.330566 
+L 129.164471 145.379305 
+L 129.247798 145.340952 
+L 129.351958 145.36239 
+L 129.258214 145.354196 
+L 129.351958 145.395627 
+L 129.393621 145.415231 
+L 129.393621 145.370948 
+L 129.456117 145.394827 
+L 129.581108 145.431408 
+L 129.654019 145.490341 
+L 129.685267 145.485657 
+L 129.924833 145.402248 
+L 129.924833 145.424231 
+L 130.018576 145.596708 
+L 130.028992 145.587842 
+L 130.268558 145.526456 
+L 130.362301 145.545229 
+L 130.351885 145.499485 
+L 130.372717 145.536402 
+L 130.560203 145.486742 
+L 130.560203 145.519408 
+L 130.591451 145.503886 
+L 130.664363 145.56193 
+L 130.831017 145.562489 
+L 130.935176 145.702109 
+L 131.049751 145.692169 
+L 130.945592 145.714955 
+L 131.060167 145.737361 
+L 131.133079 145.848469 
+L 131.164326 145.832998 
+L 131.174742 145.824258 
+L 131.185158 145.955213 
+L 131.195574 145.946474 
+L 131.278901 145.994585 
+L 131.216406 145.939733 
+L 131.299733 145.987843 
+L 131.445556 145.994224 
+L 131.445556 146.004917 
+L 131.539299 146.108091 
+L 131.549715 146.099389 
+L 131.71637 146.07752 
+L 131.560131 146.112014 
+L 131.71637 146.098808 
+L 131.789281 146.239964 
+L 131.820529 146.213939 
+L 131.966352 146.20925 
+L 131.966352 146.230433 
+L 131.987184 146.223709 
+L 132.070511 146.281439 
+L 132.112175 146.299682 
+L 132.112175 146.373567 
+L 132.143422 146.358191 
+L 132.247581 146.492992 
+L 132.40382 146.500211 
+L 132.466316 146.616232 
+L 132.435068 146.484868 
+L 132.507979 146.592276 
+L 132.63297 146.572791 
+L 132.63297 146.625033 
+L 132.705882 146.690151 
+L 132.68505 146.613423 
+L 132.737129 146.674831 
+L 132.924616 146.645547 
+L 132.757961 146.709775 
+L 132.924616 146.65595 
+L 132.935032 146.699385 
+L 133.018359 146.641345 
+L 133.028775 146.643188 
+L 133.216261 146.624441 
+L 133.32042 146.694575 
+L 133.466243 146.709791 
+L 133.497491 146.808079 
+L 133.570402 146.769213 
+L 133.914127 146.623377 
+L 133.914127 146.633657 
+L 134.007871 146.588437 
+L 134.018287 146.590266 
+L 134.195357 146.570028 
+L 134.039118 146.645246 
+L 134.195357 146.58028 
+L 134.278684 146.57439 
+L 134.299516 146.639441 
+L 134.403675 146.667773 
+L 134.403675 146.688195 
+L 134.424507 146.742817 
+L 134.507835 146.696022 
+L 134.611994 146.714008 
+L 134.51825 146.718207 
+L 134.611994 146.754717 
+L 134.695321 146.7995 
+L 134.716153 146.78275 
+L 134.820312 146.841117 
+L 134.85156 146.826165 
+L 134.924471 146.879055 
+L 135.059878 146.912049 
+L 135.132789 146.964668 
+L 135.164037 146.939671 
+L 135.361939 146.92256 
+L 135.455683 147.00856 
+L 135.466099 147.000259 
+L 135.497346 147.005461 
+L 135.497346 147.055598 
+L 135.528594 147.090825 
+L 135.549426 147.084251 
+L 135.632753 147.157985 
+L 135.82024 147.138796 
+L 135.82024 147.148769 
+L 135.851487 147.193742 
+L 135.924399 147.155839 
+L 136.018142 147.171138 
+L 136.028558 147.212601 
+L 136.059806 147.356619 
+L 136.132717 147.338573 
+L 136.143133 147.360056 
+L 136.320203 147.32903 
+L 136.320203 147.358688 
+L 136.413947 147.294635 
+L 136.424363 147.306186 
+L 136.549354 147.257126 
+L 136.570185 147.329516 
+L 136.643097 147.370688 
+L 136.674344 147.365812 
+L 136.747256 147.367561 
+L 136.768088 147.429822 
+L 136.872247 147.671466 
+L 136.893079 147.67468 
+L 136.903495 147.783705 
+L 136.945158 147.799815 
+L 136.986822 147.767168 
+L 137.007654 147.77035 
+L 137.122229 147.807279 
+L 137.01807 147.79143 
+L 137.122229 147.817008 
+L 137.215972 147.967116 
+L 137.226388 147.958977 
+L 137.445122 147.923913 
+L 137.549281 148.007101 
+L 137.601361 147.995529 
+L 137.632608 148.07729 
+L 137.643024 148.14623 
+L 137.736768 148.111854 
+L 137.809679 148.141752 
+L 137.747184 148.142227 
+L 137.809679 148.189769 
+L 137.913838 148.348553 
+L 138.028413 148.393575 
+L 138.132572 148.532224 
+L 138.142988 148.581255 
+L 138.226316 148.592869 
+L 138.299227 148.640965 
+L 138.330475 148.626324 
+L 138.424218 148.677181 
+L 138.424218 148.686647 
+L 138.497129 148.80062 
+L 138.528377 148.785987 
+L 138.663784 148.813811 
+L 138.715863 148.839695 
+L 138.767943 148.8185 
+L 138.955429 148.796858 
+L 138.778359 148.848132 
+L 138.955429 148.80625 
+L 138.955429 148.853195 
+L 139.038757 148.798737 
+L 139.059589 148.810933 
+L 139.319986 148.743066 
+L 139.372066 148.787523 
+L 139.424146 148.766504 
+L 139.549137 148.802008 
+L 139.64288 148.85184 
+L 139.601216 148.799676 
+L 139.653296 148.84392 
+L 139.778287 148.879181 
+L 139.882446 148.865161 
+L 139.882446 148.930123 
+L 139.944941 148.929102 
+L 139.965773 149.005949 
+L 140.069932 149.130421 
+L 140.257419 149.126951 
+L 140.351162 149.23096 
+L 140.361578 149.2231 
+L 140.371994 149.21524 
+L 140.371994 149.325408 
+L 140.403241 149.329347 
+L 140.496985 149.368619 
+L 140.486569 149.321517 
+L 140.507401 149.360771 
+L 140.642807 149.38687 
+L 140.642807 149.396007 
+L 140.746967 149.491059 
+L 140.924037 149.449192 
+L 140.944869 149.479057 
+L 141.007364 149.459491 
+L 141.049028 149.573577 
+L 141.153187 149.622489 
+L 141.06986 149.603319 
+L 141.153187 149.631543 
+L 141.236514 149.732 
+L 141.257346 149.716429 
+L 141.278178 149.764059 
+L 141.382337 149.758426 
+L 141.486496 149.869768 
+L 141.663567 149.854643 
+L 141.663567 149.872588 
+L 141.736478 149.961749 
+L 141.767726 149.938518 
+L 141.851053 149.983958 
+L 141.778142 149.984472 
+L 141.861469 150.003034 
+L 141.903133 150.052473 
+L 141.882301 149.996502 
+L 141.965628 150.02395 
+L 142.111451 150.049578 
+L 142.121867 150.104168 
+L 142.21561 150.070368 
+L 142.351017 150.094651 
+L 142.246858 150.118353 
+L 142.351017 150.103525 
+L 142.351017 150.112398 
+L 142.455176 150.053258 
+L 142.455176 150.088728 
+L 142.54892 150.090495 
+L 142.559335 150.144783 
+L 142.653079 150.349488 
+L 142.663495 150.341819 
+L 142.819733 150.358967 
+L 142.882229 150.436087 
+L 142.923892 150.423051 
+L 143.048883 150.462895 
+L 143.048883 150.480415 
+L 143.080131 150.457509 
+L 143.153042 150.465377 
+L 143.350945 150.451739 
+L 143.455104 150.602358 
+L 143.69467 150.558154 
+L 143.736334 150.605968 
+L 143.798829 150.586532 
+L 143.944652 150.532597 
+L 143.965484 150.595429 
+L 143.986316 150.64088 
+L 144.069643 150.606376 
+L 144.15297 150.632385 
+L 144.090475 150.669039 
+L 144.15297 150.675545 
+L 144.246713 150.711138 
+L 144.20505 150.672335 
+L 144.257129 150.7036 
+L 144.330041 150.711144 
+L 144.340457 150.772445 
+L 144.423784 150.875425 
+L 144.444616 150.860377 
+L 144.517527 150.833469 
+L 144.559191 150.906241 
+L 144.580023 150.959686 
+L 144.66335 150.959466 
+L 144.861252 150.945087 
+L 144.861252 150.953617 
+L 144.965411 151.015093 
+L 145.090402 151.052935 
+L 145.090402 151.06143 
+L 145.090402 151.069925 
+L 145.142482 151.032576 
+L 145.194561 151.054679 
+L 145.319552 151.100823 
+L 145.413296 151.169149 
+L 145.423712 151.161703 
+L 145.663278 151.125775 
+L 145.757021 151.311562 
+L 145.767437 151.304142 
+L 145.86118 151.329788 
+L 145.871596 151.364329 
+L 145.975755 151.516356 
+L 146.163241 151.508504 
+L 146.163241 151.516849 
+L 146.267401 151.626311 
+L 146.361144 151.668 
+L 146.298648 151.670709 
+L 146.361144 151.692921 
+L 146.361144 151.701226 
+L 146.413223 151.672665 
+L 146.465303 151.677324 
+L 146.611126 151.648911 
+L 146.621542 151.699552 
+L 146.715285 151.95562 
+L 146.725701 151.948272 
+L 146.736117 151.965649 
+L 146.881939 151.969904 
+L 146.986099 152.077338 
+L 147.121505 152.113292 
+L 147.163169 152.100403 
+L 147.225665 152.146528 
+L 147.392319 152.127711 
+L 147.402735 152.153063 
+L 147.496478 152.234154 
+L 147.506894 152.226864 
+L 147.590222 152.282481 
+L 147.51731 152.260278 
+L 147.590222 152.298738 
+L 147.694381 152.355859 
+L 147.892283 152.331238 
+L 147.704797 152.389132 
+L 147.892283 152.347432 
+L 147.944363 152.408223 
+L 147.996442 152.380033 
+L 148.20476 152.323998 
+L 148.215176 152.357112 
+L 148.277672 152.434616 
+L 148.319335 152.405696 
+L 148.340167 152.407346 
+L 148.340167 152.471726 
+L 148.381831 152.49107 
+L 148.465158 152.553766 
+L 148.48599 152.547355 
+L 148.610981 152.581048 
+L 148.610981 152.589057 
+L 148.704724 152.660216 
+L 148.71514 152.653015 
+L 148.881795 152.657684 
+L 148.881795 152.665661 
+L 148.985954 152.832698 
+L 149.079697 152.887229 
+L 149.079697 152.895164 
+L 149.131777 152.90689 
+L 149.17344 152.886144 
+L 149.183856 152.886904 
+L 149.423422 152.856896 
+L 149.485918 152.893075 
+L 149.527581 152.872406 
+L 149.662988 152.858593 
+L 149.68382 152.899543 
+L 149.68382 152.907427 
+L 149.725484 152.886798 
+L 149.787979 152.899206 
+L 149.902554 152.931082 
+L 149.808811 152.932202 
+L 149.902554 152.954666 
+L 149.902554 152.978242 
+L 149.96505 152.935574 
+L 150.006713 152.946419 
+L 150.121288 153.001661 
+L 150.225448 153.06382 
+L 150.360854 153.073311 
+L 150.37127 153.097463 
+L 150.454598 153.173424 
+L 150.475429 153.159276 
+L 150.569173 153.220193 
+L 150.506677 153.208145 
+L 150.569173 153.227969 
+L 150.662916 153.3275 
+L 150.590005 153.221613 
+L 150.673332 153.32044 
+L 150.798323 153.359784 
+L 150.798323 153.367527 
+L 150.902482 153.559788 
+L 151.089968 153.564101 
+L 151.100384 153.587854 
+L 151.173296 153.554048 
+L 151.194127 153.563072 
+L 151.402446 153.553348 
+L 151.423278 153.577694 
+L 151.485773 153.551003 
+L 151.506605 153.575329 
+L 151.600348 153.619557 
+L 151.527437 153.607296 
+L 151.600348 153.642508 
+L 151.694091 153.71713 
+L 151.704507 153.710142 
+L 151.714923 153.703154 
+L 151.735755 153.818832 
+L 151.839914 153.901223 
+L 151.975321 153.894129 
+L 151.975321 153.939671 
+L 152.027401 153.957924 
+L 152.069064 153.930066 
+L 152.07948 153.938264 
+L 152.183639 153.944433 
+L 152.204471 153.983502 
+L 152.287798 154.033728 
+L 152.256551 153.971435 
+L 152.30863 154.019833 
+L 152.496117 154.015656 
+L 152.496117 154.023195 
+L 152.516948 154.069615 
+L 152.600276 154.059357 
+L 152.756514 154.045804 
+L 152.76693 154.076463 
+L 152.87109 154.127445 
+L 152.964833 154.192671 
+L 153.058576 154.31746 
+L 152.99608 154.179453 
+L 153.068992 154.310564 
+L 153.110656 154.379964 
+L 153.162735 154.37532 
+L 153.162735 154.38277 
+L 153.266894 154.336261 
+L 153.266894 154.343708 
+L 153.27731 154.388933 
+L 153.402301 154.380777 
+L 153.464797 154.44353 
+L 153.50646 154.416061 
+L 153.621035 154.451804 
+L 153.621035 154.466621 
+L 153.714778 154.582468 
+L 153.725194 154.575616 
+L 153.818938 154.617333 
+L 153.818938 154.646834 
+L 153.839769 154.670002 
+L 153.923097 154.652109 
+L 154.120999 154.65475 
+L 154.225158 154.718717 
+L 154.318901 154.752685 
+L 154.235574 154.755903 
+L 154.318901 154.789305 
+L 154.423061 154.8675 
+L 154.485556 154.885104 
+L 154.495972 154.951264 
+L 154.579299 155.086211 
+L 154.600131 155.07262 
+L 154.745954 155.079294 
+L 154.745954 155.108331 
+L 154.850113 155.192757 
+L 154.943856 155.196921 
+L 154.964688 155.248457 
+L 155.068847 155.354019 
+L 155.245918 155.354368 
+L 155.245918 155.36876 
+L 155.350077 155.423471 
+L 155.433404 155.491508 
+L 155.360493 155.466981 
+L 155.433404 155.498677 
+L 155.464652 155.521454 
+L 155.537563 155.488625 
+L 155.537563 155.495786 
+L 155.620891 155.499202 
+L 155.620891 155.570718 
+L 155.72505 155.681921 
+L 155.870873 155.716073 
+L 155.964616 155.783638 
+L 155.90212 155.710167 
+L 155.975032 155.776932 
+L 156.172934 155.777343 
+L 156.277093 155.887414 
+L 156.297925 155.923511 
+L 156.402084 155.934351 
+L 156.495827 156.148905 
+L 156.506243 156.142231 
+L 156.64165 156.167889 
+L 156.64165 156.18192 
+L 156.745809 156.297441 
+L 156.92288 156.303171 
+L 156.92288 156.310154 
+L 157.027039 156.425021 
+L 157.193693 156.430186 
+L 157.037455 156.44623 
+L 157.193693 156.444089 
+L 157.297853 156.475063 
+L 157.443675 156.493359 
+L 157.443675 156.507216 
+L 157.537419 156.59304 
+L 157.547835 156.586432 
+L 157.693657 156.618301 
+L 157.693657 156.625201 
+L 157.787401 156.751861 
+L 157.797816 156.745269 
+L 157.933223 156.755876 
+L 157.933223 156.790219 
+L 158.037382 156.841046 
+L 158.193621 156.865729 
+L 158.193621 156.872571 
+L 158.287364 156.950179 
+L 158.235285 156.859987 
+L 158.29778 156.943617 
+L 158.443603 156.981418 
+L 158.547762 157.058875 
+L 158.610258 157.094367 
+L 158.558178 157.099912 
+L 158.620674 157.142142 
+L 158.672753 157.116227 
+L 158.724833 157.259753 
+L 158.881071 157.256481 
+L 158.891487 157.283741 
+L 158.985231 157.386974 
+L 158.995646 157.380454 
+L 159.151885 157.41066 
+L 159.235212 157.580206 
+L 159.256044 157.573901 
+L 159.412283 157.576895 
+L 159.412283 157.603664 
+L 159.506026 157.638847 
+L 159.516442 157.632359 
+L 159.662265 157.641737 
+L 159.672681 157.661939 
+L 159.735176 157.749666 
+L 159.77684 157.743737 
+L 159.912247 157.772677 
+L 159.912247 157.785961 
+L 160.016406 157.88056 
+L 160.172645 157.90292 
+L 160.026822 157.907224 
+L 160.172645 157.909534 
+L 160.183061 157.989005 
+L 160.276804 157.950809 
+L 160.412211 157.992448 
+L 160.505954 158.046509 
+L 160.51637 158.040081 
+L 160.683024 158.049067 
+L 160.683024 158.062203 
+L 160.683024 158.101595 
+L 160.776768 158.05698 
+L 160.787184 158.070251 
+L 160.891343 158.104489 
+L 160.901759 158.12428 
+L 160.97467 158.151446 
+L 160.933006 158.118161 
+L 161.005918 158.138786 
+L 161.214236 158.115484 
+L 161.214236 158.135071 
+L 161.297563 158.129675 
+L 161.318395 158.195149 
+L 161.464218 158.190529 
+L 161.474634 158.229695 
+L 161.578793 158.295945 
+L 161.693368 158.329727 
+L 161.693368 158.355643 
+L 161.735032 158.375542 
+L 161.724616 158.343047 
+L 161.797527 158.356831 
+L 161.880854 158.409493 
+L 161.880854 158.435335 
+L 161.974598 158.500837 
+L 161.985014 158.494494 
+L 161.995429 158.488152 
+L 162.016261 158.604293 
+L 162.110005 158.701513 
+L 162.12042 158.695178 
+L 162.203748 158.721518 
+L 162.214164 158.76647 
+L 162.297491 158.850284 
+L 162.234995 158.760221 
+L 162.318323 158.837636 
+L 162.474561 158.864248 
+L 162.474561 158.870631 
+L 162.568305 158.998668 
+L 162.578721 158.992359 
+L 162.6308 158.999004 
+L 162.6308 159.08165 
+L 162.662048 159.06909 
+L 162.755791 159.132978 
+L 162.766207 159.12668 
+L 162.828703 159.177626 
+L 162.776623 159.164758 
+L 162.839118 159.209319 
+L 162.932862 159.317062 
+L 162.943278 159.310774 
+L 163.120348 159.330127 
+L 163.14118 159.323875 
+L 163.224507 159.374427 
+L 163.297419 159.443694 
+L 163.266171 159.449936 
+L 163.297419 159.456255 
+L 163.31825 159.450001 
+L 163.401578 159.581738 
+L 163.536985 159.619262 
+L 163.536985 159.625512 
+L 163.557816 159.625505 
+L 163.641144 159.725313 
+L 163.734887 159.775016 
+L 163.661976 159.76891 
+L 163.734887 159.793689 
+L 163.755719 159.787428 
+L 163.839046 159.886695 
+L 163.901542 159.923749 
+L 163.911958 159.967112 
+L 164.016117 160.170763 
+L 164.099444 160.201161 
+L 164.099444 160.244302 
+L 164.203603 160.219066 
+L 164.203603 160.286765 
+L 164.370258 160.273442 
+L 164.380674 160.310225 
+L 164.474417 160.389319 
+L 164.401505 160.303952 
+L 164.484833 160.383119 
+L 164.713983 160.350922 
+L 164.713983 160.375386 
+L 164.79731 160.466399 
+L 164.818142 160.466237 
+L 164.838974 160.502664 
+L 164.974381 160.501568 
+L 165.02646 160.604536 
+L 164.984797 160.501484 
+L 165.07854 160.597994 
+L 165.109788 160.585568 
+L 165.120203 160.682583 
+L 165.141035 160.688445 
+L 165.193115 160.706118 
+L 165.172283 160.68208 
+L 165.245194 160.699548 
+L 165.463929 160.655082 
+L 165.463929 160.69741 
+L 165.568088 160.859255 
+L 165.682663 160.918135 
+L 165.776406 160.959086 
+L 165.76599 160.911155 
+L 165.786822 160.952957 
+L 165.859733 161.024052 
+L 165.807654 161.036699 
+L 165.859733 161.036039 
+L 165.870149 161.083828 
+L 165.870149 161.035907 
+L 165.963892 161.064652 
+L 165.974308 161.100412 
+L 166.078467 161.122936 
+L 166.109715 161.170275 
+L 166.109715 161.116546 
+L 166.182627 161.145411 
+L 166.297202 161.20343 
+L 166.380529 161.279568 
+L 166.401361 161.279262 
+L 166.536768 161.324741 
+L 166.578431 161.347825 
+L 166.620095 161.323487 
+L 166.640927 161.346872 
+L 166.73467 161.410521 
+L 166.73467 161.416433 
+L 166.776334 161.398041 
+L 166.838829 161.432507 
+L 166.942988 161.489825 
+L 166.849245 161.46186 
+L 166.942988 161.49572 
+L 166.942988 161.501614 
+L 167.026316 161.464891 
+L 167.047147 161.482227 
+L 167.057563 161.517387 
+L 167.19297 161.521017 
+L 167.24505 161.602375 
+L 167.297129 161.601473 
+L 167.390873 161.635015 
+L 167.401288 161.664119 
+L 167.495032 161.767688 
+L 167.442952 161.663376 
+L 167.505448 161.767494 
+L 167.578359 161.777807 
+L 167.515863 161.796497 
+L 167.599191 161.841578 
+L 167.640854 161.840775 
+L 167.70335 161.990844 
+L 167.890836 162.004407 
+L 167.890836 162.010208 
+L 167.963748 162.05506 
+L 167.994995 162.042821 
+L 168.16165 162.045126 
+L 168.16165 162.074037 
+L 168.224146 162.072717 
+L 168.265809 162.141113 
+L 168.380384 162.19625 
+L 168.380384 162.202009 
+L 168.474127 162.33789 
+L 168.484543 162.337648 
+L 168.755357 162.308443 
+L 168.828269 162.358295 
+L 168.765773 162.308204 
+L 168.859516 162.351844 
+L 168.90118 162.339432 
+L 168.932428 162.435865 
+L 169.026171 162.50206 
+L 169.036587 162.501805 
+L 169.171994 162.538334 
+L 169.171994 162.549714 
+L 169.265737 162.666655 
+L 169.203241 162.543249 
+L 169.276153 162.666387 
+L 169.286569 162.688808 
+L 169.390728 162.725758 
+L 169.484471 162.830726 
+L 169.494887 162.830444 
+L 169.578214 162.850765 
+L 169.58863 162.901245 
+L 169.682373 163.129239 
+L 169.692789 163.128932 
+L 169.755285 163.138312 
+L 169.776117 163.204967 
+L 169.880276 163.330469 
+L 169.942771 163.32853 
+L 169.953187 163.41191 
+L 170.026099 163.509844 
+L 169.963603 163.41158 
+L 170.057346 163.497702 
+L 170.203169 163.492991 
+L 170.213585 163.531545 
+L 170.27608 163.645979 
+L 170.317744 163.633506 
+L 170.411487 163.658056 
+L 170.411487 163.70784 
+L 170.442735 163.70678 
+L 170.515646 163.776093 
+L 170.588558 163.801155 
+L 170.588558 163.861772 
+L 170.60939 163.855533 
+L 170.692717 163.957105 
+L 170.869788 163.983686 
+L 170.901035 163.971595 
+L 170.973947 164.056616 
+L 171.130185 164.094635 
+L 171.223929 164.24386 
+L 171.234344 164.238019 
+L 171.34892 164.293508 
+L 171.34892 164.298944 
+L 171.411415 164.34 
+L 171.453079 164.322107 
+L 171.515574 164.390207 
+L 171.47391 164.391831 
+L 171.515574 164.411884 
+L 171.598901 164.565465 
+L 171.619733 164.559224 
+L 171.734308 164.608558 
+L 171.734308 164.619341 
+L 171.828052 164.728558 
+L 171.838467 164.728126 
+L 171.921795 164.805225 
+L 171.932211 164.804787 
+L 172.025954 164.891947 
+L 172.140529 164.95123 
+L 172.150945 164.977497 
+L 172.244688 164.946744 
+L 172.369679 164.994702 
+L 172.369679 165.000033 
+L 172.421759 164.987116 
+L 172.473838 165.059399 
+L 172.54675 165.093421 
+L 172.557165 165.135464 
+L 172.619661 165.201663 
+L 172.661325 165.194494 
+L 172.755068 165.253839 
+L 172.682156 165.246545 
+L 172.755068 165.264422 
+L 172.848811 165.350007 
+L 172.859227 165.344249 
+L 172.880059 165.338015 
+L 172.890475 165.453578 
+L 172.994634 165.496094 
+L 173.098793 165.564771 
+L 173.109209 165.564277 
+L 173.202952 165.737993 
+L 173.348775 165.777925 
+L 173.348775 165.783148 
+L 173.452934 166.038439 
+L 173.46335 166.069081 
+L 173.577925 166.094366 
+L 173.671668 166.167273 
+L 173.682084 166.161558 
+L 173.775827 166.223938 
+L 173.702916 166.227738 
+L 173.775827 166.234273 
+L 173.859155 166.266067 
+L 173.827907 166.221227 
+L 173.879986 166.264976 
+L 173.984146 166.326524 
+L 173.984146 166.331674 
+L 174.088305 166.444435 
+L 174.20288 166.484475 
+L 174.098721 166.474687 
+L 174.20288 166.504987 
+L 174.265375 166.619371 
+L 174.307039 166.601746 
+L 174.369534 166.634109 
+L 174.317455 166.652299 
+L 174.390366 166.678928 
+L 174.421614 166.677204 
+L 174.494525 166.841295 
+L 174.588269 166.891918 
+L 174.588269 166.912233 
+L 174.598684 166.947173 
+L 174.692428 166.941829 
+L 174.911162 166.944577 
+L 174.994489 167.096466 
+L 174.921578 166.943985 
+L 175.015321 167.085167 
+L 175.265303 167.060657 
+L 175.265303 167.075769 
+L 175.34863 167.111222 
+L 175.306967 167.068332 
+L 175.369462 167.099957 
+L 175.484037 167.163669 
+L 175.57778 167.283522 
+L 175.494453 167.163063 
+L 175.588196 167.2779 
+L 175.681939 167.282383 
+L 175.692355 167.34677 
+L 175.692355 167.406711 
+L 175.796514 167.405471 
+L 175.890258 167.459664 
+L 175.890258 167.479583 
+L 175.931921 167.467116 
+L 175.994417 167.528012 
+L 176.14024 167.573788 
+L 176.223567 167.623241 
+L 176.244399 167.61206 
+L 176.306894 167.667642 
+L 176.254815 167.64114 
+L 176.306894 167.702262 
+L 176.306894 167.72698 
+L 176.411053 167.715605 
+L 176.473549 167.711751 
+L 176.504797 167.788751 
+L 176.59854 167.881378 
+L 176.608956 167.880724 
+L 176.744363 167.92626 
+L 176.744363 167.931169 
+L 176.838106 167.998805 
+L 176.848522 167.993244 
+L 176.890185 168.019986 
+L 176.911017 168.08227 
+L 177.015176 168.265905 
+L 177.098504 168.338328 
+L 177.036008 168.308372 
+L 177.098504 168.343191 
+L 177.098504 168.37236 
+L 177.202663 168.331487 
+L 177.202663 168.341205 
+L 177.275574 168.40922 
+L 177.223495 168.388399 
+L 177.275574 168.42377 
+L 177.369317 168.499899 
+L 177.379733 168.494364 
+L 177.577636 168.505352 
+L 177.400565 168.536514 
+L 177.577636 168.515014 
+L 177.671379 168.585957 
+L 177.681795 168.580437 
+L 177.79637 168.577572 
+L 177.806786 168.639464 
+L 177.900529 168.743655 
+L 177.817202 168.638761 
+L 177.910945 168.738145 
+L 178.056768 168.785751 
+L 178.140095 168.851848 
+L 178.098431 168.782906 
+L 178.160927 168.850416 
+L 178.265086 168.914907 
+L 178.265086 168.91968 
+L 178.358829 169.051377 
+L 178.275502 168.91896 
+L 178.369245 169.050648 
+L 178.421325 169.09456 
+L 178.431741 169.141342 
+L 178.452572 169.139873 
+L 178.5359 169.276221 
+L 178.608811 169.30414 
+L 178.629643 169.349928 
+L 178.723386 169.475302 
+L 178.733802 169.469833 
+L 178.796297 169.531216 
+L 178.806713 169.55398 
+L 178.879625 169.553352 
+L 178.910873 169.598053 
+L 179.067111 169.63819 
+L 179.160854 169.715569 
+L 179.17127 169.71012 
+L 179.275429 169.772508 
+L 179.275429 169.777178 
+L 179.379589 170.034837 
+L 179.50458 170.081026 
+L 179.50458 170.090301 
+L 179.608739 170.401278 
+L 179.68165 170.483056 
+L 179.629571 170.454934 
+L 179.68165 170.487657 
+L 179.712898 170.485195 
+L 179.785809 170.557563 
+L 179.900384 170.589775 
+L 179.900384 170.621863 
+L 179.952464 170.599393 
+L 180.004543 170.709679 
+L 180.119118 170.746185 
+L 180.129534 170.768172 
+L 180.233693 170.941953 
+L 180.358684 170.972656 
+L 180.3691 170.994502 
+L 180.473259 170.990533 
+L 180.473259 171.022268 
+L 180.639914 171.049382 
+L 180.639914 171.05843 
+L 180.70241 171.157227 
+L 180.744073 171.144762 
+L 180.827401 171.192008 
+L 180.754489 171.175489 
+L 180.827401 171.22355 
+L 180.910728 171.320116 
+L 180.93156 171.318378 
+L 181.056551 171.366308 
+L 181.056551 171.37528 
+L 181.150294 171.425687 
+L 181.087798 171.36818 
+L 181.16071 171.424813 
+L 181.233621 171.450019 
+L 181.171126 171.446324 
+L 181.233621 171.508152 
+L 181.244037 171.507273 
+L 181.33778 171.691124 
+L 181.348196 171.685781 
+L 181.369028 171.799641 
+L 181.379444 171.798743 
+L 181.473187 171.959171 
+L 181.577346 172.020862 
+L 181.577346 172.029701 
+L 181.681505 172.161753 
+L 181.79608 172.226449 
+L 181.806496 172.225526 
+L 181.90024 172.34015 
+L 181.962735 172.387158 
+L 181.962735 172.430944 
+L 182.066894 172.565771 
+L 182.160637 172.579089 
+L 182.181469 172.629487 
+L 182.275212 172.799166 
+L 182.285628 172.798209 
+L 182.379372 172.871949 
+L 182.483531 172.953172 
+L 182.514778 172.958918 
+L 182.53561 173.04763 
+L 182.639769 173.188599 
+L 182.785592 173.235014 
+L 182.879335 173.333316 
+L 182.889751 173.33233 
+L 182.973079 173.375766 
+L 182.983495 173.408966 
+L 183.004326 173.402714 
+L 183.087654 173.501451 
+L 183.170981 173.582886 
+L 183.27514 173.653608 
+L 183.368883 173.678514 
+L 183.368883 173.729378 
+L 183.462627 173.804942 
+L 183.473042 173.799703 
+L 183.566786 173.853964 
+L 183.566786 173.875068 
+L 183.660529 174.038609 
+L 183.670945 174.037584 
+L 183.702193 174.042919 
+L 183.723024 174.13327 
+L 183.827184 174.303048 
+L 183.868847 174.298889 
+L 183.879263 174.398087 
+L 183.96259 174.572966 
+L 183.983422 174.56254 
+L 183.993838 174.557327 
+L 183.993838 174.603049 
+L 184.035502 174.656948 
+L 184.129245 174.688874 
+L 184.045918 174.655888 
+L 184.139661 174.683669 
+L 184.222988 174.720738 
+L 184.222988 174.762117 
+L 184.327147 174.937211 
+L 184.462554 174.972644 
+L 184.462554 174.993211 
+L 184.535466 175.149888 
+L 184.566713 175.142532 
+L 184.733368 175.174308 
+L 184.733368 175.182491 
+L 184.827111 175.348282 
+L 184.837527 175.347187 
+L 184.879191 175.350957 
+L 184.910439 175.433168 
+L 185.014598 175.527792 
+L 185.118757 175.569458 
+L 185.129173 175.59266 
+L 185.2125 175.672804 
+L 185.233332 175.670581 
+L 185.347907 175.722957 
+L 185.347907 175.73506 
+L 185.389571 175.819263 
+L 185.452066 175.816578 
+L 185.587473 175.862353 
+L 185.587473 175.870389 
+L 185.691632 176.059599 
+L 185.72288 176.084205 
+L 185.72288 176.164123 
+L 185.806207 176.258716 
+L 185.733296 176.162986 
+L 185.827039 176.248466 
+L 185.95203 176.294481 
+L 185.95203 176.310388 
+L 186.056189 176.441851 
+L 186.139516 176.472266 
+L 186.139516 176.523719 
+L 186.222844 176.644837 
+L 186.149932 176.522565 
+L 186.243675 176.642517 
+L 186.316587 176.681702 
+L 186.254091 176.66502 
+L 186.327003 176.723863 
+L 186.431162 176.939995 
+L 186.504073 177.013983 
+L 186.441578 176.985829 
+L 186.504073 177.025718 
+L 186.524905 177.023359 
+L 186.608232 177.201259 
+L 186.743639 177.251968 
+L 186.743639 177.255857 
+L 186.847798 177.399209 
+L 186.899878 177.443574 
+L 186.899878 177.493883 
+L 186.993621 177.583498 
+L 187.004037 177.578432 
+L 187.108196 177.608786 
+L 187.118612 177.646109 
+L 187.212355 177.72755 
+L 187.14986 177.63863 
+L 187.222771 177.722493 
+L 187.254019 177.734224 
+L 187.264435 177.813631 
+L 187.274851 177.820086 
+L 187.37901 177.90367 
+L 187.420674 177.940858 
+L 187.43109 178.000773 
+L 187.524833 178.100332 
+L 187.535249 178.09529 
+L 187.545665 178.09025 
+L 187.545665 178.151176 
+L 187.576912 178.196922 
+L 187.597744 178.194449 
+L 187.681071 178.290863 
+L 187.712319 178.302309 
+L 187.722735 178.391979 
+L 187.733151 178.386948 
+L 187.83731 178.487875 
+L 187.847726 178.48285 
+L 187.858142 178.598512 
+L 187.868558 178.593488 
+L 187.972717 178.750134 
+L 187.993549 178.751362 
+L 188.003965 178.843857 
+L 188.024797 178.845068 
+L 188.128956 179.086457 
+L 188.139372 179.081449 
+L 188.139372 179.144787 
+L 188.170619 179.189318 
+L 188.274778 179.321287 
+L 188.389354 179.336733 
+L 188.399769 179.383575 
+L 188.503929 179.522101 
+L 188.62892 179.561784 
+L 188.514344 179.572421 
+L 188.62892 179.583879 
+L 188.733079 179.688492 
+L 188.847654 179.740146 
+L 188.847654 179.754806 
+L 188.951813 179.93186 
+L 189.097636 179.953539 
+L 189.097636 179.982692 
+L 189.170547 180.126211 
+L 189.201795 180.125866 
+L 189.295538 180.182859 
+L 189.295538 180.200981 
+L 189.399697 180.433454 
+L 189.503856 180.456095 
+L 189.514272 180.501558 
+L 189.618431 180.714286 
+L 189.670511 180.793414 
+L 189.649679 180.799703 
+L 189.670511 180.811291 
+L 189.764254 180.973895 
+L 189.77467 180.968969 
+L 189.816334 180.988437 
+L 189.816334 181.066695 
+L 189.82675 181.065326 
+L 189.930909 181.154583 
+L 190.0559 181.212505 
+L 190.0559 181.216044 
+L 190.160059 181.26948 
+L 190.201722 181.278107 
+L 190.222554 181.360034 
+L 190.316297 181.516517 
+L 190.326713 181.511618 
+L 190.441288 181.566563 
+L 190.441288 181.577082 
+L 190.451704 181.575694 
+L 190.545448 181.706705 
+L 190.628775 181.772375 
+L 190.628775 181.789818 
+L 190.732934 181.935993 
+L 190.816261 182.011575 
+L 190.74335 182.000596 
+L 190.816261 182.018513 
+L 190.92042 182.073756 
+L 191.003748 182.110934 
+L 190.930836 182.096581 
+L 191.003748 182.155876 
+L 191.107907 182.259077 
+L 191.159986 182.283004 
+L 191.170402 182.350418 
+L 191.274561 182.470137 
+L 191.399552 182.524982 
+L 191.399552 182.531827 
+L 191.409968 182.530401 
+L 191.503712 182.701983 
+L 191.587039 182.77225 
+L 191.524543 182.774061 
+L 191.587039 182.782457 
+L 191.680782 182.976589 
+L 191.597455 182.781021 
+L 191.691198 182.975144 
+L 191.774525 183.041424 
+L 191.774525 183.05833 
+L 191.878684 183.293332 
+L 191.993259 183.361282 
+L 192.097419 183.581037 
+L 192.107835 183.576226 
+L 192.107835 183.629652 
+L 192.139082 183.681935 
+L 192.243241 183.783694 
+L 192.316153 183.863019 
+L 192.316153 183.869655 
+L 192.420312 183.911198 
+L 192.482807 183.994961 
+L 192.45156 183.982883 
+L 192.482807 184.001574 
+L 192.576551 184.153179 
+L 192.586967 184.148393 
+L 192.618214 184.1538 
+L 192.62863 184.251015 
+L 192.639046 184.24952 
+L 192.732789 184.442669 
+L 192.847364 184.504598 
+L 192.847364 184.511131 
+L 192.951524 184.694873 
+L 193.014019 184.770282 
+L 192.972355 184.779594 
+L 193.014019 184.786514 
+L 193.118178 184.978598 
+L 193.170258 185.051698 
+L 193.128594 185.0223 
+L 193.170258 185.074277 
+L 193.19109 185.071221 
+L 193.274417 185.187791 
+L 193.326496 185.237973 
+L 193.326496 185.286125 
+L 193.430656 185.450081 
+L 193.493151 185.520662 
+L 193.461903 185.528489 
+L 193.493151 185.542994 
+L 193.59731 185.696251 
+L 193.680637 185.772726 
+L 193.607726 185.72647 
+L 193.680637 185.779069 
+L 193.774381 185.989688 
+L 193.711885 185.771235 
+L 193.784797 185.984968 
+L 193.82646 186.003964 
+L 193.847292 186.076492 
+L 193.951451 186.327802 
+L 194.05561 186.390281 
+L 193.961867 186.357544 
+L 194.05561 186.399661 
+L 194.159769 186.53056 
+L 194.253513 186.575479 
+L 194.253513 186.609696 
+L 194.357672 186.755239 
+L 194.461831 186.822912 
+L 194.461831 186.829097 
+L 194.56599 187.090633 
+L 194.649317 187.126975 
+L 194.649317 187.173016 
+L 194.743061 187.430828 
+L 194.753476 187.429214 
+L 194.836804 187.501631 
+L 194.836804 187.510765 
+L 194.940963 187.946082 
+L 194.972211 187.968323 
+L 194.982627 188.04803 
+L 195.086786 188.265837 
+L 195.149281 188.327791 
+L 195.149281 188.357689 
+L 195.25344 188.618331 
+L 195.315936 188.65293 
+L 195.326352 188.704677 
+L 195.430511 188.856759 
+L 195.53467 188.925683 
+L 195.53467 188.93158 
+L 195.638829 189.020891 
+L 195.680493 189.02303 
+L 195.701325 189.113677 
+L 195.795068 189.245083 
+L 195.722156 189.113264 
+L 195.805484 189.243405 
+L 195.847147 189.245468 
+L 195.857563 189.340189 
+L 195.961722 189.454498 
+L 196.013802 189.541995 
+L 195.982554 189.552866 
+L 196.013802 189.550706 
+L 196.024218 189.549019 
+L 196.117961 189.924156 
+L 196.149209 189.933451 
+L 196.149209 190.002504 
+L 196.170041 190.022092 
+L 196.2742 190.168535 
+L 196.347111 190.253816 
+L 196.305448 190.246373 
+L 196.347111 190.256673 
+L 196.45127 190.530051 
+L 196.461686 190.52549 
+L 196.461686 190.621954 
+L 196.482518 190.635509 
+L 196.586677 190.897894 
+L 196.638757 190.911753 
+L 196.659589 190.987038 
+L 196.763748 191.249843 
+L 196.909571 191.306348 
+L 197.003314 191.518666 
+L 196.919986 191.304603 
+L 197.01373 191.514139 
+L 197.065809 191.602378 
+L 197.024146 191.58447 
+L 197.065809 191.610684 
+L 197.169968 191.780962 
+L 197.274127 191.840478 
+L 197.274127 191.854234 
+L 197.378287 192.119074 
+L 197.430366 192.156683 
+L 197.388703 192.152838 
+L 197.440782 192.212238 
+L 197.544941 192.406798 
+L 197.586605 192.432259 
+L 197.597021 192.503691 
+L 197.607437 192.501909 
+L 197.70118 192.785633 
+L 197.815755 192.81975 
+L 197.815755 192.854687 
+L 197.919914 193.064532 
+L 197.951162 193.152608 
+L 198.003241 193.148944 
+L 198.107401 193.473724 
+L 198.149064 193.469135 
+L 198.15948 193.570464 
+L 198.263639 193.707919 
+L 198.294887 193.741942 
+L 198.294887 193.812907 
+L 198.399046 194.134873 
+L 198.430294 194.145028 
+L 198.44071 194.236937 
+L 198.544869 194.496095 
+L 198.586533 194.540421 
+L 198.555285 194.527859 
+L 198.596948 194.592787 
+L 198.701108 194.854678 
+L 198.742771 194.885725 
+L 198.742771 194.957405 
+L 198.763603 194.956258 
+L 198.84693 195.097183 
+L 198.89901 195.154124 
+L 198.89901 195.194829 
+L 198.992753 195.585696 
+L 199.003169 195.583826 
+L 199.065665 195.653197 
+L 199.024001 195.635512 
+L 199.065665 195.675838 
+L 199.138576 195.830917 
+L 199.169824 195.820278 
+L 199.242735 195.909761 
+L 199.346894 196.17009 
+L 199.378142 196.189276 
+L 199.378142 196.276109 
+L 199.482301 196.664378 
+L 199.534381 196.676994 
+L 199.534381 196.762861 
+L 199.63854 197.044315 
+L 199.659372 197.042934 
+L 199.659372 197.120783 
+L 199.690619 197.141782 
+L 199.773947 197.303465 
+L 199.794778 197.297217 
+L 199.81561 197.353838 
+L 199.86769 197.385318 
+L 199.971849 197.748331 
+L 199.982265 197.744012 
+L 199.982265 197.842061 
+L 199.992681 197.859241 
+L 200.09684 198.097088 
+L 200.14892 198.158585 
+L 200.117672 198.162021 
+L 200.159335 198.189822 
+L 200.180167 198.183582 
+L 200.263495 198.331217 
+L 200.27391 198.326918 
+L 200.294742 198.436176 
+L 200.398901 198.672599 
+L 200.461397 198.766115 
+L 200.565556 199.053763 
+L 200.586388 199.049851 
+L 200.596804 199.159072 
+L 200.690547 199.503161 
+L 200.700963 199.498899 
+L 200.763458 199.583376 
+L 200.711379 199.52905 
+L 200.763458 199.592535 
+L 200.867618 199.933088 
+L 200.930113 199.968892 
+L 200.930113 200.025567 
+L 201.034272 200.218214 
+L 201.044688 200.213978 
+L 201.055104 200.329087 
+L 201.159263 200.645262 
+L 201.180095 200.643509 
+L 201.180095 200.75496 
+L 201.284254 201.032304 
+L 201.305086 201.041568 
+L 201.315502 201.11025 
+L 201.325918 201.134725 
+L 201.430077 201.35883 
+L 201.440493 201.354629 
+L 201.450909 201.468727 
+L 201.555068 201.801609 
+L 201.5759 201.806256 
+L 201.586316 201.903941 
+L 201.596731 201.904087 
+L 201.700891 202.125667 
+L 201.763386 202.199549 
+L 201.721722 202.205499 
+L 201.763386 202.218881 
+L 201.867545 202.476889 
+L 201.930041 202.558488 
+L 201.888377 202.541055 
+L 201.930041 202.57126 
+L 202.023784 202.987113 
+L 202.0342 202.982965 
+L 202.044616 202.978818 
+L 202.065448 203.086296 
+L 202.075863 203.084254 
+L 202.169607 203.402991 
+L 202.180023 203.400942 
+L 202.190439 203.396809 
+L 202.190439 203.480168 
+L 202.21127 203.507287 
+L 202.315429 204.001724 
+L 202.377925 204.08383 
+L 202.325845 204.073618 
+L 202.377925 204.096136 
+L 202.388341 204.096126 
+L 202.482084 204.438992 
+L 202.575827 204.491489 
+L 202.575827 204.519898 
+L 202.679986 204.866795 
+L 202.711234 204.874646 
+L 202.711234 204.95499 
+L 202.72165 204.968964 
+L 202.825809 205.178238 
+L 202.888305 205.223573 
+L 202.888305 205.271358 
+L 202.898721 205.269277 
+L 202.992464 205.51041 
+L 203.013296 205.516128 
+L 203.013296 205.620792 
+L 203.117455 205.847699 
+L 203.148703 205.861032 
+L 203.159118 205.948997 
+L 203.263278 206.167922 
+L 203.273693 206.163883 
+L 203.294525 206.274263 
+L 203.398684 206.821515 
+L 203.4091 206.817496 
+L 203.4091 206.935969 
+L 203.513259 207.436362 
+L 203.523675 207.432361 
+L 203.534091 207.541298 
+L 203.544507 207.542939 
+L 203.648666 207.879193 
+L 203.721578 207.938799 
+L 203.721578 207.968548 
+L 203.815321 208.2402 
+L 203.825737 208.239918 
+L 203.898648 208.296934 
+L 203.898648 208.330079 
+L 204.002807 208.615027 
+L 204.075719 208.647577 
+L 204.086135 208.701972 
+L 204.190294 209.068739 
+L 204.20071 209.064796 
+L 204.211126 209.178026 
+L 204.315285 209.559645 
+L 204.346533 209.571034 
+L 204.346533 209.665352 
+L 204.450692 210.236802 
+L 204.502771 210.297798 
+L 204.502771 210.334506 
+L 204.513187 210.332352 
+L 204.60693 210.626222 
+L 204.679842 210.706353 
+L 204.679842 210.716728 
+L 204.784001 211.03945 
+L 204.794417 211.035575 
+L 204.815249 211.145944 
+L 204.919408 211.393479 
+L 204.971487 211.419989 
+L 204.992319 211.483449 
+L 205.096478 211.929761 
+L 205.16939 212.014852 
+L 205.106894 211.974423 
+L 205.16939 212.019859 
+L 205.273549 212.239415 
+L 205.304797 212.257772 
+L 205.315212 212.34171 
+L 205.408956 212.653234 
+L 205.419372 212.649418 
+L 205.492283 212.722664 
+L 205.492283 212.740663 
+L 205.596442 213.090107 
+L 205.606858 213.086307 
+L 205.62769 213.190374 
+L 205.638106 213.193042 
+L 205.742265 213.356614 
+L 205.783929 213.391285 
+L 205.783929 213.458691 
+L 205.888088 213.700554 
+L 205.950583 213.749518 
+L 205.950583 213.795603 
+L 206.054742 214.248886 
+L 206.08599 214.294062 
+L 206.08599 214.35512 
+L 206.096406 214.352932 
+L 206.190149 214.79661 
+L 206.210981 214.79068 
+L 206.231813 214.89897 
+L 206.335972 215.453723 
+L 206.356804 215.473613 
+L 206.36722 215.553262 
+L 206.377636 215.555606 
+L 206.481795 215.785598 
+L 206.533874 215.882723 
+L 206.492211 215.846507 
+L 206.533874 215.884222 
+L 206.638033 216.402659 
+L 206.648449 216.398978 
+L 206.658865 216.511909 
+L 206.763024 216.903209 
+L 206.794272 216.940298 
+L 206.794272 217.00867 
+L 206.898431 217.304985 
+L 206.960927 217.376663 
+L 206.960927 217.399659 
+L 207.05467 217.715923 
+L 207.065086 217.71229 
+L 207.117165 217.803629 
+L 207.085918 217.803156 
+L 207.117165 217.810729 
+L 207.221325 218.28925 
+L 207.231741 218.285638 
+L 207.231741 218.350017 
+L 207.252572 218.395899 
+L 207.356731 218.913011 
+L 207.377563 218.926468 
+L 207.377563 219.008901 
+L 207.387979 219.019035 
+L 207.492138 219.351841 
+L 207.523386 219.387286 
+L 207.523386 219.457783 
+L 207.627545 220.000055 
+L 207.648377 220.022279 
+L 207.648377 220.110119 
+L 207.752536 220.807806 
+L 207.804616 220.865693 
+L 207.762952 220.843351 
+L 207.815032 220.903763 
+L 207.919191 221.271699 
+L 207.960854 221.293639 
+L 207.97127 221.370917 
+L 208.075429 221.757482 
+L 208.085845 221.753995 
+L 208.096261 221.866806 
+L 208.106677 221.865847 
+L 208.20042 222.671522 
+L 208.273332 222.739687 
+L 208.273332 222.764272 
+L 208.377491 223.382481 
+L 208.398323 223.375623 
+L 208.408739 223.489027 
+L 208.512898 223.775646 
+L 208.523314 223.772233 
+L 208.523314 223.888823 
+L 208.627473 224.292705 
+L 208.658721 224.351667 
+L 208.637889 224.346741 
+L 208.669137 224.395075 
+L 208.773296 224.792347 
+L 208.783712 224.788973 
+L 208.783712 224.869717 
+L 208.814959 224.895303 
+L 208.908703 225.44486 
+L 208.919118 225.443774 
+L 208.93995 225.451784 
+L 208.93995 225.553445 
+L 209.044109 226.024996 
+L 209.054525 226.021669 
+L 209.064941 226.134833 
+L 209.1691 226.713018 
+L 209.189932 226.720551 
+L 209.189932 226.795483 
+L 209.210764 226.815995 
+L 209.314923 227.165709 
+L 209.346171 227.208335 
+L 209.356587 227.268132 
+L 209.460746 227.598723 
+L 209.471162 227.595457 
+L 209.471162 227.685148 
+L 209.481578 227.708219 
+L 209.585737 227.95144 
+L 209.596153 227.948189 
+L 209.596153 228.063909 
+L 209.700312 228.734712 
+L 209.710728 228.731489 
+L 209.710728 228.847389 
+L 209.814887 229.180599 
+L 209.856551 229.254985 
+L 209.825303 229.256581 
+L 209.856551 229.284 
+L 209.96071 229.631864 
+L 209.991958 229.692416 
+L 209.991958 229.737755 
+L 210.096117 230.034287 
+L 210.13778 230.097581 
+L 210.13778 230.13744 
+L 210.241939 230.591824 
+L 210.273187 230.627328 
+L 210.273187 230.697959 
+L 210.377346 231.011762 
+L 210.387762 231.008633 
+L 210.398178 231.110961 
+L 210.408594 231.118174 
+L 210.512753 231.545972 
+L 210.544001 231.581073 
+L 210.544001 231.6522 
+L 210.64816 232.049184 
+L 210.689824 232.067769 
+L 210.689824 232.152215 
+L 210.793983 232.679495 
+L 210.835646 232.76949 
+L 210.814815 232.76229 
+L 210.835646 232.7828 
+L 210.939806 233.190948 
+L 210.950222 233.187909 
+L 210.950222 233.27436 
+L 210.960637 233.300086 
+L 211.064797 233.733207 
+L 211.085628 233.759758 
+L 211.085628 233.842774 
+L 211.189788 234.266515 
+L 211.241867 234.333934 
+L 211.200203 234.312305 
+L 211.241867 234.366659 
+L 211.346026 234.813544 
+L 211.377274 234.838448 
+L 211.38769 234.916983 
+L 211.491849 235.441198 
+L 211.512681 235.453856 
+L 211.512681 235.522306 
+L 211.523097 235.547502 
+L 211.533513 235.545364 
+L 211.627256 235.883908 
+L 211.689751 235.935322 
+L 211.689751 235.981214 
+L 211.783495 236.517892 
+L 211.79391 236.515767 
+L 211.804326 236.512866 
+L 211.814742 236.609028 
+L 211.825158 236.622351 
+L 211.929317 237.194779 
+L 211.950149 237.191303 
+L 211.950149 237.30371 
+L 212.054308 237.761786 
+L 212.106388 237.859816 
+L 212.106388 237.862027 
+L 212.210547 238.259387 
+L 212.241795 238.306029 
+L 212.252211 238.362554 
+L 212.35637 238.888429 
+L 212.377202 238.883539 
+L 212.387618 238.994589 
+L 212.491777 239.456277 
+L 212.53344 239.506802 
+L 212.53344 239.560002 
+L 212.637599 240.117528 
+L 212.689679 240.149691 
+L 212.689679 240.218379 
+L 212.793838 240.913559 
+L 212.825086 240.924396 
+L 212.845918 241.014289 
+L 212.950077 241.742006 
+L 213.022988 241.816179 
+L 213.022988 241.837619 
+L 213.116731 242.218298 
+L 213.127147 242.216884 
+L 213.137563 242.21423 
+L 213.137563 242.328775 
+L 213.241722 242.550723 
+L 213.293802 242.637094 
+L 213.293802 242.651721 
+L 213.397961 243.066397 
+L 213.408377 243.063782 
+L 213.418793 243.175284 
+L 213.429209 243.175058 
+L 213.522952 243.513232 
+L 213.5542 243.535986 
+L 213.5542 243.619775 
+L 213.658359 244.077106 
+L 213.700023 244.173891 
+L 213.700023 244.180746 
+L 213.793766 244.626708 
+L 213.804182 244.626404 
+L 213.814598 244.62386 
+L 213.825014 244.726986 
+L 213.835429 244.732812 
+L 213.939589 245.092618 
+L 213.970836 245.104258 
+L 213.981252 245.196463 
+L 214.085411 245.781643 
+L 214.095827 245.77915 
+L 214.106243 245.890394 
+L 214.210402 246.286035 
+L 214.231234 246.28891 
+L 214.231234 246.377794 
+L 214.24165 246.392443 
+L 214.345809 246.709639 
+L 214.356225 246.707189 
+L 214.356225 246.811713 
+L 214.377057 246.815979 
+L 214.481216 247.074183 
+L 214.502048 247.075349 
+L 214.512464 247.180688 
+L 214.616623 247.390838 
+L 214.637455 247.391947 
+L 214.647871 247.497199 
+L 214.75203 247.922556 
+L 214.804109 248.017626 
+L 214.804109 248.024359 
+L 214.908269 248.296747 
+L 214.918684 248.294374 
+L 214.9291 248.405636 
+L 215.033259 248.841106 
+L 215.074923 248.930989 
+L 215.043675 248.910826 
+L 215.074923 248.945266 
+L 215.179082 249.412338 
+L 215.220746 249.499224 
+L 215.220746 249.516705 
+L 215.324905 250.341197 
+L 215.376985 250.423528 
+L 215.376985 250.443252 
+L 215.481144 251.068573 
+L 215.512392 251.084693 
+L 215.522807 251.173206 
+L 215.626967 251.742922 
+L 215.637382 251.740709 
+L 215.637382 251.814542 
+L 215.647798 251.851948 
+L 215.751958 252.423057 
+L 215.793621 252.452755 
+L 215.804037 252.52566 
+L 215.908196 252.968052 
+L 215.981108 253.056945 
+L 215.981108 253.066336 
+L 216.085267 253.444307 
+L 216.12693 253.544118 
+L 216.12693 253.548878 
+L 216.23109 254.121396 
+L 216.283169 254.219684 
+L 216.283169 254.223924 
+L 216.387328 254.666673 
+L 216.418576 254.762645 
+L 216.397744 254.743777 
+L 216.418576 254.773622 
+L 216.522735 255.229287 
+L 216.533151 255.227242 
+L 216.533151 255.340309 
+L 216.553983 255.592518 
+L 216.553983 255.592518 
+" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:3;"/>
+   </g>
+   <g id="line2d_43">
+    <path clip-path="url(#pc39f415831)" d="M 54.524037 29.590759 
+L 54.66986 29.362979 
+L 54.66986 30.756 
+L 54.774019 30.543739 
+L 55.065665 30.048899 
+L 55.065665 31.200632 
+L 55.169824 31.004471 
+L 55.794778 30.103973 
+L 56.14892 29.738169 
+L 56.14892 30.527676 
+L 56.253079 30.411184 
+L 56.680131 29.997 
+L 56.732211 31.296153 
+L 56.78429 31.236 
+L 56.825954 31.18896 
+L 56.919697 32.35927 
+L 56.930113 32.345126 
+L 57.773802 31.390028 
+L 58.4925 30.79358 
+L 58.4925 31.258679 
+L 58.596659 31.176188 
+L 58.72165 31.080923 
+L 58.72165 31.527276 
+L 58.825809 31.443463 
+L 59.044543 31.276298 
+L 59.044543 31.699223 
+L 59.148703 31.616943 
+L 59.523675 31.341253 
+L 59.523675 31.734189 
+L 59.627835 31.65712 
+L 60.086135 31.343483 
+L 60.086135 31.7064 
+L 60.190294 31.635518 
+L 60.534019 31.414789 
+L 60.638178 32.025925 
+L 61.065231 31.749882 
+L 61.086062 32.373483 
+L 61.16939 32.317043 
+L 61.523531 32.088863 
+L 61.523531 32.390781 
+L 61.62769 32.32367 
+L 61.690185 32.284137 
+L 61.690185 32.58 
+L 61.794344 32.512045 
+L 61.940167 32.419434 
+L 61.940167 32.706975 
+L 62.044326 32.639489 
+L 62.252645 32.508847 
+L 62.252645 32.786769 
+L 62.356804 32.720651 
+L 62.742193 32.487711 
+L 62.742193 32.752098 
+L 62.846352 32.689521 
+L 62.888015 32.664842 
+L 62.888015 32.925081 
+L 62.992175 32.861721 
+L 63.200493 32.738694 
+L 63.304652 33.178409 
+L 63.544218 33.034737 
+L 63.617129 33.476209 
+L 63.648377 33.456848 
+L 63.752536 33.393083 
+L 63.752536 33.631584 
+L 63.856695 33.566866 
+L 64.190005 33.367472 
+L 64.190005 33.59692 
+L 64.294164 33.534947 
+L 64.367075 33.492209 
+L 64.367075 33.717951 
+L 64.471234 33.655896 
+L 64.48165 33.64975 
+L 64.492066 34.089398 
+L 64.585809 34.031313 
+L 64.814959 33.893019 
+L 64.856623 34.300073 
+L 64.919118 34.261394 
+L 65.137853 34.128998 
+L 65.137853 34.339687 
+L 65.242012 34.276569 
+L 65.335755 34.220629 
+L 65.367003 34.615338 
+L 65.439914 34.570359 
+L 65.491994 34.538537 
+L 65.491994 34.742734 
+L 65.596153 34.678286 
+L 65.794055 34.55858 
+L 65.794055 34.758028 
+L 65.898214 34.694945 
+L 66.096117 34.577714 
+L 66.096117 34.772628 
+L 66.200276 34.710855 
+L 66.335683 34.63192 
+L 66.439842 34.952026 
+L 66.533585 34.896632 
+L 66.533585 35.084906 
+L 66.637744 35.022883 
+L 66.689824 34.992208 
+L 66.689824 35.178238 
+L 66.793983 35.116258 
+L 66.898142 35.05516 
+L 66.960637 35.565505 
+L 67.002301 35.540023 
+L 67.033549 35.521005 
+L 67.033549 35.701823 
+L 67.137708 35.637788 
+L 67.221035 35.5872 
+L 67.221035 35.765588 
+L 67.325194 35.701952 
+L 67.554344 35.564994 
+L 67.648088 35.856679 
+L 67.658504 35.8504 
+L 67.84599 35.738802 
+L 67.929317 36.029718 
+L 67.950149 36.01718 
+L 68.220963 35.857145 
+L 68.262627 36.165014 
+L 68.325122 36.127797 
+L 69.002156 35.742304 
+L 69.002156 35.900983 
+L 69.106316 35.84347 
+L 69.304218 35.736117 
+L 69.345882 36.024508 
+L 69.408377 35.990198 
+L 69.543784 35.916703 
+L 69.543784 36.070065 
+L 69.647943 36.013425 
+L 70.127075 35.761318 
+L 70.147907 36.046962 
+L 70.231234 36.003265 
+L 70.304146 35.965358 
+L 70.304146 36.112032 
+L 70.408305 36.0576 
+L 70.574959 35.971784 
+L 70.574959 36.116225 
+L 70.679118 36.062592 
+L 70.741614 36.030699 
+L 70.741614 36.173739 
+L 70.845773 36.120293 
+L 71.085339 35.999586 
+L 71.189498 36.366574 
+L 71.449896 36.234743 
+L 71.449896 36.372154 
+L 71.554055 36.319701 
+L 71.814453 36.190984 
+L 71.845701 36.444881 
+L 71.918612 36.408608 
+L 72.23109 36.256113 
+L 72.23109 36.388 
+L 72.335249 36.33756 
+L 72.35608 36.327534 
+L 72.40816 36.563731 
+L 72.46024 36.538244 
+L 72.512319 36.512886 
+L 72.564399 36.7464 
+L 72.616478 36.720671 
+L 72.731053 36.664521 
+L 72.814381 36.879326 
+L 72.835212 36.86902 
+L 72.887292 36.843344 
+L 72.981035 37.17648 
+L 72.991451 37.171226 
+L 73.293513 37.021086 
+L 73.303929 37.264408 
+L 73.397672 37.217678 
+L 73.647654 37.217185 
+L 73.647654 37.339224 
+L 73.751813 37.287835 
+L 73.772645 37.277615 
+L 73.772645 37.398872 
+L 73.814308 37.378271 
+L 73.83514 37.60951 
+L 73.918467 37.567747 
+L 74.095538 37.480039 
+L 74.105954 37.594106 
+L 74.105954 37.713176 
+L 74.210113 37.661219 
+L 74.845484 37.469756 
+L 74.876731 37.570009 
+L 75.074634 37.476257 
+L 75.116297 37.684264 
+L 75.178793 37.654511 
+L 75.210041 37.752879 
+L 75.324616 37.69836 
+L 75.324616 37.810919 
+L 75.428775 37.761342 
+L 75.54335 37.707307 
+L 75.553766 37.813846 
+L 75.553766 37.925174 
+L 75.657925 37.875617 
+L 75.907907 37.868096 
+L 75.928739 38.077237 
+L 76.012066 38.037699 
+L 76.05373 38.126799 
+L 76.647437 37.851193 
+L 76.647437 37.957401 
+L 76.751596 37.909973 
+L 76.855755 37.968218 
+L 76.855755 38.073413 
+L 76.959914 38.025937 
+L 77.095321 38.068962 
+L 77.095321 38.17304 
+L 77.19948 38.125642 
+L 77.293223 38.18654 
+L 77.293223 38.289685 
+L 77.397382 38.242217 
+L 78.011921 38.070163 
+L 78.011921 38.170468 
+L 78.11608 38.124791 
+L 78.147328 38.210897 
+L 78.334815 38.129099 
+L 78.334815 38.228093 
+L 78.438974 38.182777 
+L 79.18892 37.962583 
+L 79.18892 38.058508 
+L 79.293079 38.015257 
+L 79.990945 37.826911 
+L 79.990945 37.920114 
+L 80.095104 37.878612 
+L 80.115936 37.963094 
+L 80.168015 37.942326 
+L 80.168015 38.034843 
+L 80.272175 37.993212 
+L 80.490909 37.998226 
+L 80.490909 38.089628 
+L 80.595068 38.048292 
+L 80.772138 38.069194 
+L 80.772138 38.159629 
+L 80.876297 38.118469 
+L 81.240854 37.976677 
+L 81.261686 38.057633 
+L 81.345014 38.202766 
+L 81.365845 38.194648 
+L 81.605411 38.18989 
+L 81.605411 38.277633 
+L 81.709571 38.23727 
+L 81.9908 38.216291 
+L 82.084543 38.353184 
+L 82.094959 38.349177 
+L 82.167871 38.321203 
+L 82.178287 38.403167 
+L 82.178287 38.489059 
+L 82.282446 38.4488 
+L 82.459516 38.466072 
+L 82.553259 38.599767 
+L 82.563675 38.595744 
+L 83.001144 38.512724 
+L 83.084471 38.897152 
+L 83.105303 38.889065 
+L 83.574019 38.79167 
+L 83.615683 39.020702 
+L 83.678178 38.996662 
+L 83.69901 38.988669 
+L 83.69901 39.069969 
+L 83.69901 39.151217 
+L 83.803169 39.110913 
+L 84.063567 39.09161 
+L 84.063567 39.171899 
+L 84.167726 39.132 
+L 84.334381 39.148299 
+L 84.365628 39.295366 
+L 84.43854 39.267419 
+L 84.594778 39.286824 
+L 84.594778 39.365653 
+L 84.698938 39.325846 
+L 84.730185 39.313952 
+L 84.751017 39.384468 
+L 84.823929 39.513073 
+L 84.855176 39.501061 
+L 85.021831 39.515065 
+L 85.053079 39.658235 
+L 85.12599 39.630145 
+L 85.521795 39.556213 
+L 85.594706 39.757446 
+L 85.625954 39.745506 
+L 85.875936 39.726323 
+L 85.980095 39.912818 
+L 86.000927 39.90486 
+L 86.000927 39.97999 
+L 86.084254 40.097876 
+L 86.105086 40.089839 
+L 86.532138 40.001098 
+L 86.532138 40.074992 
+L 86.636297 40.035496 
+L 86.646713 40.105186 
+L 86.698793 40.085434 
+L 86.698793 40.232356 
+L 86.802952 40.192622 
+L 87.146677 40.063119 
+L 87.146677 40.135658 
+L 87.198757 40.333224 
+L 87.250836 40.31348 
+L 87.615393 40.248336 
+L 87.646641 40.450779 
+L 87.719552 40.423287 
+L 87.875791 40.36474 
+L 87.875791 40.435604 
+L 87.875791 40.577215 
+L 87.97995 40.537895 
+L 88.115357 40.557423 
+L 88.115357 40.627701 
+L 88.219516 40.588514 
+L 88.615321 40.510931 
+L 88.615321 40.580255 
+L 88.71948 40.541735 
+L 89.292355 40.401732 
+L 89.323603 40.526563 
+L 89.396514 40.500194 
+L 89.40693 40.564271 
+L 89.667328 40.470523 
+L 89.667328 40.537895 
+L 89.771487 40.500576 
+L 90.292283 40.383256 
+L 90.37561 40.486483 
+L 90.396442 40.47917 
+L 90.677672 40.446805 
+L 90.771415 40.545161 
+L 90.781831 40.541527 
+L 90.896406 40.566862 
+L 90.958901 40.675207 
+L 91.000565 40.660627 
+L 91.125556 40.681803 
+L 91.156804 40.800191 
+L 91.229715 40.774614 
+L 91.250547 40.767323 
+L 91.250547 40.831775 
+L 91.354706 40.987969 
+L 91.708847 40.927341 
+L 91.792175 41.215429 
+L 91.813006 41.208033 
+L 92.010909 41.201166 
+L 92.062988 41.308604 
+L 92.115068 41.290147 
+L 92.323386 41.27926 
+L 92.323386 41.341711 
+L 92.427545 41.305008 
+L 92.479625 41.348927 
+L 92.510873 41.462159 
+L 92.583784 41.436373 
+L 92.646279 41.414341 
+L 92.646279 41.476221 
+L 92.729607 41.57027 
+L 92.750439 41.562884 
+L 92.760854 41.559194 
+L 92.760854 41.620825 
+L 92.760854 41.682426 
+L 92.865014 41.645338 
+L 92.969173 41.669719 
+L 93.062916 41.819836 
+L 93.073332 41.816116 
+L 93.094164 41.80868 
+L 93.10458 41.865952 
+L 93.198323 42.01488 
+L 93.208739 42.011127 
+L 93.302482 42.038043 
+L 93.406641 42.362844 
+L 93.583712 42.358325 
+L 93.583712 42.418331 
+L 93.687871 42.380335 
+L 93.760782 42.413595 
+L 93.760782 42.473316 
+L 93.864941 42.43536 
+L 93.896189 42.424009 
+L 93.896189 42.483528 
+L 93.958684 42.638945 
+L 94.000348 42.623667 
+L 94.073259 42.597 
+L 94.073259 42.656183 
+L 94.073259 42.715337 
+L 94.177419 42.677133 
+L 94.427401 42.64486 
+L 94.427401 42.703518 
+L 94.448232 42.813114 
+L 94.53156 42.782639 
+L 94.98986 42.7328 
+L 94.98986 42.790636 
+L 95.094019 42.753096 
+L 95.635646 42.674712 
+L 95.698142 42.766468 
+L 95.739806 42.751699 
+L 96.125194 42.729078 
+L 96.125194 42.785404 
+L 96.229354 42.748855 
+L 96.583495 42.737348 
+L 96.677238 42.927246 
+L 96.687654 42.9236 
+L 97.281361 42.828147 
+L 97.281361 42.882968 
+L 97.38552 42.847165 
+L 97.406352 42.949323 
+L 97.520927 42.90991 
+L 97.583422 43.051695 
+L 97.625086 43.037314 
+L 98.031307 43.006147 
+L 98.12505 43.189043 
+L 98.135466 43.185461 
+L 98.76042 43.079287 
+L 98.76042 43.132239 
+L 98.86458 43.097092 
+L 99.416623 43.0178 
+L 99.416623 43.070034 
+L 99.520782 43.035501 
+L 99.885339 43.019254 
+L 99.885339 43.122661 
+L 99.989498 43.088369 
+L 100.197816 43.122933 
+L 100.208232 43.222142 
+L 100.301976 43.19131 
+L 100.499878 43.177599 
+L 100.510294 43.225172 
+L 100.510294 43.276126 
+L 100.614453 43.241989 
+L 100.97901 43.224578 
+L 101.020674 43.3119 
+L 101.083169 43.291577 
+L 101.510222 43.253867 
+L 101.614381 43.32006 
+L 101.937274 43.31574 
+L 101.978938 43.401223 
+L 102.041433 43.381197 
+L 102.051849 43.427165 
+L 102.145592 43.446343 
+L 102.239335 43.563587 
+L 102.249751 43.560234 
+L 102.416406 43.555648 
+L 102.260167 43.605905 
+L 102.416406 43.604518 
+L 102.510149 43.720679 
+L 102.520565 43.717315 
+L 102.603892 43.739086 
+L 102.603892 43.7877 
+L 102.603892 43.836295 
+L 102.708052 43.80257 
+L 102.937202 43.825408 
+L 102.989281 43.953239 
+L 103.041361 43.936384 
+L 103.09344 43.919562 
+L 103.114272 44.008933 
+L 103.135104 44.146129 
+L 103.218431 44.118978 
+L 103.385086 44.160387 
+L 103.385086 44.20809 
+L 103.489245 44.174221 
+L 103.83297 44.157995 
+L 103.83297 44.20528 
+L 103.937129 44.171713 
+L 104.197527 44.182286 
+L 104.197527 44.229227 
+L 104.301686 44.195855 
+L 104.645411 44.179742 
+L 104.645411 44.22628 
+L 104.749571 44.1932 
+L 104.926641 44.229836 
+L 105.020384 44.292589 
+L 105.0308 44.289288 
+L 105.291198 44.299049 
+L 105.353693 44.371087 
+L 105.395357 44.357919 
+L 105.54118 44.403367 
+L 105.603675 44.474881 
+L 105.645339 44.461705 
+L 105.801578 44.457904 
+L 105.801578 44.503327 
+L 105.82241 44.587514 
+L 105.905737 44.561137 
+L 106.082807 44.595654 
+L 106.082807 44.640786 
+L 106.186967 44.607897 
+L 106.541108 44.586513 
+L 106.603603 44.701059 
+L 106.645267 44.687976 
+L 106.759842 44.741172 
+L 106.843169 44.803943 
+L 106.864001 44.797394 
+L 107.041071 44.741915 
+L 107.051487 44.8272 
+L 107.113983 44.984329 
+L 107.155646 44.971182 
+L 107.374381 44.946422 
+L 107.374381 44.990363 
+L 107.42646 45.149471 
+L 107.47854 45.132998 
+L 107.947256 45.072973 
+L 108.040999 45.173821 
+L 108.051415 45.170557 
+L 108.249317 45.195124 
+L 108.322229 45.258572 
+L 108.353476 45.248791 
+L 108.426388 45.269024 
+L 108.436804 45.308759 
+L 108.478467 45.42452 
+L 108.540963 45.404864 
+L 108.572211 45.395052 
+L 108.582627 45.477441 
+L 108.686786 45.615546 
+L 108.936768 45.579246 
+L 108.697202 45.654921 
+L 108.936768 45.621748 
+L 108.936768 45.664235 
+L 109.040927 45.631385 
+L 109.13467 45.601915 
+L 109.155502 45.680028 
+L 109.249245 45.777234 
+L 109.259661 45.773945 
+L 109.457563 45.795771 
+L 109.551307 45.89218 
+L 109.561722 45.888889 
+L 109.811704 45.893787 
+L 109.811704 45.935531 
+L 109.915863 45.90276 
+L 109.936695 45.97951 
+L 109.967943 45.969668 
+L 110.072102 46.061512 
+L 110.259589 46.085272 
+L 110.322084 46.272056 
+L 110.363748 46.258843 
+L 110.717889 46.188252 
+L 110.717889 46.229246 
+L 110.7908 46.329107 
+L 110.822048 46.319249 
+L 110.915791 46.371364 
+L 110.999118 46.54869 
+L 111.01995 46.542074 
+L 111.134525 46.586945 
+L 111.238684 46.634931 
+L 111.519914 46.626616 
+L 111.519914 46.707185 
+L 111.624073 46.674203 
+L 111.946967 46.652663 
+L 112.04071 46.743038 
+L 112.051126 46.739759 
+L 112.134453 46.753408 
+L 112.144869 46.789959 
+L 112.144869 46.829774 
+L 112.249028 46.796956 
+L 112.384435 46.794117 
+L 112.394851 46.830496 
+L 112.394851 46.870131 
+L 112.49901 46.837391 
+L 112.67608 46.86089 
+L 112.696912 46.933209 
+L 112.78024 46.907066 
+L 113.00939 46.913963 
+L 113.00939 46.953167 
+L 113.113549 46.920638 
+L 113.228124 46.963107 
+L 113.269788 47.02816 
+L 113.332283 47.008649 
+L 113.353115 47.080049 
+L 113.41561 47.06052 
+L 113.446858 47.128513 
+L 113.519769 47.105718 
+L 113.769751 47.105294 
+L 113.769751 47.14395 
+L 113.769751 47.182593 
+L 113.87391 47.150139 
+L 114.030149 47.217089 
+L 114.030149 47.255545 
+L 114.134308 47.223124 
+L 114.446786 47.241105 
+L 114.540529 47.364626 
+L 114.550945 47.361391 
+L 114.811343 47.280832 
+L 114.832175 47.388204 
+L 114.905086 47.479233 
+L 114.936334 47.469538 
+L 114.94675 47.504121 
+L 115.248811 47.486022 
+L 115.35297 47.566588 
+L 115.467545 47.568683 
+L 115.363386 47.600898 
+L 115.488377 47.637154 
+L 115.488377 47.674588 
+L 115.592536 47.642334 
+L 115.759191 47.70276 
+L 115.790439 47.767568 
+L 115.86335 47.744997 
+L 116.071668 47.791969 
+L 116.071668 47.829012 
+L 116.175827 47.796841 
+L 116.300818 47.869089 
+L 116.404977 47.984253 
+L 116.644543 48.020295 
+L 116.717455 48.107573 
+L 116.748703 48.097895 
+L 116.998684 48.13007 
+L 117.06118 48.256236 
+L 117.102844 48.243322 
+L 117.331994 48.28116 
+L 117.415321 48.32769 
+L 117.436153 48.321247 
+L 117.613223 48.374674 
+L 117.717382 48.48624 
+L 117.74863 48.476559 
+L 117.74863 48.584185 
+L 117.74863 48.620039 
+L 117.852789 48.587637 
+L 117.998612 48.649591 
+L 117.998612 48.685289 
+L 118.102771 48.652924 
+L 118.113187 48.720953 
+L 118.175683 48.737115 
+L 118.248594 48.856572 
+L 118.279842 48.846822 
+L 118.654815 48.836408 
+L 118.696478 48.89403 
+L 118.758974 48.87464 
+L 119.029788 48.896284 
+L 119.029788 48.931355 
+L 119.133947 48.899172 
+L 119.363097 48.933411 
+L 119.467256 49.005877 
+L 119.956804 48.959714 
+L 120.050547 49.138145 
+L 120.060963 49.134945 
+L 120.383856 49.139148 
+L 120.477599 49.213276 
+L 120.488015 49.210086 
+L 120.498431 49.275337 
+L 120.529679 49.299942 
+L 120.529679 49.334124 
+L 120.633838 49.302139 
+L 120.779661 49.359688 
+L 120.779661 49.393728 
+L 120.88382 49.361785 
+L 120.987979 49.39781 
+L 120.987979 49.431736 
+L 121.019227 49.523839 
+L 121.092138 49.501433 
+L 121.269209 49.514736 
+L 121.269209 49.54849 
+L 121.310873 49.670569 
+L 121.373368 49.651333 
+L 121.696261 49.653026 
+L 121.80042 49.788416 
+L 122.123314 49.78946 
+L 122.164977 49.876436 
+L 122.227473 49.857283 
+L 122.279552 49.907685 
+L 122.279552 49.940841 
+L 122.300384 50.033838 
+L 122.383712 50.008202 
+L 122.529534 50.062513 
+L 122.612862 50.168731 
+L 122.633693 50.162312 
+L 122.737853 50.22888 
+L 122.800348 50.340884 
+L 122.842012 50.328 
+L 123.27948 50.291361 
+L 123.362807 50.330925 
+L 123.383639 50.324535 
+L 123.550294 50.370903 
+L 123.612789 50.578479 
+L 123.654453 50.565629 
+L 123.852355 50.601541 
+L 123.935683 50.704695 
+L 123.956514 50.698267 
+L 124.404399 50.656862 
+L 124.466894 50.765507 
+L 124.508558 50.75272 
+L 124.75854 50.771697 
+L 124.862699 50.866829 
+L 125.248088 50.843981 
+L 125.289751 50.957404 
+L 125.352247 50.938312 
+L 125.539733 50.975443 
+L 125.643892 51.131748 
+L 125.935538 51.136364 
+L 125.977202 51.217141 
+L 126.039697 51.198047 
+L 126.123024 51.265891 
+L 126.123024 51.29696 
+L 126.227184 51.265125 
+L 126.289679 51.339051 
+L 126.310511 51.39462 
+L 126.393838 51.36912 
+L 126.445918 51.415023 
+L 126.445918 51.445918 
+L 126.497997 51.553405 
+L 126.550077 51.53741 
+L 126.758395 51.565863 
+L 126.841722 51.632432 
+L 126.862554 51.626043 
+L 127.206279 51.612736 
+L 127.206279 51.643265 
+L 127.310439 51.611499 
+L 127.310439 51.641986 
+L 127.38335 51.711117 
+L 127.38335 51.741549 
+L 127.487509 51.709747 
+L 127.487509 51.740137 
+L 127.84165 51.723268 
+L 127.945809 51.812473 
+L 128.29995 51.795377 
+L 128.393693 51.857058 
+L 128.404109 51.853904 
+L 128.549932 51.899624 
+L 128.602012 52.003428 
+L 128.654091 51.987627 
+L 128.86241 51.984187 
+L 128.86241 52.013961 
+L 128.86241 52.043727 
+L 128.966569 52.012208 
+L 129.143639 52.047792 
+L 129.237382 52.108356 
+L 129.247798 52.105209 
+L 129.654019 52.071455 
+L 129.737346 52.164106 
+L 129.758178 52.157841 
+L 130.164399 52.124048 
+L 130.258142 52.271231 
+L 130.268558 52.268108 
+L 130.581035 52.261949 
+L 130.643531 52.301358 
+L 130.685194 52.288918 
+L 130.987256 52.314699 
+L 131.018504 52.392013 
+L 131.091415 52.370287 
+L 131.310149 52.420364 
+L 131.393476 52.539123 
+L 131.414308 52.53291 
+L 131.799697 52.504177 
+L 131.799697 52.532721 
+L 131.903856 52.672792 
+L 132.060095 52.711599 
+L 132.060095 52.74 
+L 132.060095 52.768394 
+L 132.164254 52.737378 
+L 132.164254 52.765736 
+L 132.351741 52.823188 
+L 132.414236 52.917575 
+L 132.4559 52.905153 
+L 132.580891 52.896134 
+L 132.591307 52.977525 
+L 132.622554 53.024484 
+L 132.695466 53.00273 
+L 132.903784 53.052929 
+L 132.924616 53.102753 
+L 133.007943 53.077923 
+L 133.237093 53.09361 
+L 133.237093 53.121507 
+L 133.237093 53.149397 
+L 133.341252 53.11844 
+L 133.705809 53.121633 
+L 133.809968 53.173964 
+L 133.924543 53.250689 
+L 134.007871 53.30883 
+L 134.028703 53.302659 
+L 134.174525 53.369652 
+L 134.195357 53.418488 
+L 134.278684 53.393788 
+L 134.580746 53.414153 
+L 134.580746 53.441518 
+L 134.684905 53.410771 
+L 134.924471 53.422105 
+L 134.924471 53.449355 
+L 134.955719 53.521845 
+L 135.02863 53.500357 
+L 135.184869 53.563011 
+L 135.289028 53.749028 
+L 135.622337 53.758575 
+L 135.705665 53.787866 
+L 135.726496 53.781725 
+L 135.955646 53.821706 
+L 136.007726 53.886797 
+L 136.059806 53.871456 
+L 136.445194 53.865152 
+L 136.549354 53.994355 
+L 136.799335 54.000672 
+L 136.799335 54.027185 
+L 136.903495 54.102561 
+L 137.153476 54.134903 
+L 137.24722 54.291779 
+L 137.257636 54.288715 
+L 137.268052 54.338252 
+L 137.434706 54.341744 
+L 137.497202 54.375824 
+L 137.538865 54.363575 
+L 137.65344 54.408452 
+L 137.65344 54.434609 
+L 137.736768 54.540718 
+L 137.757599 54.534578 
+L 137.976334 54.57441 
+L 138.059661 54.601905 
+L 138.080493 54.595776 
+L 138.174236 54.672046 
+L 138.236731 54.731409 
+L 138.278395 54.71913 
+L 138.549209 54.742875 
+L 138.549209 54.768686 
+L 138.653368 54.738084 
+L 138.778359 54.752946 
+L 138.788775 54.801362 
+L 138.85127 54.937213 
+L 138.892934 54.924943 
+L 139.122084 54.960075 
+L 139.122084 54.985668 
+L 139.226243 54.955063 
+L 139.517889 54.971668 
+L 139.559552 55.035856 
+L 139.622048 55.017549 
+L 139.830366 55.058206 
+L 139.913693 55.185851 
+L 139.934525 55.179742 
+L 140.080348 55.238124 
+L 140.163675 55.339833 
+L 140.184507 55.333713 
+L 140.319914 55.394656 
+L 140.413657 55.46763 
+L 140.424073 55.464567 
+L 140.663639 55.494469 
+L 140.767798 55.56393 
+L 141.007364 55.593422 
+L 141.101108 55.764952 
+L 141.111524 55.761885 
+L 141.392753 55.778441 
+L 141.465665 55.856019 
+L 141.496912 55.846833 
+L 141.642735 55.902777 
+L 141.746894 56.020012 
+L 141.965628 56.053973 
+L 142.017708 56.087735 
+L 142.069788 56.072418 
+L 142.351017 56.063338 
+L 142.351017 56.087781 
+L 142.351017 56.112218 
+L 142.455176 56.081692 
+L 142.611415 56.08477 
+L 142.611415 56.1335 
+L 142.705158 56.276344 
+L 142.715574 56.273286 
+L 143.090547 56.260465 
+L 143.090547 56.308865 
+L 143.194706 56.278412 
+L 143.278033 56.32654 
+L 143.278033 56.350679 
+L 143.278033 56.374812 
+L 143.382193 56.344364 
+L 143.632175 56.367733 
+L 143.715502 56.415512 
+L 143.736334 56.40944 
+L 143.871741 56.441931 
+L 143.871741 56.465889 
+L 143.944652 56.516451 
+L 143.9759 56.507339 
+L 144.20505 56.536141 
+L 144.298793 56.651809 
+L 144.309209 56.648771 
+L 144.642518 56.646785 
+L 144.642518 56.694212 
+L 144.746677 56.687621 
+L 144.882084 56.719272 
+L 144.882084 56.742911 
+L 144.882084 56.766546 
+L 144.986243 56.736285 
+L 144.986243 56.759894 
+L 145.340384 56.751498 
+L 145.40288 56.82742 
+L 145.444543 56.815355 
+L 145.704941 56.833843 
+L 145.704941 56.857251 
+L 145.8091 56.827178 
+L 145.902844 56.893595 
+L 146.007003 56.980139 
+L 146.163241 56.981581 
+L 146.163241 57.028104 
+L 146.267401 57.067722 
+L 146.434055 57.112364 
+L 146.434055 57.135534 
+L 146.538214 57.105457 
+L 146.538214 57.128604 
+L 146.663205 57.208111 
+L 146.663205 57.277384 
+L 146.767364 57.247259 
+L 146.934019 57.314292 
+L 146.986099 57.345242 
+L 147.038178 57.330195 
+L 147.413151 57.336794 
+L 147.465231 57.413303 
+L 147.51731 57.398303 
+L 148.006858 57.371773 
+L 148.048522 57.45075 
+L 148.111017 57.432843 
+L 148.475574 57.441932 
+L 148.569317 57.505566 
+L 148.579733 57.502592 
+L 148.704724 57.557138 
+L 148.704724 57.579676 
+L 148.777636 57.626401 
+L 148.808883 57.617469 
+L 149.006786 57.673307 
+L 149.110945 57.733264 
+L 149.215104 57.815434 
+L 149.267184 57.867606 
+L 149.319263 57.852699 
+L 149.50675 57.910629 
+L 149.50675 57.955192 
+L 149.610909 57.925393 
+L 149.944218 57.941364 
+L 150.027545 58.006262 
+L 150.048377 58.000322 
+L 150.215032 58.063402 
+L 150.298359 58.105883 
+L 150.319191 58.099943 
+L 150.485845 58.162625 
+L 150.496261 58.203674 
+L 150.590005 58.176942 
+L 150.798323 58.205478 
+L 150.798323 58.227413 
+L 150.902482 58.285413 
+L 151.183712 58.314708 
+L 151.256623 58.337623 
+L 151.287871 58.328744 
+L 151.475357 58.340874 
+L 151.485773 58.381431 
+L 151.485773 58.40318 
+L 151.579516 58.376571 
+L 151.589932 58.395346 
+L 151.819082 58.417181 
+L 151.819082 58.438851 
+L 151.839914 58.476269 
+L 151.923241 58.474292 
+L 152.100312 58.532189 
+L 152.204471 58.610516 
+L 152.76693 58.559035 
+L 152.850258 58.706873 
+L 152.87109 58.700989 
+L 152.881505 58.698048 
+L 152.881505 58.80495 
+L 152.975249 58.842477 
+L 152.985665 58.839527 
+L 153.131487 58.862231 
+L 153.131487 58.904838 
+L 153.225231 59.005946 
+L 153.235646 59.002991 
+L 153.32939 59.061368 
+L 153.32939 59.082595 
+L 153.381469 59.131445 
+L 153.433549 59.11665 
+L 153.496044 59.14128 
+L 153.50646 59.201838 
+L 153.610619 59.299073 
+L 153.996008 59.294955 
+L 154.079335 59.334416 
+L 154.100167 59.328506 
+L 154.225158 59.356071 
+L 154.225158 59.398041 
+L 154.318901 59.56 
+L 154.329317 59.557034 
+L 154.443892 59.608068 
+L 154.443892 59.628964 
+L 154.495972 59.697648 
+L 154.548052 59.682796 
+L 154.662627 59.754353 
+L 154.714706 59.885148 
+L 154.766786 59.870257 
+L 154.995936 59.908599 
+L 155.068847 59.949945 
+L 155.100095 59.941025 
+L 155.287581 59.990941 
+L 155.391741 60.1675 
+L 155.600059 60.210807 
+L 155.683386 60.269143 
+L 155.704218 60.263183 
+L 155.933368 60.300178 
+L 155.964616 60.373103 
+L 156.037527 60.352254 
+L 156.277093 60.324742 
+L 156.277093 60.385932 
+L 156.350005 60.466998 
+L 156.381252 60.458072 
+L 156.683314 60.473552 
+L 156.777057 60.609017 
+L 156.787473 60.606042 
+L 156.933296 60.665571 
+L 157.027039 60.719598 
+L 157.037455 60.716622 
+L 157.214525 60.766874 
+L 157.214525 60.787015 
+L 157.308269 60.760258 
+L 157.318684 60.777409 
+L 157.651994 60.7829 
+L 157.735321 60.879415 
+L 157.756153 60.873481 
+L 157.901976 60.911972 
+L 157.901976 60.931956 
+L 157.985303 61.008049 
+L 158.006135 61.00211 
+L 158.141542 61.023338 
+L 158.151958 61.060204 
+L 158.256117 61.149867 
+L 158.433187 61.19863 
+L 158.506099 61.276932 
+L 158.537346 61.26801 
+L 158.704001 61.319368 
+L 158.787328 61.414065 
+L 158.80816 61.408112 
+L 159.03731 61.441219 
+L 159.141469 61.568761 
+L 159.308124 61.619226 
+L 159.401867 61.788177 
+L 159.412283 61.785191 
+L 159.526858 61.850028 
+L 159.631017 61.956657 
+L 159.756008 62.018089 
+L 159.787256 62.067442 
+L 159.860167 62.046484 
+L 160.037238 62.092673 
+L 160.047654 62.205949 
+L 160.141397 62.198338 
+L 160.245556 62.207082 
+L 160.245556 62.265063 
+L 160.328883 62.318323 
+L 160.349715 62.312327 
+L 160.505954 62.305966 
+L 160.505954 62.363757 
+L 160.558033 62.464235 
+L 160.610113 62.44923 
+L 160.724688 62.531472 
+L 160.818431 62.600329 
+L 160.828847 62.597325 
+L 161.037165 62.652098 
+L 161.130909 62.777833 
+L 161.141325 62.774824 
+L 161.297563 62.844052 
+L 161.339227 62.870083 
+L 161.401722 62.852037 
+L 161.735032 62.869901 
+L 161.828775 62.93763 
+L 161.839191 62.93463 
+L 161.880854 62.979394 
+L 161.89127 63.033119 
+L 161.985014 63.138263 
+L 161.995429 63.135254 
+L 162.359986 63.143115 
+L 162.464146 63.207064 
+L 162.641216 63.268586 
+L 162.734959 63.391301 
+L 162.745375 63.388295 
+L 162.828703 63.457669 
+L 162.828703 63.476342 
+L 162.922446 63.542531 
+L 162.932862 63.53952 
+L 163.224507 63.566982 
+L 163.31825 63.744129 
+L 163.328666 63.741115 
+L 163.464073 63.813079 
+L 163.547401 63.844455 
+L 163.536985 63.810482 
+L 163.568232 63.838425 
+L 163.891126 63.855853 
+L 163.984869 63.902468 
+L 163.995285 63.899461 
+L 164.172355 63.958676 
+L 164.276514 64.057058 
+L 164.505665 64.064166 
+L 164.505665 64.100753 
+L 164.56816 64.174102 
+L 164.609824 64.162066 
+L 164.818142 64.174937 
+L 164.818142 64.211387 
+L 164.922301 64.290562 
+L 165.172283 64.327433 
+L 165.266026 64.372936 
+L 165.25561 64.321553 
+L 165.276442 64.369932 
+L 165.401433 64.442517 
+L 165.401433 64.460607 
+L 165.474344 64.439572 
+L 165.505592 64.448639 
+L 165.630583 64.502897 
+L 165.630583 64.52094 
+L 165.630583 64.557019 
+L 165.734742 64.544996 
+L 165.807654 64.614016 
+L 165.807654 64.632013 
+L 165.901397 64.676888 
+L 165.880565 64.628962 
+L 165.911813 64.673881 
+L 166.057636 64.739516 
+L 166.151379 64.909517 
+L 166.161795 64.906501 
+L 166.338865 64.962514 
+L 166.432608 65.024615 
+L 166.443024 65.021599 
+L 166.588847 65.086285 
+L 166.672175 65.151098 
+L 166.693006 65.145063 
+L 166.984652 65.167182 
+L 167.057563 65.23468 
+L 167.088811 65.225642 
+L 167.255466 65.265896 
+L 167.255466 65.283565 
+L 167.359625 65.429898 
+L 167.557527 65.478235 
+L 167.609607 65.603755 
+L 167.661686 65.588648 
+L 167.870005 65.633501 
+L 167.974164 65.795771 
+L 168.276225 65.812863 
+L 168.338721 65.812183 
+L 168.380384 65.852356 
+L 168.515791 65.917473 
+L 168.526207 65.949203 
+L 168.61995 65.939397 
+L 169.07825 65.910892 
+L 169.171994 65.987539 
+L 169.18241 65.984533 
+L 169.442807 66.012932 
+L 169.515719 66.009154 
+L 169.546967 66.034579 
+L 169.744869 66.080741 
+L 169.849028 66.222257 
+L 169.994851 66.28292 
+L 170.036514 66.339285 
+L 170.09901 66.321257 
+L 170.244833 66.364562 
+L 170.244833 66.381615 
+L 170.338576 66.558929 
+L 170.348992 66.555918 
+L 170.526062 66.589722 
+L 170.526062 66.6067 
+L 170.567726 66.662537 
+L 170.630222 66.644471 
+L 170.682301 66.714154 
+L 170.640637 66.726208 
+L 170.682301 66.731091 
+L 170.78646 66.785575 
+L 170.796876 66.833286 
+L 170.869788 66.862858 
+L 170.973947 66.984523 
+L 171.213513 67.016093 
+L 171.286424 67.062203 
+L 171.317672 67.05315 
+L 171.47391 67.091822 
+L 171.47391 67.10859 
+L 171.546822 67.188 
+L 171.57807 67.178943 
+L 171.775972 67.221969 
+L 171.859299 67.29801 
+L 171.880131 67.291974 
+L 171.963458 67.367853 
+L 172.057202 67.440552 
+L 172.067618 67.437531 
+L 172.307184 67.467781 
+L 172.369679 67.532612 
+L 172.411343 67.520537 
+L 172.557165 67.577653 
+L 172.630077 67.606149 
+L 172.661325 67.597098 
+L 172.95297 67.628271 
+L 173.057129 67.664066 
+L 173.192536 67.707201 
+L 173.192536 67.740077 
+L 173.244616 67.839981 
+L 173.296695 67.824907 
+L 173.525845 67.85699 
+L 173.525845 67.873362 
+L 173.619589 68.009781 
+L 173.630005 68.006765 
+L 173.879986 68.048639 
+L 173.900818 68.09149 
+L 173.984146 68.083667 
+L 174.109137 68.145112 
+L 174.109137 68.161364 
+L 174.213296 68.228652 
+L 174.37995 68.293892 
+L 174.473693 68.347681 
+L 174.484109 68.344666 
+L 174.588269 68.379176 
+L 174.588269 68.427631 
+L 174.629932 68.512389 
+L 174.692428 68.494269 
+L 174.796587 68.576855 
+L 174.796587 68.592953 
+L 174.859082 68.574829 
+L 174.900746 68.578842 
+L 175.223639 68.597814 
+L 175.286135 68.643872 
+L 175.327798 68.631824 
+L 175.442373 68.662756 
+L 175.442373 68.710752 
+L 175.494453 68.775618 
+L 175.546533 68.760547 
+L 175.827762 68.75907 
+L 175.827762 68.790942 
+L 175.848594 68.816786 
+L 175.931921 68.792728 
+L 176.098576 68.855976 
+L 176.181903 68.911332 
+L 176.202735 68.90532 
+L 176.379806 68.949371 
+L 176.379806 68.96521 
+L 176.483965 69.093362 
+L 176.59854 69.123453 
+L 176.494381 69.13776 
+L 176.608956 69.167795 
+L 176.629788 69.193327 
+L 176.713115 69.185013 
+L 176.911017 69.238095 
+L 177.00476 69.321058 
+L 177.015176 69.318048 
+L 177.223495 69.367719 
+L 177.296406 69.440647 
+L 177.327654 69.431621 
+L 177.56722 69.471911 
+L 177.660963 69.522901 
+L 177.671379 69.519895 
+L 177.97344 69.541874 
+L 178.077599 69.651743 
+L 178.369245 69.660815 
+L 178.369245 69.676305 
+L 178.473404 69.770123 
+L 178.692138 69.799847 
+L 178.692138 69.815277 
+L 178.76505 69.902218 
+L 178.796297 69.893219 
+L 179.046279 69.929009 
+L 179.150439 70.067931 
+L 179.254598 70.099252 
+L 179.265014 70.142205 
+L 179.369173 70.372106 
+L 179.587907 70.415664 
+L 179.692066 70.507363 
+L 179.921216 70.517154 
+L 179.921216 70.547518 
+L 180.014959 70.672079 
+L 180.025375 70.669066 
+L 180.129534 70.744909 
+L 180.202446 70.73894 
+L 180.233693 70.760137 
+L 180.494091 70.790551 
+L 180.514923 70.829758 
+L 180.59825 70.820756 
+L 180.733657 70.871969 
+L 180.733657 70.887008 
+L 180.775321 70.9351 
+L 180.837816 70.917051 
+L 181.10863 70.943959 
+L 181.212789 71.033716 
+L 181.421108 71.078277 
+L 181.421108 71.108136 
+L 181.525267 71.093039 
+L 181.712753 71.128479 
+L 181.712753 71.143368 
+L 181.806496 71.19078 
+L 181.816912 71.187781 
+L 182.035646 71.213987 
+L 182.035646 71.228828 
+L 182.12939 71.40935 
+L 182.139806 71.406347 
+L 182.243965 71.465082 
+L 182.243965 71.479866 
+L 182.348124 71.538456 
+L 182.421035 71.591194 
+L 182.421035 71.620685 
+L 182.504363 71.69975 
+L 182.525194 71.693731 
+L 182.650185 71.745892 
+L 182.650185 71.760592 
+L 182.733513 71.927368 
+L 182.754344 71.921336 
+L 182.910583 71.978675 
+L 183.004326 72.039322 
+L 183.014742 72.036305 
+L 183.077238 72.120487 
+L 183.181397 72.177857 
+L 183.514706 72.183306 
+L 183.618865 72.240402 
+L 183.743856 72.291351 
+L 183.743856 72.305857 
+L 183.848015 72.391659 
+L 183.983422 72.439291 
+L 183.983422 72.45375 
+L 184.087581 72.553599 
+L 184.420891 72.558044 
+L 184.420891 72.57244 
+L 184.483386 72.597541 
+L 184.483386 72.568767 
+L 184.52505 72.585498 
+L 184.670873 72.658312 
+L 184.722952 72.700662 
+L 184.775032 72.699951 
+L 184.93127 72.769415 
+L 185.035429 72.939442 
+L 185.233332 72.996274 
+L 185.316659 73.043375 
+L 185.337491 73.037345 
+L 185.608305 73.07277 
+L 185.702048 73.173376 
+L 185.712464 73.170363 
+L 185.827039 73.250546 
+L 185.858287 73.283957 
+L 185.931198 73.262859 
+L 186.118684 73.321676 
+L 186.222844 73.376198 
+L 186.35825 73.449724 
+L 186.441578 73.538122 
+L 186.46241 73.532093 
+L 186.816551 73.542 
+L 186.92071 73.651927 
+L 186.972789 73.720761 
+L 186.931126 73.704855 
+L 186.972789 73.748707 
+L 187.066533 73.819308 
+L 187.076948 73.816294 
+L 187.274851 73.870534 
+L 187.37901 73.979506 
+L 187.493585 74.043552 
+L 187.493585 74.057431 
+L 187.504001 74.096036 
+L 187.597744 74.068881 
+L 187.795646 74.122418 
+L 187.795646 74.136255 
+L 187.899806 74.10613 
+L 187.910222 74.144599 
+L 188.128956 74.15045 
+L 188.222699 74.219915 
+L 188.233115 74.216906 
+L 188.358106 74.277202 
+L 188.358106 74.290963 
+L 188.399769 74.32019 
+L 188.462265 74.302137 
+L 188.649751 74.357887 
+L 188.722663 74.432829 
+L 188.75391 74.423805 
+L 188.889317 74.494241 
+L 188.993476 74.546194 
+L 189.191379 74.598262 
+L 189.295538 74.649971 
+L 189.49344 74.701725 
+L 189.597599 74.821058 
+L 189.795502 74.858826 
+L 189.795502 74.87237 
+L 189.899661 74.977607 
+L 190.0559 75.040539 
+L 190.160059 75.09138 
+L 190.326713 75.15099 
+L 190.347545 75.212229 
+L 190.430873 75.201597 
+L 190.493368 75.277565 
+L 190.493368 75.290989 
+L 190.587111 75.357781 
+L 190.597527 75.354769 
+L 190.607943 75.40536 
+L 190.660023 75.443858 
+L 190.74335 75.540127 
+L 190.764182 75.534093 
+L 190.868341 75.597423 
+L 190.868341 75.610771 
+L 190.941252 75.643009 
+L 190.9725 75.633956 
+L 191.159986 75.686238 
+L 191.25373 75.738908 
+L 191.264146 75.735892 
+L 191.514127 75.7698 
+L 191.618287 75.872211 
+L 191.784941 75.929842 
+L 191.784941 75.943061 
+L 191.868269 75.918961 
+L 191.8891 75.926151 
+L 192.076587 75.977556 
+L 192.149498 76.11457 
+L 192.180746 76.105529 
+L 192.274489 76.18362 
+L 192.378648 76.232282 
+L 192.45156 76.303008 
+L 192.39948 76.304979 
+L 192.45156 76.316119 
+L 192.493223 76.330265 
+L 192.555719 76.312171 
+L 192.691126 76.377704 
+L 192.795285 76.504349 
+L 192.90986 76.575506 
+L 193.003603 76.678572 
+L 193.014019 76.675551 
+L 193.034851 76.669508 
+L 193.055683 76.76751 
+L 193.128594 76.902171 
+L 193.159842 76.893084 
+L 193.336912 76.932363 
+L 193.336912 76.945316 
+L 193.388992 77.033725 
+L 193.441071 77.031512 
+L 193.607726 77.086427 
+L 193.711885 77.198018 
+L 193.87854 77.239681 
+L 193.87854 77.252547 
+L 193.961867 77.395381 
+L 193.982699 77.389313 
+L 194.191017 77.444103 
+L 194.28476 77.480859 
+L 194.295176 77.477828 
+L 194.472247 77.54141 
+L 194.56599 77.629041 
+L 194.576406 77.626009 
+L 194.722229 77.698288 
+L 194.805556 77.852138 
+L 194.826388 77.846065 
+L 195.013874 77.905701 
+L 195.107618 78.081095 
+L 195.118033 78.078055 
+L 195.222193 78.136183 
+L 195.222193 78.161459 
+L 195.30552 78.225525 
+L 195.326352 78.21944 
+L 195.430511 78.289908 
+L 195.430511 78.30251 
+L 195.503422 78.407116 
+L 195.53467 78.397977 
+L 195.711741 78.459337 
+L 195.8159 78.541825 
+L 196.003386 78.599759 
+L 196.076297 78.641 
+L 196.107545 78.631866 
+L 196.117961 78.628823 
+L 196.117961 78.716308 
+L 196.128377 78.738243 
+L 196.232536 78.832545 
+L 196.524182 78.859307 
+L 196.628341 78.990413 
+L 196.826243 79.04415 
+L 196.930402 79.162252 
+L 197.117889 79.218604 
+L 197.201216 79.329925 
+L 197.222048 79.323823 
+L 197.315791 79.407224 
+L 197.378287 79.487321 
+L 197.41995 79.475106 
+L 197.742844 79.491059 
+L 197.847003 79.583119 
+L 198.076153 79.626168 
+L 198.138648 79.620116 
+L 198.180312 79.681196 
+L 198.242807 79.723918 
+L 198.253223 79.769637 
+L 198.274055 79.860997 
+L 198.357382 79.836594 
+L 198.430294 79.924721 
+L 198.534453 80.003529 
+L 198.649028 80.079112 
+L 198.753187 80.121263 
+L 199.013585 80.141758 
+L 199.013585 80.15384 
+L 199.055249 80.23824 
+L 199.117744 80.219937 
+L 199.315646 80.270507 
+L 199.398974 80.31835 
+L 199.419806 80.312255 
+L 199.58646 80.359679 
+L 199.58646 80.37169 
+L 199.680203 80.368296 
+L 199.690619 80.389254 
+L 199.81561 80.448644 
+L 199.81561 80.460626 
+L 199.919769 80.549884 
+L 200.169751 80.584361 
+L 200.27391 80.720883 
+L 200.430149 80.782332 
+L 200.482229 80.826553 
+L 200.534308 80.823207 
+L 200.721795 80.875248 
+L 200.815538 80.990053 
+L 200.825954 80.987006 
+L 200.919697 81.054248 
+L 200.919697 81.066073 
+L 201.023856 81.307103 
+L 201.159263 81.349856 
+L 201.159263 81.3734 
+L 201.263422 81.519202 
+L 201.450909 81.558048 
+L 201.450909 81.569774 
+L 201.52382 81.630405 
+L 201.555068 81.621231 
+L 201.669643 81.669533 
+L 201.669643 81.692925 
+L 201.773802 81.76752 
+L 201.930041 81.826662 
+L 201.930041 81.838321 
+L 202.0342 81.819404 
+L 202.284182 81.83925 
+L 202.284182 81.85088 
+L 202.325845 81.850302 
+L 202.388341 81.913333 
+L 202.565411 81.942705 
+L 202.565411 81.965898 
+L 202.669571 82.143822 
+L 202.898721 82.169088 
+L 202.898721 82.192179 
+L 202.982048 82.340729 
+L 203.00288 82.334615 
+L 203.127871 82.401542 
+L 203.013296 82.389143 
+L 203.127871 82.413045 
+L 203.23203 82.531853 
+L 203.450764 82.582321 
+L 203.544507 82.646417 
+L 203.554923 82.643359 
+L 203.74241 82.668394 
+L 203.74241 82.702672 
+L 203.846569 82.797664 
+L 203.940312 82.872719 
+L 203.940312 82.884109 
+L 204.023639 82.973439 
+L 204.044471 82.967316 
+L 204.179878 83.018446 
+L 204.179878 83.041157 
+L 204.221542 83.097009 
+L 204.284037 83.089981 
+L 204.388196 83.172695 
+L 204.492355 83.277844 
+L 204.575683 83.309836 
+L 204.586099 83.363234 
+L 204.690258 83.422833 
+L 204.815249 83.498704 
+L 204.825665 83.540657 
+L 204.919408 83.51306 
+L 205.086062 83.565189 
+L 205.086062 83.576419 
+L 205.148558 83.703886 
+L 205.190222 83.691618 
+L 205.34646 83.746436 
+L 205.34646 83.757628 
+L 205.429788 83.777852 
+L 205.408956 83.750427 
+L 205.450619 83.771722 
+L 205.586026 83.843615 
+L 205.690185 83.957963 
+L 205.825592 84.029451 
+L 205.825592 84.051702 
+L 205.929751 84.021043 
+L 206.096406 84.027607 
+L 206.096406 84.083129 
+L 206.190149 84.122136 
+L 206.200565 84.119073 
+L 206.263061 84.211518 
+L 206.36722 84.313657 
+L 206.492211 84.387342 
+L 206.575538 84.539259 
+L 206.59637 84.533117 
+L 206.783856 84.565941 
+L 206.783856 84.58794 
+L 206.877599 84.637266 
+L 206.888015 84.634198 
+L 207.013006 84.685208 
+L 207.013006 84.707149 
+L 207.10675 84.800094 
+L 207.117165 84.797024 
+L 207.200493 84.870969 
+L 207.200493 84.881907 
+L 207.252572 84.986774 
+L 207.304652 84.982325 
+L 207.387979 85.066854 
+L 207.419227 85.133928 
+L 207.492138 85.112397 
+L 207.658793 85.172049 
+L 207.74212 85.245268 
+L 207.762952 85.239119 
+L 207.898359 85.307679 
+L 207.898359 85.318522 
+L 207.992102 85.290865 
+L 208.002518 85.309469 
+L 208.158757 85.371672 
+L 208.242084 85.455214 
+L 208.262916 85.449069 
+L 208.367075 85.472349 
+L 208.377491 85.523232 
+L 208.48165 85.600307 
+L 208.731632 85.634213 
+L 208.773296 85.707905 
+L 208.835791 85.689481 
+L 209.033693 85.71703 
+L 209.033693 85.738473 
+L 209.137853 85.953999 
+L 209.314923 86.008582 
+L 209.39825 86.058679 
+L 209.419082 86.052535 
+L 209.575321 86.112998 
+L 209.658648 86.184172 
+L 209.67948 86.178029 
+L 209.90863 86.21671 
+L 209.991958 86.319398 
+L 210.012789 86.313258 
+L 210.148196 86.379221 
+L 210.252355 86.454238 
+L 210.346099 86.51107 
+L 210.346099 86.532172 
+L 210.450258 86.638483 
+L 210.585665 86.682744 
+L 210.585665 86.714294 
+L 210.689824 86.79914 
+L 210.814815 86.867171 
+L 210.814815 86.877655 
+L 210.87731 86.911605 
+L 210.918974 86.89931 
+L 211.10646 86.95912 
+L 211.179372 87.083865 
+L 211.210619 87.074642 
+L 211.408522 87.120542 
+L 211.408522 87.130961 
+L 211.460601 87.178085 
+L 211.512681 87.162725 
+L 211.637672 87.240273 
+L 211.720999 87.278028 
+L 211.710583 87.239557 
+L 211.741831 87.271886 
+L 211.84599 87.355296 
+L 211.950149 87.479929 
+L 212.158467 87.521863 
+L 212.158467 87.532193 
+L 212.252211 87.607763 
+L 212.262627 87.604691 
+L 212.366786 87.687343 
+L 212.460529 87.752324 
+L 212.470945 87.74925 
+L 212.595936 87.825436 
+L 212.700095 87.866563 
+L 212.804254 87.887117 
+L 212.81467 87.945535 
+L 212.86675 88.032553 
+L 212.918829 88.027408 
+L 213.012572 88.081533 
+L 213.012572 88.112186 
+L 213.085484 88.22335 
+L 213.116731 88.214117 
+L 213.241722 88.228172 
+L 213.252138 88.286215 
+L 213.293802 88.334981 
+L 213.356297 88.326691 
+L 213.5542 88.380054 
+L 213.637527 88.436649 
+L 213.658359 88.4305 
+L 213.772934 88.498042 
+L 213.668775 88.478127 
+L 213.772934 88.508171 
+L 213.866677 88.642383 
+L 213.877093 88.639305 
+L 214.022916 88.707332 
+L 214.074995 88.742393 
+L 214.127075 88.727011 
+L 214.231234 88.807099 
+L 214.335393 88.897075 
+L 214.554127 88.932937 
+L 214.554127 88.942974 
+L 214.647871 89.025618 
+L 214.658287 89.022543 
+L 214.741614 89.098092 
+L 214.741614 89.108101 
+L 214.845773 89.147357 
+L 214.918684 89.195777 
+L 214.918684 89.235726 
+L 215.012428 89.397519 
+L 215.022844 89.394438 
+L 215.220746 89.435463 
+L 215.220746 89.44541 
+L 215.304073 89.530102 
+L 215.324905 89.523941 
+L 215.616551 89.536994 
+L 215.616551 89.546906 
+L 215.710294 89.647975 
+L 215.72071 89.644898 
+L 215.814453 89.686448 
+L 215.824869 89.722908 
+L 215.89778 89.750761 
+L 215.929028 89.741532 
+L 216.116514 89.794703 
+L 216.220674 89.911682 
+L 216.262337 89.978058 
+L 216.262337 90.007546 
+L 216.35608 90.127121 
+L 216.366496 90.124041 
+L 216.512319 90.188751 
+L 216.606062 90.200206 
+L 216.616478 90.197128 
+L 216.626894 90.242979 
+L 216.720637 90.273941 
+L 216.824797 90.370119 
+L 216.908124 90.44301 
+L 216.908124 90.452757 
+L 216.960203 90.515283 
+L 217.012283 90.50961 
+L 217.231017 90.551924 
+L 217.272681 90.656144 
+L 217.335176 90.647365 
+L 217.408088 90.71308 
+L 217.408088 90.732462 
+L 217.512247 90.817842 
+L 217.678901 90.855567 
+L 217.678901 90.87489 
+L 217.772645 90.982293 
+L 217.783061 90.97921 
+L 218.012211 91.027059 
+L 218.105954 91.047463 
+L 218.085122 91.024757 
+L 218.11637 91.044385 
+L 218.324688 91.098167 
+L 218.428847 91.192125 
+L 218.533006 91.276306 
+L 218.605918 91.398222 
+L 218.637165 91.388982 
+L 218.751741 91.469689 
+L 218.8559 91.534244 
+L 219.08505 91.571248 
+L 219.08505 91.580761 
+L 219.116297 91.619074 
+L 219.189209 91.607039 
+L 219.397527 91.659477 
+L 219.501686 91.846638 
+L 219.710005 91.889107 
+L 219.710005 91.898554 
+L 219.803748 92.003007 
+L 219.814164 91.99993 
+L 219.970402 92.066858 
+L 220.074561 92.148999 
+L 220.168305 92.168304 
+L 220.168305 92.234049 
+L 220.168305 92.243438 
+L 220.241216 92.221896 
+L 220.272464 92.231437 
+L 220.501614 92.276293 
+L 220.595357 92.332884 
+L 220.605773 92.329811 
+L 220.709932 92.401922 
+L 220.709932 92.411264 
+L 220.814091 92.483221 
+L 220.845339 92.483329 
+L 220.855755 92.582808 
+L 220.949498 92.638937 
+L 220.959914 92.63586 
+L 221.178648 92.664294 
+L 221.178648 92.682878 
+L 221.261976 92.825355 
+L 221.282807 92.819203 
+L 221.345303 92.90268 
+L 221.345303 92.911941 
+L 221.407798 93.013772 
+L 221.449462 93.010702 
+L 221.532789 93.013806 
+L 221.543205 93.09386 
+L 221.636948 93.186076 
+L 221.647364 93.182995 
+L 221.761939 93.259655 
+L 221.866099 93.394373 
+L 221.970258 93.473712 
+L 222.074417 93.552891 
+L 222.261903 93.607241 
+L 222.366062 93.731753 
+L 222.532717 93.791881 
+L 222.605628 93.861395 
+L 222.636876 93.852145 
+L 222.85561 93.869313 
+L 222.85561 93.896581 
+L 222.918106 93.978005 
+L 222.959769 93.974756 
+L 223.18892 94.015818 
+L 223.261831 94.111958 
+L 223.293079 94.102721 
+L 223.438901 94.159061 
+L 223.438901 94.168094 
+L 223.543061 94.263661 
+L 223.626388 94.320149 
+L 223.626388 94.347171 
+L 223.720131 94.454426 
+L 223.730547 94.451345 
+L 223.897202 94.509865 
+L 224.001361 94.559816 
+L 224.168015 94.618075 
+L 224.272175 94.739348 
+L 224.417997 94.794469 
+L 224.417997 94.803393 
+L 224.459661 94.83568 
+L 224.522156 94.817208 
+L 224.667979 94.881044 
+L 224.667979 94.889947 
+L 224.709643 94.913239 
+L 224.772138 94.89478 
+L 224.949209 94.931418 
+L 224.949209 94.958067 
+L 224.959625 94.972755 
+L 225.042952 94.948167 
+L 225.053368 94.953972 
+L 225.188775 95.02048 
+L 225.188775 95.029343 
+L 225.240854 95.093711 
+L 225.292934 95.078349 
+L 225.397093 95.153799 
+L 225.397093 95.16264 
+L 225.501252 95.273237 
+L 225.719986 95.323342 
+L 225.81373 95.559581 
+L 225.824146 95.556505 
+L 225.9908 95.621389 
+L 226.074127 95.684431 
+L 226.094959 95.678281 
+L 226.188703 95.76439 
+L 226.261614 95.812801 
+L 226.292862 95.812312 
+L 226.438684 95.882758 
+L 226.532428 95.933557 
+L 226.542844 95.930483 
+L 226.647003 95.995535 
+L 226.647003 96.01294 
+L 226.719914 96.130523 
+L 226.751162 96.12998 
+L 226.876153 96.153847 
+L 226.886569 96.202824 
+L 226.990728 96.310707 
+L 227.199046 96.353001 
+L 227.199046 96.361645 
+L 227.303205 96.434545 
+L 227.46986 96.497475 
+L 227.511524 96.562704 
+L 227.574019 96.552866 
+L 227.719842 96.621656 
+L 227.824001 96.685409 
+L 227.948992 96.734325 
+L 227.948992 96.760043 
+L 228.021903 96.815636 
+L 228.053151 96.806418 
+L 228.15731 96.878371 
+L 228.15731 96.886922 
+L 228.261469 97.035546 
+L 228.490619 97.078742 
+L 228.594778 97.133143 
+L 228.730185 97.203723 
+L 228.782265 97.247805 
+L 228.834344 97.240934 
+L 229.000999 97.293574 
+L 229.000999 97.302047 
+L 229.094742 97.33371 
+L 229.105158 97.330641 
+L 229.219733 97.389952 
+L 229.219733 97.406861 
+L 229.323892 97.553502 
+L 229.396804 97.633171 
+L 229.396804 97.641596 
+L 229.428052 97.640805 
+L 229.500963 97.753966 
+L 229.594706 97.768347 
+L 229.594706 97.83556 
+L 229.688449 97.950543 
+L 229.698865 97.947467 
+L 229.782193 98.031782 
+L 229.875936 98.079416 
+L 229.886352 98.07634 
+L 230.021759 98.145015 
+L 230.115502 98.209155 
+L 230.125918 98.20608 
+L 230.271741 98.238075 
+L 230.271741 98.271398 
+L 230.32382 98.264358 
+L 230.3759 98.315584 
+L 230.511307 98.38372 
+L 230.584218 98.470144 
+L 230.615466 98.46922 
+L 230.771704 98.530894 
+L 230.855032 98.655283 
+L 230.875863 98.649135 
+L 230.959191 98.715447 
+L 230.959191 98.740221 
+L 231.032102 98.792976 
+L 231.06335 98.783752 
+L 231.198757 98.83447 
+L 231.198757 98.859181 
+L 231.2925 98.930284 
+L 231.302916 98.92721 
+L 231.438323 98.977676 
+L 231.438323 99.002318 
+L 231.542482 99.193028 
+L 231.771632 99.239951 
+L 231.865375 99.408306 
+L 231.875791 99.405229 
+L 232.063278 99.455844 
+L 232.063278 99.46399 
+L 232.157021 99.590923 
+L 232.167437 99.587846 
+L 232.292428 99.664664 
+L 232.396587 99.755573 
+L 232.573657 99.792382 
+L 232.573657 99.816663 
+L 232.677816 99.874873 
+L 232.688232 99.912203 
+L 232.792392 99.954122 
+L 232.875719 100.01825 
+L 232.896551 100.012099 
+L 233.031958 100.076853 
+L 233.031958 100.084903 
+L 233.125701 100.185916 
+L 233.136117 100.182841 
+L 233.323603 100.231895 
+L 233.323603 100.239919 
+L 233.417346 100.316491 
+L 233.427762 100.313417 
+L 233.531921 100.370769 
+L 233.531921 100.394776 
+L 233.625665 100.479048 
+L 233.563169 100.393555 
+L 233.63608 100.475973 
+L 233.802735 100.538564 
+L 233.896478 100.670295 
+L 233.906894 100.667221 
+L 234.125628 100.714054 
+L 234.219372 100.77379 
+L 234.229788 100.770718 
+L 234.469354 100.811155 
+L 234.479769 100.839783 
+L 234.573513 100.835929 
+L 234.688088 100.897154 
+L 234.688088 100.912971 
+L 234.792247 100.977128 
+L 234.979733 101.032409 
+L 235.083892 101.143557 
+L 235.177636 101.194631 
+L 235.177636 101.226079 
+L 235.281795 101.289677 
+L 235.365122 101.359295 
+L 235.365122 101.374977 
+L 235.458865 101.441394 
+L 235.469281 101.438327 
+L 235.62552 101.494047 
+L 235.62552 101.501866 
+L 235.729679 101.549349 
+L 235.875502 101.607896 
+L 235.875502 101.615695 
+L 235.969245 101.681638 
+L 235.979661 101.678573 
+L 236.146316 101.715173 
+L 236.146316 101.738508 
+L 236.229643 101.853869 
+L 236.250475 101.847739 
+L 236.396297 101.913454 
+L 236.479625 101.974174 
+L 236.500457 101.968046 
+L 236.615032 102.019482 
+L 236.615032 102.042684 
+L 236.719191 102.151118 
+L 236.833766 102.22541 
+L 236.833766 102.233118 
+L 236.937925 102.294917 
+L 236.990005 102.30269 
+L 237.010836 102.388868 
+L 237.10458 102.484196 
+L 237.114995 102.48113 
+L 237.177491 102.570134 
+L 237.177491 102.5778 
+L 237.28165 102.738554 
+L 237.364977 102.813371 
+L 237.364977 102.828648 
+L 237.469137 102.904807 
+L 237.625375 102.96547 
+L 237.625375 102.973086 
+L 237.729534 103.06415 
+L 237.823278 103.150502 
+L 237.896189 103.311053 
+L 237.927437 103.309412 
+L 238.094091 103.373821 
+L 238.156587 103.431002 
+L 238.19825 103.426275 
+L 238.344073 103.496545 
+L 238.448232 103.586465 
+L 238.53156 103.592032 
+L 238.541976 103.671747 
+L 238.594055 103.663918 
+L 238.646135 103.738771 
+L 238.781542 103.796462 
+L 238.781542 103.811466 
+L 238.885701 104.035431 
+L 239.031524 104.097049 
+L 239.031524 104.104518 
+L 239.135683 104.215562 
+L 239.229426 104.284759 
+L 239.229426 104.29965 
+L 239.333585 104.439962 
+L 239.562735 104.468846 
+L 239.562735 104.483682 
+L 239.646062 104.518415 
+L 239.604399 104.478809 
+L 239.666894 104.512271 
+L 239.781469 104.582165 
+L 239.781469 104.589565 
+L 239.864797 104.705473 
+L 239.885628 104.699327 
+L 239.968956 104.770726 
+L 239.968956 104.785482 
+L 240.021035 104.836485 
+L 240.073115 104.828491 
+L 240.198106 104.894734 
+L 240.198106 104.902094 
+L 240.302265 104.966985 
+L 240.333513 104.994512 
+L 240.343929 105.064876 
+L 240.448088 105.173495 
+L 240.531415 105.22215 
+L 240.531415 105.258749 
+L 240.635574 105.352315 
+L 240.708486 105.440318 
+L 240.802229 105.58758 
+L 240.812645 105.584502 
+L 240.958467 105.63603 
+L 240.958467 105.650573 
+L 241.031379 105.70898 
+L 241.062627 105.699751 
+L 241.15637 105.780943 
+L 241.260529 105.895117 
+L 241.375104 105.977033 
+L 241.479263 106.025751 
+L 241.583422 106.110455 
+L 241.677165 106.205267 
+L 241.687581 106.20219 
+L 241.781325 106.275239 
+L 241.781325 106.289621 
+L 241.875068 106.362522 
+L 241.885484 106.359445 
+L 242.031307 106.431175 
+L 242.135466 106.486402 
+L 242.239625 106.570144 
+L 242.270873 106.568068 
+L 242.343784 106.682278 
+L 242.416695 106.760619 
+L 242.416695 106.774877 
+L 242.447943 106.772774 
+L 242.520854 106.865197 
+L 242.58335 106.924988 
+L 242.58335 106.960537 
+L 242.677093 107.103246 
+L 242.687509 107.100165 
+L 242.843748 107.13196 
+L 242.843748 107.167381 
+L 242.947907 107.327597 
+L 243.072898 107.389498 
+L 243.072898 107.403611 
+L 243.177057 107.513804 
+L 243.291632 107.592533 
+L 243.343712 107.591196 
+L 243.395791 107.716315 
+L 243.49995 107.797742 
+L 243.583278 107.84316 
+L 243.604109 107.836997 
+L 243.666605 107.930491 
+L 243.760348 108.021565 
+L 243.770764 108.018482 
+L 243.854091 108.077585 
+L 243.854091 108.105486 
+L 243.916587 108.163668 
+L 243.95825 108.151337 
+L 244.145737 108.200301 
+L 244.145737 108.207258 
+L 244.249896 108.33628 
+L 244.447798 108.381812 
+L 244.447798 108.388744 
+L 244.551958 108.579452 
+L 244.645701 108.641538 
+L 244.562373 108.624749 
+L 244.645701 108.662251 
+L 244.74986 108.748707 
+L 244.906099 108.805815 
+L 244.906099 108.812699 
+L 245.010258 108.967518 
+L 245.166496 109.031093 
+L 245.20816 109.046194 
+L 245.20816 109.025627 
+L 245.270656 109.034567 
+L 245.353983 109.119509 
+L 245.458142 109.239138 
+L 245.593549 109.301496 
+L 245.593549 109.308318 
+L 245.697708 109.447875 
+L 245.833115 109.516666 
+L 245.833115 109.523464 
+L 245.926858 109.584052 
+L 245.937274 109.580972 
+L 246.083097 109.646406 
+L 246.083097 109.653185 
+L 246.187256 109.859304 
+L 246.426822 109.903278 
+L 246.520565 110.023892 
+L 246.530981 110.020812 
+L 246.666388 110.095207 
+L 246.770547 110.239097 
+L 246.989281 110.268341 
+L 246.989281 110.288444 
+L 247.072608 110.324105 
+L 247.09344 110.317952 
+L 247.208015 110.337654 
+L 247.218431 110.394761 
+L 247.32259 110.550952 
+L 247.457997 110.610929 
+L 247.457997 110.624249 
+L 247.530909 110.675933 
+L 247.562156 110.666705 
+L 247.666316 110.748964 
+L 247.728811 110.856634 
+L 247.770475 110.844328 
+L 247.853802 110.925774 
+L 247.853802 110.932398 
+L 247.957961 111.000924 
+L 248.124616 111.064086 
+L 248.228775 111.15873 
+L 248.395429 111.22156 
+L 248.499589 111.342117 
+L 248.593332 111.419531 
+L 248.593332 111.426094 
+L 248.687075 111.477138 
+L 248.697491 111.474064 
+L 248.80165 111.521959 
+L 248.80165 111.554697 
+L 248.905809 111.700522 
+L 249.009968 111.780748 
+L 249.0308 111.787644 
+L 249.103712 111.766128 
+L 249.114127 111.782616 
+L 249.187039 111.81976 
+L 249.197455 111.868788 
+L 249.280782 111.967807 
+L 249.301614 111.961659 
+L 249.437021 112.012661 
+L 249.437021 112.032136 
+L 249.530764 112.198977 
+L 249.54118 112.195902 
+L 249.655755 112.265631 
+L 249.655755 112.272098 
+L 249.749498 112.321994 
+L 249.759914 112.318921 
+L 249.957816 112.370281 
+L 250.030728 112.368133 
+L 250.061976 112.41693 
+L 250.239046 112.461327 
+L 250.239046 112.474194 
+L 250.332789 112.510882 
+L 250.343205 112.507815 
+L 250.405701 112.553655 
+L 250.416117 112.601948 
+L 250.520276 112.629011 
+L 250.655683 112.704486 
+L 250.749426 112.79206 
+L 250.759842 112.788993 
+L 250.999408 112.820722 
+L 250.999408 112.833488 
+L 251.02024 112.852889 
+L 251.103567 112.847525 
+L 251.218142 112.928571 
+L 251.322301 113.057019 
+L 251.436876 113.131319 
+L 251.436876 113.137666 
+L 251.488956 113.185802 
+L 251.541035 113.183175 
+L 251.759769 113.226615 
+L 251.759769 113.232946 
+L 251.832681 113.262158 
+L 251.863929 113.252984 
+L 251.947256 113.317028 
+L 251.947256 113.342298 
+L 252.051415 113.412716 
+L 252.124326 113.466974 
+L 252.124326 113.504779 
+L 252.207654 113.637646 
+L 252.228486 113.631527 
+L 252.259733 113.678915 
+L 252.270149 113.732384 
+L 252.374308 113.839797 
+L 252.509715 113.912755 
+L 252.613874 114.044718 
+L 252.707618 114.085852 
+L 252.718033 114.126464 
+L 252.811777 114.167501 
+L 252.822193 114.164441 
+L 252.895104 114.242664 
+L 252.895104 114.25511 
+L 252.999263 114.342654 
+L 253.124254 114.38667 
+L 253.124254 114.417697 
+L 253.228413 114.461522 
+L 253.353404 114.536306 
+L 253.457563 114.623229 
+L 253.624218 114.673122 
+L 253.624218 114.685464 
+L 253.728377 114.839794 
+L 253.853368 114.913842 
+L 253.957527 115.030674 
+L 254.061686 115.098218 
+L 254.061686 115.110474 
+L 254.165845 115.19012 
+L 254.342916 115.24822 
+L 254.447075 115.297051 
+L 254.519986 115.354968 
+L 254.519986 115.385446 
+L 254.603314 115.446286 
+L 254.624146 115.446264 
+L 254.707473 115.537404 
+L 254.811632 115.701135 
+L 254.947039 115.752321 
+L 254.947039 115.776545 
+L 254.999118 115.845994 
+L 255.051198 115.842814 
+L 255.124109 115.918129 
+L 255.124109 115.936247 
+L 255.228269 116.044465 
+L 255.280348 116.113538 
+L 255.280348 116.143644 
+L 255.384507 116.335512 
+L 255.519914 116.403753 
+L 255.519914 116.409748 
+L 255.624073 116.51095 
+L 255.780312 116.554817 
+L 255.780312 116.578723 
+L 255.801144 116.578586 
+L 255.884471 116.637745 
+L 255.967798 116.708739 
+L 255.967798 116.726621 
+L 256.071958 116.844925 
+L 256.186533 116.906435 
+L 256.186533 116.924258 
+L 256.290692 117.047997 
+L 256.342771 117.1216 
+L 256.342771 117.145286 
+L 256.415683 117.194905 
+L 256.44693 117.185736 
+L 256.624001 117.246094 
+L 256.686496 117.345797 
+L 256.72816 117.339475 
+L 256.821903 117.400385 
+L 256.821903 117.423941 
+L 256.926062 117.581596 
+L 257.051053 117.644738 
+L 257.051053 117.656471 
+L 257.113549 117.720223 
+L 257.155212 117.708006 
+L 257.290619 117.767856 
+L 257.290619 117.779558 
+L 257.373947 117.91295 
+L 257.394778 117.912682 
+L 257.46769 117.978842 
+L 257.405194 117.962163 
+L 257.46769 118.002169 
+L 257.561433 118.120322 
+L 257.571849 118.117268 
+L 257.655176 118.203341 
+L 257.74892 118.274597 
+L 257.676008 118.203045 
+L 257.759335 118.271543 
+L 257.87391 118.348162 
+L 257.957238 118.422211 
+L 257.894742 118.347852 
+L 257.97807 118.416105 
+L 258.113476 118.463206 
+L 258.113476 118.492111 
+L 258.217636 118.577106 
+L 258.405122 118.637524 
+L 258.509281 118.7912 
+L 258.540529 118.782048 
+L 258.561361 118.890845 
+L 258.634272 119.081625 
+L 258.66552 119.072466 
+L 258.832175 119.120911 
+L 258.832175 119.138064 
+L 258.905086 119.225256 
+L 258.936334 119.216102 
+L 259.102988 119.28139 
+L 259.196731 119.362174 
+L 259.207147 119.359125 
+L 259.332138 119.419245 
+L 259.332138 119.436298 
+L 259.425882 119.522454 
+L 259.436297 119.519405 
+L 259.488377 119.594919 
+L 259.488377 119.617592 
+L 259.58212 119.697762 
+L 259.592536 119.694713 
+L 259.686279 119.780387 
+L 259.790439 119.913626 
+L 259.977925 119.954575 
+L 259.977925 119.97147 
+L 260.082084 120.025421 
+L 260.175827 120.087948 
+L 260.175827 120.110417 
+L 260.269571 120.161595 
+L 260.279986 120.15855 
+L 260.404977 120.234139 
+L 260.446641 120.233165 
+L 260.509137 120.343628 
+L 260.686207 120.403642 
+L 260.790366 120.518257 
+L 260.936189 120.587047 
+L 261.040348 120.723407 
+L 261.071596 120.725385 
+L 261.092428 120.81919 
+L 261.196587 120.860825 
+L 261.352825 120.920395 
+L 261.352825 120.925928 
+L 261.384073 120.922337 
+L 261.456985 121.02818 
+L 261.592392 121.082484 
+L 261.592392 121.09903 
+L 261.675719 121.173914 
+L 261.696551 121.167834 
+L 261.821542 121.246936 
+L 261.925701 121.419761 
+L 262.061108 121.489878 
+L 262.061108 121.495355 
+L 262.165267 121.54708 
+L 262.331921 121.602356 
+L 262.331921 121.613282 
+L 262.425665 121.755107 
+L 262.43608 121.75207 
+L 262.446496 121.792629 
+L 262.519408 121.842158 
+L 262.613151 121.96708 
+L 262.623567 121.964042 
+L 262.675646 122.041154 
+L 262.675646 122.062857 
+L 262.738142 122.1097 
+L 262.706894 122.059168 
+L 262.779806 122.09755 
+L 262.883965 122.170093 
+L 262.883965 122.180917 
+L 262.988124 122.280331 
+L 263.050619 122.364703 
+L 263.050619 122.375494 
+L 263.123531 122.397388 
+L 263.154778 122.393671 
+L 263.248522 122.457953 
+L 263.248522 122.479491 
+L 263.352681 122.578239 
+L 263.436008 122.666746 
+L 263.529751 122.746695 
+L 263.540167 122.74366 
+L 263.68599 122.813644 
+L 263.790149 123.007751 
+L 263.904724 123.086356 
+L 263.96722 123.169331 
+L 264.008883 123.162515 
+L 264.123458 123.22487 
+L 264.123458 123.240812 
+L 264.217202 123.43637 
+L 264.227618 123.433335 
+L 264.279697 123.465839 
+L 264.290113 123.526327 
+L 264.321361 123.522514 
+L 264.394272 123.575313 
+L 264.477599 123.63557 
+L 264.477599 123.661966 
+L 264.581759 123.742394 
+L 264.665086 123.786616 
+L 264.675502 123.8257 
+L 264.779661 123.900561 
+L 264.915068 123.976684 
+L 264.998395 124.025865 
+L 265.019227 124.019803 
+L 265.217129 124.06701 
+L 265.217129 124.077479 
+L 265.321288 124.209282 
+L 265.383784 124.285072 
+L 265.383784 124.305939 
+L 265.487943 124.405933 
+L 265.644182 124.474972 
+L 265.717093 124.547303 
+L 265.748341 124.543413 
+L 265.842084 124.619944 
+L 265.842084 124.630314 
+L 265.862916 124.629444 
+L 265.946243 124.677775 
+L 266.039986 124.764398 
+L 266.144146 124.858157 
+L 266.331632 124.917212 
+L 266.425375 125.059931 
+L 266.435791 125.056907 
+L 266.581614 125.127659 
+L 266.675357 125.274887 
+L 266.685773 125.271864 
+L 266.810764 125.343133 
+L 266.810764 125.348251 
+L 266.894091 125.436567 
+L 266.914923 125.435632 
+L 266.987835 125.516597 
+L 266.987835 125.526801 
+L 267.091994 125.720748 
+L 267.133657 125.713744 
+L 267.144073 125.817483 
+L 267.216985 125.867413 
+L 267.248232 125.86342 
+L 267.373223 125.933658 
+L 267.373223 125.938726 
+L 267.383639 125.986366 
+L 267.477382 125.984489 
+L 267.612789 126.056515 
+L 267.696117 126.113194 
+L 267.716948 126.107155 
+L 267.873187 126.16784 
+L 267.873187 126.172882 
+L 267.96693 126.206203 
+L 267.946099 126.166885 
+L 267.977346 126.203186 
+L 268.081505 126.268676 
+L 268.081505 126.283768 
+L 268.164833 126.470626 
+L 268.185665 126.469608 
+L 268.268992 126.560769 
+L 268.362735 126.668746 
+L 268.373151 126.665729 
+L 268.446062 126.714587 
+L 268.456478 126.75652 
+L 268.560637 126.866033 
+L 268.748124 126.921318 
+L 268.748124 126.926294 
+L 268.852283 126.985667 
+L 269.008522 127.049731 
+L 269.008522 127.054694 
+L 269.112681 127.158438 
+L 269.21684 127.24217 
+L 269.310583 127.328748 
+L 269.320999 127.325736 
+L 269.435574 127.401196 
+L 269.435574 127.406127 
+L 269.539733 127.553356 
+L 269.602229 127.618893 
+L 269.602229 127.648379 
+L 269.643892 127.641249 
+L 269.706388 127.66739 
+L 269.914706 127.695538 
+L 269.914706 127.720052 
+L 270.008449 127.781171 
+L 269.95637 127.717826 
+L 270.018865 127.778164 
+L 270.175104 127.801588 
+L 270.18552 127.842593 
+L 270.289679 127.939542 
+L 270.456334 127.993895 
+L 270.456334 128.003642 
+L 270.539661 128.091614 
+L 270.560493 128.090474 
+L 270.685484 128.11281 
+L 270.685484 128.166268 
+L 270.789643 128.238206 
+L 270.966713 128.298701 
+L 271.060457 128.436233 
+L 271.070873 128.433233 
+L 271.1542 128.520338 
+L 271.247943 128.623562 
+L 271.258359 128.620563 
+L 271.414598 128.681522 
+L 271.414598 128.691145 
+L 271.508341 128.774744 
+L 271.518757 128.771747 
+L 271.6125 128.85519 
+L 271.6125 128.859987 
+L 271.633332 128.85879 
+L 271.716659 128.930689 
+L 271.799986 128.959398 
+L 271.810402 129.018611 
+L 271.904146 129.068144 
+L 271.914561 129.065149 
+L 271.997889 129.131924 
+L 271.997889 129.155784 
+L 272.102048 129.230733 
+L 272.174959 129.314523 
+L 272.174959 129.324039 
+L 272.279118 129.389191 
+L 272.29995 129.383204 
+L 272.29995 129.463939 
+L 272.320782 129.491171 
+L 272.424941 129.565544 
+L 272.570764 129.632539 
+L 272.570764 129.63727 
+L 272.674923 129.716081 
+L 272.81033 129.790485 
+L 272.914489 129.87841 
+L 272.987401 129.970424 
+L 273.029064 129.967868 
+L 273.09156 130.104939 
+L 273.164471 130.140299 
+L 273.174887 130.193558 
+L 273.279046 130.304103 
+L 273.414453 130.358727 
+L 273.414453 130.37741 
+L 273.456117 130.374796 
+L 273.518612 130.520123 
+L 273.601939 130.58935 
+L 273.601939 130.607964 
+L 273.695683 130.725171 
+L 273.706099 130.722183 
+L 273.747762 130.747374 
+L 273.758178 130.81862 
+L 273.862337 130.913845 
+L 273.95608 130.984119 
+L 273.95608 130.997989 
+L 274.06024 131.092835 
+L 274.185231 131.144636 
+L 274.185231 131.17229 
+L 274.28939 131.317345 
+L 274.445628 131.382825 
+L 274.445628 131.387416 
+L 274.549788 131.522653 
+L 274.706026 131.583172 
+L 274.706026 131.592319 
+L 274.810185 131.695006 
+L 274.862265 131.785029 
+L 274.862265 131.794147 
+L 274.966424 131.891859 
+L 275.101831 131.962237 
+L 275.101831 131.966782 
+L 275.143495 132.022988 
+L 275.20599 132.014179 
+L 275.341397 132.079768 
+L 275.341397 132.088833 
+L 275.445556 132.203938 
+L 275.539299 132.285619 
+L 275.539299 132.290137 
+L 275.643458 132.481367 
+L 275.768449 132.513151 
+L 275.768449 132.558138 
+L 275.851777 132.624205 
+L 275.872608 132.618249 
+L 275.987184 132.693226 
+L 275.987184 132.697711 
+L 276.070511 132.776985 
+L 276.091343 132.771032 
+L 276.22675 132.839763 
+L 276.22675 132.844236 
+L 276.330909 132.939602 
+L 276.424652 133.015451 
+L 276.424652 133.024368 
+L 276.528811 133.123803 
+L 276.674634 133.193356 
+L 276.778793 133.319004 
+L 276.935032 133.389641 
+L 277.039191 133.483807 
+L 277.164182 133.536523 
+L 277.164182 133.563008 
+L 277.268341 133.692036 
+L 277.42458 133.753135 
+L 277.42458 133.76193 
+L 277.528739 133.864061 
+L 277.60165 133.957336 
+L 277.674561 134.0198 
+L 277.705809 134.015279 
+L 277.789137 134.096546 
+L 277.789137 134.105289 
+L 277.893296 134.136805 
+L 278.007871 134.208942 
+L 278.007871 134.217665 
+L 278.11203 134.43619 
+L 278.174525 134.505289 
+L 278.174525 134.531336 
+L 278.278684 134.666446 
+L 278.393259 134.737712 
+L 278.393259 134.746361 
+L 278.497419 134.785887 
+L 278.591162 134.867153 
+L 278.591162 134.871467 
+L 278.695321 135.009898 
+L 278.809896 135.089146 
+L 278.903639 135.255648 
+L 278.914055 135.252686 
+L 278.986967 135.339054 
+L 278.986967 135.343334 
+L 279.091126 135.463395 
+L 279.195285 135.527717 
+L 279.195285 135.549047 
+L 279.226533 135.548698 
+L 279.299444 135.626009 
+L 279.351524 135.683586 
+L 279.351524 135.726126 
+L 279.455683 135.88767 
+L 279.611921 135.953502 
+L 279.611921 135.957738 
+L 279.71608 136.080482 
+L 279.830656 136.119776 
+L 279.830656 136.161991 
+L 279.861903 136.157341 
+L 279.934815 136.250502 
+L 280.018142 136.319498 
+L 280.018142 136.340537 
+L 280.122301 136.525246 
+L 280.247292 136.598781 
+L 280.247292 136.60297 
+L 280.351451 136.770044 
+L 280.403531 136.859649 
+L 280.361867 136.838083 
+L 280.403531 136.867993 
+L 280.50769 136.984318 
+L 280.632681 137.044573 
+L 280.632681 137.061204 
+L 280.73684 137.139684 
+L 280.840999 137.222158 
+L 280.945158 137.407867 
+L 281.01807 137.478077 
+L 281.01807 137.498715 
+L 281.101397 137.726428 
+L 281.122229 137.720523 
+L 281.257636 137.776698 
+L 281.257636 137.797235 
+L 281.340963 137.925426 
+L 281.361795 137.919524 
+L 281.486786 137.994699 
+L 281.486786 137.998791 
+L 281.590945 138.071529 
+L 281.695104 138.156373 
+L 281.799263 138.285845 
+L 281.955502 138.343352 
+L 281.955502 138.355548 
+L 282.017997 138.439423 
+L 282.059661 138.435759 
+L 282.2159 138.497041 
+L 282.2159 138.505146 
+L 282.320059 138.702297 
+L 282.424218 138.773796 
+L 282.424218 138.785899 
+L 282.528377 138.893497 
+L 282.684616 138.953982 
+L 282.684616 138.962023 
+L 282.788775 139.109291 
+L 282.861686 139.196915 
+L 282.861686 139.200919 
+L 282.965845 139.267565 
+L 283.028341 139.321881 
+L 282.976261 139.312602 
+L 283.028341 139.361824 
+L 283.1325 139.452134 
+L 283.267907 139.521502 
+L 283.267907 139.525482 
+L 283.372066 139.67105 
+L 283.486641 139.737961 
+L 283.486641 139.753822 
+L 283.5908 139.902672 
+L 283.705375 139.965252 
+L 283.705375 139.985001 
+L 283.809534 140.129217 
+L 283.882446 140.218915 
+L 283.882446 140.222849 
+L 283.903278 140.220914 
+L 283.986605 140.276076 
+L 284.090764 140.360611 
+L 284.194923 140.480223 
+L 284.33033 140.555571 
+L 284.413657 140.661018 
+L 284.434489 140.655157 
+L 284.538648 140.723354 
+L 284.538648 140.73894 
+L 284.61156 140.81967 
+L 284.642807 140.810884 
+L 284.799046 140.879714 
+L 284.903205 140.966897 
+L 284.944869 140.97846 
+L 284.965701 141.061732 
+L 285.06986 141.202673 
+L 285.205267 141.268892 
+L 285.205267 141.276608 
+L 285.29901 141.373633 
+L 285.309426 141.37071 
+L 285.486496 141.417238 
+L 285.486496 141.432619 
+L 285.590656 141.576229 
+L 285.778142 141.623331 
+L 285.778142 141.638651 
+L 285.882301 141.800702 
+L 285.944797 141.859547 
+L 285.892717 141.851242 
+L 285.944797 141.897696 
+L 286.048956 141.994263 
+L 286.142699 142.059323 
+L 286.142699 142.082134 
+L 286.21561 142.152891 
+L 286.246858 142.151733 
+L 286.361433 142.233453 
+L 286.434344 142.375843 
+L 286.465592 142.374661 
+L 286.528088 142.41387 
+L 286.528088 142.470525 
+L 286.632247 142.644977 
+L 286.798901 142.703703 
+L 286.798901 142.711222 
+L 286.903061 142.787276 
+L 286.944724 142.858162 
+L 286.923892 142.863986 
+L 286.944724 142.888152 
+L 287.048883 143.049929 
+L 287.090547 143.090598 
+L 287.090547 143.150342 
+L 287.194706 143.251748 
+L 287.278033 143.34015 
+L 287.382193 143.415136 
+L 287.507184 143.487873 
+L 287.507184 143.495291 
+L 287.528015 143.493183 
+L 287.611343 143.588494 
+L 287.715502 143.659319 
+L 287.715502 143.674106 
+L 287.819661 143.837007 
+L 287.955068 143.913433 
+L 288.059227 144.046165 
+L 288.20505 144.111941 
+L 288.20505 144.119275 
+L 288.236297 144.1179 
+L 288.309209 144.233113 
+L 288.507111 144.287691 
+L 288.507111 144.291344 
+L 288.590439 144.39591 
+L 288.61127 144.390111 
+L 288.684182 144.457296 
+L 288.684182 144.48279 
+L 288.788341 144.610219 
+L 288.882084 144.642252 
+L 288.882084 144.696691 
+L 288.986243 144.870598 
+L 289.038323 144.928433 
+L 289.038323 144.968178 
+L 289.142482 145.162824 
+L 289.204977 145.206639 
+L 289.215393 145.257694 
+L 289.288305 145.36674 
+L 289.319552 145.365231 
+L 289.454959 145.42084 
+L 289.454959 145.442339 
+L 289.486207 145.440823 
+L 289.559118 145.549418 
+L 289.63203 145.636365 
+L 289.63203 145.643506 
+L 289.736189 145.814241 
+L 289.840348 145.899164 
+L 289.944507 146.033586 
+L 290.007003 146.083598 
+L 290.017419 146.126756 
+L 290.100746 146.266342 
+L 290.121578 146.264095 
+L 290.236153 146.306467 
+L 290.236153 146.345277 
+L 290.31948 146.537014 
+L 290.340312 146.534754 
+L 290.37156 146.533123 
+L 290.381976 146.635646 
+L 290.486135 146.84863 
+L 290.611126 146.922381 
+L 290.611126 146.925875 
+L 290.715285 146.980816 
+L 290.82986 147.064146 
+L 290.934019 147.139748 
+L 291.017346 147.16537 
+L 291.027762 147.22851 
+L 291.131921 147.300339 
+L 291.225665 147.385305 
+L 291.225665 147.388768 
+L 291.308992 147.552466 
+L 291.329824 147.550158 
+L 291.433983 147.635233 
+L 291.538142 147.70292 
+L 291.663133 147.761291 
+L 291.663133 147.781921 
+L 291.767292 147.9214 
+L 291.840203 148.004079 
+L 291.840203 148.014352 
+L 291.944363 148.101921 
+L 292.006858 148.176911 
+L 292.006858 148.197393 
+L 292.111017 148.345909 
+L 292.194344 148.367166 
+L 292.20476 148.432309 
+L 292.30892 148.525846 
+L 292.392247 148.611373 
+L 292.392247 148.614761 
+L 292.496406 148.755244 
+L 292.579733 148.847102 
+L 292.673476 148.946015 
+L 292.683892 148.943146 
+L 292.829715 149.017417 
+L 292.933874 149.156688 
+L 293.027618 149.234814 
+L 293.027618 149.244863 
+L 293.131777 149.38014 
+L 293.246352 149.458816 
+L 293.246352 149.462152 
+L 293.267184 149.45976 
+L 293.350511 149.536862 
+L 293.475502 149.612358 
+L 293.475502 149.615684 
+L 293.579661 149.723301 
+L 293.673404 149.797069 
+L 293.673404 149.810327 
+L 293.777563 149.857914 
+L 293.850475 149.920616 
+L 293.850475 149.95037 
+L 293.954634 150.086858 
+L 294.100457 150.155591 
+L 294.100457 150.158883 
+L 294.121288 150.156462 
+L 294.204616 150.304595 
+L 294.350439 150.376195 
+L 294.350439 150.379474 
+L 294.454598 150.534301 
+L 294.569173 150.61075 
+L 294.569173 150.61728 
+L 294.673332 150.699675 
+L 294.798323 150.743652 
+L 294.798323 150.779457 
+L 294.902482 150.894 
+L 295.027473 150.966904 
+L 295.027473 150.973389 
+L 295.131632 151.123011 
+L 295.246207 151.19834 
+L 295.246207 151.204798 
+L 295.350366 151.395554 
+L 295.402446 151.445672 
+L 295.412862 151.491046 
+L 295.517021 151.645532 
+L 295.673259 151.711771 
+L 295.673259 151.714971 
+L 295.777419 151.795263 
+L 295.90241 151.872905 
+L 295.90241 151.876094 
+L 296.006569 151.984714 
+L 296.089896 152.054258 
+L 296.089896 152.076507 
+L 296.194055 152.23221 
+L 296.298214 152.305194 
+L 296.298214 152.317853 
+L 296.381542 152.386871 
+L 296.402373 152.3812 
+L 296.527364 152.454545 
+L 296.527364 152.460856 
+L 296.621108 152.567735 
+L 296.631524 152.564902 
+L 296.746099 152.606132 
+L 296.746099 152.647013 
+L 296.839842 152.715779 
+L 296.850258 152.712947 
+L 296.964833 152.791608 
+L 296.964833 152.794742 
+L 297.058576 152.860115 
+L 297.068992 152.857286 
+L 297.173151 152.941599 
+L 297.27731 153.088112 
+L 297.391885 153.125569 
+L 297.391885 153.169152 
+L 297.496044 153.274594 
+L 297.600203 153.358082 
+L 297.600203 153.361183 
+L 297.704363 153.450687 
+L 297.777274 153.545375 
+L 297.881433 153.656093 
+L 298.027256 153.730634 
+L 298.131415 153.893088 
+L 298.225158 153.972048 
+L 298.225158 153.981245 
+L 298.266822 153.976106 
+L 298.329317 154.084767 
+L 298.443892 154.148576 
+L 298.443892 154.166906 
+L 298.548052 154.279127 
+L 298.662627 154.336522 
+L 298.662627 154.360873 
+L 298.766786 154.478673 
+L 298.891777 154.554175 
+L 298.891777 154.557207 
+L 298.98552 154.701491 
+L 298.995936 154.698681 
+L 299.079263 154.788017 
+L 299.079263 154.791036 
+L 299.120927 154.788858 
+L 299.183422 154.826327 
+L 299.297997 154.906966 
+L 299.297997 154.909977 
+L 299.329245 154.90758 
+L 299.402156 154.999261 
+L 299.506316 155.082351 
+L 299.506316 155.085352 
+L 299.610475 155.129303 
+L 299.683386 155.175606 
+L 299.693802 155.22071 
+L 299.766713 155.30876 
+L 299.797961 155.300354 
+L 299.870873 155.376305 
+L 299.870873 155.394208 
+L 299.975032 155.580672 
+L 300.058359 155.671195 
+L 300.162518 155.726292 
+L 300.266677 155.784261 
+L 300.266677 155.810912 
+L 300.36042 155.904063 
+L 300.370836 155.901266 
+L 300.506243 155.97419 
+L 300.506243 155.977141 
+L 300.599986 156.043399 
+L 300.558323 155.97202 
+L 300.610402 156.040605 
+L 300.683314 156.094678 
+L 300.683314 156.135873 
+L 300.787473 156.263676 
+L 300.933296 156.338965 
+L 301.037455 156.472021 
+L 301.09995 156.537082 
+L 301.09995 156.569188 
+L 301.204109 156.672493 
+L 301.370764 156.741395 
+L 301.474923 156.867466 
+L 301.55825 156.93506 
+L 301.55825 156.958233 
+L 301.66241 157.135708 
+L 301.745737 157.214428 
+L 301.745737 157.225959 
+L 301.766569 157.223277 
+L 301.849896 157.408237 
+L 301.954055 157.483801 
+L 301.954055 157.495276 
+L 302.058214 157.610762 
+L 302.141542 157.697223 
+L 302.141542 157.702939 
+L 302.245701 157.911934 
+L 302.318612 157.966497 
+L 302.318612 158.006308 
+L 302.422771 158.112032 
+L 302.506099 158.191896 
+L 302.506099 158.203226 
+L 302.610258 158.356518 
+L 302.693585 158.424669 
+L 302.693585 158.447232 
+L 302.797744 158.529406 
+L 302.881071 158.619762 
+L 302.985231 158.735256 
+L 303.131053 158.805793 
+L 303.131053 158.811392 
+L 303.235212 159.018494 
+L 303.339372 159.088416 
+L 303.339372 159.105129 
+L 303.433115 159.277704 
+L 303.443531 159.27494 
+L 303.610185 159.313989 
+L 303.610185 159.34449 
+L 303.714344 159.435974 
+L 303.818504 159.502391 
+L 303.818504 159.521732 
+L 303.922663 159.651419 
+L 303.974742 159.742274 
+L 303.974742 159.750529 
+L 304.078901 159.893319 
+L 304.172645 159.975454 
+L 304.172645 159.980933 
+L 304.276804 160.106625 
+L 304.380963 160.185598 
+L 304.380963 160.193784 
+L 304.474706 160.272613 
+L 304.391379 160.193759 
+L 304.485122 160.269861 
+L 304.620529 160.337534 
+L 304.620529 160.348414 
+L 304.724688 160.519149 
+L 304.839263 160.583744 
+L 304.839263 160.602695 
+L 304.943422 160.796808 
+L 304.995502 160.850484 
+L 305.005918 160.893537 
+L 305.110077 160.946824 
+L 305.172572 161.040547 
+L 305.172572 161.043232 
+L 305.266316 161.259769 
+L 305.276731 161.257025 
+L 305.43297 161.322819 
+L 305.43297 161.328161 
+L 305.453802 161.328019 
+L 305.537129 161.450152 
+L 305.66212 161.5158 
+L 305.66212 161.531763 
+L 305.766279 161.695636 
+L 305.860023 161.771718 
+L 305.860023 161.784959 
+L 305.870439 161.78487 
+L 305.964182 161.984921 
+L 306.047509 162.060601 
+L 306.047509 162.076408 
+L 306.141252 162.159713 
+L 306.151668 162.15961 
+L 306.214164 162.203667 
+L 306.22458 162.25346 
+L 306.318323 162.383575 
+L 306.328739 162.383463 
+L 306.422482 162.460943 
+L 306.422482 162.471401 
+L 306.443314 162.471169 
+L 306.526641 162.564256 
+L 306.620384 162.649211 
+L 306.620384 162.654421 
+L 306.714127 162.783389 
+L 306.724543 162.783261 
+L 306.849534 162.854418 
+L 306.849534 162.864796 
+L 306.953693 162.97231 
+L 307.068269 163.05358 
+L 307.068269 163.056165 
+L 307.172428 163.222483 
+L 307.276587 163.295689 
+L 307.276587 163.308551 
+L 307.380746 163.440636 
+L 307.484905 163.492947 
+L 307.484905 163.526255 
+L 307.578648 163.670637 
+L 307.589064 163.670475 
+L 307.703639 163.74781 
+L 307.703639 163.752911 
+L 307.807798 163.868425 
+L 307.911958 163.942999 
+L 307.911958 163.955702 
+L 308.005701 164.080991 
+L 308.016117 164.078279 
+L 308.120276 164.152465 
+L 308.120276 164.165116 
+L 308.141108 164.162226 
+L 308.224435 164.246714 
+L 308.370258 164.304703 
+L 308.370258 164.322354 
+L 308.474417 164.49667 
+L 308.62024 164.559254 
+L 308.62024 164.5718 
+L 308.703567 164.745572 
+L 308.724399 164.740166 
+L 308.828558 164.825607 
+L 308.932717 164.975639 
+L 308.995212 165.073883 
+L 309.099372 165.185943 
+L 309.213947 165.238068 
+L 309.213947 165.270263 
+L 309.30769 165.357317 
+L 309.318106 165.357093 
+L 309.422265 165.433864 
+L 309.422265 165.443734 
+L 309.526424 165.574502 
+L 309.58892 165.646885 
+L 309.58892 165.671457 
+L 309.693079 165.774618 
+L 309.76599 165.861124 
+L 309.76599 165.868467 
+L 309.828486 165.864566 
+L 309.870149 165.939397 
+L 309.953476 166.027765 
+L 309.953476 166.030204 
+L 310.04722 166.127876 
+L 310.057636 166.125189 
+L 310.172211 166.205118 
+L 310.172211 166.209979 
+L 310.27637 166.408766 
+L 310.307618 166.437033 
+L 310.318033 166.511757 
+L 310.422193 166.68768 
+L 310.588847 166.755546 
+L 310.588847 166.757952 
+L 310.693006 166.97845 
+L 310.78675 167.033376 
+L 310.78675 167.066872 
+L 310.890909 167.178689 
+L 310.953404 167.205584 
+L 310.953404 167.277096 
+L 311.057563 167.405021 
+L 311.172138 167.487223 
+L 311.172138 167.489595 
+L 311.255466 167.697917 
+L 311.276297 167.697303 
+L 311.359625 167.782212 
+L 311.359625 167.78929 
+L 311.463784 167.946357 
+L 311.557527 167.999932 
+L 311.557527 168.035164 
+L 311.630439 168.182999 
+L 311.661686 168.175004 
+L 311.734598 168.256974 
+L 311.734598 168.271002 
+L 311.838757 168.389136 
+L 312.036659 168.43179 
+L 312.036659 168.452746 
+L 312.140818 168.591228 
+L 312.21373 168.677021 
+L 312.21373 168.686293 
+L 312.317889 168.893379 
+L 312.463712 168.943888 
+L 312.463712 168.969248 
+L 312.567871 169.138326 
+L 312.661614 169.220062 
+L 312.661614 169.226944 
+L 312.765773 169.347053 
+L 312.90118 169.406357 
+L 312.90118 169.426917 
+L 313.005339 169.619326 
+L 313.067835 169.660321 
+L 313.07825 169.714499 
+L 313.171994 169.822321 
+L 313.18241 169.821943 
+L 313.317816 169.900821 
+L 313.421976 169.982923 
+L 313.526135 170.067105 
+L 313.526135 170.06936 
+L 313.619878 170.151493 
+L 313.630294 170.148854 
+L 313.765701 170.213525 
+L 313.765701 170.227009 
+L 313.859444 170.37382 
+L 313.86986 170.373425 
+L 313.942771 170.460204 
+L 313.942771 170.469152 
+L 313.953187 170.468753 
+L 314.04693 170.692811 
+L 314.130258 170.76079 
+L 314.130258 170.785253 
+L 314.234417 170.9033 
+L 314.317744 170.948773 
+L 314.32816 170.992662 
+L 314.432319 171.275596 
+L 314.526062 171.351016 
+L 314.526062 171.366411 
+L 314.619806 171.481166 
+L 314.630222 171.480735 
+L 314.734381 171.566289 
+L 314.734381 171.568479 
+L 314.83854 171.730303 
+L 314.932283 171.81142 
+L 314.932283 171.820138 
+L 315.026026 171.922826 
+L 314.942699 171.819697 
+L 315.036442 171.922381 
+L 315.088522 172.007071 
+L 315.088522 172.022267 
+L 315.182265 172.159129 
+L 315.192681 172.156512 
+L 315.24476 172.247261 
+L 315.24476 172.255906 
+L 315.34892 172.40239 
+L 315.442663 172.49297 
+L 315.536406 172.632706 
+L 315.546822 172.630095 
+L 315.682229 172.69047 
+L 315.682229 172.709744 
+L 315.786388 172.801304 
+L 315.859299 172.887674 
+L 315.859299 172.896207 
+L 315.953042 172.994212 
+L 315.963458 172.993735 
+L 316.015538 173.093426 
+L 316.109281 173.165529 
+L 316.025954 173.092946 
+L 316.119697 173.165046 
+L 316.192608 173.259155 
+L 316.192608 173.261273 
+L 316.26552 173.382646 
+L 316.296768 173.381181 
+L 316.411343 173.466537 
+L 316.515502 173.655222 
+L 316.598829 173.699538 
+L 316.598829 173.747787 
+L 316.702988 173.90817 
+L 316.796731 173.997603 
+L 316.827979 173.996083 
+L 316.900891 174.092576 
+L 316.984218 174.161323 
+L 316.984218 174.186269 
+L 317.088377 174.251752 
+L 317.098793 174.249163 
+L 317.098793 174.350768 
+L 317.109209 174.360609 
+L 317.213368 174.529123 
+L 317.244616 174.59152 
+L 317.244616 174.634811 
+L 317.338359 174.815206 
+L 317.348775 174.812621 
+L 317.421686 174.833541 
+L 317.432102 174.904798 
+L 317.525845 175.100488 
+L 317.536261 175.097907 
+L 317.650836 175.183783 
+L 317.754995 175.306616 
+L 317.807075 175.4014 
+L 317.765411 175.371102 
+L 317.807075 175.407489 
+L 317.911234 175.53172 
+L 318.046641 175.611509 
+L 318.1508 175.721006 
+L 318.254959 175.775876 
+L 318.254959 175.808081 
+L 318.359118 176.049408 
+L 318.452862 176.076352 
+L 318.463278 176.137799 
+L 318.557021 176.322268 
+L 318.567437 176.319702 
+L 318.629932 176.39191 
+L 318.629932 176.417766 
+L 318.734091 176.572809 
+L 318.807003 176.65985 
+L 318.807003 176.667765 
+L 318.911162 176.742983 
+L 319.004905 176.830463 
+L 319.004905 176.832435 
+L 319.109064 176.930934 
+L 319.150728 177.018996 
+L 319.11948 176.979508 
+L 319.150728 177.034707 
+L 319.254887 177.197358 
+L 319.306967 177.274556 
+L 319.306967 177.298003 
+L 319.40071 177.397972 
+L 319.411126 177.39737 
+L 319.504869 177.458173 
+L 319.504869 177.487366 
+L 319.609028 177.667749 
+L 319.692355 177.742291 
+L 319.692355 177.761645 
+L 319.796514 177.904289 
+L 319.869426 177.996352 
+L 319.869426 178.000204 
+L 319.973585 178.167028 
+L 320.015249 178.170293 
+L 320.03608 178.264911 
+L 320.14024 178.340949 
+L 320.223567 178.431448 
+L 320.223567 178.433357 
+L 320.327726 178.56809 
+L 320.390222 178.647966 
+L 320.390222 178.666967 
+L 320.494381 178.76876 
+L 320.567292 178.821119 
+L 320.567292 178.864649 
+L 320.650619 178.93513 
+L 320.671451 178.931955 
+L 320.681867 178.986063 
+L 320.754778 179.024932 
+L 320.848522 179.201657 
+L 320.858938 179.201007 
+L 320.952681 179.272117 
+L 320.952681 179.29087 
+L 321.05684 179.447203 
+L 321.150583 179.534659 
+L 321.150583 179.53839 
+L 321.244326 179.636814 
+L 321.254742 179.634292 
+L 321.296406 179.707916 
+L 321.296406 179.73765 
+L 321.390149 179.861555 
+L 321.400565 179.859036 
+L 321.463061 179.940208 
+L 321.463061 179.956856 
+L 321.556804 180.102263 
+L 321.483892 179.955519 
+L 321.56722 180.099746 
+L 321.629715 180.132579 
+L 321.640131 180.196359 
+L 321.74429 180.395317 
+L 321.775538 180.453738 
+L 321.754706 180.44228 
+L 321.775538 180.501328 
+L 321.879697 180.578581 
+L 321.994272 180.664098 
+L 322.098431 180.80647 
+L 322.171343 180.901496 
+L 322.275502 181.046698 
+L 322.369245 181.132574 
+L 322.369245 181.137989 
+L 322.473404 181.291377 
+L 322.577563 181.374232 
+L 322.577563 181.379619 
+L 322.681722 181.458691 
+L 322.744218 181.554732 
+L 322.744218 181.556521 
+L 322.837961 181.691264 
+L 322.848377 181.688769 
+L 322.94212 181.719816 
+L 322.94212 181.780382 
+L 322.962952 181.778956 
+L 323.046279 181.858626 
+L 323.119191 181.951267 
+L 323.119191 181.954814 
+L 323.22335 182.084013 
+L 323.296261 182.140838 
+L 323.296261 182.179687 
+L 323.40042 182.255353 
+L 323.462916 182.275672 
+L 323.473332 182.350622 
+L 323.577491 182.541684 
+L 323.712898 182.605698 
+L 323.712898 182.623185 
+L 323.806641 182.848594 
+L 323.817057 182.846116 
+L 323.879552 182.914741 
+L 323.879552 182.944281 
+L 323.973296 183.067728 
+L 323.983712 183.066986 
+L 324.077455 183.12609 
+L 324.077455 183.157224 
+L 324.181614 183.372334 
+L 324.285773 183.454275 
+L 324.285773 183.461148 
+L 324.389932 183.674788 
+L 324.452428 183.767669 
+L 324.400348 183.723623 
+L 324.452428 183.772791 
+L 324.556587 183.855604 
+L 324.639914 183.93805 
+L 324.639914 183.949956 
+L 324.744073 184.10362 
+L 324.848232 184.165408 
+L 324.848232 184.192484 
+L 324.952392 184.417721 
+L 325.025303 184.51325 
+L 325.129462 184.624675 
+L 325.191958 184.670281 
+L 325.202373 184.721396 
+L 325.296117 184.908082 
+L 325.306533 184.905631 
+L 325.327364 184.902398 
+L 325.327364 185.00564 
+L 325.33778 185.011508 
+L 325.441939 185.196212 
+L 325.56693 185.272809 
+L 325.56693 185.279424 
+L 325.650258 185.426639 
+L 325.67109 185.423401 
+L 325.764833 185.510123 
+L 325.764833 185.515059 
+L 325.775249 185.514263 
+L 325.868992 185.661493 
+L 325.952319 185.743576 
+L 325.952319 185.755035 
+L 326.056478 186.013091 
+L 326.139806 186.096098 
+L 326.139806 186.107474 
+L 326.233549 186.288309 
+L 326.243965 186.287496 
+L 326.316876 186.364288 
+L 326.316876 186.383677 
+L 326.421035 186.57703 
+L 326.514778 186.666091 
+L 326.514778 186.667697 
+L 326.598106 186.906183 
+L 326.618938 186.901336 
+L 326.671017 186.981823 
+L 326.671017 187.002557 
+L 326.775176 187.112125 
+L 326.920999 187.187901 
+L 326.920999 187.191076 
+L 327.004326 187.34449 
+L 327.025158 187.344404 
+L 327.077238 187.414539 
+L 327.077238 187.446126 
+L 327.170981 187.600944 
+L 327.181397 187.600104 
+L 327.223061 187.684791 
+L 327.191813 187.651169 
+L 327.223061 187.703639 
+L 327.32722 187.981749 
+L 327.441795 188.050428 
+L 327.441795 188.069129 
+L 327.535538 188.178202 
+L 327.473042 188.068141 
+L 327.545954 188.175797 
+L 327.650113 188.263555 
+L 327.650113 188.265106 
+L 327.754272 188.428444 
+L 327.837599 188.514246 
+L 327.837599 188.521959 
+L 327.941759 188.653536 
+L 328.035502 188.739515 
+L 328.035502 188.745655 
+L 328.139661 188.930022 
+L 328.181325 188.98309 
+L 328.181325 189.033455 
+L 328.285484 189.145133 
+L 328.358395 189.216582 
+L 328.358395 189.240882 
+L 328.462554 189.332271 
+L 328.545882 189.397956 
+L 328.545882 189.42669 
+L 328.650041 189.534212 
+L 328.743784 189.622745 
+L 328.743784 189.625755 
+L 328.837527 189.832584 
+L 328.847943 189.830204 
+L 328.910439 189.929688 
+L 329.014598 190.041802 
+L 329.097925 190.103268 
+L 329.097925 190.13602 
+L 329.202084 190.268309 
+L 329.285411 190.341246 
+L 329.285411 190.361979 
+L 329.389571 190.415209 
+L 329.545809 190.481595 
+L 329.545809 190.4934 
+L 329.649968 190.671477 
+L 329.743712 190.758843 
+L 329.743712 190.763243 
+L 329.847871 190.902155 
+L 329.89995 190.926886 
+L 329.910366 191.001905 
+L 330.004109 191.129262 
+L 330.014525 191.128358 
+L 330.077021 191.221748 
+L 330.077021 191.227554 
+L 330.18118 191.343155 
+L 330.254091 191.419243 
+L 330.254091 191.439471 
+L 330.347835 191.657539 
+L 330.35825 191.655187 
+L 330.431162 191.746464 
+L 330.431162 191.752203 
+L 330.524905 191.910098 
+L 330.535321 191.907751 
+L 330.670728 191.982948 
+L 330.670728 191.990082 
+L 330.774887 192.211458 
+L 330.899878 192.295416 
+L 330.899878 192.296833 
+L 331.004037 192.37111 
+L 331.129028 192.447604 
+L 331.129028 192.456073 
+L 331.233187 192.601782 
+L 331.274851 192.676771 
+L 331.274851 192.706253 
+L 331.368594 192.798813 
+L 331.37901 192.797882 
+L 331.483169 192.873902 
+L 331.483169 192.887877 
+L 331.587328 192.96091 
+L 331.66024 193.044939 
+L 331.66024 193.057465 
+L 331.670656 193.05653 
+L 331.764399 193.210645 
+L 331.826894 193.288153 
+L 331.826894 193.310299 
+L 331.931053 193.457002 
+L 331.983133 193.49916 
+L 331.993549 193.556049 
+L 332.097708 193.786814 
+L 332.181035 193.847641 
+L 332.181035 193.881808 
+L 332.285194 194.025072 
+L 332.389354 194.113494 
+L 332.389354 194.114853 
+L 332.493513 194.311393 
+L 332.566424 194.403351 
+L 332.566424 194.40875 
+L 332.670583 194.564899 
+L 332.75391 194.623078 
+L 332.75391 194.659326 
+L 332.847654 194.810097 
+L 332.85807 194.809134 
+L 332.951813 194.896654 
+L 332.951813 194.901992 
+L 332.983061 194.900434 
+L 333.055972 194.937694 
+L 333.149715 195.0302 
+L 333.253874 195.230196 
+L 333.358033 195.261531 
+L 333.368449 195.318726 
+L 333.472608 195.406676 
+L 333.566352 195.49932 
+L 333.670511 195.658946 
+L 333.733006 195.747352 
+L 333.733006 195.757813 
+L 333.837165 195.909888 
+L 333.930909 195.999991 
+L 333.930909 196.002592 
+L 334.035068 196.200317 
+L 334.128811 196.28843 
+L 334.128811 196.292304 
+L 334.23297 196.42943 
+L 334.305882 196.517676 
+L 334.243386 196.479902 
+L 334.305882 196.526667 
+L 334.410041 196.701343 
+L 334.482952 196.768539 
+L 334.482952 196.799177 
+L 334.587111 196.962486 
+L 334.639191 197.052769 
+L 334.639191 197.064186 
+L 334.74335 197.322348 
+L 334.816261 197.417389 
+L 334.816261 197.419905 
+L 334.899589 197.551346 
+L 334.837093 197.419164 
+L 334.92042 197.548089 
+L 334.9725 197.64582 
+L 334.9725 197.649574 
+L 335.066243 197.765513 
+L 335.076659 197.764508 
+L 335.212066 197.841207 
+L 335.212066 197.848678 
+L 335.316225 197.972894 
+L 335.420384 198.048397 
+L 335.420384 198.063263 
+L 335.524543 198.211439 
+L 335.597455 198.277131 
+L 335.597455 198.309158 
+L 335.701614 198.499312 
+L 335.774525 198.580399 
+L 335.774525 198.596302 
+L 335.868269 198.737359 
+L 335.878684 198.735123 
+L 335.909932 198.78081 
+L 335.909932 198.841659 
+L 335.930764 198.839624 
+L 336.014091 198.955352 
+L 336.066171 199.024173 
+L 336.066171 199.056853 
+L 336.149498 199.165895 
+L 336.17033 199.162644 
+L 336.22241 199.253971 
+L 336.180746 199.226742 
+L 336.22241 199.264808 
+L 336.316153 199.385427 
+L 336.326569 199.384402 
+L 336.420312 199.475894 
+L 336.420312 199.477092 
+L 336.524471 199.604341 
+L 336.607798 199.667698 
+L 336.607798 199.699869 
+L 336.711958 199.94849 
+L 336.836948 200.034294 
+L 336.836948 200.035476 
+L 336.868196 200.03238 
+L 336.941108 200.112498 
+L 337.024435 200.181988 
+L 337.024435 200.207875 
+L 337.128594 200.446228 
+L 337.211921 200.512739 
+L 337.211921 200.541926 
+L 337.31608 200.645771 
+L 337.388992 200.736168 
+L 337.388992 200.743136 
+L 337.493151 201.045184 
+L 337.576478 201.130144 
+L 337.576478 201.1405 
+L 337.680637 201.302286 
+L 337.743133 201.394452 
+L 337.743133 201.402456 
+L 337.847292 201.461658 
+L 337.909788 201.560247 
+L 337.909788 201.561386 
+L 338.013947 201.638474 
+L 338.10769 201.71756 
+L 338.10769 201.732299 
+L 338.211849 201.90391 
+L 338.295176 201.983448 
+L 338.295176 201.999218 
+L 338.399335 202.156154 
+L 338.482663 202.236245 
+L 338.482663 202.251917 
+L 338.586822 202.369862 
+L 338.743061 202.444281 
+L 338.743061 202.449848 
+L 338.84722 202.611478 
+L 338.930547 202.688296 
+L 338.930547 202.707106 
+L 339.034706 202.903965 
+L 339.097202 202.98008 
+L 339.097202 203.004249 
+L 339.201361 203.151467 
+L 339.25344 203.241236 
+L 339.25344 203.253245 
+L 339.357599 203.433182 
+L 339.461759 203.503928 
+L 339.461759 203.524532 
+L 339.565918 203.695595 
+L 339.638829 203.792694 
+L 339.638829 203.793771 
+L 339.742988 203.949656 
+L 339.805484 204.03859 
+L 339.805484 204.049293 
+L 339.826316 204.049285 
+L 339.909643 204.163573 
+L 339.99297 204.258345 
+L 339.99297 204.25941 
+L 340.003386 204.258334 
+L 340.097129 204.380427 
+L 340.211704 204.469261 
+L 340.211704 204.47032 
+L 340.315863 204.65281 
+L 340.388775 204.741037 
+L 340.388775 204.750499 
+L 340.472102 204.902379 
+L 340.492934 204.90231 
+L 340.586677 204.984621 
+L 340.586677 204.996113 
+L 340.68042 205.069853 
+L 340.690836 205.069812 
+L 340.763748 205.160107 
+L 340.763748 205.167387 
+L 340.867907 205.366079 
+L 340.930402 205.448461 
+L 340.930402 205.466011 
+L 341.034561 205.596314 
+L 341.128305 205.663607 
+L 341.128305 205.690296 
+L 341.232464 205.817715 
+L 341.263712 205.882919 
+L 341.24288 205.876928 
+L 341.263712 205.923746 
+L 341.367871 206.056439 
+L 341.430366 206.135206 
+L 341.430366 206.156508 
+L 341.524109 206.246954 
+L 341.534525 206.24485 
+L 341.607437 206.340265 
+L 341.607437 206.343292 
+L 341.617853 206.343208 
+L 341.711596 206.467359 
+L 341.815755 206.553868 
+L 341.815755 206.558885 
+L 341.919914 206.712161 
+L 341.971994 206.814481 
+L 342.076153 206.900092 
+L 342.15948 206.982707 
+L 342.15948 206.996597 
+L 342.263639 207.126239 
+L 342.294887 207.131839 
+L 342.294887 207.23254 
+L 342.399046 207.416325 
+L 342.492789 207.478976 
+L 342.492789 207.510316 
+L 342.596948 207.652712 
+L 342.66986 207.745333 
+L 342.66986 207.75117 
+L 342.774019 207.941029 
+L 342.888594 208.029436 
+L 342.888594 208.031367 
+L 342.992753 208.262002 
+L 343.034417 208.319934 
+L 343.034417 208.366884 
+L 343.12816 208.536547 
+L 343.138576 208.534483 
+L 343.201071 208.623062 
+L 343.201071 208.634476 
+L 343.305231 208.730692 
+L 343.367726 208.821604 
+L 343.367726 208.831065 
+L 343.471885 208.926707 
+L 343.555212 209.004521 
+L 343.555212 209.023347 
+L 343.659372 209.162512 
+L 343.721867 209.198938 
+L 343.732283 209.260529 
+L 343.836442 209.343728 
+L 343.919769 209.437309 
+L 343.919769 209.4401 
+L 344.023929 209.551595 
+L 344.086424 209.610715 
+L 344.086424 209.652375 
+L 344.190583 209.865433 
+L 344.294742 209.92964 
+L 344.294742 209.958103 
+L 344.388486 210.02048 
+L 344.398901 210.018446 
+L 344.471813 210.107613 
+L 344.471813 210.116751 
+L 344.575972 210.246943 
+L 344.60722 210.348162 
+L 344.586388 210.351311 
+L 344.60722 210.353611 
+L 344.700963 210.488558 
+L 344.711379 210.486532 
+L 344.825954 210.573606 
+L 344.825954 210.577217 
+L 344.919697 210.775058 
+L 344.930113 210.773038 
+L 344.950945 210.773486 
+L 344.961361 210.879957 
+L 345.06552 211.009948 
+L 345.138431 211.07874 
+L 345.138431 211.109007 
+L 345.253006 211.191738 
+L 345.253006 211.199727 
+L 345.357165 211.316078 
+L 345.461325 211.405551 
+L 345.461325 211.40908 
+L 345.565484 211.496523 
+L 345.648811 211.588603 
+L 345.648811 211.592992 
+L 345.75297 211.763018 
+L 345.815466 211.85313 
+L 345.815466 211.863589 
+L 345.919625 212.015805 
+L 346.055032 212.101676 
+L 346.055032 212.102541 
+L 346.159191 212.253652 
+L 346.26335 212.321585 
+L 346.26335 212.346526 
+L 346.357093 212.451397 
+L 346.367509 212.450266 
+L 346.450836 212.520867 
+L 346.450836 212.547378 
+L 346.554995 212.753475 
+L 346.627907 212.844055 
+L 346.627907 212.852535 
+L 346.732066 212.996919 
+L 346.846641 213.083145 
+L 346.846641 213.088199 
+L 346.9508 213.218116 
+L 347.013296 213.306871 
+L 347.013296 213.31859 
+L 347.117455 213.570832 
+L 347.211198 213.663563 
+L 347.211198 213.66605 
+L 347.315357 213.815201 
+L 347.398684 213.877877 
+L 347.398684 213.912474 
+L 347.419516 213.910202 
+L 347.502844 214.157975 
+L 347.596587 214.226997 
+L 347.596587 214.253109 
+L 347.700746 214.379341 
+L 347.763241 214.45533 
+L 347.763241 214.480464 
+L 347.856985 214.686025 
+L 347.867401 214.685691 
+L 347.981976 214.775383 
+L 347.981976 214.776991 
+L 348.086135 214.922017 
+L 348.138214 215.02264 
+L 348.138214 215.025035 
+L 348.231958 215.113629 
+L 348.242373 215.113284 
+L 348.336117 215.18176 
+L 348.336117 215.208764 
+L 348.42986 215.293654 
+L 348.440276 215.293306 
+L 348.523603 215.387784 
+L 348.523603 215.390153 
+L 348.627762 215.549732 
+L 348.690258 215.637112 
+L 348.690258 215.650442 
+L 348.794417 215.711083 
+L 348.815249 215.715059 
+L 348.815249 215.819751 
+L 348.908992 216.111769 
+L 348.919408 216.1114 
+L 349.044399 216.194309 
+L 349.044399 216.201257 
+L 349.065231 216.200514 
+L 349.148558 216.345423 
+L 349.221469 216.441816 
+L 349.221469 216.444882 
+L 349.325628 216.573454 
+L 349.377708 216.67221 
+L 349.377708 216.676779 
+L 349.481867 216.742163 
+L 349.554778 216.836596 
+L 349.554778 216.841143 
+L 349.658938 216.99904 
+L 349.752681 217.070111 
+L 349.752681 217.094188 
+L 349.85684 217.31593 
+L 350.002663 217.385008 
+L 350.002663 217.402156 
+L 350.013079 217.401011 
+L 350.106822 217.480043 
+L 350.127654 217.491878 
+L 350.13807 217.587241 
+L 350.242229 217.74075 
+L 350.325556 217.814159 
+L 350.325556 217.838455 
+L 350.429715 218.145047 
+L 350.460963 218.231981 
+L 350.440131 218.218257 
+L 350.460963 218.25163 
+L 350.554706 218.460373 
+L 350.565122 218.458502 
+L 350.658865 218.54496 
+L 350.658865 218.554337 
+L 350.763024 218.678906 
+L 350.835936 218.731891 
+L 350.835936 218.778486 
+L 350.846352 218.777338 
+L 350.940095 218.849297 
+L 351.013006 218.895543 
+L 351.013006 218.949031 
+L 351.117165 219.113863 
+L 351.179661 219.201179 
+L 351.179661 219.215324 
+L 351.28382 219.468051 
+L 351.356731 219.530843 
+L 351.356731 219.567259 
+L 351.460891 219.770018 
+L 351.544218 219.864353 
+L 351.544218 219.867822 
+L 351.637961 220.10982 
+L 351.648377 220.10867 
+L 351.74212 220.165777 
+L 351.74212 220.204951 
+L 351.846279 220.25591 
+L 351.898359 220.318667 
+L 351.898359 220.359023 
+L 352.002518 220.52007 
+L 352.085845 220.606673 
+L 352.085845 220.618207 
+L 352.190005 220.789386 
+L 352.242084 220.8753 
+L 352.242084 220.892797 
+L 352.346243 221.041736 
+L 352.398323 221.124287 
+L 352.398323 221.144992 
+L 352.502482 221.281421 
+L 352.575393 221.330512 
+L 352.575393 221.380931 
+L 352.679552 221.610581 
+L 352.731632 221.711995 
+L 352.731632 221.713964 
+L 352.835791 221.815188 
+L 352.960782 221.867416 
+L 352.960782 221.905926 
+L 353.064941 222.099977 
+L 353.179516 222.187071 
+L 353.179516 222.19289 
+L 353.283675 222.360053 
+L 353.346171 222.391094 
+L 353.346171 222.461711 
+L 353.45033 222.54245 
+L 353.523241 222.627032 
+L 353.523241 222.642339 
+L 353.627401 222.786094 
+L 353.658648 222.86761 
+L 353.658648 222.892931 
+L 353.762807 223.048737 
+L 353.835719 223.148222 
+L 353.835719 223.148849 
+L 353.939878 223.371373 
+L 353.991958 223.444113 
+L 353.991958 223.475208 
+L 354.096117 223.55746 
+L 354.18986 223.651117 
+L 354.18986 223.654207 
+L 354.294019 223.83193 
+L 354.356514 223.928141 
+L 354.356514 223.933655 
+L 354.460674 224.086589 
+L 354.554417 224.177936 
+L 354.554417 224.183406 
+L 354.658576 224.339281 
+L 354.762735 224.429275 
+L 354.762735 224.434099 
+L 354.866894 224.70066 
+L 354.960637 224.788281 
+L 354.960637 224.797225 
+L 355.064797 224.95999 
+L 355.127292 225.061478 
+L 355.127292 225.062069 
+L 355.231451 225.219271 
+L 355.366858 225.304824 
+L 355.366858 225.308929 
+L 355.460601 225.453668 
+L 355.471017 225.452523 
+L 355.575176 225.542493 
+L 355.575176 225.54773 
+L 355.679335 225.79422 
+L 355.741831 225.885371 
+L 355.741831 225.896307 
+L 355.84599 226.113714 
+L 355.887654 226.211295 
+L 355.887654 226.219272 
+L 355.991813 226.356198 
+L 356.158467 226.439851 
+L 356.158467 226.440981 
+L 356.262627 226.572859 
+L 356.366786 226.666548 
+L 356.366786 226.668231 
+L 356.470945 226.833102 
+L 356.53344 226.933801 
+L 356.53344 226.93547 
+L 356.627184 227.128176 
+L 356.637599 227.128142 
+L 356.689679 227.224006 
+L 356.689679 227.231721 
+L 356.793838 227.412058 
+L 356.845918 227.509727 
+L 356.845918 227.515732 
+L 356.950077 227.64435 
+L 357.054236 227.730668 
+L 357.054236 227.73988 
+L 357.158395 227.984848 
+L 357.241722 228.058964 
+L 357.241722 228.083618 
+L 357.252138 228.083017 
+L 357.345882 228.299681 
+L 357.450041 228.388711 
+L 357.450041 228.395074 
+L 357.5542 228.607757 
+L 357.637527 228.678614 
+L 357.637527 228.706965 
+L 357.741686 228.856324 
+L 357.814598 228.949523 
+L 357.814598 228.95681 
+L 357.918757 229.166908 
+L 358.022916 229.227849 
+L 358.022916 229.26289 
+L 358.127075 229.419543 
+L 358.168739 229.5214 
+L 358.168739 229.524974 
+L 358.272898 229.651211 
+L 358.345809 229.699164 
+L 358.345809 229.751893 
+L 358.449968 229.865977 
+L 358.502048 229.967621 
+L 358.502048 229.970135 
+L 358.606207 230.139341 
+L 358.689534 230.231139 
+L 358.689534 230.238614 
+L 358.793693 230.496209 
+L 358.866605 230.572179 
+L 358.866605 230.597292 
+L 358.970764 230.760278 
+L 359.127003 230.826007 
+L 359.127003 230.848456 
+L 359.231162 231.033667 
+L 359.345737 231.124383 
+L 359.345737 231.128248 
+L 359.356153 231.12809 
+L 359.449896 231.249576 
+L 359.564471 231.338555 
+L 359.564471 231.344307 
+L 359.66863 231.670604 
+L 359.793621 231.753721 
+L 359.793621 231.763644 
+L 359.89778 231.936621 
+L 360.001939 232.022956 
+L 360.001939 232.032785 
+L 360.106099 232.20124 
+L 360.220674 232.267469 
+L 360.220674 232.295761 
+L 360.324833 232.562397 
+L 360.366496 232.651954 
+L 360.366496 232.668435 
+L 360.470656 232.84753 
+L 360.481071 232.845961 
+L 360.481071 232.931793 
+L 360.491487 232.956516 
+L 360.595646 233.098139 
+L 360.626894 233.184374 
+L 360.606062 233.180306 
+L 360.626894 233.20549 
+L 360.731053 233.339086 
+L 360.824797 233.436162 
+L 360.824797 233.437052 
+L 360.928956 233.633201 
+L 361.022699 233.714621 
+L 361.022699 233.73137 
+L 361.116442 233.821689 
+L 361.033115 233.731142 
+L 361.126858 233.820141 
+L 361.241433 233.891717 
+L 361.241433 233.915356 
+L 361.345592 234.077063 
+L 361.418504 234.170942 
+L 361.418504 234.178311 
+L 361.522663 234.522245 
+L 361.585158 234.601991 
+L 361.585158 234.625037 
+L 361.689317 234.835848 
+L 361.803892 234.928535 
+L 361.803892 234.931066 
+L 361.908052 235.080745 
+L 361.970547 235.162522 
+L 361.970547 235.183843 
+L 362.074706 235.342441 
+L 362.178865 235.438864 
+L 362.178865 235.439278 
+L 362.283024 235.631647 
+L 362.376768 235.723531 
+L 362.376768 235.730083 
+L 362.480927 235.862493 
+L 362.553838 235.920759 
+L 362.553838 235.964219 
+L 362.657997 236.037176 
+L 362.751741 236.129947 
+L 362.751741 236.135592 
+L 362.762156 236.134903 
+L 362.8559 236.341149 
+L 362.960059 236.430093 
+L 362.960059 236.438464 
+L 363.064218 236.675985 
+L 363.08505 236.674994 
+L 363.095466 236.78352 
+L 363.199625 237.075598 
+L 363.26212 237.129361 
+L 363.26212 237.178651 
+L 363.366279 237.326729 
+L 363.449607 237.391226 
+L 363.449607 237.426968 
+L 363.460023 237.426269 
+L 363.553766 237.607904 
+L 363.626677 237.683745 
+L 363.626677 237.709593 
+L 363.730836 237.907727 
+L 363.803748 238.009688 
+L 363.907907 238.19539 
+L 364.043314 238.287846 
+L 364.043314 238.288589 
+L 364.147473 238.476228 
+L 364.189137 238.560298 
+L 364.189137 238.582344 
+L 364.293296 238.744067 
+L 364.376623 238.843315 
+L 364.376623 238.844405 
+L 364.480782 239.0228 
+L 364.501614 239.038344 
+L 364.501614 239.131979 
+L 364.605773 239.302953 
+L 364.6891 239.366811 
+L 364.6891 239.403468 
+L 364.793259 239.617353 
+L 364.834923 239.644113 
+L 364.834923 239.723609 
+L 364.939082 239.958753 
+L 365.02241 240.02914 
+L 365.02241 240.059309 
+L 365.126569 240.282307 
+L 365.19948 240.343857 
+L 365.19948 240.384599 
+L 365.303639 240.548946 
+L 365.366135 240.650121 
+L 365.366135 240.65249 
+L 365.470294 240.782016 
+L 365.564037 240.872995 
+L 365.564037 240.881377 
+L 365.668196 241.023612 
+L 365.70986 241.127833 
+L 365.70986 241.130156 
+L 365.814019 241.35225 
+L 365.897346 241.412516 
+L 365.897346 241.453161 
+L 366.001505 241.758774 
+L 366.064001 241.832293 
+L 366.064001 241.862592 
+L 366.16816 242.070283 
+L 366.22024 242.154034 
+L 366.22024 242.17535 
+L 366.324399 242.421568 
+L 366.39731 242.48284 
+L 366.39731 242.523938 
+L 366.501469 242.722417 
+L 366.563965 242.817972 
+L 366.563965 242.826331 
+L 366.668124 243.10008 
+L 366.67854 243.098742 
+L 366.67854 243.210501 
+L 366.782699 243.405008 
+L 366.824363 243.494994 
+L 366.824363 243.511545 
+L 366.928522 243.681418 
+L 367.011849 243.765327 
+L 367.011849 243.782579 
+L 367.105592 244.084778 
+L 367.116008 244.084344 
+L 367.240999 244.177848 
+L 367.240999 244.180479 
+L 367.345158 244.262184 
+L 367.36599 244.304371 
+L 367.36599 244.371428 
+L 367.459733 244.569815 
+L 367.470149 244.569373 
+L 367.563892 244.668924 
+L 367.563892 244.669496 
+L 367.574308 244.668481 
+L 367.668052 244.80428 
+L 367.699299 244.871396 
+L 367.699299 244.912201 
+L 367.803458 245.032259 
+L 367.928449 245.126355 
+L 367.928449 245.128598 
+L 368.032608 245.419685 
+L 368.115936 245.512201 
+L 368.115936 245.521297 
+L 368.199263 245.705667 
+L 368.126352 245.521119 
+L 368.220095 245.704481 
+L 368.251343 245.741895 
+L 368.251343 245.812468 
+L 368.355502 246.049297 
+L 368.449245 246.147762 
+L 368.449245 246.149638 
+L 368.553404 246.284745 
+L 368.6159 246.385869 
+L 368.6159 246.38905 
+L 368.720059 246.573947 
+L 368.782554 246.669255 
+L 368.782554 246.678153 
+L 368.886713 246.94216 
+L 368.928377 247.025186 
+L 368.928377 247.048874 
+L 368.928377 247.089242 
+L 368.928377 247.089242 
+" style="fill:none;stroke:#d62728;stroke-linecap:square;stroke-width:3;"/>
+   </g>
+   <g id="line2d_44">
+    <path clip-path="url(#pc39f415831)" d="M 92.380108 24.5608 
+L 99.59539 180.807388 
+L 106.810671 214.2888 
+L 114.025953 228.883262 
+L 121.241235 237.05616 
+L 128.456516 242.281456 
+L 135.671798 245.910133 
+L 142.88708 248.576993 
+L 150.102361 250.619694 
+L 157.317643 252.2344 
+L 164.532924 253.542869 
+L 171.748206 254.624674 
+L 178.963488 255.534017 
+L 186.178769 256.309095 
+L 193.394051 256.9776 
+L 200.609333 257.560098 
+L 207.824614 258.072185 
+L 215.039896 258.525898 
+L 222.255178 258.930682 
+L 229.470459 259.294047 
+L 236.685741 259.622039 
+L 243.901022 259.919585 
+L 251.116304 260.190735 
+L 258.331586 260.438854 
+L 265.546867 260.666756 
+L 272.762149 260.876814 
+L 279.977431 261.071047 
+L 287.192712 261.251176 
+L 294.407994 261.418685 
+L 301.623276 261.574855 
+L 308.838557 261.7208 
+L 316.053839 261.857492 
+L 323.26912 261.985783 
+L 330.484402 262.106426 
+L 337.699684 262.220084 
+L 344.914965 262.327347 
+L 352.130247 262.42874 
+L 359.345529 262.524732 
+L 366.56081 262.615743 
+L 373.776092 262.702152 
+L 380.991373 262.784298 
+L 388.206655 262.862489 
+L 395.421937 262.937005 
+L 402.637218 263.008099 
+L 409.8525 263.076 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_45">
+    <path clip-path="url(#pc39f415831)" d="M 112.940971 -1 
+L 114.025953 65.896085 
+L 121.241235 143.748 
+L 128.456516 176.128885 
+L 135.671798 193.871836 
+L 142.88708 205.072693 
+L 150.102361 212.786491 
+L 157.317643 218.422286 
+L 164.532924 222.720086 
+L 171.748206 226.105814 
+L 178.963488 228.841953 
+L 186.178769 231.099088 
+L 193.394051 232.992878 
+L 200.609333 234.604524 
+L 207.824614 235.992706 
+L 215.039896 237.200888 
+L 222.255178 238.261948 
+L 229.470459 239.201217 
+L 236.685741 240.038526 
+L 243.901022 240.789622 
+L 251.116304 241.467169 
+L 258.331586 242.081465 
+L 265.546867 242.640973 
+L 272.762149 243.152709 
+L 279.977431 243.622541 
+L 287.192712 244.055414 
+L 294.407994 244.455523 
+L 301.623276 244.826453 
+L 308.838557 245.171284 
+L 316.053839 245.492676 
+L 323.26912 245.79294 
+L 330.484402 246.074095 
+L 337.699684 246.337907 
+L 344.914965 246.585933 
+L 352.130247 246.819549 
+L 359.345529 247.039976 
+L 366.56081 247.2483 
+L 373.776092 247.44549 
+L 380.991373 247.632416 
+L 388.206655 247.80986 
+L 395.421937 247.978525 
+L 402.637218 248.139046 
+L 409.8525 248.292 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_46">
+    <path clip-path="url(#pc39f415831)" d="M 133.432847 -1 
+L 135.671798 45.973516 
+L 142.88708 105.69131 
+L 150.102361 137.652946 
+L 157.317643 157.56048 
+L 164.532924 171.1512 
+L 171.748206 181.01998 
+L 178.963488 188.511609 
+L 186.178769 194.392659 
+L 193.394051 199.132094 
+L 200.609333 203.032916 
+L 207.824614 206.299614 
+L 215.039896 209.075191 
+L 222.255178 211.462658 
+L 229.470459 213.538099 
+L 236.685741 215.358932 
+L 243.901022 216.969302 
+L 251.116304 218.403703 
+L 258.331586 219.689486 
+L 265.546867 220.848609 
+L 272.762149 221.89891 
+L 279.977431 222.855026 
+L 287.192712 223.729083 
+L 294.407994 224.53121 
+L 301.623276 225.269935 
+L 308.838557 225.95249 
+L 316.053839 226.585047 
+L 323.26912 227.172904 
+L 330.484402 227.72064 
+L 337.699684 228.232224 
+L 344.914965 228.711123 
+L 352.130247 229.160371 
+L 359.345529 229.582639 
+L 366.56081 229.980288 
+L 373.776092 230.355409 
+L 380.991373 230.709864 
+L 388.206655 231.045315 
+L 395.421937 231.363251 
+L 402.637218 231.665007 
+L 409.8525 231.951789 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_47">
+    <path clip-path="url(#pc39f415831)" d="M 156.11298 -1 
+L 157.317643 15.5496 
+L 164.532924 67.266052 
+L 171.748206 99.021768 
+L 178.963488 120.503576 
+L 186.178769 136.003109 
+L 193.394051 147.713867 
+L 200.609333 156.873766 
+L 207.824614 164.2344 
+L 215.039896 170.278498 
+L 222.255178 175.330281 
+L 229.470459 179.615586 
+L 236.685741 183.296554 
+L 243.901022 186.492604 
+L 251.116304 189.293636 
+L 258.331586 191.768622 
+L 265.546867 193.97136 
+L 272.762149 195.944428 
+L 279.977431 197.721968 
+L 287.192712 199.33167 
+L 294.407994 200.796236 
+L 301.623276 202.134447 
+L 308.838557 203.361979 
+L 316.053839 204.492017 
+L 323.26912 205.535733 
+L 330.484402 206.502654 
+L 337.699684 207.400955 
+L 344.914965 208.23769 
+L 352.130247 209.018978 
+L 359.345529 209.750155 
+L 366.56081 210.435892 
+L 373.776092 211.080296 
+L 380.991373 211.686996 
+L 388.206655 212.259206 
+L 395.421937 212.799787 
+L 402.637218 213.31129 
+L 409.8525 213.796 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_48">
+    <path clip-path="url(#pc39f415831)" d="M 181.646211 -1 
+L 186.178769 28.664235 
+L 193.394051 60.30288 
+L 200.609333 82.979506 
+L 207.824614 100.0296 
+L 215.039896 113.316128 
+L 222.255178 123.961359 
+L 229.470459 132.681699 
+L 236.685741 139.955952 
+L 243.901022 146.116282 
+L 251.116304 151.400359 
+L 258.331586 155.982727 
+L 265.546867 159.99446 
+L 272.762149 163.535902 
+L 279.977431 166.68517 
+L 287.192712 169.503991 
+L 294.407994 172.041781 
+L 301.623276 174.338573 
+L 308.838557 176.427138 
+L 316.053839 178.334567 
+L 323.26912 180.083444 
+L 330.484402 181.692749 
+L 337.699684 183.178549 
+L 344.914965 184.554536 
+L 352.130247 185.832451 
+L 359.345529 187.022418 
+L 366.56081 188.133213 
+L 373.776092 189.172484 
+L 380.991373 190.146923 
+L 388.206655 191.062414 
+L 395.421937 191.924148 
+L 402.637218 192.736725 
+L 409.8525 193.504235 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_49">
+    <path clip-path="url(#pc39f415831)" d="M 209.89003 -1 
+L 215.039896 21.529603 
+L 222.255178 45.143395 
+L 229.470459 63.474102 
+L 236.685741 78.116312 
+L 243.901022 90.081553 
+L 251.116304 100.042465 
+L 258.331586 108.463751 
+L 265.546867 115.676765 
+L 272.762149 121.924143 
+L 279.977431 127.387629 
+L 287.192712 132.206052 
+L 294.407994 136.487286 
+L 301.623276 140.316422 
+L 308.838557 143.761481 
+L 316.053839 146.877489 
+L 323.26912 149.709441 
+L 330.484402 152.294486 
+L 337.699684 154.663565 
+L 344.914965 156.842657 
+L 352.130247 158.853735 
+L 359.345529 160.715509 
+L 366.56081 162.44401 
+L 373.776092 164.053055 
+L 380.991373 165.554614 
+L 388.206655 166.959108 
+L 395.421937 168.275654 
+L 402.637218 169.512263 
+L 409.8525 170.676 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_50">
+    <path clip-path="url(#pc39f415831)" d="M 241.50606 -1 
+L 243.901022 7.088536 
+L 251.116304 26.492889 
+L 258.331586 42.309882 
+L 265.546867 55.450154 
+L 272.762149 66.54017 
+L 279.977431 76.025053 
+L 287.192712 84.229767 
+L 294.407994 91.397103 
+L 301.623276 97.712108 
+L 308.838557 103.318286 
+L 316.053839 108.328638 
+L 323.26912 112.833358 
+L 330.484402 116.90531 
+L 337.699684 120.604 
+L 344.914965 123.978502 
+L 352.130247 127.069649 
+L 359.345529 129.911692 
+L 366.56081 132.533577 
+L 373.776092 134.959932 
+L 380.991373 137.211843 
+L 388.206655 139.30747 
+L 395.421937 141.262537 
+L 402.637218 143.090726 
+L 409.8525 144.804 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="line2d_51">
+    <path clip-path="url(#pc39f415831)" d="M 276.964303 -1 
+L 279.977431 6.033563 
+L 287.192712 20.223219 
+L 294.407994 32.340935 
+L 301.623276 42.809641 
+L 308.838557 51.944497 
+L 316.053839 59.98516 
+L 323.26912 67.117118 
+L 330.484402 73.486176 
+L 337.699684 79.208529 
+L 344.914965 84.377917 
+L 352.130247 89.070798 
+L 359.345529 93.350153 
+L 366.56081 97.268336 
+L 373.776092 100.869217 
+L 380.991373 104.189842 
+L 388.206655 107.261702 
+L 395.421937 110.111743 
+L 402.637218 112.763154 
+L 409.8525 115.236 
+" style="fill:none;stroke:#008000;stroke-linecap:square;stroke-opacity:0.3;stroke-width:1.5;"/>
+   </g>
+   <g id="patch_3">
+    <path d="M 52.7325 292.644 
+L 52.7325 26.532 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 409.8525 292.644 
+L 409.8525 26.532 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 52.7325 292.644 
+L 409.8525 292.644 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 52.7325 26.532 
+L 409.8525 26.532 
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+   </g>
+   <g id="text_23">
+    <!-- f=0.2 -->
+    <defs>
+     <path d="M 20.609375 41.21875 
+L 20.609375 11.8125 
+Q 20.609375 5.5625 21.96875 3.90625 
+Q 23.78125 1.765625 26.8125 1.765625 
+L 30.859375 1.765625 
+L 30.859375 0 
+L 4.15625 0 
+L 4.15625 1.765625 
+L 6.15625 1.765625 
+Q 8.109375 1.765625 9.71875 2.734375 
+Q 11.328125 3.71875 11.9375 5.375 
+Q 12.546875 7.03125 12.546875 11.8125 
+L 12.546875 41.21875 
+L 3.859375 41.21875 
+L 3.859375 44.734375 
+L 12.546875 44.734375 
+L 12.546875 47.65625 
+Q 12.546875 54.34375 14.6875 58.984375 
+Q 16.84375 63.625 21.265625 66.484375 
+Q 25.6875 69.34375 31.203125 69.34375 
+Q 36.328125 69.34375 40.625 66.015625 
+Q 43.453125 63.8125 43.453125 61.078125 
+Q 43.453125 59.625 42.1875 58.328125 
+Q 40.921875 57.03125 39.453125 57.03125 
+Q 38.328125 57.03125 37.078125 57.828125 
+Q 35.84375 58.640625 34.03125 61.296875 
+Q 32.234375 63.96875 30.71875 64.890625 
+Q 29.203125 65.828125 27.34375 65.828125 
+Q 25.09375 65.828125 23.53125 64.625 
+Q 21.96875 63.421875 21.28125 60.90625 
+Q 20.609375 58.40625 20.609375 47.953125 
+L 20.609375 44.734375 
+L 32.125 44.734375 
+L 32.125 41.21875 
+z
+" id="TimesNewRomanPSMT-102"/>
+     <path d="M 1.8125 43.109375 
+L 54.5 43.109375 
+L 54.5 39.109375 
+L 1.8125 39.109375 
+z
+M 1.8125 27.203125 
+L 54.5 27.203125 
+L 54.5 23.1875 
+L 1.8125 23.1875 
+z
+" id="TimesNewRomanPSMT-61"/>
+    </defs>
+    <g style="opacity:0.4;" transform="translate(374.1405 257.462058)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-50"/>
+    </g>
+   </g>
+   <g id="text_24">
+    <!-- f=0.3 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 242.310176)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-51"/>
+    </g>
+   </g>
+   <g id="text_25">
+    <!-- f=0.4 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 225.387624)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-52"/>
+    </g>
+   </g>
+   <g id="text_26">
+    <!-- f=0.5 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 206.364756)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-53"/>
+    </g>
+   </g>
+   <g id="text_27">
+    <!-- f=0.5 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 184.824683)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-53"/>
+    </g>
+   </g>
+   <g id="text_28">
+    <!-- f=0.6 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 160.232374)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-54"/>
+    </g>
+   </g>
+   <g id="text_29">
+    <!-- f=0.7 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 131.889603)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-55"/>
+    </g>
+   </g>
+   <g id="text_30">
+    <!-- f=0.8 -->
+    <g style="opacity:0.4;" transform="translate(374.1405 98.867602)scale(0.16 -0.16)">
+     <use xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="33.300781" xlink:href="#TimesNewRomanPSMT-61"/>
+     <use x="89.697266" xlink:href="#TimesNewRomanPSMT-48"/>
+     <use x="139.697266" xlink:href="#TimesNewRomanPSMT-46"/>
+     <use x="164.697266" xlink:href="#TimesNewRomanPSMT-56"/>
+    </g>
+   </g>
+   <g id="text_31">
+    <!-- PR Curve for sAP10 -->
+    <defs>
+     <path id="TimesNewRomanPSMT-32"/>
+     <path d="M 60.203125 67.71875 
+L 61.71875 45.21875 
+L 60.203125 45.21875 
+Q 57.171875 55.328125 51.5625 59.765625 
+Q 45.953125 64.203125 38.09375 64.203125 
+Q 31.5 64.203125 26.171875 60.859375 
+Q 20.84375 57.515625 17.796875 50.1875 
+Q 14.75 42.875 14.75 31.984375 
+Q 14.75 23 17.625 16.40625 
+Q 20.515625 9.8125 26.296875 6.296875 
+Q 32.078125 2.78125 39.5 2.78125 
+Q 45.953125 2.78125 50.875 5.53125 
+Q 55.8125 8.296875 61.71875 16.5 
+L 63.234375 15.53125 
+Q 58.25 6.6875 51.609375 2.578125 
+Q 44.96875 -1.515625 35.84375 -1.515625 
+Q 19.390625 -1.515625 10.359375 10.6875 
+Q 3.609375 19.78125 3.609375 32.078125 
+Q 3.609375 42 8.046875 50.296875 
+Q 12.5 58.59375 20.28125 63.15625 
+Q 28.078125 67.71875 37.3125 67.71875 
+Q 44.484375 67.71875 51.46875 64.203125 
+Q 53.515625 63.140625 54.390625 63.140625 
+Q 55.71875 63.140625 56.6875 64.0625 
+Q 57.953125 65.375 58.5 67.71875 
+z
+" id="TimesNewRomanPSMT-67"/>
+     <path d="M 42.328125 44.734375 
+L 42.328125 17.625 
+Q 42.328125 9.859375 42.6875 8.125 
+Q 43.0625 6.390625 43.859375 5.703125 
+Q 44.671875 5.03125 45.75 5.03125 
+Q 47.265625 5.03125 49.171875 5.859375 
+L 49.859375 4.15625 
+L 36.46875 -1.375 
+L 34.28125 -1.375 
+L 34.28125 8.109375 
+Q 28.515625 1.859375 25.484375 0.234375 
+Q 22.46875 -1.375 19.09375 -1.375 
+Q 15.328125 -1.375 12.5625 0.796875 
+Q 9.8125 2.984375 8.734375 6.390625 
+Q 7.671875 9.8125 7.671875 16.0625 
+L 7.671875 36.03125 
+Q 7.671875 39.203125 6.984375 40.421875 
+Q 6.296875 41.65625 4.953125 42.3125 
+Q 3.609375 42.96875 0.09375 42.921875 
+L 0.09375 44.734375 
+L 15.765625 44.734375 
+L 15.765625 14.796875 
+Q 15.765625 8.546875 17.9375 6.59375 
+Q 20.125 4.640625 23.1875 4.640625 
+Q 25.296875 4.640625 27.953125 5.953125 
+Q 30.609375 7.28125 34.28125 10.984375 
+L 34.28125 36.328125 
+Q 34.28125 40.140625 32.890625 41.484375 
+Q 31.5 42.828125 27.09375 42.921875 
+L 27.09375 44.734375 
+z
+" id="TimesNewRomanPSMT-117"/>
+     <path d="M 0.828125 44.734375 
+L 21.875 44.734375 
+L 21.875 42.921875 
+L 20.515625 42.921875 
+Q 18.609375 42.921875 17.609375 41.984375 
+Q 16.609375 41.0625 16.609375 39.5 
+Q 16.609375 37.796875 17.625 35.453125 
+L 28.03125 10.75 
+L 38.484375 36.375 
+Q 39.59375 39.109375 39.59375 40.53125 
+Q 39.59375 41.21875 39.203125 41.65625 
+Q 38.671875 42.390625 37.84375 42.65625 
+Q 37.015625 42.921875 34.46875 42.921875 
+L 34.46875 44.734375 
+L 49.078125 44.734375 
+L 49.078125 42.921875 
+Q 46.53125 42.71875 45.5625 41.890625 
+Q 43.84375 40.4375 42.484375 37.015625 
+L 26.609375 -1.375 
+L 24.609375 -1.375 
+L 8.640625 36.375 
+Q 7.5625 39.015625 6.578125 40.15625 
+Q 5.609375 41.3125 4.109375 42.09375 
+Q 3.265625 42.53125 0.828125 42.921875 
+z
+" id="TimesNewRomanPSMT-118"/>
+     <path d="M 45.75 22.171875 
+L 20.125 22.171875 
+L 15.625 11.71875 
+Q 13.96875 7.859375 13.96875 5.953125 
+Q 13.96875 4.4375 15.40625 3.296875 
+Q 16.84375 2.15625 21.625 1.8125 
+L 21.625 0 
+L 0.78125 0 
+L 0.78125 1.8125 
+Q 4.9375 2.546875 6.15625 3.71875 
+Q 8.640625 6.0625 11.671875 13.234375 
+L 34.96875 67.71875 
+L 36.671875 67.71875 
+L 59.71875 12.640625 
+Q 62.5 6 64.765625 4.015625 
+Q 67.046875 2.046875 71.09375 1.8125 
+L 71.09375 0 
+L 44.96875 0 
+L 44.96875 1.8125 
+Q 48.921875 2 50.3125 3.125 
+Q 51.703125 4.25 51.703125 5.859375 
+Q 51.703125 8.015625 49.75 12.640625 
+z
+M 44.390625 25.78125 
+L 33.15625 52.546875 
+L 21.625 25.78125 
+z
+" id="TimesNewRomanPSMT-65"/>
+    </defs>
+    <g transform="translate(152.088 20.532)scale(0.192 -0.192)">
+     <use xlink:href="#TimesNewRomanPSMT-80"/>
+     <use x="55.615234" xlink:href="#TimesNewRomanPSMT-82"/>
+     <use x="122.314453" xlink:href="#TimesNewRomanPSMT-32"/>
+     <use x="147.314453" xlink:href="#TimesNewRomanPSMT-67"/>
+     <use x="214.013672" xlink:href="#TimesNewRomanPSMT-117"/>
+     <use x="264.013672" xlink:href="#TimesNewRomanPSMT-114"/>
+     <use x="297.314453" xlink:href="#TimesNewRomanPSMT-118"/>
+     <use x="347.314453" xlink:href="#TimesNewRomanPSMT-101"/>
+     <use x="391.699219" xlink:href="#TimesNewRomanPSMT-32"/>
+     <use x="416.699219" xlink:href="#TimesNewRomanPSMT-102"/>
+     <use x="450" xlink:href="#TimesNewRomanPSMT-111"/>
+     <use x="500" xlink:href="#TimesNewRomanPSMT-114"/>
+     <use x="533.300781" xlink:href="#TimesNewRomanPSMT-32"/>
+     <use x="558.300781" xlink:href="#TimesNewRomanPSMT-115"/>
+     <use x="597.216797" xlink:href="#TimesNewRomanPSMT-65"/>
+     <use x="669.433594" xlink:href="#TimesNewRomanPSMT-80"/>
+     <use x="725.048828" xlink:href="#TimesNewRomanPSMT-49"/>
+     <use x="775.048828" xlink:href="#TimesNewRomanPSMT-48"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_7">
+     <path d="M 278.18 107.1995 
+L 398.6525 107.1995 
+Q 401.8525 107.1995 401.8525 103.9995 
+L 401.8525 37.732 
+Q 401.8525 34.532 398.6525 34.532 
+L 278.18 34.532 
+Q 274.98 34.532 274.98 37.732 
+L 274.98 103.9995 
+Q 274.98 107.1995 278.18 107.1995 
+z
+" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
+    </g>
+    <g id="line2d_52">
+     <path d="M 281.38 46.532 
+L 313.38 46.532 
+" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:3;"/>
+    </g>
+    <g id="line2d_53"/>
+    <g id="text_32">
+     <!-- Wireframe -->
+     <defs>
+      <path d="M 93.609375 66.21875 
+L 93.609375 64.40625 
+Q 91.015625 64.40625 89.40625 63.46875 
+Q 87.796875 62.546875 86.328125 60.015625 
+Q 85.359375 58.296875 83.25 51.859375 
+L 64.796875 -1.515625 
+L 62.84375 -1.515625 
+L 47.75 40.828125 
+L 32.765625 -1.515625 
+L 31 -1.515625 
+L 11.328125 53.46875 
+Q 9.125 59.625 8.546875 60.75 
+Q 7.5625 62.59375 5.875 63.5 
+Q 4.203125 64.40625 1.3125 64.40625 
+L 1.3125 66.21875 
+L 25.828125 66.21875 
+L 25.828125 64.40625 
+L 24.65625 64.40625 
+Q 22.078125 64.40625 20.703125 63.234375 
+Q 19.34375 62.0625 19.34375 60.40625 
+Q 19.34375 58.6875 21.484375 52.546875 
+L 34.515625 15.375 
+L 45.515625 46.96875 
+L 43.5625 52.546875 
+L 42 56.984375 
+Q 40.96875 59.421875 39.703125 61.28125 
+Q 39.0625 62.203125 38.140625 62.84375 
+Q 36.921875 63.71875 35.6875 64.109375 
+Q 34.765625 64.40625 32.765625 64.40625 
+L 32.765625 66.21875 
+L 58.546875 66.21875 
+L 58.546875 64.40625 
+L 56.78125 64.40625 
+Q 54.046875 64.40625 52.78125 63.234375 
+Q 51.515625 62.0625 51.515625 60.0625 
+Q 51.515625 57.5625 53.71875 51.375 
+L 66.40625 15.375 
+L 79 51.859375 
+Q 81.15625 57.90625 81.15625 60.25 
+Q 81.15625 61.375 80.4375 62.34375 
+Q 79.734375 63.328125 78.65625 63.71875 
+Q 76.8125 64.40625 73.828125 64.40625 
+L 73.828125 66.21875 
+z
+" id="TimesNewRomanPSMT-87"/>
+      <path d="M 16.40625 36.53125 
+Q 21.296875 41.40625 22.171875 42.140625 
+Q 24.359375 44 26.890625 45.015625 
+Q 29.4375 46.046875 31.9375 46.046875 
+Q 36.140625 46.046875 39.15625 43.59375 
+Q 42.1875 41.15625 43.21875 36.53125 
+Q 48.25 42.390625 51.703125 44.21875 
+Q 55.171875 46.046875 58.84375 46.046875 
+Q 62.40625 46.046875 65.15625 44.21875 
+Q 67.921875 42.390625 69.53125 38.234375 
+Q 70.609375 35.40625 70.609375 29.34375 
+L 70.609375 10.109375 
+Q 70.609375 5.90625 71.234375 4.34375 
+Q 71.734375 3.265625 73.046875 2.515625 
+Q 74.359375 1.765625 77.34375 1.765625 
+L 77.34375 0 
+L 55.28125 0 
+L 55.28125 1.765625 
+L 56.203125 1.765625 
+Q 59.078125 1.765625 60.6875 2.875 
+Q 61.8125 3.65625 62.3125 5.375 
+Q 62.5 6.203125 62.5 10.109375 
+L 62.5 29.34375 
+Q 62.5 34.8125 61.1875 37.0625 
+Q 59.28125 40.1875 55.078125 40.1875 
+Q 52.484375 40.1875 49.875 38.890625 
+Q 47.265625 37.59375 43.5625 34.078125 
+L 43.453125 33.546875 
+L 43.5625 31.453125 
+L 43.5625 10.109375 
+Q 43.5625 5.515625 44.0625 4.390625 
+Q 44.578125 3.265625 45.984375 2.515625 
+Q 47.40625 1.765625 50.828125 1.765625 
+L 50.828125 0 
+L 28.21875 0 
+L 28.21875 1.765625 
+Q 31.9375 1.765625 33.328125 2.640625 
+Q 34.71875 3.515625 35.25 5.28125 
+Q 35.5 6.109375 35.5 10.109375 
+L 35.5 29.34375 
+Q 35.5 34.8125 33.890625 37.203125 
+Q 31.734375 40.328125 27.875 40.328125 
+Q 25.25 40.328125 22.65625 38.921875 
+Q 18.609375 36.765625 16.40625 34.078125 
+L 16.40625 10.109375 
+Q 16.40625 5.71875 17.015625 4.390625 
+Q 17.625 3.078125 18.8125 2.421875 
+Q 20.015625 1.765625 23.6875 1.765625 
+L 23.6875 0 
+L 1.5625 0 
+L 1.5625 1.765625 
+Q 4.640625 1.765625 5.859375 2.421875 
+Q 7.078125 3.078125 7.703125 4.515625 
+Q 8.34375 5.953125 8.34375 10.109375 
+L 8.34375 27.203125 
+Q 8.34375 34.578125 7.90625 36.71875 
+Q 7.5625 38.328125 6.828125 38.9375 
+Q 6.109375 39.546875 4.828125 39.546875 
+Q 3.46875 39.546875 1.5625 38.8125 
+L 0.828125 40.578125 
+L 14.3125 46.046875 
+L 16.40625 46.046875 
+z
+" id="TimesNewRomanPSMT-109"/>
+     </defs>
+     <g transform="translate(326.18 52.132)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-87"/>
+      <use x="94.322266" xlink:href="#TimesNewRomanPSMT-105"/>
+      <use x="122.105469" xlink:href="#TimesNewRomanPSMT-114"/>
+      <use x="155.40625" xlink:href="#TimesNewRomanPSMT-101"/>
+      <use x="199.791016" xlink:href="#TimesNewRomanPSMT-102"/>
+      <use x="233.091797" xlink:href="#TimesNewRomanPSMT-114"/>
+      <use x="266.392578" xlink:href="#TimesNewRomanPSMT-97"/>
+      <use x="310.777344" xlink:href="#TimesNewRomanPSMT-109"/>
+      <use x="388.560547" xlink:href="#TimesNewRomanPSMT-101"/>
+     </g>
+    </g>
+    <g id="line2d_54">
+     <path d="M 281.38 69.1545 
+L 313.38 69.1545 
+" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:3;"/>
+    </g>
+    <g id="line2d_55"/>
+    <g id="text_33">
+     <!-- AFM -->
+     <defs>
+      <path d="M 20.453125 62.59375 
+L 20.453125 36.578125 
+L 32.515625 36.578125 
+Q 36.671875 36.578125 38.59375 38.40625 
+Q 40.53125 40.234375 41.15625 45.65625 
+L 42.96875 45.65625 
+L 42.96875 23.25 
+L 41.15625 23.25 
+Q 41.109375 27.09375 40.15625 28.90625 
+Q 39.203125 30.71875 37.515625 31.609375 
+Q 35.84375 32.515625 32.515625 32.515625 
+L 20.453125 32.515625 
+L 20.453125 11.71875 
+Q 20.453125 6.6875 21.09375 5.078125 
+Q 21.578125 3.859375 23.140625 2.984375 
+Q 25.296875 1.8125 27.640625 1.8125 
+L 30.03125 1.8125 
+L 30.03125 0 
+L 1.609375 0 
+L 1.609375 1.8125 
+L 3.953125 1.8125 
+Q 8.0625 1.8125 9.90625 4.203125 
+Q 11.078125 5.765625 11.078125 11.71875 
+L 11.078125 54.5 
+Q 11.078125 59.515625 10.453125 61.140625 
+Q 9.96875 62.359375 8.453125 63.234375 
+Q 6.34375 64.40625 3.953125 64.40625 
+L 1.609375 64.40625 
+L 1.609375 66.21875 
+L 50.875 66.21875 
+L 51.515625 51.65625 
+L 49.8125 51.65625 
+Q 48.53125 56.296875 46.84375 58.46875 
+Q 45.171875 60.640625 42.703125 61.609375 
+Q 40.234375 62.59375 35.0625 62.59375 
+z
+" id="TimesNewRomanPSMT-70"/>
+      <path d="M 40.921875 0 
+L 15.328125 55.71875 
+L 15.328125 11.46875 
+Q 15.328125 5.375 16.65625 3.859375 
+Q 18.453125 1.8125 22.359375 1.8125 
+L 24.703125 1.8125 
+L 24.703125 0 
+L 1.65625 0 
+L 1.65625 1.8125 
+L 4 1.8125 
+Q 8.203125 1.8125 9.96875 4.34375 
+Q 11.03125 5.90625 11.03125 11.46875 
+L 11.03125 54.734375 
+Q 11.03125 59.125 10.0625 61.078125 
+Q 9.375 62.5 7.546875 63.453125 
+Q 5.71875 64.40625 1.65625 64.40625 
+L 1.65625 66.21875 
+L 20.40625 66.21875 
+L 44.4375 14.40625 
+L 68.0625 66.21875 
+L 86.8125 66.21875 
+L 86.8125 64.40625 
+L 84.515625 64.40625 
+Q 80.28125 64.40625 78.515625 61.859375 
+Q 77.4375 60.296875 77.4375 54.734375 
+L 77.4375 11.46875 
+Q 77.4375 5.375 78.8125 3.859375 
+Q 80.609375 1.8125 84.515625 1.8125 
+L 86.8125 1.8125 
+L 86.8125 0 
+L 58.6875 0 
+L 58.6875 1.8125 
+L 61.03125 1.8125 
+Q 65.28125 1.8125 67 4.34375 
+Q 68.0625 5.90625 68.0625 11.46875 
+L 68.0625 55.71875 
+L 42.53125 0 
+z
+" id="TimesNewRomanPSMT-77"/>
+     </defs>
+     <g transform="translate(326.18 74.7545)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-65"/>
+      <use x="72.216797" xlink:href="#TimesNewRomanPSMT-70"/>
+      <use x="127.832031" xlink:href="#TimesNewRomanPSMT-77"/>
+     </g>
+    </g>
+    <g id="line2d_56">
+     <path d="M 281.38 91.777 
+L 313.38 91.777 
+" style="fill:none;stroke:#d62728;stroke-linecap:square;stroke-width:3;"/>
+    </g>
+    <g id="line2d_57"/>
+    <g id="text_34">
+     <!-- L-CNN -->
+     <defs>
+      <path d="M 57.328125 18.3125 
+L 58.9375 17.96875 
+L 53.265625 0 
+L 2 0 
+L 2 1.8125 
+L 4.5 1.8125 
+Q 8.6875 1.8125 10.5 4.546875 
+Q 11.53125 6.109375 11.53125 11.765625 
+L 11.53125 54.5 
+Q 11.53125 60.6875 10.15625 62.25 
+Q 8.25 64.40625 4.5 64.40625 
+L 2 64.40625 
+L 2 66.21875 
+L 31.984375 66.21875 
+L 31.984375 64.40625 
+Q 26.703125 64.453125 24.578125 63.421875 
+Q 22.46875 62.40625 21.6875 60.84375 
+Q 20.90625 59.28125 20.90625 53.375 
+L 20.90625 11.765625 
+Q 20.90625 7.71875 21.6875 6.203125 
+Q 22.265625 5.171875 23.484375 4.6875 
+Q 24.703125 4.203125 31.109375 4.203125 
+L 35.9375 4.203125 
+Q 43.5625 4.203125 46.625 5.328125 
+Q 49.703125 6.453125 52.234375 9.296875 
+Q 54.78125 12.15625 57.328125 18.3125 
+z
+" id="TimesNewRomanPSMT-76"/>
+      <path d="M 4.046875 26.125 
+L 29.296875 26.125 
+L 29.296875 18.75 
+L 4.046875 18.75 
+z
+" id="TimesNewRomanPSMT-45"/>
+      <path d="M -1.3125 66.21875 
+L 16.65625 66.21875 
+L 57.125 16.546875 
+L 57.125 54.734375 
+Q 57.125 60.84375 55.765625 62.359375 
+Q 53.953125 64.40625 50.046875 64.40625 
+L 47.75 64.40625 
+L 47.75 66.21875 
+L 70.796875 66.21875 
+L 70.796875 64.40625 
+L 68.453125 64.40625 
+Q 64.265625 64.40625 62.5 61.859375 
+Q 61.421875 60.296875 61.421875 54.734375 
+L 61.421875 -1.078125 
+L 59.671875 -1.078125 
+L 16.015625 52.25 
+L 16.015625 11.46875 
+Q 16.015625 5.375 17.328125 3.859375 
+Q 19.1875 1.8125 23.046875 1.8125 
+L 25.390625 1.8125 
+L 25.390625 0 
+L 2.34375 0 
+L 2.34375 1.8125 
+L 4.640625 1.8125 
+Q 8.890625 1.8125 10.640625 4.34375 
+Q 11.71875 5.90625 11.71875 11.46875 
+L 11.71875 57.515625 
+Q 8.84375 60.890625 7.34375 61.953125 
+Q 5.859375 63.03125 2.984375 63.96875 
+Q 1.5625 64.40625 -1.3125 64.40625 
+z
+" id="TimesNewRomanPSMT-78"/>
+     </defs>
+     <g transform="translate(326.18 97.377)scale(0.16 -0.16)">
+      <use xlink:href="#TimesNewRomanPSMT-76"/>
+      <use x="61.083984" xlink:href="#TimesNewRomanPSMT-45"/>
+      <use x="94.384766" xlink:href="#TimesNewRomanPSMT-67"/>
+      <use x="161.083984" xlink:href="#TimesNewRomanPSMT-78"/>
+      <use x="233.300781" xlink:href="#TimesNewRomanPSMT-78"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="pc39f415831">
+   <rect height="266.112" width="357.12" x="52.7325" y="26.532"/>
+  </clipPath>
+ </defs>
+</svg>

+ 4 - 0
lcnn/__init__.py

@@ -0,0 +1,4 @@
+import lcnn.models
+import lcnn.trainer
+import lcnn.datasets
+import lcnn.config

+ 1110 - 0
lcnn/box.py

@@ -0,0 +1,1110 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+#
+# Copyright (c) 2017-2019 - Chris Griffith - MIT License
+"""
+Improved dictionary access through dot notation with additional tools.
+"""
+import string
+import sys
+import json
+import re
+import copy
+from keyword import kwlist
+import warnings
+
+try:
+    from collections.abc import Iterable, Mapping, Callable
+except ImportError:
+    from collections import Iterable, Mapping, Callable
+
+yaml_support = True
+
+try:
+    import yaml
+except ImportError:
+    try:
+        import ruamel.yaml as yaml
+    except ImportError:
+        yaml = None
+        yaml_support = False
+
+if sys.version_info >= (3, 0):
+    basestring = str
+else:
+    from io import open
+
+__all__ = ['Box', 'ConfigBox', 'BoxList', 'SBox',
+           'BoxError', 'BoxKeyError']
+__author__ = 'Chris Griffith'
+__version__ = '3.2.4'
+
+BOX_PARAMETERS = ('default_box', 'default_box_attr', 'conversion_box',
+                  'frozen_box', 'camel_killer_box', 'box_it_up',
+                  'box_safe_prefix', 'box_duplicates', 'ordered_box')
+
+_first_cap_re = re.compile('(.)([A-Z][a-z]+)')
+_all_cap_re = re.compile('([a-z0-9])([A-Z])')
+
+
+class BoxError(Exception):
+    """Non standard dictionary exceptions"""
+
+
+class BoxKeyError(BoxError, KeyError, AttributeError):
+    """Key does not exist"""
+
+
+# Abstract converter functions for use in any Box class
+
+
+def _to_json(obj, filename=None,
+             encoding="utf-8", errors="strict", **json_kwargs):
+    json_dump = json.dumps(obj,
+                           ensure_ascii=False, **json_kwargs)
+    if filename:
+        with open(filename, 'w', encoding=encoding, errors=errors) as f:
+            f.write(json_dump if sys.version_info >= (3, 0) else
+                    json_dump.decode("utf-8"))
+    else:
+        return json_dump
+
+
+def _from_json(json_string=None, filename=None,
+               encoding="utf-8", errors="strict", multiline=False, **kwargs):
+    if filename:
+        with open(filename, 'r', encoding=encoding, errors=errors) as f:
+            if multiline:
+                data = [json.loads(line.strip(), **kwargs) for line in f
+                        if line.strip() and not line.strip().startswith("#")]
+            else:
+                data = json.load(f, **kwargs)
+    elif json_string:
+        data = json.loads(json_string, **kwargs)
+    else:
+        raise BoxError('from_json requires a string or filename')
+    return data
+
+
+def _to_yaml(obj, filename=None, default_flow_style=False,
+             encoding="utf-8", errors="strict",
+             **yaml_kwargs):
+    if filename:
+        with open(filename, 'w',
+                  encoding=encoding, errors=errors) as f:
+            yaml.dump(obj, stream=f,
+                      default_flow_style=default_flow_style,
+                      **yaml_kwargs)
+    else:
+        return yaml.dump(obj,
+                         default_flow_style=default_flow_style,
+                         **yaml_kwargs)
+
+
+def _from_yaml(yaml_string=None, filename=None,
+               encoding="utf-8", errors="strict",
+               **kwargs):
+    if filename:
+        with open(filename, 'r',
+                  encoding=encoding, errors=errors) as f:
+            data = yaml.load(f, **kwargs)
+    elif yaml_string:
+        data = yaml.load(yaml_string, **kwargs)
+    else:
+        raise BoxError('from_yaml requires a string or filename')
+    return data
+
+
+# Helper functions
+
+
+def _safe_key(key):
+    try:
+        return str(key)
+    except UnicodeEncodeError:
+        return key.encode("utf-8", "ignore")
+
+
+def _safe_attr(attr, camel_killer=False, replacement_char='x'):
+    """Convert a key into something that is accessible as an attribute"""
+    allowed = string.ascii_letters + string.digits + '_'
+
+    attr = _safe_key(attr)
+
+    if camel_killer:
+        attr = _camel_killer(attr)
+
+    attr = attr.replace(' ', '_')
+
+    out = ''
+    for character in attr:
+        out += character if character in allowed else "_"
+    out = out.strip("_")
+
+    try:
+        int(out[0])
+    except (ValueError, IndexError):
+        pass
+    else:
+        out = '{0}{1}'.format(replacement_char, out)
+
+    if out in kwlist:
+        out = '{0}{1}'.format(replacement_char, out)
+
+    return re.sub('_+', '_', out)
+
+
+def _camel_killer(attr):
+    """
+    CamelKiller, qu'est-ce que c'est?
+
+    Taken from http://stackoverflow.com/a/1176023/3244542
+    """
+    try:
+        attr = str(attr)
+    except UnicodeEncodeError:
+        attr = attr.encode("utf-8", "ignore")
+
+    s1 = _first_cap_re.sub(r'\1_\2', attr)
+    s2 = _all_cap_re.sub(r'\1_\2', s1)
+    return re.sub('_+', '_', s2.casefold() if hasattr(s2, 'casefold') else
+                  s2.lower())
+
+
+def _recursive_tuples(iterable, box_class, recreate_tuples=False, **kwargs):
+    out_list = []
+    for i in iterable:
+        if isinstance(i, dict):
+            out_list.append(box_class(i, **kwargs))
+        elif isinstance(i, list) or (recreate_tuples and isinstance(i, tuple)):
+            out_list.append(_recursive_tuples(i, box_class,
+                                              recreate_tuples, **kwargs))
+        else:
+            out_list.append(i)
+    return tuple(out_list)
+
+
+def _conversion_checks(item, keys, box_config, check_only=False,
+                       pre_check=False):
+    """
+    Internal use for checking if a duplicate safe attribute already exists
+
+    :param item: Item to see if a dup exists
+    :param keys: Keys to check against
+    :param box_config: Easier to pass in than ask for specfic items
+    :param check_only: Don't bother doing the conversion work
+    :param pre_check: Need to add the item to the list of keys to check
+    :return: the original unmodified key, if exists and not check_only
+    """
+    if box_config['box_duplicates'] != 'ignore':
+        if pre_check:
+            keys = list(keys) + [item]
+
+        key_list = [(k,
+                     _safe_attr(k, camel_killer=box_config['camel_killer_box'],
+                                replacement_char=box_config['box_safe_prefix']
+                                )) for k in keys]
+        if len(key_list) > len(set(x[1] for x in key_list)):
+            seen = set()
+            dups = set()
+            for x in key_list:
+                if x[1] in seen:
+                    dups.add("{0}({1})".format(x[0], x[1]))
+                seen.add(x[1])
+            if box_config['box_duplicates'].startswith("warn"):
+                warnings.warn('Duplicate conversion attributes exist: '
+                              '{0}'.format(dups))
+            else:
+                raise BoxError('Duplicate conversion attributes exist: '
+                               '{0}'.format(dups))
+    if check_only:
+        return
+    # This way will be slower for warnings, as it will have double work
+    # But faster for the default 'ignore'
+    for k in keys:
+        if item == _safe_attr(k, camel_killer=box_config['camel_killer_box'],
+                              replacement_char=box_config['box_safe_prefix']):
+            return k
+
+
+def _get_box_config(cls, kwargs):
+    return {
+        # Internal use only
+        '__converted': set(),
+        '__box_heritage': kwargs.pop('__box_heritage', None),
+        '__created': False,
+        '__ordered_box_values': [],
+        # Can be changed by user after box creation
+        'default_box': kwargs.pop('default_box', False),
+        'default_box_attr': kwargs.pop('default_box_attr', cls),
+        'conversion_box': kwargs.pop('conversion_box', True),
+        'box_safe_prefix': kwargs.pop('box_safe_prefix', 'x'),
+        'frozen_box': kwargs.pop('frozen_box', False),
+        'camel_killer_box': kwargs.pop('camel_killer_box', False),
+        'modify_tuples_box': kwargs.pop('modify_tuples_box', False),
+        'box_duplicates': kwargs.pop('box_duplicates', 'ignore'),
+        'ordered_box': kwargs.pop('ordered_box', False)
+    }
+
+
+class Box(dict):
+    """
+    Improved dictionary access through dot notation with additional tools.
+
+    :param default_box: Similar to defaultdict, return a default value
+    :param default_box_attr: Specify the default replacement.
+        WARNING: If this is not the default 'Box', it will not be recursive
+    :param frozen_box: After creation, the box cannot be modified
+    :param camel_killer_box: Convert CamelCase to snake_case
+    :param conversion_box: Check for near matching keys as attributes
+    :param modify_tuples_box: Recreate incoming tuples with dicts into Boxes
+    :param box_it_up: Recursively create all Boxes from the start
+    :param box_safe_prefix: Conversion box prefix for unsafe attributes
+    :param box_duplicates: "ignore", "error" or "warn" when duplicates exists
+        in a conversion_box
+    :param ordered_box: Preserve the order of keys entered into the box
+    """
+
+    _protected_keys = dir({}) + ['to_dict', 'tree_view', 'to_json', 'to_yaml',
+                                 'from_yaml', 'from_json']
+
+    def __new__(cls, *args, **kwargs):
+        """
+        Due to the way pickling works in python 3, we need to make sure
+        the box config is created as early as possible.
+        """
+        obj = super(Box, cls).__new__(cls, *args, **kwargs)
+        obj._box_config = _get_box_config(cls, kwargs)
+        return obj
+
+    def __init__(self, *args, **kwargs):
+        self._box_config = _get_box_config(self.__class__, kwargs)
+        if self._box_config['ordered_box']:
+            self._box_config['__ordered_box_values'] = []
+        if (not self._box_config['conversion_box'] and
+                self._box_config['box_duplicates'] != "ignore"):
+            raise BoxError('box_duplicates are only for conversion_boxes')
+        if len(args) == 1:
+            if isinstance(args[0], basestring):
+                raise ValueError('Cannot extrapolate Box from string')
+            if isinstance(args[0], Mapping):
+                for k, v in args[0].items():
+                    if v is args[0]:
+                        v = self
+                    self[k] = v
+                    self.__add_ordered(k)
+            elif isinstance(args[0], Iterable):
+                for k, v in args[0]:
+                    self[k] = v
+                    self.__add_ordered(k)
+
+            else:
+                raise ValueError('First argument must be mapping or iterable')
+        elif args:
+            raise TypeError('Box expected at most 1 argument, '
+                            'got {0}'.format(len(args)))
+
+        box_it = kwargs.pop('box_it_up', False)
+        for k, v in kwargs.items():
+            if args and isinstance(args[0], Mapping) and v is args[0]:
+                v = self
+            self[k] = v
+            self.__add_ordered(k)
+
+        if (self._box_config['frozen_box'] or box_it or
+                self._box_config['box_duplicates'] != 'ignore'):
+            self.box_it_up()
+
+        self._box_config['__created'] = True
+
+    def __add_ordered(self, key):
+        if (self._box_config['ordered_box'] and
+                key not in self._box_config['__ordered_box_values']):
+            self._box_config['__ordered_box_values'].append(key)
+
+    def box_it_up(self):
+        """
+        Perform value lookup for all items in current dictionary,
+        generating all sub Box objects, while also running `box_it_up` on
+        any of those sub box objects.
+        """
+        for k in self:
+            _conversion_checks(k, self.keys(), self._box_config,
+                               check_only=True)
+            if self[k] is not self and hasattr(self[k], 'box_it_up'):
+                self[k].box_it_up()
+
+    def __hash__(self):
+        if self._box_config['frozen_box']:
+            hashing = 54321
+            for item in self.items():
+                hashing ^= hash(item)
+            return hashing
+        raise TypeError("unhashable type: 'Box'")
+
+    def __dir__(self):
+        allowed = string.ascii_letters + string.digits + '_'
+        kill_camel = self._box_config['camel_killer_box']
+        items = set(dir(dict) + ['to_dict', 'to_json',
+                                 'from_json', 'box_it_up'])
+        # Only show items accessible by dot notation
+        for key in self.keys():
+            key = _safe_key(key)
+            if (' ' not in key and key[0] not in string.digits and
+                    key not in kwlist):
+                for letter in key:
+                    if letter not in allowed:
+                        break
+                else:
+                    items.add(key)
+
+        for key in self.keys():
+            key = _safe_key(key)
+            if key not in items:
+                if self._box_config['conversion_box']:
+                    key = _safe_attr(key, camel_killer=kill_camel,
+                                     replacement_char=self._box_config[
+                                         'box_safe_prefix'])
+                    if key:
+                        items.add(key)
+            if kill_camel:
+                snake_key = _camel_killer(key)
+                if snake_key:
+                    items.remove(key)
+                    items.add(snake_key)
+
+        if yaml_support:
+            items.add('to_yaml')
+            items.add('from_yaml')
+
+        return list(items)
+
+    def get(self, key, default=None):
+        try:
+            return self[key]
+        except KeyError:
+            if isinstance(default, dict) and not isinstance(default, Box):
+                return Box(default)
+            if isinstance(default, list) and not isinstance(default, BoxList):
+                return BoxList(default)
+            return default
+
+    def copy(self):
+        return self.__class__(super(self.__class__, self).copy())
+
+    def __copy__(self):
+        return self.__class__(super(self.__class__, self).copy())
+
+    def __deepcopy__(self, memodict=None):
+        out = self.__class__()
+        memodict = memodict or {}
+        memodict[id(self)] = out
+        for k, v in self.items():
+            out[copy.deepcopy(k, memodict)] = copy.deepcopy(v, memodict)
+        return out
+
+    def __setstate__(self, state):
+        self._box_config = state['_box_config']
+        self.__dict__.update(state)
+
+    def __getitem__(self, item, _ignore_default=False):
+        try:
+            value = super(Box, self).__getitem__(item)
+        except KeyError as err:
+            if item == '_box_config':
+                raise BoxKeyError('_box_config should only exist as an '
+                                  'attribute and is never defaulted')
+            if self._box_config['default_box'] and not _ignore_default:
+                return self.__get_default(item)
+            raise BoxKeyError(str(err))
+        else:
+            return self.__convert_and_store(item, value)
+
+    def keys(self):
+        if self._box_config['ordered_box']:
+            return self._box_config['__ordered_box_values']
+        return super(Box, self).keys()
+
+    def values(self):
+        return [self[x] for x in self.keys()]
+
+    def items(self):
+        return [(x, self[x]) for x in self.keys()]
+
+    def __get_default(self, item):
+        default_value = self._box_config['default_box_attr']
+        if default_value is self.__class__:
+            return self.__class__(__box_heritage=(self, item),
+                                  **self.__box_config())
+        elif isinstance(default_value, Callable):
+            return default_value()
+        elif hasattr(default_value, 'copy'):
+            return default_value.copy()
+        return default_value
+
+    def __box_config(self):
+        out = {}
+        for k, v in self._box_config.copy().items():
+            if not k.startswith("__"):
+                out[k] = v
+        return out
+
+    def __convert_and_store(self, item, value):
+        if item in self._box_config['__converted']:
+            return value
+        if isinstance(value, dict) and not isinstance(value, Box):
+            value = self.__class__(value, __box_heritage=(self, item),
+                                   **self.__box_config())
+            self[item] = value
+        elif isinstance(value, list) and not isinstance(value, BoxList):
+            if self._box_config['frozen_box']:
+                value = _recursive_tuples(value, self.__class__,
+                                          recreate_tuples=self._box_config[
+                                              'modify_tuples_box'],
+                                          __box_heritage=(self, item),
+                                          **self.__box_config())
+            else:
+                value = BoxList(value, __box_heritage=(self, item),
+                                box_class=self.__class__,
+                                **self.__box_config())
+            self[item] = value
+        elif (self._box_config['modify_tuples_box'] and
+              isinstance(value, tuple)):
+            value = _recursive_tuples(value, self.__class__,
+                                      recreate_tuples=True,
+                                      __box_heritage=(self, item),
+                                      **self.__box_config())
+            self[item] = value
+        self._box_config['__converted'].add(item)
+        return value
+
+    def __create_lineage(self):
+        if (self._box_config['__box_heritage'] and
+                self._box_config['__created']):
+            past, item = self._box_config['__box_heritage']
+            if not past[item]:
+                past[item] = self
+            self._box_config['__box_heritage'] = None
+
+    def __getattr__(self, item):
+        try:
+            try:
+                value = self.__getitem__(item, _ignore_default=True)
+            except KeyError:
+                value = object.__getattribute__(self, item)
+        except AttributeError as err:
+            if item == "__getstate__":
+                raise AttributeError(item)
+            if item == '_box_config':
+                raise BoxError('_box_config key must exist')
+            kill_camel = self._box_config['camel_killer_box']
+            if self._box_config['conversion_box'] and item:
+                k = _conversion_checks(item, self.keys(), self._box_config)
+                if k:
+                    return self.__getitem__(k)
+            if kill_camel:
+                for k in self.keys():
+                    if item == _camel_killer(k):
+                        return self.__getitem__(k)
+            if self._box_config['default_box']:
+                return self.__get_default(item)
+            raise BoxKeyError(str(err))
+        else:
+            if item == '_box_config':
+                return value
+            return self.__convert_and_store(item, value)
+
+    def __setitem__(self, key, value):
+        if (key != '_box_config' and self._box_config['__created'] and
+                self._box_config['frozen_box']):
+            raise BoxError('Box is frozen')
+        if self._box_config['conversion_box']:
+            _conversion_checks(key, self.keys(), self._box_config,
+                               check_only=True, pre_check=True)
+        super(Box, self).__setitem__(key, value)
+        self.__add_ordered(key)
+        self.__create_lineage()
+
+    def __setattr__(self, key, value):
+        if (key != '_box_config' and self._box_config['frozen_box'] and
+                self._box_config['__created']):
+            raise BoxError('Box is frozen')
+        if key in self._protected_keys:
+            raise AttributeError("Key name '{0}' is protected".format(key))
+        if key == '_box_config':
+            return object.__setattr__(self, key, value)
+        try:
+            object.__getattribute__(self, key)
+        except (AttributeError, UnicodeEncodeError):
+            if (key not in self.keys() and
+                    (self._box_config['conversion_box'] or
+                     self._box_config['camel_killer_box'])):
+                if self._box_config['conversion_box']:
+                    k = _conversion_checks(key, self.keys(),
+                                           self._box_config)
+                    self[key if not k else k] = value
+                elif self._box_config['camel_killer_box']:
+                    for each_key in self:
+                        if key == _camel_killer(each_key):
+                            self[each_key] = value
+                            break
+            else:
+                self[key] = value
+        else:
+            object.__setattr__(self, key, value)
+        self.__add_ordered(key)
+        self.__create_lineage()
+
+    def __delitem__(self, key):
+        if self._box_config['frozen_box']:
+            raise BoxError('Box is frozen')
+        super(Box, self).__delitem__(key)
+        if (self._box_config['ordered_box'] and
+                key in self._box_config['__ordered_box_values']):
+            self._box_config['__ordered_box_values'].remove(key)
+
+    def __delattr__(self, item):
+        if self._box_config['frozen_box']:
+            raise BoxError('Box is frozen')
+        if item == '_box_config':
+            raise BoxError('"_box_config" is protected')
+        if item in self._protected_keys:
+            raise AttributeError("Key name '{0}' is protected".format(item))
+        try:
+            object.__getattribute__(self, item)
+        except AttributeError:
+            del self[item]
+        else:
+            object.__delattr__(self, item)
+        if (self._box_config['ordered_box'] and
+                item in self._box_config['__ordered_box_values']):
+            self._box_config['__ordered_box_values'].remove(item)
+
+    def pop(self, key, *args):
+        if args:
+            if len(args) != 1:
+                raise BoxError('pop() takes only one optional'
+                               ' argument "default"')
+            try:
+                item = self[key]
+            except KeyError:
+                return args[0]
+            else:
+                del self[key]
+                return item
+        try:
+            item = self[key]
+        except KeyError:
+            raise BoxKeyError('{0}'.format(key))
+        else:
+            del self[key]
+            return item
+
+    def clear(self):
+        self._box_config['__ordered_box_values'] = []
+        super(Box, self).clear()
+
+    def popitem(self):
+        try:
+            key = next(self.__iter__())
+        except StopIteration:
+            raise BoxKeyError('Empty box')
+        return key, self.pop(key)
+
+    def __repr__(self):
+        return '<Box: {0}>'.format(str(self.to_dict()))
+
+    def __str__(self):
+        return str(self.to_dict())
+
+    def __iter__(self):
+        for key in self.keys():
+            yield key
+
+    def __reversed__(self):
+        for key in reversed(list(self.keys())):
+            yield key
+
+    def to_dict(self):
+        """
+        Turn the Box and sub Boxes back into a native
+        python dictionary.
+
+        :return: python dictionary of this Box
+        """
+        out_dict = dict(self)
+        for k, v in out_dict.items():
+            if v is self:
+                out_dict[k] = out_dict
+            elif hasattr(v, 'to_dict'):
+                out_dict[k] = v.to_dict()
+            elif hasattr(v, 'to_list'):
+                out_dict[k] = v.to_list()
+        return out_dict
+
+    def update(self, item=None, **kwargs):
+        if not item:
+            item = kwargs
+        iter_over = item.items() if hasattr(item, 'items') else item
+        for k, v in iter_over:
+            if isinstance(v, dict):
+                # Box objects must be created in case they are already
+                # in the `converted` box_config set
+                v = self.__class__(v)
+                if k in self and isinstance(self[k], dict):
+                    self[k].update(v)
+                    continue
+            if isinstance(v, list):
+                v = BoxList(v)
+            try:
+                self.__setattr__(k, v)
+            except (AttributeError, TypeError):
+                self.__setitem__(k, v)
+
+    def setdefault(self, item, default=None):
+        if item in self:
+            return self[item]
+
+        if isinstance(default, dict):
+            default = self.__class__(default)
+        if isinstance(default, list):
+            default = BoxList(default)
+        self[item] = default
+        return default
+
+    def to_json(self, filename=None,
+                encoding="utf-8", errors="strict", **json_kwargs):
+        """
+        Transform the Box object into a JSON string.
+
+        :param filename: If provided will save to file
+        :param encoding: File encoding
+        :param errors: How to handle encoding errors
+        :param json_kwargs: additional arguments to pass to json.dump(s)
+        :return: string of JSON or return of `json.dump`
+        """
+        return _to_json(self.to_dict(), filename=filename,
+                        encoding=encoding, errors=errors, **json_kwargs)
+
+    @classmethod
+    def from_json(cls, json_string=None, filename=None,
+                  encoding="utf-8", errors="strict", **kwargs):
+        """
+        Transform a json object string into a Box object. If the incoming
+        json is a list, you must use BoxList.from_json.
+
+        :param json_string: string to pass to `json.loads`
+        :param filename: filename to open and pass to `json.load`
+        :param encoding: File encoding
+        :param errors: How to handle encoding errors
+        :param kwargs: parameters to pass to `Box()` or `json.loads`
+        :return: Box object from json data
+        """
+        bx_args = {}
+        for arg in kwargs.copy():
+            if arg in BOX_PARAMETERS:
+                bx_args[arg] = kwargs.pop(arg)
+
+        data = _from_json(json_string, filename=filename,
+                          encoding=encoding, errors=errors, **kwargs)
+
+        if not isinstance(data, dict):
+            raise BoxError('json data not returned as a dictionary, '
+                           'but rather a {0}'.format(type(data).__name__))
+        return cls(data, **bx_args)
+
+    if yaml_support:
+        def to_yaml(self, filename=None, default_flow_style=False,
+                    encoding="utf-8", errors="strict",
+                    **yaml_kwargs):
+            """
+            Transform the Box object into a YAML string.
+
+            :param filename:  If provided will save to file
+            :param default_flow_style: False will recursively dump dicts
+            :param encoding: File encoding
+            :param errors: How to handle encoding errors
+            :param yaml_kwargs: additional arguments to pass to yaml.dump
+            :return: string of YAML or return of `yaml.dump`
+            """
+            return _to_yaml(self.to_dict(), filename=filename,
+                            default_flow_style=default_flow_style,
+                            encoding=encoding, errors=errors, **yaml_kwargs)
+
+        @classmethod
+        def from_yaml(cls, yaml_string=None, filename=None,
+                      encoding="utf-8", errors="strict",
+                      loader=yaml.SafeLoader, **kwargs):
+            """
+            Transform a yaml object string into a Box object.
+
+            :param yaml_string: string to pass to `yaml.load`
+            :param filename: filename to open and pass to `yaml.load`
+            :param encoding: File encoding
+            :param errors: How to handle encoding errors
+            :param loader: YAML Loader, defaults to SafeLoader
+            :param kwargs: parameters to pass to `Box()` or `yaml.load`
+            :return: Box object from yaml data
+            """
+            bx_args = {}
+            for arg in kwargs.copy():
+                if arg in BOX_PARAMETERS:
+                    bx_args[arg] = kwargs.pop(arg)
+
+            data = _from_yaml(yaml_string=yaml_string, filename=filename,
+                              encoding=encoding, errors=errors,
+                              Loader=loader, **kwargs)
+            if not isinstance(data, dict):
+                raise BoxError('yaml data not returned as a dictionary'
+                               'but rather a {0}'.format(type(data).__name__))
+            return cls(data, **bx_args)
+
+
+class BoxList(list):
+    """
+    Drop in replacement of list, that converts added objects to Box or BoxList
+    objects as necessary.
+    """
+
+    def __init__(self, iterable=None, box_class=Box, **box_options):
+        self.box_class = box_class
+        self.box_options = box_options
+        self.box_org_ref = self.box_org_ref = id(iterable) if iterable else 0
+        if iterable:
+            for x in iterable:
+                self.append(x)
+        if box_options.get('frozen_box'):
+            def frozen(*args, **kwargs):
+                raise BoxError('BoxList is frozen')
+
+            for method in ['append', 'extend', 'insert', 'pop',
+                           'remove', 'reverse', 'sort']:
+                self.__setattr__(method, frozen)
+
+    def __delitem__(self, key):
+        if self.box_options.get('frozen_box'):
+            raise BoxError('BoxList is frozen')
+        super(BoxList, self).__delitem__(key)
+
+    def __setitem__(self, key, value):
+        if self.box_options.get('frozen_box'):
+            raise BoxError('BoxList is frozen')
+        super(BoxList, self).__setitem__(key, value)
+
+    def append(self, p_object):
+        if isinstance(p_object, dict):
+            try:
+                p_object = self.box_class(p_object, **self.box_options)
+            except AttributeError as err:
+                if 'box_class' in self.__dict__:
+                    raise err
+        elif isinstance(p_object, list):
+            try:
+                p_object = (self if id(p_object) == self.box_org_ref else
+                            BoxList(p_object))
+            except AttributeError as err:
+                if 'box_org_ref' in self.__dict__:
+                    raise err
+        super(BoxList, self).append(p_object)
+
+    def extend(self, iterable):
+        for item in iterable:
+            self.append(item)
+
+    def insert(self, index, p_object):
+        if isinstance(p_object, dict):
+            p_object = self.box_class(p_object, **self.box_options)
+        elif isinstance(p_object, list):
+            p_object = (self if id(p_object) == self.box_org_ref else
+                        BoxList(p_object))
+        super(BoxList, self).insert(index, p_object)
+
+    def __repr__(self):
+        return "<BoxList: {0}>".format(self.to_list())
+
+    def __str__(self):
+        return str(self.to_list())
+
+    def __copy__(self):
+        return BoxList((x for x in self),
+                       self.box_class,
+                       **self.box_options)
+
+    def __deepcopy__(self, memodict=None):
+        out = self.__class__()
+        memodict = memodict or {}
+        memodict[id(self)] = out
+        for k in self:
+            out.append(copy.deepcopy(k))
+        return out
+
+    def __hash__(self):
+        if self.box_options.get('frozen_box'):
+            hashing = 98765
+            hashing ^= hash(tuple(self))
+            return hashing
+        raise TypeError("unhashable type: 'BoxList'")
+
+    def to_list(self):
+        new_list = []
+        for x in self:
+            if x is self:
+                new_list.append(new_list)
+            elif isinstance(x, Box):
+                new_list.append(x.to_dict())
+            elif isinstance(x, BoxList):
+                new_list.append(x.to_list())
+            else:
+                new_list.append(x)
+        return new_list
+
+    def to_json(self, filename=None,
+                encoding="utf-8", errors="strict",
+                multiline=False, **json_kwargs):
+        """
+        Transform the BoxList object into a JSON string.
+
+        :param filename: If provided will save to file
+        :param encoding: File encoding
+        :param errors: How to handle encoding errors
+        :param multiline: Put each item in list onto it's own line
+        :param json_kwargs: additional arguments to pass to json.dump(s)
+        :return: string of JSON or return of `json.dump`
+        """
+        if filename and multiline:
+            lines = [_to_json(item, filename=False, encoding=encoding,
+                              errors=errors, **json_kwargs) for item in self]
+            with open(filename, 'w', encoding=encoding, errors=errors) as f:
+                f.write("\n".join(lines).decode('utf-8') if
+                        sys.version_info < (3, 0) else "\n".join(lines))
+        else:
+            return _to_json(self.to_list(), filename=filename,
+                            encoding=encoding, errors=errors, **json_kwargs)
+
+    @classmethod
+    def from_json(cls, json_string=None, filename=None, encoding="utf-8",
+                  errors="strict", multiline=False, **kwargs):
+        """
+        Transform a json object string into a BoxList object. If the incoming
+        json is a dict, you must use Box.from_json.
+
+        :param json_string: string to pass to `json.loads`
+        :param filename: filename to open and pass to `json.load`
+        :param encoding: File encoding
+        :param errors: How to handle encoding errors
+        :param multiline: One object per line
+        :param kwargs: parameters to pass to `Box()` or `json.loads`
+        :return: BoxList object from json data
+        """
+        bx_args = {}
+        for arg in kwargs.copy():
+            if arg in BOX_PARAMETERS:
+                bx_args[arg] = kwargs.pop(arg)
+
+        data = _from_json(json_string, filename=filename, encoding=encoding,
+                          errors=errors, multiline=multiline, **kwargs)
+
+        if not isinstance(data, list):
+            raise BoxError('json data not returned as a list, '
+                           'but rather a {0}'.format(type(data).__name__))
+        return cls(data, **bx_args)
+
+    if yaml_support:
+        def to_yaml(self, filename=None, default_flow_style=False,
+                    encoding="utf-8", errors="strict",
+                    **yaml_kwargs):
+            """
+            Transform the BoxList object into a YAML string.
+
+            :param filename:  If provided will save to file
+            :param default_flow_style: False will recursively dump dicts
+            :param encoding: File encoding
+            :param errors: How to handle encoding errors
+            :param yaml_kwargs: additional arguments to pass to yaml.dump
+            :return: string of YAML or return of `yaml.dump`
+            """
+            return _to_yaml(self.to_list(), filename=filename,
+                            default_flow_style=default_flow_style,
+                            encoding=encoding, errors=errors, **yaml_kwargs)
+
+        @classmethod
+        def from_yaml(cls, yaml_string=None, filename=None,
+                      encoding="utf-8", errors="strict",
+                      loader=yaml.SafeLoader,
+                      **kwargs):
+            """
+            Transform a yaml object string into a BoxList object.
+
+            :param yaml_string: string to pass to `yaml.load`
+            :param filename: filename to open and pass to `yaml.load`
+            :param encoding: File encoding
+            :param errors: How to handle encoding errors
+            :param loader: YAML Loader, defaults to SafeLoader
+            :param kwargs: parameters to pass to `BoxList()` or `yaml.load`
+            :return: BoxList object from yaml data
+            """
+            bx_args = {}
+            for arg in kwargs.copy():
+                if arg in BOX_PARAMETERS:
+                    bx_args[arg] = kwargs.pop(arg)
+
+            data = _from_yaml(yaml_string=yaml_string, filename=filename,
+                              encoding=encoding, errors=errors,
+                              Loader=loader, **kwargs)
+            if not isinstance(data, list):
+                raise BoxError('yaml data not returned as a list'
+                               'but rather a {0}'.format(type(data).__name__))
+            return cls(data, **bx_args)
+
+    def box_it_up(self):
+        for v in self:
+            if hasattr(v, 'box_it_up') and v is not self:
+                v.box_it_up()
+
+
+class ConfigBox(Box):
+    """
+    Modified box object to add object transforms.
+
+    Allows for build in transforms like:
+
+    cns = ConfigBox(my_bool='yes', my_int='5', my_list='5,4,3,3,2')
+
+    cns.bool('my_bool') # True
+    cns.int('my_int') # 5
+    cns.list('my_list', mod=lambda x: int(x)) # [5, 4, 3, 3, 2]
+    """
+
+    _protected_keys = dir({}) + ['to_dict', 'bool', 'int', 'float',
+                                 'list', 'getboolean', 'to_json', 'to_yaml',
+                                 'getfloat', 'getint',
+                                 'from_json', 'from_yaml']
+
+    def __getattr__(self, item):
+        """Config file keys are stored in lower case, be a little more
+        loosey goosey"""
+        try:
+            return super(ConfigBox, self).__getattr__(item)
+        except AttributeError:
+            return super(ConfigBox, self).__getattr__(item.lower())
+
+    def __dir__(self):
+        return super(ConfigBox, self).__dir__() + ['bool', 'int', 'float',
+                                                   'list', 'getboolean',
+                                                   'getfloat', 'getint']
+
+    def bool(self, item, default=None):
+        """ Return value of key as a boolean
+
+        :param item: key of value to transform
+        :param default: value to return if item does not exist
+        :return: approximated bool of value
+        """
+        try:
+            item = self.__getattr__(item)
+        except AttributeError as err:
+            if default is not None:
+                return default
+            raise err
+
+        if isinstance(item, (bool, int)):
+            return bool(item)
+
+        if (isinstance(item, str) and
+                item.lower() in ('n', 'no', 'false', 'f', '0')):
+            return False
+
+        return True if item else False
+
+    def int(self, item, default=None):
+        """ Return value of key as an int
+
+        :param item: key of value to transform
+        :param default: value to return if item does not exist
+        :return: int of value
+        """
+        try:
+            item = self.__getattr__(item)
+        except AttributeError as err:
+            if default is not None:
+                return default
+            raise err
+        return int(item)
+
+    def float(self, item, default=None):
+        """ Return value of key as a float
+
+        :param item: key of value to transform
+        :param default: value to return if item does not exist
+        :return: float of value
+        """
+        try:
+            item = self.__getattr__(item)
+        except AttributeError as err:
+            if default is not None:
+                return default
+            raise err
+        return float(item)
+
+    def list(self, item, default=None, spliter=",", strip=True, mod=None):
+        """ Return value of key as a list
+
+        :param item: key of value to transform
+        :param mod: function to map against list
+        :param default: value to return if item does not exist
+        :param spliter: character to split str on
+        :param strip: clean the list with the `strip`
+        :return: list of items
+        """
+        try:
+            item = self.__getattr__(item)
+        except AttributeError as err:
+            if default is not None:
+                return default
+            raise err
+        if strip:
+            item = item.lstrip('[').rstrip(']')
+        out = [x.strip() if strip else x for x in item.split(spliter)]
+        if mod:
+            return list(map(mod, out))
+        return out
+
+    # loose configparser compatibility
+
+    def getboolean(self, item, default=None):
+        return self.bool(item, default)
+
+    def getint(self, item, default=None):
+        return self.int(item, default)
+
+    def getfloat(self, item, default=None):
+        return self.float(item, default)
+
+    def __repr__(self):
+        return '<ConfigBox: {0}>'.format(str(self.to_dict()))
+
+
+class SBox(Box):
+    """
+    ShorthandBox (SBox) allows for
+    property access of `dict` `json` and `yaml`
+    """
+    _protected_keys = dir({}) + ['to_dict', 'tree_view', 'to_json', 'to_yaml',
+                                 'json', 'yaml', 'from_yaml', 'from_json',
+                                 'dict']
+
+    @property
+    def dict(self):
+        return self.to_dict()
+
+    @property
+    def json(self):
+        return self.to_json()
+
+    if yaml_support:
+        @property
+        def yaml(self):
+            return self.to_yaml()
+
+    def __repr__(self):
+        return '<ShorthandBox: {0}>'.format(str(self.to_dict()))

+ 9 - 0
lcnn/config.py

@@ -0,0 +1,9 @@
+import numpy as np
+
+from lcnn.box import Box
+
+# C is a dict storing all the configuration
+C = Box()
+
+# shortcut for C.model
+M = Box()

+ 88 - 0
lcnn/datasets.py

@@ -0,0 +1,88 @@
+import os
+import glob
+import json
+import math
+import random
+
+import numpy as np
+import torch
+import numpy.linalg as LA
+from skimage import io
+from torch.utils.data import Dataset
+from torch.utils.data.dataloader import default_collate
+
+from lcnn.config import M
+
+
+class WireframeDataset(Dataset):
+    def __init__(
+        self,
+        rootdir,
+        split,
+    ):
+        self.rootdir = rootdir
+        filelist = glob.glob(f"{rootdir}/{split}/*_label.npz")
+        filelist.sort()
+
+        print(f"n{split}:", len(filelist))
+        self.split = split
+        self.filelist = filelist
+
+    def __len__(self):
+        return len(self.filelist)
+
+    def __getitem__(self, idx):
+        iname = self.filelist[idx][:-10].replace("_a0", "").replace("_a1", "") + ".png"
+        image = io.imread(iname).astype(float)[:, :, :3]
+        if "a1" in self.filelist[idx]:
+            image = image[:, ::-1, :]
+        image = (image - M.image.mean) / M.image.stddev
+        image = np.rollaxis(image, 2).copy()
+
+        with np.load(self.filelist[idx]) as npz:
+            target = {
+                name: torch.from_numpy(npz[name]).float()
+                for name in ["jmap", "joff", "lmap"]
+            }
+            lpos = np.random.permutation(npz["lpos"])[: M.n_stc_posl]
+            lneg = np.random.permutation(npz["lneg"])[: M.n_stc_negl]
+            npos, nneg = len(lpos), len(lneg)
+            lpre = np.concatenate([lpos, lneg], 0)
+            for i in range(len(lpre)):
+                if random.random() > 0.5:
+                    lpre[i] = lpre[i, ::-1]
+            ldir = lpre[:, 0, :2] - lpre[:, 1, :2]
+            ldir /= np.clip(LA.norm(ldir, axis=1, keepdims=True), 1e-6, None)
+            feat = [
+                lpre[:, :, :2].reshape(-1, 4) / 128 * M.use_cood,
+                ldir * M.use_slop,
+                lpre[:, :, 2],
+            ]
+            feat = np.concatenate(feat, 1)
+            meta = {
+                "junc": torch.from_numpy(npz["junc"][:, :2]),
+                "jtyp": torch.from_numpy(npz["junc"][:, 2]).byte(),
+                "Lpos": self.adjacency_matrix(len(npz["junc"]), npz["Lpos"]),
+                "Lneg": self.adjacency_matrix(len(npz["junc"]), npz["Lneg"]),
+                "lpre": torch.from_numpy(lpre[:, :, :2]),
+                "lpre_label": torch.cat([torch.ones(npos), torch.zeros(nneg)]),
+                "lpre_feat": torch.from_numpy(feat),
+            }
+
+        return torch.from_numpy(image).float(), meta, target
+
+    def adjacency_matrix(self, n, link):
+        mat = torch.zeros(n + 1, n + 1, dtype=torch.uint8)
+        link = torch.from_numpy(link)
+        if len(link) > 0:
+            mat[link[:, 0], link[:, 1]] = 1
+            mat[link[:, 1], link[:, 0]] = 1
+        return mat
+
+
+def collate(batch):
+    return (
+        default_collate([b[0] for b in batch]),
+        [b[1] for b in batch],
+        default_collate([b[2] for b in batch]),
+    )

+ 209 - 0
lcnn/metric.py

@@ -0,0 +1,209 @@
+import numpy as np
+import numpy.linalg as LA
+import matplotlib.pyplot as plt
+
+from lcnn.utils import argsort2d
+
+DX = [0, 0, 1, -1, 1, 1, -1, -1]
+DY = [1, -1, 0, 0, 1, -1, 1, -1]
+
+
+def ap(tp, fp):
+    recall = tp
+    precision = tp / np.maximum(tp + fp, 1e-9)
+
+    recall = np.concatenate(([0.0], recall, [1.0]))
+    precision = np.concatenate(([0.0], precision, [0.0]))
+
+    for i in range(precision.size - 1, 0, -1):
+        precision[i - 1] = max(precision[i - 1], precision[i])
+    i = np.where(recall[1:] != recall[:-1])[0]
+    return np.sum((recall[i + 1] - recall[i]) * precision[i + 1])
+
+
+def APJ(vert_pred, vert_gt, max_distance, im_ids):
+    if len(vert_pred) == 0:
+        return 0
+
+    vert_pred = np.array(vert_pred)
+    vert_gt = np.array(vert_gt)
+
+    confidence = vert_pred[:, -1]
+    idx = np.argsort(-confidence)
+    vert_pred = vert_pred[idx, :]
+    im_ids = im_ids[idx]
+    n_gt = sum(len(gt) for gt in vert_gt)
+
+    nd = len(im_ids)
+    tp, fp = np.zeros(nd, dtype=np.float), np.zeros(nd, dtype=np.float)
+    hit = [[False for _ in j] for j in vert_gt]
+
+    for i in range(nd):
+        gt_juns = vert_gt[im_ids[i]]
+        pred_juns = vert_pred[i][:-1]
+        if len(gt_juns) == 0:
+            continue
+        dists = np.linalg.norm((pred_juns[None, :] - gt_juns), axis=1)
+        choice = np.argmin(dists)
+        dist = np.min(dists)
+        if dist < max_distance and not hit[im_ids[i]][choice]:
+            tp[i] = 1
+            hit[im_ids[i]][choice] = True
+        else:
+            fp[i] = 1
+
+    tp = np.cumsum(tp) / n_gt
+    fp = np.cumsum(fp) / n_gt
+    return ap(tp, fp)
+
+
+def nms_j(heatmap, delta=1):
+    heatmap = heatmap.copy()
+    disable = np.zeros_like(heatmap, dtype=np.bool)
+    for x, y in argsort2d(heatmap):
+        for dx, dy in zip(DX, DY):
+            xp, yp = x + dx, y + dy
+            if not (0 <= xp < heatmap.shape[0] and 0 <= yp < heatmap.shape[1]):
+                continue
+            if heatmap[x, y] >= heatmap[xp, yp]:
+                disable[xp, yp] = True
+    heatmap[disable] *= 0.6
+    return heatmap
+
+
+def mAPJ(pred, truth, distances, im_ids):
+    return sum(APJ(pred, truth, d, im_ids) for d in distances) / len(distances) * 100
+
+
+def post_jheatmap(heatmap, offset=None, delta=1):
+    heatmap = nms_j(heatmap, delta=delta)
+    # only select the best 1000 junctions for efficiency
+    v0 = argsort2d(-heatmap)[:1000]
+    confidence = -np.sort(-heatmap.ravel())[:1000]
+    keep_id = np.where(confidence >= 1e-2)[0]
+    if len(keep_id) == 0:
+        return np.zeros((0, 3))
+
+    confidence = confidence[keep_id]
+    if offset is not None:
+        v0 = np.array([v + offset[:, v[0], v[1]] for v in v0])
+    v0 = v0[keep_id] + 0.5
+    v0 = np.hstack((v0, confidence[:, np.newaxis]))
+    return v0
+
+
+def vectorized_wireframe_2d_metric(
+    vert_pred, dpth_pred, edge_pred, vert_gt, dpth_gt, edge_gt, threshold
+):
+    # staging 1: matching
+    nd = len(vert_pred)
+    sorted_confidence = np.argsort(-vert_pred[:, -1])
+    vert_pred = vert_pred[sorted_confidence, :-1]
+    dpth_pred = dpth_pred[sorted_confidence]
+    d = np.sqrt(
+        np.sum(vert_pred ** 2, 1)[:, None]
+        + np.sum(vert_gt ** 2, 1)[None, :]
+        - 2 * vert_pred @ vert_gt.T
+    )
+    choice = np.argmin(d, 1)
+    dist = np.min(d, 1)
+
+    # staging 2: compute depth metric: SIL/L2
+    loss_L1 = loss_L2 = 0
+    hit = np.zeros_like(dpth_gt, np.bool)
+    SIL = np.zeros(dpth_pred)
+    for i in range(nd):
+        if dist[i] < threshold and not hit[choice[i]]:
+            hit[choice[i]] = True
+            loss_L1 += abs(dpth_gt[choice[i]] - dpth_pred[i])
+            loss_L2 += (dpth_gt[choice[i]] - dpth_pred[i]) ** 2
+            a = np.maximum(-dpth_pred[i], 1e-10)
+            b = -dpth_gt[choice[i]]
+            SIL[i] = np.log(a) - np.log(b)
+        else:
+            choice[i] = -1
+
+    n = max(np.sum(hit), 1)
+    loss_L1 /= n
+    loss_L2 /= n
+    loss_SIL = np.sum(SIL ** 2) / n - np.sum(SIL) ** 2 / (n * n)
+
+    # staging 3: compute mAP for edge matching
+    edgeset = set([frozenset(e) for e in edge_gt])
+    tp = np.zeros(len(edge_pred), dtype=np.float)
+    fp = np.zeros(len(edge_pred), dtype=np.float)
+    for i, (v0, v1, score) in enumerate(sorted(edge_pred, key=-edge_pred[2])):
+        length = LA.norm(vert_gt[v0] - vert_gt[v1], axis=1)
+        if frozenset([choice[v0], choice[v1]]) in edgeset:
+            tp[i] = length
+        else:
+            fp[i] = length
+    total_length = LA.norm(
+        vert_gt[edge_gt[:, 0]] - vert_gt[edge_gt[:, 1]], axis=1
+    ).sum()
+    return ap(tp / total_length, fp / total_length), (loss_SIL, loss_L1, loss_L2)
+
+
+def vectorized_wireframe_3d_metric(
+    vert_pred, dpth_pred, edge_pred, vert_gt, dpth_gt, edge_gt, threshold
+):
+    # staging 1: matching
+    nd = len(vert_pred)
+    sorted_confidence = np.argsort(-vert_pred[:, -1])
+    vert_pred = np.hstack([vert_pred[:, :-1], dpth_pred[:, None]])[sorted_confidence]
+    vert_gt = np.hstack([vert_gt[:, :-1], dpth_gt[:, None]])
+    d = np.sqrt(
+        np.sum(vert_pred ** 2, 1)[:, None]
+        + np.sum(vert_gt ** 2, 1)[None, :]
+        - 2 * vert_pred @ vert_gt.T
+    )
+    choice = np.argmin(d, 1)
+    dist = np.min(d, 1)
+    hit = np.zeros_like(dpth_gt, np.bool)
+    for i in range(nd):
+        if dist[i] < threshold and not hit[choice[i]]:
+            hit[choice[i]] = True
+        else:
+            choice[i] = -1
+
+    # staging 2: compute mAP for edge matching
+    edgeset = set([frozenset(e) for e in edge_gt])
+    tp = np.zeros(len(edge_pred), dtype=np.float)
+    fp = np.zeros(len(edge_pred), dtype=np.float)
+    for i, (v0, v1, score) in enumerate(sorted(edge_pred, key=-edge_pred[2])):
+        length = LA.norm(vert_gt[v0] - vert_gt[v1], axis=1)
+        if frozenset([choice[v0], choice[v1]]) in edgeset:
+            tp[i] = length
+        else:
+            fp[i] = length
+    total_length = LA.norm(
+        vert_gt[edge_gt[:, 0]] - vert_gt[edge_gt[:, 1]], axis=1
+    ).sum()
+
+    return ap(tp / total_length, fp / total_length)
+
+
+def msTPFP(line_pred, line_gt, threshold):
+    diff = ((line_pred[:, None, :, None] - line_gt[:, None]) ** 2).sum(-1)
+    diff = np.minimum(
+        diff[:, :, 0, 0] + diff[:, :, 1, 1], diff[:, :, 0, 1] + diff[:, :, 1, 0]
+    )
+    choice = np.argmin(diff, 1)
+    dist = np.min(diff, 1)
+    hit = np.zeros(len(line_gt), np.bool)
+    tp = np.zeros(len(line_pred), np.float)
+    fp = np.zeros(len(line_pred), np.float)
+    for i in range(len(line_pred)):
+        if dist[i] < threshold and not hit[choice[i]]:
+            hit[choice[i]] = True
+            tp[i] = 1
+        else:
+            fp[i] = 1
+    return tp, fp
+
+
+def msAP(line_pred, line_gt, threshold):
+    tp, fp = msTPFP(line_pred, line_gt, threshold)
+    tp = np.cumsum(tp) / len(line_gt)
+    fp = np.cumsum(fp) / len(line_gt)
+    return ap(tp, fp)

+ 3 - 0
lcnn/models/__init__.py

@@ -0,0 +1,3 @@
+# flake8: noqa
+from .hourglass_pose import hg
+# from .dla import dla169, dla102x, dla102x2

+ 201 - 0
lcnn/models/hourglass_pose.py

@@ -0,0 +1,201 @@
+"""
+Hourglass network inserted in the pre-activated Resnet
+Use lr=0.01 for current version
+(c) Yichao Zhou (LCNN)
+(c) YANG, Wei
+"""
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+__all__ = ["HourglassNet", "hg"]
+
+
+class Bottleneck2D(nn.Module):
+    expansion = 2
+
+    def __init__(self, inplanes, planes, stride=1, downsample=None):
+        super(Bottleneck2D, self).__init__()
+
+        self.bn1 = nn.BatchNorm2d(inplanes)
+        self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1)
+        self.bn2 = nn.BatchNorm2d(planes)
+        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1)
+        self.bn3 = nn.BatchNorm2d(planes)
+        self.conv3 = nn.Conv2d(planes, planes * 2, kernel_size=1)
+        self.relu = nn.ReLU(inplace=True)
+        self.downsample = downsample
+        self.stride = stride
+
+    def forward(self, x):
+        residual = x
+
+        out = self.bn1(x)
+        out = self.relu(out)
+        out = self.conv1(out)
+
+        out = self.bn2(out)
+        out = self.relu(out)
+        out = self.conv2(out)
+
+        out = self.bn3(out)
+        out = self.relu(out)
+        out = self.conv3(out)
+
+        if self.downsample is not None:
+            residual = self.downsample(x)
+
+        out += residual
+
+        return out
+
+
+class Hourglass(nn.Module):
+    def __init__(self, block, num_blocks, planes, depth):
+        super(Hourglass, self).__init__()
+        self.depth = depth
+        self.block = block
+        self.hg = self._make_hour_glass(block, num_blocks, planes, depth)
+
+    def _make_residual(self, block, num_blocks, planes):
+        layers = []
+        for i in range(0, num_blocks):
+            layers.append(block(planes * block.expansion, planes))
+        return nn.Sequential(*layers)
+
+    def _make_hour_glass(self, block, num_blocks, planes, depth):
+        hg = []
+        for i in range(depth):
+            res = []
+            for j in range(3):
+                res.append(self._make_residual(block, num_blocks, planes))
+            if i == 0:
+                res.append(self._make_residual(block, num_blocks, planes))
+            hg.append(nn.ModuleList(res))
+        return nn.ModuleList(hg)
+
+    def _hour_glass_forward(self, n, x):
+        up1 = self.hg[n - 1][0](x)
+        low1 = F.max_pool2d(x, 2, stride=2)
+        low1 = self.hg[n - 1][1](low1)
+
+        if n > 1:
+            low2 = self._hour_glass_forward(n - 1, low1)
+        else:
+            low2 = self.hg[n - 1][3](low1)
+        low3 = self.hg[n - 1][2](low2)
+        up2 = F.interpolate(low3, scale_factor=2)
+        out = up1 + up2
+        return out
+
+    def forward(self, x):
+        return self._hour_glass_forward(self.depth, x)
+
+
+class HourglassNet(nn.Module):
+    """Hourglass model from Newell et al ECCV 2016"""
+
+    def __init__(self, block, head, depth, num_stacks, num_blocks, num_classes):
+        super(HourglassNet, self).__init__()
+
+        self.inplanes = 64
+        self.num_feats = 128
+        self.num_stacks = num_stacks
+        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3)
+        self.bn1 = nn.BatchNorm2d(self.inplanes)
+        self.relu = nn.ReLU(inplace=True)
+        self.layer1 = self._make_residual(block, self.inplanes, 1)
+        self.layer2 = self._make_residual(block, self.inplanes, 1)
+        self.layer3 = self._make_residual(block, self.num_feats, 1)
+        self.maxpool = nn.MaxPool2d(2, stride=2)
+
+        # build hourglass modules
+        ch = self.num_feats * block.expansion
+        # vpts = []
+        hg, res, fc, score, fc_, score_ = [], [], [], [], [], []
+        for i in range(num_stacks):
+            hg.append(Hourglass(block, num_blocks, self.num_feats, depth))
+            res.append(self._make_residual(block, self.num_feats, num_blocks))
+            fc.append(self._make_fc(ch, ch))
+            score.append(head(ch, num_classes))
+            # vpts.append(VptsHead(ch))
+            # vpts.append(nn.Linear(ch, 9))
+            # score.append(nn.Conv2d(ch, num_classes, kernel_size=1))
+            # score[i].bias.data[0] += 4.6
+            # score[i].bias.data[2] += 4.6
+            if i < num_stacks - 1:
+                fc_.append(nn.Conv2d(ch, ch, kernel_size=1))
+                score_.append(nn.Conv2d(num_classes, ch, kernel_size=1))
+        self.hg = nn.ModuleList(hg)
+        self.res = nn.ModuleList(res)
+        self.fc = nn.ModuleList(fc)
+        self.score = nn.ModuleList(score)
+        # self.vpts = nn.ModuleList(vpts)
+        self.fc_ = nn.ModuleList(fc_)
+        self.score_ = nn.ModuleList(score_)
+
+    def _make_residual(self, block, planes, blocks, stride=1):
+        downsample = None
+        if stride != 1 or self.inplanes != planes * block.expansion:
+            downsample = nn.Sequential(
+                nn.Conv2d(
+                    self.inplanes,
+                    planes * block.expansion,
+                    kernel_size=1,
+                    stride=stride,
+                )
+            )
+
+        layers = []
+        layers.append(block(self.inplanes, planes, stride, downsample))
+        self.inplanes = planes * block.expansion
+        for i in range(1, blocks):
+            layers.append(block(self.inplanes, planes))
+
+        return nn.Sequential(*layers)
+
+    def _make_fc(self, inplanes, outplanes):
+        bn = nn.BatchNorm2d(inplanes)
+        conv = nn.Conv2d(inplanes, outplanes, kernel_size=1)
+        return nn.Sequential(conv, bn, self.relu)
+
+    def forward(self, x):
+        out = []
+        # out_vps = []
+        x = self.conv1(x)
+        x = self.bn1(x)
+        x = self.relu(x)
+
+        x = self.layer1(x)
+        x = self.maxpool(x)
+        x = self.layer2(x)
+        x = self.layer3(x)
+
+        for i in range(self.num_stacks):
+            y = self.hg[i](x)
+            y = self.res[i](y)
+            y = self.fc[i](y)
+            score = self.score[i](y)
+            # pre_vpts = F.adaptive_avg_pool2d(x, (1, 1))
+            # pre_vpts = pre_vpts.reshape(-1, 256)
+            # vpts = self.vpts[i](x)
+            out.append(score)
+            # out_vps.append(vpts)
+            if i < self.num_stacks - 1:
+                fc_ = self.fc_[i](y)
+                score_ = self.score_[i](score)
+                x = x + fc_ + score_
+
+        return out[::-1], y  # , out_vps[::-1]
+
+
+def hg(**kwargs):
+    model = HourglassNet(
+        Bottleneck2D,
+        head=kwargs.get("head", lambda c_in, c_out: nn.Conv2D(c_in, c_out, 1)),
+        depth=kwargs["depth"],
+        num_stacks=kwargs["num_stacks"],
+        num_blocks=kwargs["num_blocks"],
+        num_classes=kwargs["num_classes"],
+    )
+    return model

+ 263 - 0
lcnn/models/line_vectorizer.py

@@ -0,0 +1,263 @@
+import random
+import itertools
+from collections import defaultdict
+
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.parallel
+import torch.nn.functional as F
+
+from lcnn.config import M
+
+FEATURE_DIM = 8
+
+
+class LineVectorizer(nn.Module):
+    def __init__(self, backbone):
+        super().__init__()
+        self.backbone = backbone
+
+        lambda_ = torch.linspace(0, 1, M.n_pts0)[:, None]
+        self.register_buffer("lambda_", lambda_)
+        self.do_static_sampling = M.n_stc_posl + M.n_stc_negl > 0
+
+        self.fc1 = nn.Conv2d(256, M.dim_loi, 1)
+        scale_factor = M.n_pts0 // M.n_pts1
+        if M.use_conv:
+            self.pooling = nn.Sequential(
+                nn.MaxPool1d(scale_factor, scale_factor),
+                Bottleneck1D(M.dim_loi, M.dim_loi),
+            )
+            self.fc2 = nn.Sequential(
+                nn.ReLU(inplace=True), nn.Linear(M.dim_loi * M.n_pts1 + FEATURE_DIM, 1)
+            )
+        else:
+            self.pooling = nn.MaxPool1d(scale_factor, scale_factor)
+            self.fc2 = nn.Sequential(
+                nn.Linear(M.dim_loi * M.n_pts1 + FEATURE_DIM, M.dim_fc),
+                nn.ReLU(inplace=True),
+                nn.Linear(M.dim_fc, M.dim_fc),
+                nn.ReLU(inplace=True),
+                nn.Linear(M.dim_fc, 1),
+            )
+        self.loss = nn.BCEWithLogitsLoss(reduction="none")
+
+    def forward(self, input_dict):
+        result = self.backbone(input_dict)
+        h = result["heatmaps"]
+        x = self.fc1(result["feature"])
+        n_batch, n_channel, row, col = x.shape
+
+        xs, ys, fs, ps, idx, jcs = [], [], [], [], [0], []
+        for i, meta in enumerate(input_dict["meta"]):
+            p, label, feat, jc = self.sample_lines(
+                meta, h["jmap"][i], h["joff"][i], input_dict["do_evaluation"]
+            )
+            # print("p.shape:", p.shape)
+            ys.append(label)
+            if not input_dict["do_evaluation"] and self.do_static_sampling:
+                p = torch.cat([p, meta["lpre"]])
+                feat = torch.cat([feat, meta["lpre_feat"]])
+                ys.append(meta["lpre_label"])
+                del jc
+            else:
+                jcs.append(jc)
+                ps.append(p)
+            fs.append(feat)
+
+            p = p[:, 0:1, :] * self.lambda_ + p[:, 1:2, :] * (1 - self.lambda_) - 0.5
+            p = p.reshape(-1, 2)  # [N_LINE x N_POINT, 2_XY]
+            px, py = p[:, 0].contiguous(), p[:, 1].contiguous()
+            px0 = px.floor().clamp(min=0, max=127)
+            py0 = py.floor().clamp(min=0, max=127)
+            px1 = (px0 + 1).clamp(min=0, max=127)
+            py1 = (py0 + 1).clamp(min=0, max=127)
+            px0l, py0l, px1l, py1l = px0.long(), py0.long(), px1.long(), py1.long()
+
+            # xp: [N_LINE, N_CHANNEL, N_POINT]
+            xp = (
+                (
+                    x[i, :, px0l, py0l] * (px1 - px) * (py1 - py)
+                    + x[i, :, px1l, py0l] * (px - px0) * (py1 - py)
+                    + x[i, :, px0l, py1l] * (px1 - px) * (py - py0)
+                    + x[i, :, px1l, py1l] * (px - px0) * (py - py0)
+                )
+                .reshape(n_channel, -1, M.n_pts0)
+                .permute(1, 0, 2)
+            )
+            xp = self.pooling(xp)
+            xs.append(xp)
+            idx.append(idx[-1] + xp.shape[0])
+
+        x, y = torch.cat(xs), torch.cat(ys)
+        f = torch.cat(fs)
+        x = x.reshape(-1, M.n_pts1 * M.dim_loi)
+        x = torch.cat([x, f], 1)
+        x = self.fc2(x).flatten()
+
+        def sum_batch(x):
+            xs = [x[idx[i] : idx[i + 1]].sum()[None] for i in range(n_batch)]
+            return torch.cat(xs)
+
+        loss = self.loss(x, y)
+        lpos_mask, lneg_mask = y, 1 - y
+        loss_lpos, loss_lneg = loss * lpos_mask, loss * lneg_mask
+        lpos = sum_batch(loss_lpos) / sum_batch(lpos_mask).clamp(min=1)
+        lneg = sum_batch(loss_lneg) / sum_batch(lneg_mask).clamp(min=1)
+        result["losses"][0]["lpos"] = lpos * M.loss_weight["lpos"]
+        result["losses"][0]["lneg"] = lneg * M.loss_weight["lneg"]
+
+        if input_dict["do_evaluation"]:
+            p = torch.cat(ps)
+            s = torch.sigmoid(x)
+            b = s > 0.5
+            lines = []
+            score = []
+            for i in range(n_batch):
+                p0 = p[idx[i] : idx[i + 1]]
+                s0 = s[idx[i] : idx[i + 1]]
+                mask = b[idx[i] : idx[i + 1]]
+                p0 = p0[mask]
+                s0 = s0[mask]
+                if len(p0) == 0:
+                    lines.append(torch.zeros([1, M.n_out_line, 2, 2], device=p.device))
+                    score.append(torch.zeros([1, M.n_out_line], device=p.device))
+                else:
+                    arg = torch.argsort(s0, descending=True)
+                    p0, s0 = p0[arg], s0[arg]
+                    lines.append(p0[None, torch.arange(M.n_out_line) % len(p0)])
+                    score.append(s0[None, torch.arange(M.n_out_line) % len(s0)])
+                for j in range(len(jcs[i])):
+                    if len(jcs[i][j]) == 0:
+                        jcs[i][j] = torch.zeros([M.n_out_junc, 2], device=p.device)
+                    jcs[i][j] = jcs[i][j][
+                        None, torch.arange(M.n_out_junc) % len(jcs[i][j])
+                    ]
+            result["heatmaps"]["lines"] = torch.cat(lines)
+            result["heatmaps"]["score"] = torch.cat(score)
+            result["heatmaps"]["juncs"] = torch.cat([jcs[i][0] for i in range(n_batch)])
+            if len(jcs[i]) > 1:
+                result["heatmaps"]["junts"] = torch.cat(
+                    [jcs[i][1] for i in range(n_batch)]
+                )
+        else:
+            if "heatmaps" in result:
+                del result["heatmaps"]
+        return result
+
+    def sample_lines(self, meta, jmap, joff, do_evaluation):
+        with torch.no_grad():
+            junc = meta["junc"]  # [N, 2]
+            jtyp = meta["jtyp"]  # [N]
+            Lpos = meta["Lpos"]
+            Lneg = meta["Lneg"]
+
+            n_type = jmap.shape[0]
+            jmap = non_maximum_suppression(jmap).reshape(n_type, -1)
+            joff = joff.reshape(n_type, 2, -1)
+            N = len(junc)
+            K = min(int(N * 2 + 2), M.n_dyn_junc // n_type)
+            device = jmap.device
+
+            # index: [N_TYPE, K]
+            score, index = torch.topk(jmap, k=K)
+            y = (index / 128).float() + torch.gather(joff[:, 0], 1, index) + 0.5
+            x = (index % 128).float() + torch.gather(joff[:, 1], 1, index) + 0.5
+
+            # xy: [N_TYPE, K, 2]
+            xy = torch.cat([y[..., None], x[..., None]], dim=-1)
+            xy_ = xy[..., None, :]
+            del x, y, index
+
+            # dist: [N_TYPE, K, N]
+            dist = torch.sum((xy_ - junc) ** 2, -1)
+            cost, match = torch.min(dist, -1)
+
+            # xy: [N_TYPE * K, 2]
+            # match: [N_TYPE, K]
+            for t in range(n_type):
+                match[t, jtyp[match[t]] != t] = N
+            match[cost > 1.5 * 1.5] = N
+            match = match.flatten()
+
+            _ = torch.arange(len(match), device=device)
+            u, v = torch.meshgrid(_, _)
+            u, v = u.flatten(), v.flatten()
+            up, vp = match[u], match[v]
+            label = Lpos[up, vp]
+
+            if do_evaluation:
+                c = (u < v).flatten()
+            else:
+                c = torch.zeros_like(label)
+
+                # sample positive lines
+                cdx = label.nonzero().flatten()
+                if len(cdx) > M.n_dyn_posl:
+                    # print("too many positive lines")
+                    perm = torch.randperm(len(cdx), device=device)[: M.n_dyn_posl]
+                    cdx = cdx[perm]
+                c[cdx] = 1
+
+                # sample negative lines
+                cdx = Lneg[up, vp].nonzero().flatten()
+                if len(cdx) > M.n_dyn_negl:
+                    # print("too many negative lines")
+                    perm = torch.randperm(len(cdx), device=device)[: M.n_dyn_negl]
+                    cdx = cdx[perm]
+                c[cdx] = 1
+
+                # sample other (unmatched) lines
+                cdx = torch.randint(len(c), (M.n_dyn_othr,), device=device)
+                c[cdx] = 1
+
+            # sample lines
+            u, v, label = u[c], v[c], label[c]
+            xy = xy.reshape(n_type * K, 2)
+            xyu, xyv = xy[u], xy[v]
+
+            u2v = xyu - xyv
+            u2v /= torch.sqrt((u2v ** 2).sum(-1, keepdim=True)).clamp(min=1e-6)
+            feat = torch.cat(
+                [
+                    xyu / 128 * M.use_cood,
+                    xyv / 128 * M.use_cood,
+                    u2v * M.use_slop,
+                    (u[:, None] > K).float(),
+                    (v[:, None] > K).float(),
+                ],
+                1,
+            )
+            line = torch.cat([xyu[:, None], xyv[:, None]], 1)
+
+            xy = xy.reshape(n_type, K, 2)
+            jcs = [xy[i, score[i] > 0.03] for i in range(n_type)]
+            return line, label.float(), feat, jcs
+
+
+def non_maximum_suppression(a):
+    ap = F.max_pool2d(a, 3, stride=1, padding=1)
+    mask = (a == ap).float().clamp(min=0.0)
+    return a * mask
+
+
+class Bottleneck1D(nn.Module):
+    def __init__(self, inplanes, outplanes):
+        super(Bottleneck1D, self).__init__()
+
+        planes = outplanes // 2
+        self.op = nn.Sequential(
+            nn.BatchNorm1d(inplanes),
+            nn.ReLU(inplace=True),
+            nn.Conv1d(inplanes, planes, kernel_size=1),
+            nn.BatchNorm1d(planes),
+            nn.ReLU(inplace=True),
+            nn.Conv1d(planes, planes, kernel_size=3, padding=1),
+            nn.BatchNorm1d(planes),
+            nn.ReLU(inplace=True),
+            nn.Conv1d(planes, outplanes, kernel_size=1),
+        )
+
+    def forward(self, x):
+        return x + self.op(x)

+ 108 - 0
lcnn/models/multitask_learner.py

@@ -0,0 +1,108 @@
+from collections import OrderedDict, defaultdict
+
+import numpy as np
+import torch
+import torch.nn as nn
+import torch.nn.functional as F
+
+from lcnn.config import M
+
+
+class MultitaskHead(nn.Module):
+    def __init__(self, input_channels, num_class):
+        super(MultitaskHead, self).__init__()
+
+        m = int(input_channels / 4)
+        heads = []
+        for output_channels in sum(M.head_size, []):
+            heads.append(
+                nn.Sequential(
+                    nn.Conv2d(input_channels, m, kernel_size=3, padding=1),
+                    nn.ReLU(inplace=True),
+                    nn.Conv2d(m, output_channels, kernel_size=1),
+                )
+            )
+        self.heads = nn.ModuleList(heads)
+        assert num_class == sum(sum(M.head_size, []))
+
+    def forward(self, x):
+        return torch.cat([head(x) for head in self.heads], dim=1)
+
+
+class MultitaskLearner(nn.Module):
+    def __init__(self, backbone):
+        super(MultitaskLearner, self).__init__()
+        self.backbone = backbone
+        head_size = M.head_size
+        self.num_class = sum(sum(head_size, []))
+        self.head_off = np.cumsum([sum(h) for h in head_size])
+
+    def forward(self, input_dict, output_feature=True):
+        image = input_dict["image"]
+        outputs, feature = self.backbone(image)
+        result = {"feature": feature}
+        batch, channel, row, col = outputs[0].shape
+
+        T = input_dict["target"].copy()
+        n_jtyp = T["jmap"].shape[1]
+
+        # switch to CNHW
+        for task in ["jmap"]:
+            T[task] = T[task].permute(1, 0, 2, 3)
+        for task in ["joff"]:
+            T[task] = T[task].permute(1, 2, 0, 3, 4)
+
+        offset = self.head_off
+        loss_weight = M.loss_weight
+        losses = []
+        for stack, output in enumerate(outputs):
+            output = output.transpose(0, 1).reshape([-1, batch, row, col]).contiguous()
+            jmap = output[0 : offset[0]].reshape(n_jtyp, 2, batch, row, col)
+            lmap = output[offset[0] : offset[1]].squeeze(0)
+            joff = output[offset[1] : offset[2]].reshape(n_jtyp, 2, batch, row, col)
+            if stack == 0:
+                result["heatmaps"] = {
+                    "jmap": jmap.permute(2, 0, 1, 3, 4).softmax(2)[:, :, 1],
+                    "lmap": lmap.sigmoid(),
+                    "joff": joff.permute(2, 0, 1, 3, 4).sigmoid() - 0.5,
+                }
+
+            L = OrderedDict()
+            L["jmap"] = sum(
+                cross_entropy_loss(jmap[i], T["jmap"][i]) for i in range(n_jtyp)
+            )
+            L["lmap"] = (
+                F.binary_cross_entropy_with_logits(lmap, T["lmap"], reduction="none")
+                .mean(2)
+                .mean(1)
+            )
+            L["joff"] = sum(
+                sigmoid_l1_loss(joff[i, j], T["joff"][i, j], -0.5, T["jmap"][i])
+                for i in range(n_jtyp)
+                for j in range(2)
+            )
+            for loss_name in L:
+                L[loss_name].mul_(loss_weight[loss_name])
+            losses.append(L)
+        result["losses"] = losses
+        return result
+
+
+def l2loss(input, target):
+    return ((target - input) ** 2).mean(2).mean(1)
+
+
+def cross_entropy_loss(logits, positive):
+    nlogp = -F.log_softmax(logits, dim=0)
+    return (positive * nlogp[1] + (1 - positive) * nlogp[0]).mean(2).mean(1)
+
+
+def sigmoid_l1_loss(logits, target, offset=0.0, mask=None):
+    logp = torch.sigmoid(logits) + offset
+    loss = torch.abs(logp - target)
+    if mask is not None:
+        w = mask.mean(2, True).mean(1, True)
+        w[w == 0] = 1
+        loss = loss * (mask / w)
+
+    return loss.mean(2).mean(1)

+ 331 - 0
lcnn/trainer.py

@@ -0,0 +1,331 @@
+import os
+import time
+import atexit
+import shutil
+import signal
+import os.path as osp
+import threading
+import subprocess
+from timeit import default_timer as timer
+
+import numpy as np
+import torch
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+import torch.nn.functional as F
+from skimage import io
+from tensorboardX import SummaryWriter
+
+from lcnn.utils import recursive_to
+from lcnn.config import C
+
+
+class Trainer(object):
+    def __init__(self, device, model, optimizer, train_loader, val_loader, out):
+        self.device = device
+
+        self.model = model
+        self.optim = optimizer
+
+        self.train_loader = train_loader
+        self.val_loader = val_loader
+        self.batch_size = C.model.batch_size
+
+        self.validation_interval = C.io.validation_interval
+
+        self.out = out
+        if not osp.exists(self.out):
+            os.makedirs(self.out)
+
+        self.run_tensorboard()
+        time.sleep(1)
+
+        self.epoch = 0
+        self.iteration = 0
+        self.max_epoch = C.optim.max_epoch
+        self.lr_decay_epoch = C.optim.lr_decay_epoch
+        self.num_stacks = C.model.num_stacks
+        self.mean_loss = self.best_mean_loss = 1e1000
+
+        self.loss_labels = None
+        self.avg_metrics = None
+        self.metrics = np.zeros(0)
+
+    def run_tensorboard(self):
+        board_out = osp.join(self.out, "tensorboard")
+        if not osp.exists(board_out):
+            os.makedirs(board_out)
+        self.writer = SummaryWriter(board_out)
+        os.environ["CUDA_VISIBLE_DEVICES"] = ""
+        p = subprocess.Popen(
+            ["tensorboard", f"--logdir={board_out}", f"--port={C.io.tensorboard_port}"]
+        )
+
+        def killme():
+            os.kill(p.pid, signal.SIGTERM)
+
+        atexit.register(killme)
+
+    def _loss(self, result):
+        losses = result["losses"]
+        # Don't move loss label to other place.
+        # If I want to change the loss, I just need to change this function.
+        if self.loss_labels is None:
+            self.loss_labels = ["sum"] + list(losses[0].keys())
+            self.metrics = np.zeros([self.num_stacks, len(self.loss_labels)])
+            print()
+            print(
+                "| ".join(
+                    ["progress "]
+                    + list(map("{:7}".format, self.loss_labels))
+                    + ["speed"]
+                )
+            )
+            with open(f"{self.out}/loss.csv", "a") as fout:
+                print(",".join(["progress"] + self.loss_labels), file=fout)
+
+        total_loss = 0
+        for i in range(self.num_stacks):
+            for j, name in enumerate(self.loss_labels):
+                if name == "sum":
+                    continue
+                if name not in losses[i]:
+                    assert i != 0
+                    continue
+                loss = losses[i][name].mean()
+                self.metrics[i, 0] += loss.item()
+                self.metrics[i, j] += loss.item()
+                total_loss += loss
+        return total_loss
+
+    def validate(self):
+        tprint("Running validation...", " " * 75)
+        training = self.model.training
+        self.model.eval()
+
+        viz = osp.join(self.out, "viz", f"{self.iteration * self.batch_size:09d}")
+        npz = osp.join(self.out, "npz", f"{self.iteration * self.batch_size:09d}")
+        osp.exists(viz) or os.makedirs(viz)
+        osp.exists(npz) or os.makedirs(npz)
+
+        total_loss = 0
+        self.metrics[...] = 0
+        with torch.no_grad():
+            for batch_idx, (image, meta, target) in enumerate(self.val_loader):
+                input_dict = {
+                    "image": recursive_to(image, self.device),
+                    "meta": recursive_to(meta, self.device),
+                    "target": recursive_to(target, self.device),
+                    "do_evaluation": True,
+                }
+                result = self.model(input_dict)
+
+                total_loss += self._loss(result)
+
+                H = result["heatmaps"]
+                for i in range(H["jmap"].shape[0]):
+                    index = batch_idx * self.batch_size + i
+                    np.savez(
+                        f"{npz}/{index:06}.npz",
+                        **{k: v[i].cpu().numpy() for k, v in H.items()},
+                    )
+                    if index >= 20:
+                        continue
+                    self._plot_samples(i, index, H, meta, target, f"{viz}/{index:06}")
+
+        self._write_metrics(len(self.val_loader), total_loss, "validation", True)
+        self.mean_loss = total_loss / len(self.val_loader)
+
+        torch.save(
+            {
+                "iteration": self.iteration,
+                "arch": self.model.__class__.__name__,
+                "optim_state_dict": self.optim.state_dict(),
+                "model_state_dict": self.model.state_dict(),
+                "best_mean_loss": self.best_mean_loss,
+            },
+            osp.join(self.out, "checkpoint_lastest.pth.tar"),
+        )
+        shutil.copy(
+            osp.join(self.out, "checkpoint_lastest.pth.tar"),
+            osp.join(npz, "checkpoint.pth.tar"),
+        )
+        if self.mean_loss < self.best_mean_loss:
+            self.best_mean_loss = self.mean_loss
+            shutil.copy(
+                osp.join(self.out, "checkpoint_lastest.pth.tar"),
+                osp.join(self.out, "checkpoint_best.pth.tar"),
+            )
+
+        if training:
+            self.model.train()
+
+    def train_epoch(self):
+        self.model.train()
+
+        time = timer()
+        for batch_idx, (image, meta, target) in enumerate(self.train_loader):
+
+            self.optim.zero_grad()
+            self.metrics[...] = 0
+
+            input_dict = {
+                "image": recursive_to(image, self.device),
+                "meta": recursive_to(meta, self.device),
+                "target": recursive_to(target, self.device),
+                "do_evaluation": False,
+            }
+            result = self.model(input_dict)
+
+            loss = self._loss(result)
+            if np.isnan(loss.item()):
+                raise ValueError("loss is nan while training")
+            loss.backward()
+            self.optim.step()
+
+            if self.avg_metrics is None:
+                self.avg_metrics = self.metrics
+            else:
+                self.avg_metrics = self.avg_metrics * 0.9 + self.metrics * 0.1
+            self.iteration += 1
+            self._write_metrics(1, loss.item(), "training", do_print=False)
+
+            if self.iteration % 4 == 0:
+                tprint(
+                    f"{self.epoch:03}/{self.iteration * self.batch_size // 1000:04}k| "
+                    + "| ".join(map("{:.5f}".format, self.avg_metrics[0]))
+                    + f"| {4 * self.batch_size / (timer() - time):04.1f} "
+                )
+                time = timer()
+            num_images = self.batch_size * self.iteration
+            if num_images % self.validation_interval == 0 or num_images == 600:
+                self.validate()
+                time = timer()
+
+    def _write_metrics(self, size, total_loss, prefix, do_print=False):
+        for i, metrics in enumerate(self.metrics):
+            for label, metric in zip(self.loss_labels, metrics):
+                self.writer.add_scalar(
+                    f"{prefix}/{i}/{label}", metric / size, self.iteration
+                )
+            if i == 0 and do_print:
+                csv_str = (
+                    f"{self.epoch:03}/{self.iteration * self.batch_size:07},"
+                    + ",".join(map("{:.11f}".format, metrics / size))
+                )
+                prt_str = (
+                    f"{self.epoch:03}/{self.iteration * self.batch_size // 1000:04}k| "
+                    + "| ".join(map("{:.5f}".format, metrics / size))
+                )
+                with open(f"{self.out}/loss.csv", "a") as fout:
+                    print(csv_str, file=fout)
+                pprint(prt_str, " " * 7)
+        self.writer.add_scalar(
+            f"{prefix}/total_loss", total_loss / size, self.iteration
+        )
+        return total_loss
+
+    def _plot_samples(self, i, index, result, meta, target, prefix):
+        fn = self.val_loader.dataset.filelist[index][:-10].replace("_a0", "") + ".png"
+        img = io.imread(fn)
+        imshow(img), plt.savefig(f"{prefix}_img.jpg"), plt.close()
+
+        mask_result = result["jmap"][i].cpu().numpy()
+        mask_target = target["jmap"][i].cpu().numpy()
+        for ch, (ia, ib) in enumerate(zip(mask_target, mask_result)):
+            imshow(ia), plt.savefig(f"{prefix}_mask_{ch}a.jpg"), plt.close()
+            imshow(ib), plt.savefig(f"{prefix}_mask_{ch}b.jpg"), plt.close()
+
+        line_result = result["lmap"][i].cpu().numpy()
+        line_target = target["lmap"][i].cpu().numpy()
+        imshow(line_target), plt.savefig(f"{prefix}_line_a.jpg"), plt.close()
+        imshow(line_result), plt.savefig(f"{prefix}_line_b.jpg"), plt.close()
+
+        def draw_vecl(lines, sline, juncs, junts, fn):
+            imshow(img)
+            if len(lines) > 0 and not (lines[0] == 0).all():
+                for i, ((a, b), s) in enumerate(zip(lines, sline)):
+                    if i > 0 and (lines[i] == lines[0]).all():
+                        break
+                    plt.plot([a[1], b[1]], [a[0], b[0]], c=c(s), linewidth=4)
+            if not (juncs[0] == 0).all():
+                for i, j in enumerate(juncs):
+                    if i > 0 and (i == juncs[0]).all():
+                        break
+                    plt.scatter(j[1], j[0], c="red", s=64, zorder=100)
+            if junts is not None and len(junts) > 0 and not (junts[0] == 0).all():
+                for i, j in enumerate(junts):
+                    if i > 0 and (i == junts[0]).all():
+                        break
+                    plt.scatter(j[1], j[0], c="blue", s=64, zorder=100)
+            plt.savefig(fn), plt.close()
+
+        junc = meta[i]["junc"].cpu().numpy() * 4
+        jtyp = meta[i]["jtyp"].cpu().numpy()
+        juncs = junc[jtyp == 0]
+        junts = junc[jtyp == 1]
+        rjuncs = result["juncs"][i].cpu().numpy() * 4
+        rjunts = None
+        if "junts" in result:
+            rjunts = result["junts"][i].cpu().numpy() * 4
+
+        lpre = meta[i]["lpre"].cpu().numpy() * 4
+        vecl_target = meta[i]["lpre_label"].cpu().numpy()
+        vecl_result = result["lines"][i].cpu().numpy() * 4
+        score = result["score"][i].cpu().numpy()
+        lpre = lpre[vecl_target == 1]
+
+        draw_vecl(lpre, np.ones(lpre.shape[0]), juncs, junts, f"{prefix}_vecl_a.jpg")
+        draw_vecl(vecl_result, score, rjuncs, rjunts, f"{prefix}_vecl_b.jpg")
+
+    def train(self):
+        plt.rcParams["figure.figsize"] = (24, 24)
+        # if self.iteration == 0:
+        #     self.validate()
+        epoch_size = len(self.train_loader)
+        start_epoch = self.iteration // epoch_size
+        for self.epoch in range(start_epoch, self.max_epoch):
+            if self.epoch == self.lr_decay_epoch:
+                self.optim.param_groups[0]["lr"] /= 10
+            self.train_epoch()
+
+
+cmap = plt.get_cmap("jet")
+norm = mpl.colors.Normalize(vmin=0.4, vmax=1.0)
+sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
+sm.set_array([])
+
+
+def c(x):
+    return sm.to_rgba(x)
+
+
+def imshow(im):
+    plt.close()
+    plt.tight_layout()
+    plt.imshow(im)
+    plt.colorbar(sm, fraction=0.046)
+    plt.xlim([0, im.shape[0]])
+    plt.ylim([im.shape[0], 0])
+
+
+def tprint(*args):
+    """Temporarily prints things on the screen"""
+    print("\r", end="")
+    print(*args, end="")
+
+
+def pprint(*args):
+    """Permanently prints things on the screen"""
+    print("\r", end="")
+    print(*args)
+
+
+def _launch_tensorboard(board_out, port, out):
+    os.environ["CUDA_VISIBLE_DEVICES"] = ""
+    p = subprocess.Popen(["tensorboard", f"--logdir={board_out}", f"--port={port}"])
+
+    def kill():
+        os.kill(p.pid, signal.SIGTERM)
+
+    atexit.register(kill)

+ 101 - 0
lcnn/utils.py

@@ -0,0 +1,101 @@
+import math
+import os.path as osp
+import multiprocessing
+from timeit import default_timer as timer
+
+import numpy as np
+import torch
+import matplotlib.pyplot as plt
+
+
+class benchmark(object):
+    def __init__(self, msg, enable=True, fmt="%0.3g"):
+        self.msg = msg
+        self.fmt = fmt
+        self.enable = enable
+
+    def __enter__(self):
+        if self.enable:
+            self.start = timer()
+        return self
+
+    def __exit__(self, *args):
+        if self.enable:
+            t = timer() - self.start
+            print(("%s : " + self.fmt + " seconds") % (self.msg, t))
+            self.time = t
+
+
+def quiver(x, y, ax):
+    ax.set_xlim(0, x.shape[1])
+    ax.set_ylim(x.shape[0], 0)
+    ax.quiver(
+        x,
+        y,
+        units="xy",
+        angles="xy",
+        scale_units="xy",
+        scale=1,
+        minlength=0.01,
+        width=0.1,
+        color="b",
+    )
+
+
+def recursive_to(input, device):
+    if isinstance(input, torch.Tensor):
+        return input.to(device)
+    if isinstance(input, dict):
+        for name in input:
+            if isinstance(input[name], torch.Tensor):
+                input[name] = input[name].to(device)
+        return input
+    if isinstance(input, list):
+        for i, item in enumerate(input):
+            input[i] = recursive_to(item, device)
+        return input
+    assert False
+
+
+def np_softmax(x, axis=0):
+    """Compute softmax values for each sets of scores in x."""
+    e_x = np.exp(x - np.max(x))
+    return e_x / e_x.sum(axis=axis, keepdims=True)
+
+
+def argsort2d(arr):
+    return np.dstack(np.unravel_index(np.argsort(arr.ravel()), arr.shape))[0]
+
+
+def __parallel_handle(f, q_in, q_out):
+    while True:
+        i, x = q_in.get()
+        if i is None:
+            break
+        q_out.put((i, f(x)))
+
+
+def parmap(f, X, nprocs=multiprocessing.cpu_count(), progress_bar=lambda x: x):
+    if nprocs == 0:
+        nprocs = multiprocessing.cpu_count()
+    q_in = multiprocessing.Queue(1)
+    q_out = multiprocessing.Queue()
+
+    proc = [
+        multiprocessing.Process(target=__parallel_handle, args=(f, q_in, q_out))
+        for _ in range(nprocs)
+    ]
+    for p in proc:
+        p.daemon = True
+        p.start()
+
+    try:
+        sent = [q_in.put((i, x)) for i, x in enumerate(X)]
+        [q_in.put((None, None)) for _ in range(nprocs)]
+        res = [q_out.get() for _ in progress_bar(range(len(sent)))]
+        [p.join() for p in proc]
+    except KeyboardInterrupt:
+        q_in.close()
+        q_out.close()
+        raise
+    return [x for i, x in sorted(res)]

BIN
matlab/correspondPixels.mexa64


BIN
matlab/correspondPixels.mexmaci64


+ 96 - 0
matlab/eval_release.m

@@ -0,0 +1,96 @@
+function eval_release(image_path, line_gt_path, output_file, result_path, output_size)
+
+lineThresh = [0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.97, 0.99, 0.995, 0.999, 0.9995, 0.9999];
+
+nLineThresh = size(lineThresh, 2);
+sumtp = zeros(nLineThresh, 1);
+sumfp = zeros(nLineThresh, 1);
+sumgt = zeros(nLineThresh, 1);
+
+listing = dir(image_path);
+numResults = size(listing, 1);
+
+for index=1:numResults
+  filename = listing(index).name;
+  if length(filename) == 1 || length(filename) == 2
+    continue;
+  end
+  filename = filename(1:end-4);
+  fprintf('processed %d/%d\n', index - 2, numResults - 2)
+  gtname = [line_gt_path, '/', filename, '_line.mat'];
+  imgname = [image_path, filename, '.jpg'];
+  
+  I = imread(imgname);
+  height = size(I,1);
+  width = size(I,2);
+  
+  % convert GT lines to binary map
+  gtlines = load(gtname);
+  gtlines = gtlines.lines;
+  
+  ne = size(gtlines,1);
+  edgemap0 = zeros(height, width);
+  for k = 1:ne
+    x1 = gtlines(k,1);
+    x2 = gtlines(k,3);
+    y1 = gtlines(k,2);
+    y2 = gtlines(k,4);
+    
+    vn = ceil(sqrt((x1-x2)^2+(y1-y2)^2));
+    cur_edge = [linspace(y1,y2,vn).', linspace(x1,x2,vn).'];
+    for j = 1:size(cur_edge,1)
+      yy = round(cur_edge(j,1));
+      xx = round(cur_edge(j,2));
+      if yy <= 0
+        yy = 1;
+      end
+      if xx <= 0
+        xx = 1;
+      end
+      edgemap0(yy,xx) = 1;
+    end
+  end
+  
+  parfor m=1:nLineThresh
+    resultname = [result_path, '/', num2str(lineThresh(m)), '/', sprintf('%06d', index - 3), '.mat'];
+    resultlines = load(resultname);
+    resultlines = resultlines.lines;
+    ne = size(resultlines,1);
+    edgemap1 = zeros(height, width);
+    for k = 1:ne
+      x1 = resultlines(k,2) * width / output_size;
+      y1 = resultlines(k,1) * height / output_size;
+      x2 = resultlines(k,4) * width / output_size;
+      y2 = resultlines(k,3) * height / output_size;
+
+      vn = ceil(sqrt((x1-x2)^2+(y1-y2)^2));
+      cur_edge = [linspace(y1,y2,vn).', linspace(x1,x2,vn).'];
+      for j = 1:size(cur_edge,1)
+        yy = round(cur_edge(j,1) - 0.5);
+        xx = round(cur_edge(j,2) - 0.5);
+        if yy <= 0
+          yy = 1;
+        end
+        if xx <= 0
+          xx = 1;
+        end
+        if yy > height
+          yy = height;
+        end
+        if xx > width
+          xx = width;
+        end
+        edgemap1(yy,xx) = 1;
+      end
+    end
+    
+    [matchE1,matchG1] = correspondPixels(edgemap1,edgemap0,0.01);
+    matchE = double(matchE1 > 0);
+
+    sumtp(m, 1) = sumtp(m, 1) + sum(matchE(:));
+    sumfp(m, 1) = sumfp(m, 1) + sum(edgemap1(:)) - sum(matchE(:));
+    sumgt(m, 1) = sumgt(m, 1) + sum(edgemap0(:));
+  end
+end
+save(output_file, 'sumtp', 'sumfp', 'sumgt');
+end

+ 127 - 0
misc/draw-wireframe.py

@@ -0,0 +1,127 @@
+import os
+import glob
+import os.path as osp
+
+import cv2
+import numpy as np
+import scipy.io
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+
+from lcnn.utils import parmap
+
+PRED = "/run/media/zyc/YZBackup/Paper/ICCV2019/LCNN/logs/190320-033347-abdf9cb-hg-q2/npz/000072000/*.npz"
+GT = "data/q2/valid/*.npz"
+WF = "/data/wirebase/result/wireframe/wireframe_1_rerun-baseline_0.5_0.5/2/*.mat"
+AFM = "/data/wirebase/result/wireframe/afm/*.npz"
+IMGS = "/data/wirebase/data/v1.1/test/*.jpg"
+LL = "/data/bible/linelet/*.mat"
+
+
+def imshow(im):
+    sizes = im.shape
+    height = float(sizes[0])
+    width = float(sizes[1])
+
+    fig = plt.figure()
+    fig.set_size_inches(width / height, 1, forward=False)
+    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
+    ax.set_axis_off()
+    fig.add_axes(ax)
+    plt.xlim([-0.5, sizes[1] - 0.5])
+    plt.ylim([sizes[0] - 0.5, -0.5])
+    plt.imshow(im)
+
+
+def main():
+    gts = glob.glob(GT)
+    gts.sort()
+    afm = glob.glob(AFM)
+    afm.sort()
+    wf = glob.glob(WF)
+    wf.sort()
+    img = glob.glob(IMGS)
+    img.sort()
+    ll = glob.glob(LL)
+    ll.sort()
+
+    prefix = "/data/wirebase/myplot/"
+    os.makedirs(osp.join(prefix, "GT"), exist_ok=True)
+    os.makedirs(osp.join(prefix, "LSD"), exist_ok=True)
+    os.makedirs(osp.join(prefix, "AFM"), exist_ok=True)
+    os.makedirs(osp.join(prefix, "WF"), exist_ok=True)
+    os.makedirs(osp.join(prefix, "LL"), exist_ok=True)
+
+    def draw(args):
+        i, (wf_name, gt_name, afm_name, ll_name, img_name) = args
+        img = cv2.imread(img_name, 0)
+        lsd = cv2.createLineSegmentDetector(cv2.LSD_REFINE_ADV)
+        lsd_line, _, _, lsd_score = lsd.detect(img)
+        lsd_line = lsd_line.reshape(-1, 2, 2)
+        lsd_score = lsd_score.flatten()
+        img = cv2.imread(img_name)[:, :, ::-1]
+
+        with np.load(gt_name) as fgt:
+            gt_line = fgt["lpos"][:, :, :2]
+            gt_line[:, :, 0] *= img.shape[0] / 128
+            gt_line[:, :, 1] *= img.shape[1] / 128
+
+        with np.load(afm_name) as fafm:
+            afm_line = fafm["lines"].reshape(-1, 2, 2)[:, :, ::-1]
+
+        wf_line = scipy.io.loadmat(wf_name)["lines"].reshape(-1, 2, 2)
+        wf_line = wf_line[:, :, ::-1]
+
+        ll_line = scipy.io.loadmat(wf_name)["lines"].reshape(-1, 2, 2)
+        ll_line = ll_line[:, :, ::-1]
+
+        plt.figure("LL")
+        imshow(img)
+        for a, b in ll_line - 0.5:
+            plt.plot([a[1], b[1]], [a[0], b[0]], color="orange", linewidth=0.5)
+            plt.scatter(a[1], a[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+            plt.scatter(b[1], b[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+        plt.savefig(osp.join(prefix, "LL", f"{i:05}"), dpi=500, bbox_inches=0)
+        plt.close()
+
+        plt.figure("GT")
+        imshow(img)
+        for a, b in gt_line - 0.5:
+            plt.plot([a[1], b[1]], [a[0], b[0]], color="orange", linewidth=0.5)
+            plt.scatter(a[1], a[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+            plt.scatter(b[1], b[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+        plt.savefig(osp.join(prefix, "GT", f"{i:05}"), dpi=500, bbox_inches=0)
+        plt.close()
+
+        plt.figure("LSD")
+        imshow(img)
+        for a, b in lsd_line[:, :, ::-1] - 0.5:
+            plt.plot([a[1], b[1]], [a[0], b[0]], color="orange", linewidth=0.5)
+            plt.scatter(a[1], a[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+            plt.scatter(b[1], b[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+        plt.savefig(osp.join(prefix, "LSD", f"{i:05}"), dpi=3000, bbox_inches=0)
+        plt.close()
+
+        plt.figure("AFM")
+        imshow(img)
+        for a, b in afm_line - 0.5:
+            plt.plot([a[1], b[1]], [a[0], b[0]], color="orange", linewidth=0.5)
+            plt.scatter(a[1], a[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+            plt.scatter(b[1], b[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+        plt.savefig(osp.join(prefix, "AFM", f"{i:05}"), dpi=3000, bbox_inches=0)
+        plt.close()
+
+        plt.figure("WF")
+        imshow(img)
+        for a, b in wf_line - 0.5:
+            plt.plot([a[1], b[1]], [a[0], b[0]], color="orange", linewidth=0.5)
+            plt.scatter(a[1], a[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+            plt.scatter(b[1], b[0], color="#33FFFF", s=1.2, edgecolors="none", zorder=5)
+        plt.savefig(osp.join(prefix, "WF", f"{i:05}"), dpi=3000, bbox_inches=0)
+        plt.close()
+
+    parmap(draw, enumerate(zip(wf, gts, afm, ll, img)))
+
+
+if __name__ == "__main__":
+    main()

+ 7 - 0
misc/gdrive-download.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+fileid="$1"
+filename="$2"
+curl -c ./cookie -s -L "https://drive.google.com/uc?export=download&id=${fileid}" > /dev/null
+curl -Lb ./cookie "https://drive.google.com/uc?export=download&confirm=`awk '/download/ {print $NF}' ./cookie`&id=${fileid}" -o ${filename}
+
+rm ./cookie

+ 36 - 0
misc/lsd.py

@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+import glob
+import os.path as osp
+
+import cv2
+import numpy as np
+import scipy.io
+import matplotlib as mpl
+import numpy.linalg as LA
+import matplotlib.pyplot as plt
+
+IM = "data/wireframe/valid-images/*.jpg"
+
+
+if __name__ == "__main__":
+    for i, iname in enumerate(sorted(glob.glob(IM))):
+        img = cv2.imread(iname, 0)
+        lsd = cv2.createLineSegmentDetector(cv2.LSD_REFINE_ADV)
+        lsd_line, _, _, lsd_score = lsd.detect(img)
+        lsd_line = lsd_line.reshape(-1, 2, 2)[:, :, ::-1]
+        lsd_score = lsd_score.flatten()
+
+        # plt.imshow(img)
+        # for a, b in lsd_line:
+        #     plt.plot([a[1], b[1]], [a[0], b[0]], linewidth=4)
+        # plt.show()
+
+        lsd_index = np.argsort(-lsd_score)
+        np.savez_compressed(
+            iname.replace(".jpg", "_LSD.npz"),
+            lines=lsd_line[lsd_index],
+            scores=lsd_score[lsd_index],
+        )

+ 230 - 0
misc/plot-sAP.py

@@ -0,0 +1,230 @@
+#!/usr/bin/env python3
+
+import sys
+import glob
+import os.path as osp
+
+import cv2
+import numpy as np
+import scipy.io
+import matplotlib as mpl
+import numpy.linalg as LA
+import matplotlib.pyplot as plt
+
+try:
+    sys.path.append(".")
+    sys.path.append("..")
+    import lcnn.utils
+    import lcnn.metric
+except Exception:
+    raise
+
+# Change the directory here
+PRED = "logs/190418-201834-f8934c6-lr4d10/npz/000312000/*.npz"
+GT = "data/wireframe/valid/*.npz"
+# PRED = "logs/190506-001532-york/*.npz"
+# GT = "data/york/valid/*.npz"
+WF = "/data/lcnn/wirebase/result/wireframe/wireframe_1_rerun-baseline_0.5_0.5/*"
+AFM = "/data/lcnn/wirebase/result/wireframe/afm/*.npz"
+
+
+mpl.rcParams.update({"font.size": 16})
+plt.rcParams["font.family"] = "Times New Roman"
+del mpl.font_manager.weight_dict["roman"]
+mpl.font_manager._rebuild()
+
+
+def wireframe_score(T=10):
+    gts = glob.glob(GT)
+    gts.sort()
+    dirs = glob.glob(WF)
+    dirs.sort(key=lambda x: -float(osp.split(x)[-1]))
+
+    precision, recall = [], []
+    for threshold in dirs:
+        print("Processing", threshold)
+        mat_files = glob.glob(osp.join(threshold, "*.mat"))
+        mat_files.sort()
+        tp, fp, total_gt = 0, 0, 0
+        for i, (gt_name, matf) in enumerate(zip(gts, mat_files)):
+            line_pred = scipy.io.loadmat(matf)["lines"].reshape(-1, 2, 2)
+            img = cv2.imread(matf.replace(".mat", ".jpg"))
+            line_pred[:, :, 0] *= 128 / img.shape[1]
+            line_pred[:, :, 1] *= 128 / img.shape[0]
+            line_pred = line_pred[:, :, ::-1]
+
+            with np.load(gt_name) as fgt:
+                line_gt = fgt["lpos"][:, :, :2]
+            tp_, fp_ = lcnn.metric.msTPFP(line_pred, line_gt, T)
+            tp += tp_.sum()
+            fp += fp_.sum()
+            total_gt += len(line_gt)
+        recall.append(tp / total_gt)
+        precision.append(tp / (tp + fp))
+
+    recall = np.concatenate(([0.0], recall, [1.0]))
+    precision = np.concatenate(([0.0], precision, [0.0]))
+    for i in range(precision.size - 1, 0, -1):
+        precision[i - 1] = max(precision[i - 1], precision[i])
+    i = np.where(recall[1:] != recall[:-1])[0]
+    ap = np.sum((recall[i + 1] - recall[i]) * precision[i + 1])
+
+    plt.plot(
+        np.maximum(0.005, recall[:-1]),
+        precision[:-1],
+        label="Wireframe",
+        linewidth=3,
+        c="C1",
+    )
+    print("Huang sAP:", ap)
+
+
+def line_score(threshold=10):
+    preds = sorted(glob.glob(PRED))
+    gts = sorted(glob.glob(GT))
+    afm = sorted(glob.glob(AFM))
+
+    lcnn_tp, lcnn_fp, lcnn_scores = [], [], []
+    lsd_tp, lsd_fp, lsd_scores = [], [], []
+    afm_tp, afm_fp, afm_scores = [], [], []
+    n_gt = 0
+    for pred_name, gt_name, afm_name in zip(preds, gts, afm):
+        image = gt_name.replace("_label.npz", ".png")
+
+        img = cv2.imread(image, 0)
+        lsd = cv2.createLineSegmentDetector(cv2.LSD_REFINE_ADV)
+        lsd_line, _, _, lsd_score = lsd.detect(img)
+        lsd_line = lsd_line.reshape(-1, 2, 2)[:, :, ::-1]
+        lsd_score = lsd_score.flatten()
+        # print(lines.shape)
+        # print(nfa.shape)
+
+        with np.load(pred_name) as fpred:
+            lcnn_line = fpred["lines"][:, :, :2]
+            lcnn_score = fpred["score"]
+        lcnn_line = lcnn_line[:, :, :2]
+        with np.load(gt_name) as fgt:
+            gt_line = fgt["lpos"][:, :, :2]
+
+        with np.load(afm_name) as fafm:
+            afm_line = fafm["lines"].reshape(-1, 2, 2)[:, :, ::-1]
+            afm_score = -fafm["scores"]
+            h = fafm["h"]
+            w = fafm["w"]
+        afm_line[:, :, 0] *= 128 / h
+        afm_line[:, :, 1] *= 128 / w
+        for i, ((a, b), s) in enumerate(zip(lcnn_line, lcnn_score)):
+            if i > 0 and (lcnn_line[i] == lcnn_line[0]).all():
+                lcnn_line = lcnn_line[:i]
+                lcnn_score = lcnn_score[:i]
+                break
+
+        # plt.figure("LCNN")
+        # for a, b in lcnn_line:
+        #     plt.plot([a[1], b[1]], [a[0], b[0]], linewidth=4)
+        # plt.figure("GT")
+        # for a, b in gt_line:
+        #     plt.plot([a[1], b[1]], [a[0], b[0]], linewidth=4)
+        # plt.figure("LSD")
+        # for a, b in lsd_line:
+        #     plt.plot([a[1], b[1]], [a[0], b[0]], linewidth=4)
+        # plt.figure("AFM")
+        # for a, b in afm_line:
+        #     plt.plot([a[1], b[1]], [a[0], b[0]], linewidth=4)
+        # plt.show()
+
+        tp, fp = lcnn.metric.msTPFP(lcnn_line, gt_line, threshold)
+        lcnn_tp.append(tp)
+        lcnn_fp.append(fp)
+        lcnn_scores.append(lcnn_score)
+
+        tp, fp = lcnn.metric.msTPFP(lsd_line, gt_line, threshold)
+        lsd_tp.append(tp)
+        lsd_fp.append(fp)
+        lsd_scores.append(lsd_score)
+
+        tp, fp = lcnn.metric.msTPFP(afm_line, gt_line, threshold)
+        afm_tp.append(tp)
+        afm_fp.append(fp)
+        afm_scores.append(afm_score)
+
+        n_gt += len(gt_line)
+
+    lcnn_tp = np.concatenate(lcnn_tp)
+    lcnn_fp = np.concatenate(lcnn_fp)
+    lcnn_scores = np.concatenate(lcnn_scores)
+    lcnn_index = np.argsort(-lcnn_scores)
+    lcnn_tp = lcnn_tp[lcnn_index]
+    lcnn_fp = lcnn_fp[lcnn_index]
+    lcnn_tp = np.cumsum(lcnn_tp) / n_gt
+    lcnn_fp = np.cumsum(lcnn_fp) / n_gt
+
+    lsd_tp = np.concatenate(lsd_tp)
+    lsd_fp = np.concatenate(lsd_fp)
+    lsd_scores = np.concatenate(lsd_scores)
+    lsd_index = np.argsort(-lsd_scores)
+    lsd_tp = lsd_tp[lsd_index]
+    lsd_fp = lsd_fp[lsd_index]
+    lsd_tp = np.cumsum(lsd_tp) / n_gt
+    lsd_fp = np.cumsum(lsd_fp) / n_gt
+
+    afm_tp = np.concatenate(afm_tp)
+    afm_fp = np.concatenate(afm_fp)
+    afm_scores = np.concatenate(afm_scores)
+    afm_index = np.argsort(-afm_scores)
+    afm_tp = afm_tp[afm_index]
+    afm_fp = afm_fp[afm_index]
+    afm_tp = np.cumsum(afm_tp) / n_gt
+    afm_fp = np.cumsum(afm_fp) / n_gt
+
+    lcnn_re, lcnn_pr = lcnn_tp, lcnn_tp / (lcnn_tp + lcnn_fp)
+    afm_re, afm_pr = afm_tp, afm_tp / (afm_tp + afm_fp)
+    # lsd_re, lsd_pr = lsd_tp, lsd_tp / (lsd_tp + lsd_fp)
+
+    T = 0.005
+    plt.plot(afm_re[afm_re > T], afm_pr[afm_re > T], label="AFM", linewidth=3, c="C2")
+    plt.plot(lcnn_re[lcnn_re > T], lcnn_pr[lcnn_re > T], label="L-CNN", linewidth=3, c="C3")
+    # plt.plot(lsd_re, lsd_pr, label="LSD", linewidth=2)
+
+    plt.grid(True)
+    plt.axis([0.0, 1.0, 0.0, 1.0])
+    plt.xticks(np.arange(0, 1.0, step=0.1))
+    plt.yticks(np.arange(0, 1.0, step=0.1))
+
+    plt.xlabel("Recall")
+    plt.ylabel("Precision")
+    plt.legend(loc="upper right")
+
+    f_scores = np.linspace(0.2, 0.8, num=8)
+    for f_score in f_scores:
+        x = np.linspace(0.01, 1)
+        y = f_score * x / (2 * x - f_score)
+        l, = plt.plot(x[y >= 0], y[y >= 0], color="green", alpha=0.3)
+        plt.annotate("f={0:0.1}".format(f_score), xy=(0.9, y[45] + 0.02), alpha=0.4)
+    plt.title("PR Curve for sAP10")
+    plt.savefig("sAP.pdf", format="pdf", bbox_inches="tight")
+    plt.savefig("sAP.svg", format="svg", bbox_inches="tight")
+    plt.show()
+
+    print(
+        f"Processing {PRED}:\n"
+        + f"    LSD sAP{threshold}: {lcnn.metric.ap(lsd_tp, lsd_fp)}\n"
+        + f"    AFM sAP{threshold}: {lcnn.metric.ap(afm_tp, afm_fp)}\n"
+        + f"    L-CNN sAP{threshold}: {lcnn.metric.ap(lcnn_tp, lcnn_fp)}"
+    )
+
+
+cmap = plt.get_cmap("jet")
+norm = mpl.colors.Normalize(vmin=0.4, vmax=1.0)
+sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
+sm.set_array([])
+
+
+def c(x):
+    return sm.to_rgba(x)
+
+
+if __name__ == "__main__":
+    plt.tight_layout()
+    wireframe_score()
+    line_score()

+ 205 - 0
post.py

@@ -0,0 +1,205 @@
+#!/usr/bin/env python3
+"""Post-processing the output of neural network
+Usage:
+    post.py [options] <input-dir> <output-dir>
+    post.py ( -h | --help )
+
+Examples:
+    post.py logs/logname/npz/000336000  result/logname
+
+Arguments:
+   input-dir                         Directory that stores the npz
+   output-dir                        Output directory
+
+Options:
+   -h --help                         Show this screen.
+   --plot                            Generate images besides npz files
+   --thresholds=<thresholds>         A comma-separated list for thresholding
+                                     [default: 0.006,0.010,0.015]
+"""
+
+import os
+import sys
+import glob
+import math
+import os.path as osp
+
+import cv2
+import numpy as np
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+from docopt import docopt
+
+from lcnn.utils import parmap
+
+cmap = plt.get_cmap("jet")
+norm = mpl.colors.Normalize(vmin=0.92, vmax=1.02)
+sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
+sm.set_array([])
+
+
+def c(x):
+    return sm.to_rgba(x)
+
+
+def imshow(im):
+    plt.close()
+    sizes = im.shape
+    height = float(sizes[0])
+    width = float(sizes[1])
+
+    fig = plt.figure()
+    fig.set_size_inches(width / height, 1, forward=False)
+    ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0])
+    ax.set_axis_off()
+    fig.add_axes(ax)
+    plt.xlim([-0.5, sizes[1] - 0.5])
+    plt.ylim([sizes[0] - 0.5, -0.5])
+    plt.imshow(im)
+
+
+def pline(x1, y1, x2, y2, x, y):
+    px = x2 - x1
+    py = y2 - y1
+    dd = px * px + py * py
+    u = ((x - x1) * px + (y - y1) * py) / max(1e-9, float(dd))
+    dx = x1 + u * px - x
+    dy = y1 + u * py - y
+    return dx * dx + dy * dy
+
+
+def psegment(x1, y1, x2, y2, x, y):
+    px = x2 - x1
+    py = y2 - y1
+    dd = px * px + py * py
+    u = max(min(((x - x1) * px + (y - y1) * py) / float(dd), 1), 0)
+    dx = x1 + u * px - x
+    dy = y1 + u * py - y
+    return dx * dx + dy * dy
+
+
+def plambda(x1, y1, x2, y2, x, y):
+    px = x2 - x1
+    py = y2 - y1
+    dd = px * px + py * py
+    return ((x - x1) * px + (y - y1) * py) / max(1e-9, float(dd))
+
+
+def process(lines, scores, threshold=0.01, tol=1e9, do_clip=False):
+    nlines, nscores = [], []
+    for (p, q), score in zip(lines, scores):
+        start, end = 0, 1
+        for a, b in nlines:
+            if (
+                min(
+                    max(pline(*p, *q, *a), pline(*p, *q, *b)),
+                    max(pline(*a, *b, *p), pline(*a, *b, *q)),
+                )
+                > threshold ** 2
+            ):
+                continue
+            lambda_a = plambda(*p, *q, *a)
+            lambda_b = plambda(*p, *q, *b)
+            if lambda_a > lambda_b:
+                lambda_a, lambda_b = lambda_b, lambda_a
+            lambda_a -= tol
+            lambda_b += tol
+
+            # case 1: skip (if not do_clip)
+            if start < lambda_a and lambda_b < end:
+                continue
+
+            # not intersect
+            if lambda_b < start or lambda_a > end:
+                continue
+
+            # cover
+            if lambda_a <= start and end <= lambda_b:
+                start = 10
+                break
+
+            # case 2 & 3:
+            if lambda_a <= start and start <= lambda_b:
+                start = lambda_b
+            if lambda_a <= end and end <= lambda_b:
+                end = lambda_a
+
+            if start >= end:
+                break
+
+        if start >= end:
+            continue
+        nlines.append(np.array([p + (q - p) * start, p + (q - p) * end]))
+        nscores.append(score)
+    return np.array(nlines), np.array(nscores)
+
+
+def main():
+    args = docopt(__doc__)
+
+    files = sorted(glob.glob(osp.join(args["<input-dir>"], "*.npz")))
+    inames = sorted(glob.glob("data/wireframe/valid-images/*.jpg"))
+    gts = sorted(glob.glob("data/wireframe/valid/*.npz"))
+    prefix = args["<output-dir>"]
+
+    inputs = list(zip(files, inames, gts))
+    thresholds = list(map(float, args["--thresholds"].split(",")))
+
+    def handle(allname):
+        fname, iname, gtname = allname
+        print("Processing", fname)
+        im = cv2.imread(iname)
+        with np.load(fname) as f:
+            lines = f["lines"]
+            scores = f["score"]
+        with np.load(gtname) as f:
+            gtlines = f["lpos"][:, :, :2]
+        gtlines[:, :, 0] *= im.shape[0] / 128
+        gtlines[:, :, 1] *= im.shape[1] / 128
+        for i in range(1, len(lines)):
+            if (lines[i] == lines[0]).all():
+                lines = lines[:i]
+                scores = scores[:i]
+                break
+
+        lines[:, :, 0] *= im.shape[0] / 128
+        lines[:, :, 1] *= im.shape[1] / 128
+        diag = (im.shape[0] ** 2 + im.shape[1] ** 2) ** 0.5
+
+        for threshold in thresholds:
+            nlines, nscores = process(lines, scores, diag * threshold, 0, False)
+
+            outdir = osp.join(prefix, f"{threshold:.3f}".replace(".", "_"))
+            os.makedirs(outdir, exist_ok=True)
+            npz_name = osp.join(outdir, osp.split(fname)[-1])
+
+            PLTOPTS = {"color": "#33FFFF", "s": 1.2, "edgecolors": "none", "zorder": 5}
+            if args["--plot"]:
+                # plot gt
+                imshow(im[:, :, ::-1])
+                for (a, b) in gtlines:
+                    plt.plot([a[1], b[1]], [a[0], b[0]], c="orange", linewidth=0.5)
+                    plt.scatter(a[1], a[0], *PLTOPTS)
+                    plt.scatter(b[1], b[0], *PLTOPTS)
+                plt.savefig(npz_name.replace(".npz", ".png"), dpi=500, bbox_inches=0)
+
+                thres = [0.97, 0.98, 0.99]
+                for i, t in enumerate(thres):
+                    imshow(im[:, :, ::-1])
+                    for (a, b), s in zip(nlines[nscores > t], nscores[nscores > t]):
+                        plt.plot([a[1], b[1]], [a[0], b[0]], c=c(s), linewidth=0.5)
+                        plt.scatter(a[1], a[0], *PLTOPTS)
+                        plt.scatter(b[1], b[0], *PLTOPTS)
+                    plt.savefig(
+                        npz_name.replace(".npz", f"_{i}.png"), dpi=500, bbox_inches=0
+                    )
+
+            nlines[:, :, 0] *= 128 / im.shape[0]
+            nlines[:, :, 1] *= 128 / im.shape[1]
+            np.savez_compressed(npz_name, lines=nlines, score=nscores)
+
+    parmap(handle, inputs, 12)
+
+
+if __name__ == "__main__":
+    main()

+ 133 - 0
process.py

@@ -0,0 +1,133 @@
+#!/usr/bin/env python3
+"""Process a dataset with the trained neural network
+Usage:
+    train.py [options] <yaml-config> <checkpoint> <image-dir> <output-dir>
+    train.py (-h | --help )
+
+Arguments:
+   <yaml-config>                 Path to the yaml hyper-parameter file
+   <checkpoint>                  Path to the checkpoint
+   <image-dir>                   Path to the directory containing processed images
+   <output-dir>                  Path to the output directory
+
+Options:
+   -h --help                     Show this screen.
+   -d --devices <devices>        Comma seperated GPU devices [default: 0]
+   --plot                        Plot the result
+"""
+
+import os
+import sys
+import shlex
+import pprint
+import random
+import os.path as osp
+import threading
+import subprocess
+
+import numpy as np
+import torch
+import matplotlib as mpl
+import skimage.io
+import matplotlib.pyplot as plt
+from docopt import docopt
+
+import lcnn
+from lcnn.utils import recursive_to
+from lcnn.config import C, M
+from lcnn.datasets import WireframeDataset, collate
+from lcnn.models.line_vectorizer import LineVectorizer
+from lcnn.models.multitask_learner import MultitaskHead, MultitaskLearner
+
+
+def main():
+    args = docopt(__doc__)
+    config_file = args["<yaml-config>"] or "config/wireframe.yaml"
+    C.update(C.from_yaml(filename=config_file))
+    M.update(C.model)
+    pprint.pprint(C, indent=4)
+
+    random.seed(0)
+    np.random.seed(0)
+    torch.manual_seed(0)
+
+    device_name = "cpu"
+    os.environ["CUDA_VISIBLE_DEVICES"] = args["--devices"]
+    if torch.cuda.is_available():
+        device_name = "cuda"
+        torch.backends.cudnn.deterministic = True
+        torch.cuda.manual_seed(0)
+        print("Let's use", torch.cuda.device_count(), "GPU(s)!")
+    else:
+        print("CUDA is not available")
+    device = torch.device(device_name)
+
+    if M.backbone == "stacked_hourglass":
+        model = lcnn.models.hg(
+            depth=M.depth,
+            head=lambda c_in, c_out: MultitaskHead(c_in, c_out),
+            num_stacks=M.num_stacks,
+            num_blocks=M.num_blocks,
+            num_classes=sum(sum(M.head_size, [])),
+        )
+    else:
+        raise NotImplementedError
+
+    checkpoint = torch.load(args["<checkpoint>"])
+    model = MultitaskLearner(model)
+    model = LineVectorizer(model)
+    model.load_state_dict(checkpoint["model_state_dict"])
+    model = model.to(device)
+    model.eval()
+
+    loader = torch.utils.data.DataLoader(
+        WireframeDataset(args["<image-dir>"], split="valid"),
+        shuffle=False,
+        batch_size=M.batch_size,
+        collate_fn=collate,
+        num_workers=C.io.num_workers,
+        pin_memory=True,
+    )
+    os.makedirs(args["<output-dir>"], exist_ok=True)
+
+    for batch_idx, (image, meta, target) in enumerate(loader):
+        with torch.no_grad():
+            input_dict = {
+                "image": recursive_to(image, device),
+                "meta": recursive_to(meta, device),
+                "target": recursive_to(target, device),
+                "do_evaluation": True,
+            }
+            H = model(input_dict)["heatmaps"]
+            for i in range(M.batch_size):
+                index = batch_idx * M.batch_size + i
+                np.savez(
+                    osp.join(args["<output-dir>"], f"{index:06}.npz"),
+                    **{k: v[i].cpu().numpy() for k, v in H.items()},
+                )
+                if not args["--plot"]:
+                    continue
+                im = image[i].cpu().numpy().transpose(1, 2, 0)
+                im = im * M.image.stddev + M.image.mean
+                lines = H["lines"][i].cpu().numpy() * 4
+                scores = H["score"][i].cpu().numpy()
+                if len(lines) > 0 and not (lines[0] == 0).all():
+                    for i, ((a, b), s) in enumerate(zip(lines, scores)):
+                        if i > 0 and (lines[i] == lines[0]).all():
+                            break
+                        plt.plot([a[1], b[1]], [a[0], b[0]], c=c(s), linewidth=4)
+                plt.show()
+
+
+cmap = plt.get_cmap("jet")
+norm = mpl.colors.Normalize(vmin=0.4, vmax=1.0)
+sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
+sm.set_array([])
+
+
+def c(x):
+    return sm.to_rgba(x)
+
+
+if __name__ == "__main__":
+    main()

+ 180 - 0
train.py

@@ -0,0 +1,180 @@
+#!/usr/bin/env python3
+"""Train L-CNN
+Usage:
+    train.py [options] <yaml-config>
+    train.py (-h | --help )
+
+Arguments:
+   <yaml-config>                   Path to the yaml hyper-parameter file
+
+Options:
+   -h --help                       Show this screen.
+   -d --devices <devices>          Comma seperated GPU devices [default: 0]
+   -i --identifier <identifier>    Folder identifier [default: default-identifier]
+"""
+
+import os
+import sys
+import glob
+import shlex
+import pprint
+import random
+import shutil
+import signal
+import os.path as osp
+import datetime
+import platform
+import threading
+import subprocess
+
+import yaml
+import numpy as np
+import torch
+from docopt import docopt
+
+import lcnn
+from lcnn.config import C, M
+from lcnn.datasets import WireframeDataset, collate
+from lcnn.models.line_vectorizer import LineVectorizer
+from lcnn.models.multitask_learner import MultitaskHead, MultitaskLearner
+
+
+def git_hash():
+    cmd = 'git log -n 1 --pretty="%h"'
+    ret = subprocess.check_output(shlex.split(cmd)).strip()
+    if isinstance(ret, bytes):
+        ret = ret.decode()
+    return ret
+
+
+def get_outdir(identifier):
+    # load config
+    name = str(datetime.datetime.now().strftime("%y%m%d-%H%M%S"))
+    name += "-%s" % git_hash()
+    name += "-%s" % identifier
+    outdir = osp.join(osp.expanduser(C.io.logdir), name)
+    if not osp.exists(outdir):
+        os.makedirs(outdir)
+    C.io.resume_from = outdir
+    C.to_yaml(osp.join(outdir, "config.yaml"))
+    os.system(f"git diff HEAD > {outdir}/gitdiff.patch")
+    return outdir
+
+
+def main():
+    args = docopt(__doc__)
+    config_file = args["<yaml-config>"] or "config/wireframe.yaml"
+    C.update(C.from_yaml(filename=config_file))
+    M.update(C.model)
+    pprint.pprint(C, indent=4)
+    resume_from = C.io.resume_from
+
+    # WARNING: L-CNN is still not deterministic
+    random.seed(0)
+    np.random.seed(0)
+    torch.manual_seed(0)
+
+    device_name = "cpu"
+    os.environ["CUDA_VISIBLE_DEVICES"] = args["--devices"]
+    if torch.cuda.is_available():
+        device_name = "cuda"
+        torch.backends.cudnn.deterministic = True
+        torch.cuda.manual_seed(0)
+        print("Let's use", torch.cuda.device_count(), "GPU(s)!")
+    else:
+        print("CUDA is not available")
+    device = torch.device(device_name)
+
+    # 1. dataset
+
+    # uncomment for debug DataLoader
+    # wireframe.datasets.WireframeDataset(datadir, split="train")[0]
+    # sys.exit(0)
+
+    datadir = C.io.datadir
+    kwargs = {
+        "batch_size": M.batch_size,
+        "collate_fn": collate,
+        "num_workers": C.io.num_workers,
+        "pin_memory": True,
+    }
+    train_loader = torch.utils.data.DataLoader(
+        WireframeDataset(datadir, split="train"), shuffle=True, **kwargs
+    )
+    val_loader = torch.utils.data.DataLoader(
+        WireframeDataset(datadir, split="valid"), shuffle=False, **kwargs
+    )
+    epoch_size = len(train_loader)
+    # print("epoch_size (train):", epoch_size)
+    # print("epoch_size (valid):", len(val_loader))
+
+    if resume_from:
+        checkpoint = torch.load(osp.join(resume_from, "checkpoint_lastest.pth.tar"))
+
+    # 2. model
+    if M.backbone == "stacked_hourglass":
+        model = lcnn.models.hg(
+            depth=M.depth,
+            head=lambda c_in, c_out: MultitaskHead(c_in, c_out),
+            num_stacks=M.num_stacks,
+            num_blocks=M.num_blocks,
+            num_classes=sum(sum(M.head_size, [])),
+        )
+    else:
+        raise NotImplementedError
+
+    model = MultitaskLearner(model)
+    model = LineVectorizer(model)
+
+    if resume_from:
+        model.load_state_dict(checkpoint["model_state_dict"])
+    model = model.to(device)
+
+    # 3. optimizer
+    if C.optim.name == "Adam":
+        optim = torch.optim.Adam(
+            model.parameters(),
+            lr=C.optim.lr,
+            weight_decay=C.optim.weight_decay,
+            amsgrad=C.optim.amsgrad,
+        )
+    elif C.optim.name == "SGD":
+        optim = torch.optim.SGD(
+            model.parameters(),
+            lr=C.optim.lr,
+            weight_decay=C.optim.weight_decay,
+            momentum=C.optim.momentum,
+        )
+    else:
+        raise NotImplementedError
+
+    if resume_from:
+        optim.load_state_dict(checkpoint["optim_state_dict"])
+    outdir = resume_from or get_outdir(args["--identifier"])
+    print("outdir:", outdir)
+
+    try:
+        trainer = lcnn.trainer.Trainer(
+            device=device,
+            model=model,
+            optimizer=optim,
+            train_loader=train_loader,
+            val_loader=val_loader,
+            out=outdir,
+        )
+        if resume_from:
+            trainer.iteration = checkpoint["iteration"]
+            if trainer.iteration % epoch_size != 0:
+                print("WARNING: iteration is not a multiple of epoch_size, reset it")
+                trainer.iteration -= trainer.iteration % epoch_size
+            trainer.best_mean_loss = checkpoint["best_mean_loss"]
+            del checkpoint
+        trainer.train()
+    except BaseException:
+        if len(glob.glob(f"{outdir}/viz/*")) <= 1:
+            shutil.rmtree(outdir)
+        raise
+
+
+if __name__ == "__main__":
+    main()