From 6934d27234bc0d1e4a4341615410badd12f13e93 Mon Sep 17 00:00:00 2001
From: Samuel Farrens <samuel.farrens@gmail.com>
Date: Wed, 16 Nov 2022 09:36:13 +0100
Subject: [PATCH 001/207] added Dockerfile and GH action

---
 .github/workflows/deploy-image.yml | 41 ++++++++++++++++++++++++++++++
 Dockerfile                         | 26 +++++++++++++++++++
 2 files changed, 67 insertions(+)
 create mode 100644 .github/workflows/deploy-image.yml
 create mode 100644 Dockerfile

diff --git a/.github/workflows/deploy-image.yml b/.github/workflows/deploy-image.yml
new file mode 100644
index 000000000..81c31c7ad
--- /dev/null
+++ b/.github/workflows/deploy-image.yml
@@ -0,0 +1,41 @@
+name: Create and publish a Docker image
+
+on:
+  push:
+    branches: ['master']
+
+env:
+  REGISTRY: ghcr.io
+  IMAGE_NAME: ${{ github.repository }}
+
+jobs:
+  build-and-push-image:
+    runs-on: ubuntu-latest
+    permissions:
+      contents: read
+      packages: write
+
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v3
+
+      - name: Log in to the Container registry
+        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
+        with:
+          registry: ${{ env.REGISTRY }}
+          username: ${{ github.actor }}
+          password: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Extract metadata (tags, labels) for Docker
+        id: meta
+        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
+        with:
+          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+      - name: Build and push Docker image
+        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
+        with:
+          context: .
+          push: true
+          tags: ${{ steps.meta.outputs.tags }}
+          labels: ${{ steps.meta.outputs.labels }}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..e9529e52c
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,26 @@
+FROM continuumio/miniconda3
+
+LABEL Description="ShapePipe Docker Image"
+WORKDIR /home
+ENV SHELL /bin/bash
+
+ARG CC=gcc-9
+ARG CXX=g++-9
+
+RUN apt-get update --allow-releaseinfo-change && \
+    apt-get update && \
+    apt-get upgrade -y && \
+    apt-get install gcc-9 g++-9 -y && \
+    apt-get install locales -y && \
+    apt install libgl1-mesa-glx -y && \
+    apt-get clean
+
+RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
+    locale-gen
+ENV LANG en_US.UTF-8
+ENV LANGUAGE en_US:en
+ENV LC_ALL en_US.UTF-8
+
+COPY . /home
+
+RUN ./install_shapepipe --develop --vos

From 82bc72ac0a992d1f73b43ddd7b41b8807634877b Mon Sep 17 00:00:00 2001
From: sfarrens <samuel.farrens@gmail.com>
Date: Wed, 16 Nov 2022 16:44:17 +0100
Subject: [PATCH 002/207] added make dependency

---
 Dockerfile | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Dockerfile b/Dockerfile
index e9529e52c..49cfa01ab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -10,6 +10,7 @@ ARG CXX=g++-9
 RUN apt-get update --allow-releaseinfo-change && \
     apt-get update && \
     apt-get upgrade -y && \
+    apt-get install make -y && \
     apt-get install gcc-9 g++-9 -y && \
     apt-get install locales -y && \
     apt install libgl1-mesa-glx -y && \

From 5b447439ecaba42da88b9d93437bd5c6fa097674 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 15 May 2023 14:50:35 +0200
Subject: [PATCH 003/207] notebook

---
 scripts/jupyter/plot_spectro_areas.ipynb | 60 +++++++++++++++++-------
 1 file changed, 42 insertions(+), 18 deletions(-)

diff --git a/scripts/jupyter/plot_spectro_areas.ipynb b/scripts/jupyter/plot_spectro_areas.ipynb
index b41326a17..f608c7aee 100644
--- a/scripts/jupyter/plot_spectro_areas.ipynb
+++ b/scripts/jupyter/plot_spectro_areas.ipynb
@@ -9,14 +9,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Warning: surveys missing because pymangle is not installed\n"
+     "ename": "ModuleNotFoundError",
+     "evalue": "No module named 'skymapper'",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
+      "Cell \u001b[0;32mIn [1], line 12\u001b[0m\n\u001b[1;32m      9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mastropy\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m units \u001b[38;5;28;01mas\u001b[39;00m u\n\u001b[1;32m     10\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m---> 12\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mskymapper\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mskm\u001b[39;00m\n",
+      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'skymapper'"
      ]
     }
    ],
@@ -27,7 +31,7 @@
     "import numpy as np\n",
     "import pylab as plt\n",
     "from astropy.io import fits\n",
-    "from cs_util import cfis\n",
+    "from shapepipe.utilities import cfis\n",
     "from astropy.coordinates import SkyCoord, match_coordinates_sky\n",
     "from astropy import units as u\n",
     "import pandas as pd\n",
@@ -53,7 +57,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -101,7 +105,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -194,9 +198,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 4,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DESI: 17450894 objects in total, 4835230/17450894 = 27.7% potentially in UNIONS footprint\n"
+     ]
+    }
+   ],
    "source": [
     "surveys = []\n",
     "\n",
@@ -299,8 +311,8 @@
     "    \n",
     "if 'DESI-Iron'in use:\n",
     "    surveys.append(Survey.from_fits('DESI', 'cyan',\n",
-    "                                    '{}/.fits'.format(cat_home),\n",
-    "                                    key_ra='RA[deg]', key_dec='DEC[deg]'))\n",
+    "                                    '{}/galaxies_desi_iron_v0.1.fits'.format(cat_home),\n",
+    "                                    key_ra='TARGET_RA', key_dec='TARGET_DEC'))\n",
     "    "
    ]
   },
@@ -313,7 +325,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -378,9 +390,21 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 6,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "ename": "AttributeError",
+     "evalue": "module 'cs_util.cfis' has no attribute 'get_image_list'",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
+      "Cell \u001b[0;32mIn[6], line 24\u001b[0m\n\u001b[1;32m     22\u001b[0m images \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m     23\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m band \u001b[38;5;129;01min\u001b[39;00m bands:\n\u001b[0;32m---> 24\u001b[0m     images[band] \u001b[38;5;241m=\u001b[39m \u001b[43mcfis\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_image_list\u001b[49m(tiles_ID[band], band, image_type, input_format\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mID_only\u001b[39m\u001b[38;5;124m'\u001b[39m, verbose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n",
+      "\u001b[0;31mAttributeError\u001b[0m: module 'cs_util.cfis' has no attribute 'get_image_list'"
+     ]
+    }
+   ],
    "source": [
     "# Variables\n",
     "unit = 'deg'\n",
@@ -644,9 +668,9 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "sp_validation",
+   "display_name": "shapepipe",
    "language": "python",
-   "name": "sp_validation"
+   "name": "shapepipe"
   },
   "language_info": {
    "codemirror_mode": {
@@ -658,7 +682,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.0"
+   "version": "3.9.13"
   }
  },
  "nbformat": 4,

From c83a43e40f9ebb271cde5eef155d45d2e9bc3f22 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 16 Oct 2023 18:06:55 +0200
Subject: [PATCH 004/207] wcs notebook to compare different WCS conventions

---
 scripts/jupyter/wcs.ipynb | 542 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 542 insertions(+)
 create mode 100644 scripts/jupyter/wcs.ipynb

diff --git a/scripts/jupyter/wcs.ipynb b/scripts/jupyter/wcs.ipynb
new file mode 100644
index 000000000..7a194e1bb
--- /dev/null
+++ b/scripts/jupyter/wcs.ipynb
@@ -0,0 +1,542 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "871d80f3-6570-4303-aeb3-f1ded8fb9d09",
+   "metadata": {},
+   "source": [
+    "# WCS issues"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "26bf7743-4ad1-4275-884f-d9b68a0beb98",
+   "metadata": {},
+   "source": [
+    "## PV polynomials"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "a76aedde-b4b5-448e-902b-256952e99671",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np\n",
+    "\n",
+    "from copy import copy\n",
+    "\n",
+    "from astropy.io import fits\n",
+    "from astropy.wcs import WCS\n",
+    "import sip_tpv as stp\n",
+    "from esutil import wcsutil\n",
+    "\n",
+    "from cs_util import canfar"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "43982ec7-8172-4951-96dc-1601f6759cf1",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Target file 2105209p.fits.fz exists, skipping download.\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Get image\n",
+    "\n",
+    "id = \"2105209\"\n",
+    "image_name = f\"{id}p.fits.fz\"\n",
+    "vos_dir = f\"vos:cfis/pitcairn/\"\n",
+    "canfar.download(f\"{vos_dir}/{image_name}\", image_name, verbose=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "cf4c69a6-60f2-4e0f-adb6-7791bd6a839d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Open file\n",
+    "dat = fits.open(image_name)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "3a7b5e25-3c79-4771-80f1-fc4f9bdab252",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Get main image header\n",
+    "header_0 = dat[0].header"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "71197a6c-2da6-4fec-a195-2f59db937f27",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING: FITSFixedWarning: RADECSYS= 'FK5 ' / Coordinate system for equinox (FK4/FK5/GAPPT) \n",
+      "the RADECSYS keyword is deprecated, use RADESYSa. [astropy.wcs.wcs]\n",
+      "WARNING: FITSFixedWarning: The WCS transformation has more axes (2) than the image it is associated with (0) [astropy.wcs.wcs]\n",
+      "WARNING: FITSFixedWarning: 'datfix' made the change 'Invalid parameter values: MJD-OBS and DATE-OBS are inconsistent'. [astropy.wcs.wcs]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Get WCS, warning might be raised\n",
+    "wcs_0 = WCS(header_0)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "5a62ffcf-3e9d-4a46-ad46-313d75f057e3",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Show PV polynomials: empty with standard \"TAN\" convention\n",
+    "wcs_0.wcs.get_pv()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "73ce8d14-a3b2-4676-9717-6a932a5dc826",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Get header of CCD extension\n",
+    "header_1 = fits.getheader(image_name, 1)\n",
+    "header_2 = fits.getheader(image_name, 2)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "f14e151e-5a8f-4eaa-87e0-0ef3187c4719",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "ERROR 6 in wcsset() at line 2594 of file cextern/wcslib/C/wcs.c:\n",
+      "PV1_5 : Unrecognized coordinate transformation parameter.\n",
+      "\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "WARNING: FITSFixedWarning: 'celfix' made the change 'PV1_5 : Unrecognized coordinate transformation parameter'. [astropy.wcs.wcs]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Try to get WCS: will raise error\n",
+    "try:\n",
+    "    wcs_1 = WCS(header_1)\n",
+    "except Exception as e:\n",
+    "    print(e)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "1da0a4bf-098b-4ab5-871f-869aaaf398b8",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Change convention\n",
+    "header_0[\"CTYPE1\"] = \"RA-TPV\"\n",
+    "header_0[\"CTYPE2\"] = \"DEC-TPV\"\n",
+    "\n",
+    "header_1[\"CTYPE1\"] = \"RA-TPV\"\n",
+    "header_1[\"CTYPE2\"] = \"DEC-TPV\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "11ccbb22-a684-480e-9f54-392338fa5b26",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "wcs_0_tpv = WCS(header_0)\n",
+    "wcs_1_tpv = WCS(header_1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "511bf40f-0e96-472c-bd92-327d1401c55e",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Show PV polynomials: from main header still empty\n",
+    "wcs_0_tpv.wcs.get_pv()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "df253e8f-4e46-4f42-bc62-aae431deb7b6",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(1, 0, -0.006879527402639),\n",
+       " (1, 1, 1.01650122237),\n",
+       " (1, 2, 0.007779393963485),\n",
+       " (1, 3, 0.0),\n",
+       " (1, 4, 0.001658429411009),\n",
+       " (1, 5, 0.001232870290071),\n",
+       " (1, 6, 0.0006421933266491),\n",
+       " (1, 7, -0.02501061777044),\n",
+       " (1, 8, -0.001885796980293),\n",
+       " (1, 9, -0.02476149608525),\n",
+       " (1, 10, -0.0005079512200027),\n",
+       " (2, 0, -0.006116094003451),\n",
+       " (2, 1, 1.01486402431),\n",
+       " (2, 2, 0.007783886945903),\n",
+       " (2, 3, 0.0),\n",
+       " (2, 4, 0.001436380491668),\n",
+       " (2, 5, 0.001297612914507),\n",
+       " (2, 6, 0.0006046712116443),\n",
+       " (2, 7, -0.02474775482412),\n",
+       " (2, 8, -0.001916401228446),\n",
+       " (2, 9, -0.02480256398885),\n",
+       " (2, 10, -0.0004942902025637)]"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Show PV polynomials: now not empty\n",
+    "wcs_1_tpv.wcs.get_pv()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "12636f27-ebd0-4fd1-a373-fb2a1c316d00",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/home/mkilbing/.conda/envs/shapepipe/lib/python3.9/site-packages/sip_tpv/reverse.py:77: FutureWarning: `rcond` parameter will change to the default of machine precision times ``max(M, N)`` where M and N are the input matrix dimensions.\n",
+      "To use the future default and silence this warning we advise to pass `rcond=None`, to keep using the old, explicitly pass `rcond=-1`.\n",
+      "  apcoeffs, r, rank, s = np.linalg.lstsq(a, b)\n",
+      "/home/mkilbing/.conda/envs/shapepipe/lib/python3.9/site-packages/sip_tpv/reverse.py:82: FutureWarning: `rcond` parameter will change to the default of machine precision times ``max(M, N)`` where M and N are the input matrix dimensions.\n",
+      "To use the future default and silence this warning we advise to pass `rcond=None`, to keep using the old, explicitly pass `rcond=-1`.\n",
+      "  bpcoeffs, r, rank, s = np.linalg.lstsq(a, b)\n"
+     ]
+    }
+   ],
+   "source": [
+    "header_1_sip = fits.getheader(image_name, 1)\n",
+    "\n",
+    "# Transform header from PV to SIP\n",
+    "stp.pv_to_sip(header_1_sip)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "15897199-88d8-4c94-a504-406419431b36",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DEC--TAN-SIP\n",
+      "DEC-TPV\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Check key words\n",
+    "print(header_1_sip[\"CTYPE2\"])\n",
+    "print(header_1[\"CTYPE2\"])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "id": "140fcdcc-eba6-48e3-aaca-20aad00ed8e9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "wcs_1_sip = WCS(header_1_sip)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "4cc2169b-ae94-40dc-967d-bb7df9e316c1",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[]"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "wcs_1_sip.wcs.get_pv()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "id": "5a1daffb-ec3f-40b7-a8b2-6071e8132065",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "4644 2112\n"
+     ]
+    }
+   ],
+   "source": [
+    "n_pix_x, n_pix_y = dat[1].data.shape\n",
+    "print(n_pix_x, n_pix_y)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "163c68e5-8dc4-4b6b-a893-10b01b8cbb7d",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[[2000. 1500.]\n",
+      " [2322. 1500.]\n",
+      " [2000. 1056.]\n",
+      " [2322. 1056.]]\n",
+      "[2000. 2322. 2000. 2322.]\n",
+      "[1500. 1500. 1056. 1056.]\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Define some coordinate pairs\n",
+    "x = np.array([2000, n_pix_x/2])\n",
+    "y = np.array([1500, n_pix_y/2])\n",
+    "xx, yy = np.meshgrid(x, y)\n",
+    "pixargs = np.vstack([xx.reshape(-1), yy.reshape(-1)]).T\n",
+    "print(pixargs)\n",
+    "print(pixargs[:,0])\n",
+    "print(pixargs[:,1])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "id": "01ac1dda-5e82-4202-b4bb-65ace2054bce",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([[205.70844802,  49.69450748],\n",
+       "       [205.72490131,  49.69446538],\n",
+       "       [205.70815285,  49.71724671],\n",
+       "       [205.72460613,  49.71720461]])"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Transform to world coordinates using PV\n",
+    "wcs_1_tpv.all_pix2world(pixargs, 1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "id": "0f306759-05f1-497f-beb3-f572edfec9a5",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([[205.96952336,  49.69219154],\n",
+       "       [205.99483982,  49.69195117],\n",
+       "       [205.96933441,  49.7148398 ],\n",
+       "       [205.9946501 ,  49.7145905 ]])"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Transform to world coordinates using SIP: different results\n",
+    "wcs_1_sip.all_pix2world(pixargs, 1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "id": "fb696e11-c066-4297-96c6-acc5245b2716",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Transform sip back to pv\n",
+    "header_1_tpv_back = copy(header_1_sip)\n",
+    "stp.sip_to_pv(header_1_tpv_back)\n",
+    "wcs_1_tpv_back = WCS(header_1_tpv_back)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "id": "209e5bfa-f4f5-4070-9a3b-9057ee69c697",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([[205.96952336,  49.69219154],\n",
+       "       [205.99483982,  49.69195117],\n",
+       "       [205.96933441,  49.7148398 ],\n",
+       "       [205.9946501 ,  49.7145905 ]])"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Transform to world coordinates: same as SIP\n",
+    "wcs_1_tpv_back.all_pix2world(pixargs, 1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "id": "49f45f87-dc7d-4187-ba7d-597370a3d20b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Compare with Erin Shepdon's utils\n",
+    "header_1[\"CTYPE1\"] = \"RA- -TPV\"\n",
+    "header_1[\"CTYPE2\"] = \"DEC- -TPV\"\n",
+    "wcs1_tpv_es = wcsutil.WCS(header_1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "id": "dcee6113-fd9f-4c06-a5ae-e8703ff12b15",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(array([205.96952336, 205.99483982, 205.96933441, 205.9946501 ]),\n",
+       " array([49.69219154, 49.69195117, 49.7148398 , 49.7145905 ]))"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Transform to world coordinates: same as SIP\n",
+    "wcs1_tpv_es.image2sky(pixargs[:,0], pixargs[:,1])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "3f75ed37-6ac1-48b4-b2fd-590c2e209224",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "shapepipe",
+   "language": "python",
+   "name": "shapepipe"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

From 29c609e52985abe62c281d703a68771cc315e54f Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 1 Nov 2023 15:20:31 +0100
Subject: [PATCH 005/207] docker testing

---
 Dockerfile      | 11 +++++++++
 environment.yml |  1 +
 nsswitch.conf   | 62 +++++++++++++++++++++++++++++++++++++++++++++++++
 xterm-start.sh  |  2 ++
 4 files changed, 76 insertions(+)
 create mode 100644 nsswitch.conf
 create mode 100755 xterm-start.sh

diff --git a/Dockerfile b/Dockerfile
index 49cfa01ab..1f966302b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,8 +14,13 @@ RUN apt-get update --allow-releaseinfo-change && \
     apt-get install gcc-9 g++-9 -y && \
     apt-get install locales -y && \
     apt install libgl1-mesa-glx -y && \
+    apt-get install xterm -y && \
     apt-get clean
 
+RUN apt-get install acl -y && \
+    apt-get install sssd -y
+ADD nsswitch.conf /etc/
+
 RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
     locale-gen
 ENV LANG en_US.UTF-8
@@ -25,3 +30,9 @@ ENV LC_ALL en_US.UTF-8
 COPY . /home
 
 RUN ./install_shapepipe --develop --vos
+
+# Create entrypoint script for desktop
+RUN mkdir /skaha
+COPY xterm_start.sh /skaha/init.sh
+
+ENTRYPOINT [ "/skaha/init.sh" ]
diff --git a/environment.yml b/environment.yml
index 24f6dfd5f..2e98f669a 100644
--- a/environment.yml
+++ b/environment.yml
@@ -15,6 +15,7 @@ dependencies:
   - numba==0.54.1
   - pandas==1.4.1
   - pip:
+    - jupyter
     - mccd==1.2.3
     - modopt==1.6.0
     - PyQt5==5.15.6
diff --git a/nsswitch.conf b/nsswitch.conf
new file mode 100644
index 000000000..22d8d9949
--- /dev/null
+++ b/nsswitch.conf
@@ -0,0 +1,62 @@
+#
+# /etc/nsswitch.conf
+#
+# An example Name Service Switch config file. This file should be
+# sorted with the most-used services at the beginning.
+#
+# The entry '[NOTFOUND=return]' means that the search for an
+# entry should stop if the search in the previous entry turned
+# up nothing. Note that if the search failed due to some other reason
+# (like no NIS server responding) then the search continues with the
+# next entry.
+#
+# Valid entries include:
+#
+#	nisplus			Use NIS+ (NIS version 3)
+#	nis			Use NIS (NIS version 2), also called YP
+#	dns			Use DNS (Domain Name Service)
+#	files			Use the local files
+#	db			Use the local database (.db) files
+#	compat			Use NIS on compat mode
+#	hesiod			Use Hesiod for user lookups
+#	[NOTFOUND=return]	Stop searching if not found so far
+#
+
+# To use db, put the "db" in front of "files" for entries you want to be
+# looked up first in the databases
+#
+# Example:
+#passwd:    db files nisplus nis
+#shadow:    db files nisplus nis
+#group:     db files nisplus nis
+
+passwd:     sss files
+shadow:     files sss
+group:      sss files
+
+#hosts:     db files nisplus nis dns
+hosts:      files dns
+
+# Example - obey only what nisplus tells us...
+#services:   nisplus [NOTFOUND=return] files
+#networks:   nisplus [NOTFOUND=return] files
+#protocols:  nisplus [NOTFOUND=return] files
+#rpc:        nisplus [NOTFOUND=return] files
+#ethers:     nisplus [NOTFOUND=return] files
+#netmasks:   nisplus [NOTFOUND=return] files
+
+bootparams: nisplus [NOTFOUND=return] files
+
+ethers:     files
+netmasks:   files
+networks:   files
+protocols:  files
+rpc:        files
+services:   files
+
+netgroup:   nisplus
+
+publickey:  nisplus
+
+automount:  files nisplus
+aliases:    files nisplus
diff --git a/xterm-start.sh b/xterm-start.sh
new file mode 100755
index 000000000..007a2516f
--- /dev/null
+++ b/xterm-start.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+xterm

From 5770367157a3e0b50d38472e6f4a6d14e541c445 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 8 Nov 2023 13:12:05 +0100
Subject: [PATCH 006/207] Dockerfile tests

---
 Dockerfile | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 1f966302b..2235da657 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -15,6 +15,7 @@ RUN apt-get update --allow-releaseinfo-change && \
     apt-get install locales -y && \
     apt install libgl1-mesa-glx -y && \
     apt-get install xterm -y && \
+    apt-get install cmake protobuf-compiler -y && \
     apt-get clean
 
 RUN apt-get install acl -y && \
@@ -27,12 +28,22 @@ ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 
-COPY . /home
+FROM python:3.10-buster
 
-RUN ./install_shapepipe --develop --vos
+RUN pip install poetry==1.7.0
 
-# Create entrypoint script for desktop
-RUN mkdir /skaha
-COPY xterm_start.sh /skaha/init.sh
+ENV POETRY_NO_INTERACTION=1 \
+    POETRY_VIRTUALENVS_IN_PROJECT=1 \
+    POETRY_VIRTUALENVS_CREATE=1 \
+    POETRY_CACHE_DIR=/tmp/poetry_cache
 
-ENTRYPOINT [ "/skaha/init.sh" ]
+COPY . /
+
+COPY pyproject.toml poetry.lock README.rst ./
+RUN touch README.md
+
+RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR
+
+COPY shapepipe ./
+
+RUN poetry install --without dev

From 3166e3c39a9ff8bae45c7cfdb2b36188a5bcc0b5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 8 Nov 2023 13:14:08 +0100
Subject: [PATCH 007/207] Added cent-os to CI tests

---
 .github/workflows/ci-tests.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml
index cc4ae4e93..ba9fe6cce 100644
--- a/.github/workflows/ci-tests.yml
+++ b/.github/workflows/ci-tests.yml
@@ -20,7 +20,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        os: [ubuntu-latest, macos-latest]
+        os: [ubuntu-latest, macos-latest, centos-latest]
         python-version: [3.9]
 
     steps:

From 04a5315e66800f85f4c874473877661630f40d4b Mon Sep 17 00:00:00 2001
From: Samuel Farrens <samuel.farrens@gmail.com>
Date: Thu, 7 Sep 2023 17:42:12 +0200
Subject: [PATCH 008/207] fixed bug in install_shapepipe

---
 install_shapepipe | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/install_shapepipe b/install_shapepipe
index c370d91d0..56fa9be00 100755
--- a/install_shapepipe
+++ b/install_shapepipe
@@ -200,26 +200,28 @@ check_conda() {
     echo -ne "${RED}ERROR: Found Conda version $CONDA_VERSION but require 4.0.0 or greater.${NC}\n"
     exit 1
   fi
-  # Check Conda minor version
-  if [ "$CONDA_VERSION_MINOR" -gt 4 ]
+  # Look for conda.sh file
+  if [ -f "$CONDA_PREFIX_1$CONDA_SH" ]
   then
-    if [ -f "$CONDA_PREFIX_1$CONDA_SH" ]
-    then
-      source "$CONDA_PREFIX_1$CONDA_SH"
-    elif [ -f "$CONDA_PREFIX$CONDA_SH" ]
-    then
-      source "$CONDA_PREFIX$CONDA_SH"
-    else
-      echo -ne "${RED}ERROR: Could not find $CONDA_SH in \$CONDA_PREFIX.${NC}\n"
-      echo -ne "${RED}Activate the base/root Conda environment and try again.${NC}\n"
-      exit 1
-    fi
-    CONDA_ACTIVATE="conda activate"
-    CONDA_DEACTIVATE="conda deactivate"
+    source "$CONDA_PREFIX_1$CONDA_SH"
+  elif [ -f "$CONDA_PREFIX$CONDA_SH" ]
+  then
+    source "$CONDA_PREFIX$CONDA_SH"
   else
+    echo -ne "${RED}ERROR: Could not find $CONDA_SH in \$CONDA_PREFIX.${NC}\n"
+    echo -ne "${RED}Activate the base/root Conda environment and try again.${NC}\n"
+    exit 1
+  fi
+  # Set environment activation command
+  if [ "$USE_CONDA_SOURCE" == TRUE ]
+  then
     CONDA_ACTIVATE="source activate"
     CONDA_DEACTIVATE="source deactivate"
+  else
+    CONDA_ACTIVATE="conda activate"
+    CONDA_DEACTIVATE="conda deactivate"
   fi
+
 }
 
 # Check if a binary executable is already installed in the conda environment
@@ -464,6 +466,7 @@ Options:\n
 \t--pipe-dir\t set the path to the ShapePipe base directory (default is \$PWD)\n
 \t--build-dir\t set the path to the ShapePipe build (default is \$PWD/build)\n
 \t--env-name\t set the name of the conda environment (default is shapepipe)\n
+\t--use-conda-source\t use conda source instead of the default conda activate to activate the shapepipe environment\n
 \t--develop\t option to install additional development packages\n
 \t--vos\t\t option to install virtual observatory software\n
 \t--no-env\t do not build Conda environment\n
@@ -525,6 +528,10 @@ case $i in
     ENV_NAME="${i#*=}"
     shift
     ;;
+    --use-conda-source)
+    USE_CONDA_SOURCE=TRUE
+    shift
+    ;;
     --develop)
     DEVELOP=TRUE
     shift

From 757ef7fad45be8e4315462c66a6642ba70e01b2c Mon Sep 17 00:00:00 2001
From: sfarrens <samuel.farrens@gmail.com>
Date: Wed, 8 Nov 2023 17:34:20 +0100
Subject: [PATCH 009/207] Added development environment.

---
 .github/workflows/ci-dev.yml                  | 50 +++++++++++++++++++
 .../{ci-tests.yml => ci-release.yml}          |  1 -
 environment-dev.yml                           | 37 ++++++++++++++
 environment.yml                               |  6 +++
 install_shapepipe                             | 34 +++++++++++--
 5 files changed, 123 insertions(+), 5 deletions(-)
 create mode 100644 .github/workflows/ci-dev.yml
 rename .github/workflows/{ci-tests.yml => ci-release.yml} (98%)
 create mode 100644 environment-dev.yml

diff --git a/.github/workflows/ci-dev.yml b/.github/workflows/ci-dev.yml
new file mode 100644
index 000000000..a260f6c9d
--- /dev/null
+++ b/.github/workflows/ci-dev.yml
@@ -0,0 +1,50 @@
+name: CI
+
+on:
+  pull_request:
+    branches:
+     - develop
+
+jobs:
+
+  test-full:
+    name: Full Test Suite
+    runs-on: ${{ matrix.os }}
+
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [ubuntu-latest, macos-latest]
+        python-version: [3.8]
+
+    steps:
+      - uses: actions/checkout@v2
+
+      - name: Install Linux dependencies
+        if: runner.os == 'Linux'
+        run: sudo apt-get install libopenblas-dev
+
+      - name: Install macOS Dependencies
+        shell: bash -l {0}
+        if: runner.os == 'macOS'
+        run: |
+          brew install libomp
+
+      - name: Set up conda
+        uses: conda-incubator/setup-miniconda@v2
+        with:
+          auto-update-conda: true
+          python-version: ${{ matrix.python-version }}
+          auto-activate-base: true
+
+      - name: Install package
+        shell: bash -l {0}
+        run: |
+          ./install_shapepipe --env-dev --develop
+
+      - name: Run tests
+        shell: bash -l {0}
+        run: |
+          conda activate shapepipe
+          python setup.py test
+          shapepipe_run -c example/config.ini
diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-release.yml
similarity index 98%
rename from .github/workflows/ci-tests.yml
rename to .github/workflows/ci-release.yml
index cc4ae4e93..ef1f6a013 100644
--- a/.github/workflows/ci-tests.yml
+++ b/.github/workflows/ci-release.yml
@@ -5,7 +5,6 @@ on:
     branches:
      - main
      - master
-     - develop
 
 jobs:
 
diff --git a/environment-dev.yml b/environment-dev.yml
new file mode 100644
index 000000000..b5325d02c
--- /dev/null
+++ b/environment-dev.yml
@@ -0,0 +1,37 @@
+# ShapePipe Development Environment
+# ---------------------------------
+# This environment should only be used for development and testing of  
+# ShapePipe (i.e. nothing that could be published). Packages need only
+# specify the minimum compatible versions. This environment can updated 
+# as needed.
+name: shapepipe-dev
+channels:
+  - conda-forge
+dependencies:
+  - python=3.11
+  - pip>=21.2.4
+  - astropy>=5.0
+  - autoconf>=2.71
+  - automake>=1.16
+  - cmake>=3.27
+  - galsim>=2.5
+  - joblib>=1.3
+  - libtool>=2.4
+  - matplotlib>=3.8
+  - numba>=0.57
+  - pandas>=2.1
+  - pyqt5-sip>=12.12
+  - pyqtgraph>=0.13
+  - reproject>=0.12
+  - sqlitedict>=2.1
+  - termcolor>=2.3
+  - tqdm>=4.66
+  - treecorr>=4.3
+  - pip:
+    - mccd==1.2.3
+    - modopt==1.6.0
+    - sip_tpv==1.1
+    - sf_tools==2.0.4
+    - git+https://github.com/CEA-COSMIC/pysap@develop
+    - git+https://github.com/aguinot/ngmix@stable_version
+    - git+https://github.com/tobias-liaudat/Stile@v0.1
diff --git a/environment.yml b/environment.yml
index 9279402ef..ec8fae7a1 100644
--- a/environment.yml
+++ b/environment.yml
@@ -1,3 +1,9 @@
+# ShapePipe Production Environment
+# --------------------------------
+# This environment should be used for any production runs of ShapePipe 
+# (i.e. anything that could be published). All packages are pinned to
+# specific versions to maximise the reproducibility of the results.
+# This environment should be updated for each release of ShapePipe.
 name: shapepipe
 channels:
   - conda-forge
diff --git a/install_shapepipe b/install_shapepipe
index 56fa9be00..4c3f512c6 100755
--- a/install_shapepipe
+++ b/install_shapepipe
@@ -81,6 +81,8 @@ NC='\033[0m'
 PIPE_DIR=$PWD
 BUILD_DIR=$PIPE_DIR/build
 ENV_NAME='shapepipe'
+ENV_DEV=FALSE
+USE_CONDA_SOURCE=FALSE
 BUILD_ENV=TRUE
 DEVELOP=FALSE
 VOS=FALSE
@@ -258,6 +260,14 @@ check_binary2() {
   echo ""
 }
 
+# Check the environment name
+check_env_name() {
+if [ "$ENV_DEV" == TRUE ]
+then
+  ENV_NAME='shapepipe-dev'
+fi
+}
+
 # Check if a python site-package is installed correctly in the conda environment
 check_site_pkg() {
   if compgen -G "$CONDA_PREFIX/lib/python3.*/site-packages/$1*" > /dev/null
@@ -343,7 +353,9 @@ package_report() {
   echo 'Package Report'
   echo ''
   packages
-  python -m piplist
+  echo 'Python Package Check List:'
+  echo ''
+  site-packages
   echo ''
   exit_code
 }
@@ -410,6 +422,7 @@ astromatic_setup() {
 
 # Function to uninstall ShapePipe and dependencies
 uninstall() {
+  check_env_name
   read -p "Uninstall $ENV_NAME environment [y/N]: " response
   response=${response:-n}
   if [ $response == "y" ]
@@ -465,8 +478,9 @@ Options:\n
 \t--uninstall\t uninstall ShapePipe\n
 \t--pipe-dir\t set the path to the ShapePipe base directory (default is \$PWD)\n
 \t--build-dir\t set the path to the ShapePipe build (default is \$PWD/build)\n
-\t--env-name\t set the name of the conda environment (default is shapepipe)\n
-\t--use-conda-source\t use conda source instead of the default conda activate to activate the shapepipe environment\n
+\t--env-name\t set the name of the Conda environment (default is shapepipe)\n
+\t--env-dev\t use the developers Conda environment instead of the standard production environment\n
+\t--use-conda-source\t use 'conda source' instead of the default 'conda activate' to activate the shapepipe environment\n
 \t--develop\t option to install additional development packages\n
 \t--vos\t\t option to install virtual observatory software\n
 \t--no-env\t do not build Conda environment\n
@@ -528,6 +542,10 @@ case $i in
     ENV_NAME="${i#*=}"
     shift
     ;;
+    --env-dev)
+    ENV_DEV=TRUE
+    shift
+    ;;
     --use-conda-source)
     USE_CONDA_SOURCE=TRUE
     shift
@@ -620,6 +638,9 @@ start
 # Check if conda is installed
 check_conda
 
+# Check the Conda environment name
+check_env_name
+
 # Find the operating system
 case "$OSTYPE" in
   darwin*)
@@ -652,7 +673,12 @@ setup
 if [ "$BUILD_ENV" == TRUE ]
 then
   report_progress 'ShapePipe Environment'
-  conda env create -f environment.yml -n $ENV_NAME
+  if [ "$ENV_DEV" == TRUE ]
+  then
+    conda env create -f environment-dev.yml -n $ENV_NAME
+  else
+    conda env create -f environment.yml -n $ENV_NAME
+  fi
 fi
 
 # Activate conda environment

From 373722e030ddf83238e9f444880769aeb9f6f63b Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 9 Nov 2023 11:44:05 +0100
Subject: [PATCH 010/207] Added pyproject

---
 pyproject.toml | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100644 pyproject.toml

diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 000000000..bc252da53
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,44 @@
+[tool.poetry]
+name = "shapepipe"
+version = "0.1.0"
+description = "Weak-lensing shape measurement"
+authors = [
+	"Sam Farrens",
+	"Axel Guinot",
+	"Martin Kilbinger <martin.kilbinger@cea.fr>",
+]
+readme = "README.rst"
+
+[tool.poetry.dependencies]
+python = ">=3.9,<3.13"
+cmake = "^3.27.2"
+treecorr = "^4.3.3"
+matplotlib = "^3.7.2"
+jupyter = "^1.0.0"
+pandas = "^2.1.0"
+
+cs-util = "^0.0.5"
+numpy = "^1.19.1"
+autoconf = "^2023.10.23.3"
+galsim = "^2.5.1"
+libtool = "^1.1.0"
+numba = "^0.58.1"
+modopt = "^1.6.1"
+
+#python-pysap = { git = "https://github.com/martinkilbinger/pysap.git", branch = "fix_versions" }
+ngmix = { git = "https://github.com/aguinot/ngmix", branch = "stable_version" }
+stile = { git = "https://github.com/tobias-liaudat/Stile", tag = "v0.1" }
+pywavelets = "^1.4.1"
+
+[tool.poetry.dev-dependencies]
+pytest = "^6.2.5"
+pydocstyle = "^6.3.0"
+pytest-cov = "^4.1.0"
+black = "^23.7.0"
+
+[tool.black]
+line-length = 80
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"

From b025b6aad7eebbfab31511ec5d372837acbf4df9 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 10 Nov 2023 15:31:02 +0000
Subject: [PATCH 011/207] canfar pyproject update

---
 pyproject.toml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/pyproject.toml b/pyproject.toml
index bc252da53..e718d3aeb 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -29,6 +29,8 @@ modopt = "^1.6.1"
 ngmix = { git = "https://github.com/aguinot/ngmix", branch = "stable_version" }
 stile = { git = "https://github.com/tobias-liaudat/Stile", tag = "v0.1" }
 pywavelets = "^1.4.1"
+joblib = "^1.3.2"
+sip-tpv = "^1.1"
 
 [tool.poetry.dev-dependencies]
 pytest = "^6.2.5"

From ba135f27c7d05d1cfae0ca04233b97680ea3aec7 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 10 Nov 2023 15:32:37 +0000
Subject: [PATCH 012/207] cfis vos configs: missing keywords, DR5 added

---
 example/cfis/config_GitFeGie_vos.ini          | 8 +++++++-
 example/cfis/config_get_tiles_vos_headers.ini | 2 +-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/example/cfis/config_GitFeGie_vos.ini b/example/cfis/config_GitFeGie_vos.ini
index fd3207bb3..eb06d372b 100644
--- a/example/cfis/config_GitFeGie_vos.ini
+++ b/example/cfis/config_GitFeGie_vos.ini
@@ -66,7 +66,7 @@ NUMBERING_SCHEME =
 
 # Input path where original images are stored. Can be local path or vos url.
 # Single string or list of strings
-INPUT_PATH = vos:cfis/tiles_DR3, vos:cfis/tiles_DR3
+INPUT_PATH = vos:cfis/tiles_DR5, vos:cfis/tiles_DR5
 
 # Input file pattern including tile number as dummy template
 INPUT_FILE_PATTERN = CFIS.000.000.r, CFIS.000.000.r.weight
@@ -98,6 +98,12 @@ FILE_EXT = .fits
 # NUMBERING_SCHEME (optional) string with numbering pattern for input files
 NUMBERING_SCHEME = -000-000
 
+# Column number of exposure name in FITS header
+COLNUM = 3
+
+# Prefix to remove from exposure name
+EXP_PREFIX = p
+
 
 # Get exposures
 [GET_IMAGES_RUNNER_RUN_2]
diff --git a/example/cfis/config_get_tiles_vos_headers.ini b/example/cfis/config_get_tiles_vos_headers.ini
index e28347ebf..4b79a2493 100644
--- a/example/cfis/config_get_tiles_vos_headers.ini
+++ b/example/cfis/config_get_tiles_vos_headers.ini
@@ -69,7 +69,7 @@ NUMBERING_SCHEME =
 
 # Input path where original images are stored. Can be local path or vos url.
 # Single string or list of strings
-INPUT_PATH = vos:cfis/tiles_DR3
+INPUT_PATH = vos:cfis/tiles_DR5
 
 # Input file pattern including tile number as dummy template
 INPUT_FILE_PATTERN = CFIS.000.000.r

From 07cafb4651db7dee9d372b121c984d3ba27060cb Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 15 Nov 2023 09:55:57 +0100
Subject: [PATCH 013/207] Testing dockerfile with only conda env installed

---
 Dockerfile                                 | 35 ++--------------
 environment.yml                            | 48 ++++++++++------------
 shapepipe/modules/python_example_runner.py |  2 -
 3 files changed, 25 insertions(+), 60 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 1f966302b..8cf92b10c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,38 +1,9 @@
 FROM continuumio/miniconda3
 
 LABEL Description="ShapePipe Docker Image"
-WORKDIR /home
 ENV SHELL /bin/bash
 
-ARG CC=gcc-9
-ARG CXX=g++-9
+COPY ./environment.yml ./
+RUN touch ./README.md
 
-RUN apt-get update --allow-releaseinfo-change && \
-    apt-get update && \
-    apt-get upgrade -y && \
-    apt-get install make -y && \
-    apt-get install gcc-9 g++-9 -y && \
-    apt-get install locales -y && \
-    apt install libgl1-mesa-glx -y && \
-    apt-get install xterm -y && \
-    apt-get clean
-
-RUN apt-get install acl -y && \
-    apt-get install sssd -y
-ADD nsswitch.conf /etc/
-
-RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
-    locale-gen
-ENV LANG en_US.UTF-8
-ENV LANGUAGE en_US:en
-ENV LC_ALL en_US.UTF-8
-
-COPY . /home
-
-RUN ./install_shapepipe --develop --vos
-
-# Create entrypoint script for desktop
-RUN mkdir /skaha
-COPY xterm_start.sh /skaha/init.sh
-
-ENTRYPOINT [ "/skaha/init.sh" ]
+RUN conda env create --file environment.yml
diff --git a/environment.yml b/environment.yml
index d6e5957b6..0335a4ac7 100644
--- a/environment.yml
+++ b/environment.yml
@@ -1,34 +1,30 @@
-name: shapepipe
+name: shapepipe2
 channels:
   - conda-forge
 dependencies:
   - python=3.9
   - pip>=21.2.4
-  - numpy==1.21.6
-  - astropy==5.0
-  - automake==1.16.2
-  - autoconf==2.69
-  - cmake==3.19.6
-  - galsim==2.2.5
-  - joblib==1.1.0
-  - libtool==2.4.6
-  - matplotlib==3.5.1
-  - numba==0.54.1
-  - pandas==1.4.1
+  - numpy
+  - astropy
+  - automake
+  - autoconf
+  - cmake
+  - galsim
+  - joblib
+  - libtool
+  - matplotlib
+  - numba
   - pip:
-    - jupyter
-    - cs_util==0.0.5
-    - mccd==1.2.3
-    - modopt==1.6.0
-    - PyQt5==5.15.6
-    - pyqtgraph==0.12.4
-    - python-pysap==0.0.6
-    - reproject==0.8
-    - sip_tpv==1.1
-    - sf_tools==2.0.4
-    - sqlitedict==2.0.0
-    - termcolor==1.1.0
-    - tqdm==4.63.0
-    - treecorr==4.2.6
+    - cs_util
+    - modopt
+    - PyQt5
+    - pyqtgraph
+    - reproject
+    - sip_tpv
+    - sf_tools
+    - sqlitedict
+    - termcolor
+    - tqdm
+    - treecorr
     - git+https://github.com/aguinot/ngmix@stable_version
     - git+https://github.com/tobias-liaudat/Stile@v0.1
diff --git a/shapepipe/modules/python_example_runner.py b/shapepipe/modules/python_example_runner.py
index d468c10e0..fc5565ecc 100644
--- a/shapepipe/modules/python_example_runner.py
+++ b/shapepipe/modules/python_example_runner.py
@@ -19,10 +19,8 @@
         'astropy',
         'galsim',
         'joblib',
-        'mccd',
         'ngmix',
         'pandas',
-        'pysap',
         'scipy',
         'sf_tools',
         'sip_tpv',

From 92a999ca5f647637de051c961ef51663a41c98d6 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 15 Nov 2023 09:59:38 +0100
Subject: [PATCH 014/207] Fixing numpy and astropy versions

---
 environment.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/environment.yml b/environment.yml
index 0335a4ac7..bd0c28bce 100644
--- a/environment.yml
+++ b/environment.yml
@@ -4,8 +4,8 @@ channels:
 dependencies:
   - python=3.9
   - pip>=21.2.4
-  - numpy
-  - astropy
+  - numpy==1.21.6
+  - astropy==5.1
   - automake
   - autoconf
   - cmake

From 2b6600de2512b4a91f3f8b0a635deb73c55cc9e0 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 17 Nov 2023 10:39:53 +0000
Subject: [PATCH 015/207] installation on canfar working: removed most versions
 from yml file; added init_canfar.sh script

---
 environment.yml                  | 48 +++++++++++++++-----------------
 example/cfis/config_exp_SpMh.ini |  2 ++
 pyproject.toml                   |  3 ++
 scripts/sh/init_canfar.sh        | 13 +++++++++
 4 files changed, 41 insertions(+), 25 deletions(-)
 create mode 100755 scripts/sh/init_canfar.sh

diff --git a/environment.yml b/environment.yml
index d6e5957b6..489080262 100644
--- a/environment.yml
+++ b/environment.yml
@@ -3,32 +3,30 @@ channels:
   - conda-forge
 dependencies:
   - python=3.9
-  - pip>=21.2.4
-  - numpy==1.21.6
-  - astropy==5.0
-  - automake==1.16.2
-  - autoconf==2.69
-  - cmake==3.19.6
-  - galsim==2.2.5
-  - joblib==1.1.0
-  - libtool==2.4.6
-  - matplotlib==3.5.1
-  - numba==0.54.1
-  - pandas==1.4.1
+  - pip
+  - numpy
+  - astropy
+  - automake
+  - autoconf
+  - cmake
+  - galsim
+  - joblib
+  - libtool
+  - matplotlib
+  - numba
+  - pandas
   - pip:
     - jupyter
-    - cs_util==0.0.5
-    - mccd==1.2.3
-    - modopt==1.6.0
-    - PyQt5==5.15.6
-    - pyqtgraph==0.12.4
-    - python-pysap==0.0.6
-    - reproject==0.8
-    - sip_tpv==1.1
-    - sf_tools==2.0.4
-    - sqlitedict==2.0.0
-    - termcolor==1.1.0
-    - tqdm==4.63.0
-    - treecorr==4.2.6
+    - cs_util
+    - modopt
+    - PyQt5
+    - pyqtgraph
+    - reproject
+    - sip_tpv
+    - sf_tools
+    - sqlitedict
+    - termcolor
+    - tqdm
+    - treecorr
     - git+https://github.com/aguinot/ngmix@stable_version
     - git+https://github.com/tobias-liaudat/Stile@v0.1
diff --git a/example/cfis/config_exp_SpMh.ini b/example/cfis/config_exp_SpMh.ini
index 76f87ddd7..ce37729f3 100644
--- a/example/cfis/config_exp_SpMh.ini
+++ b/example/cfis/config_exp_SpMh.ini
@@ -57,6 +57,8 @@ TIMEOUT = 96:00:00
 
 INPUT_DIR = last:get_images_runner_run_2
 
+FILE_PATTERN = image, weight, flag
+
 # Matches compressed single-exposure files
 FILE_EXT = .fitsfz, .fitsfz, .fitsfz
 
diff --git a/pyproject.toml b/pyproject.toml
index e718d3aeb..59d487316 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,6 +24,8 @@ galsim = "^2.5.1"
 libtool = "^1.1.0"
 numba = "^0.58.1"
 modopt = "^1.6.1"
+# MKDEBUG astropy>5.2: RuntimeError: Invalid TFORM2: 1PE(625) when reading (compressed) tiles weight
+astropy = ">=5.0, <5.2"
 
 #python-pysap = { git = "https://github.com/martinkilbinger/pysap.git", branch = "fix_versions" }
 ngmix = { git = "https://github.com/aguinot/ngmix", branch = "stable_version" }
@@ -31,6 +33,7 @@ stile = { git = "https://github.com/tobias-liaudat/Stile", tag = "v0.1" }
 pywavelets = "^1.4.1"
 joblib = "^1.3.2"
 sip-tpv = "^1.1"
+sqlitedict = "^2.1.0"
 
 [tool.poetry.dev-dependencies]
 pytest = "^6.2.5"
diff --git a/scripts/sh/init_canfar.sh b/scripts/sh/init_canfar.sh
new file mode 100755
index 000000000..dd3346f94
--- /dev/null
+++ b/scripts/sh/init_canfar.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+echo "start init canfar"
+
+echo init_canfar > ~/init_canfar.log
+date >> ~/init_canfar.log
+
+. /opt/conda/etc/profile.d/conda.sh
+
+conda activate shapepipe
+
+echo "end init canfar"
+

From b6e5c970db8d6b2e788fa3286b3255c9fcc3bde6 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 17 Nov 2023 11:47:15 +0100
Subject: [PATCH 016/207] Dockerfile for image 0:7, 0:8

---
 Dockerfile                       | 47 ++++++++++++++++++++++++++++++++
 environment.yml                  |  2 +-
 example/cfis/config_exp_SpMh.ini |  2 +-
 scripts/sh/curl_canfar.sh        | 37 +++++++++++++++++++++++++
 4 files changed, 86 insertions(+), 2 deletions(-)
 create mode 100755 scripts/sh/curl_canfar.sh

diff --git a/Dockerfile b/Dockerfile
index 8cf92b10c..dfcef1762 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,7 +3,54 @@ FROM continuumio/miniconda3
 LABEL Description="ShapePipe Docker Image"
 ENV SHELL /bin/bash
 
+ARG CC=gcc-9
+ARG CXX=g++-9
+
+# gcc < 10 is required to compile ww
+ENV CC=gcc-9
+ENV CXX=g++-9
+
+RUN apt-get update --allow-releaseinfo-change && \
+    apt-get update && \
+    apt-get upgrade -y && \
+    apt-get install apt-utils -y && \
+    apt-get install make -y && \
+    apt-get install automake -y && \
+    apt-get install autoconf -y && \
+    apt-get install gcc-9 g++-9 -y && \
+    apt-get install locales -y && \
+    apt-get install libgl1-mesa-glx -y && \
+    apt-get install xterm -y && \
+    apt-get install cmake protobuf-compiler -y && \
+    apt-get install libtool libtool-bin libtool-doc -y && \
+    apt-get install libfftw3-bin libfftw3-dev -y && \
+    apt-get install libatlas-base-dev liblapack-dev libblas-dev -y && \
+    apt-get install vim -y && \
+    apt-get install locate -y && \
+    apt-get install sextractor -y && \
+    apt-get install psfex -y && \
+    apt-get clean
+
+RUN apt-get install acl -y && \
+    apt-get install sssd -y
+ADD nsswitch.conf /etc/
+
+RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
+    locale-gen
+ENV LANG en_US.UTF-8
+ENV LANGUAGE en_US:en
+ENV LC_ALL en_US.UTF-8
+
 COPY ./environment.yml ./
+COPY install_shapepipe README.rst setup.py setup.cfg ./
 RUN touch ./README.md
 
+RUN conda update -n base -c defaults conda -c defaults
 RUN conda env create --file environment.yml
+
+COPY shapepipe ./shapepipe
+COPY scripts ./scripts
+
+RUN ls ./scripts/sh
+RUN ./scripts/sh/init_canfar.sh
+#RUN conda activate shapepipe
diff --git a/environment.yml b/environment.yml
index bd0c28bce..8bc1d736a 100644
--- a/environment.yml
+++ b/environment.yml
@@ -1,4 +1,4 @@
-name: shapepipe2
+name: shapepipe
 channels:
   - conda-forge
 dependencies:
diff --git a/example/cfis/config_exp_SpMh.ini b/example/cfis/config_exp_SpMh.ini
index 76f87ddd7..20ac38616 100644
--- a/example/cfis/config_exp_SpMh.ini
+++ b/example/cfis/config_exp_SpMh.ini
@@ -63,7 +63,7 @@ FILE_EXT = .fitsfz, .fitsfz, .fitsfz
 NUMBERING_SCHEME = -0000000
 
 # OUTPUT_SUFFIX, actually file name prefixes.
-# Expected keyword "flag" will lead to a behavior where the data are save as int.
+# Expected keyword "flag" will lead to a behavior where the data are saved as int.
 # The code also expects the image data to use the "image" suffix
 # (default value in the pipeline).
 OUTPUT_SUFFIX = image, weight, flag
diff --git a/scripts/sh/curl_canfar.sh b/scripts/sh/curl_canfar.sh
new file mode 100755
index 000000000..5e898a27d
--- /dev/null
+++ b/scripts/sh/curl_canfar.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/bash
+
+# Usage
+# cat tile_num.txt | xargs -n 1 -P 1 ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.7 shapepipe/scripts/sh/init_canfar.sh
+
+SSL=~/.ssl/cadcproxy.pem
+SESSION=https://ws-uv.canfar.net/skaha/v0/session
+IMAGE=images.canfar.net/unions/shapepipe
+NAME=shapepipe
+
+version=$1
+cmd=$2
+arg=$3
+
+arg_an=`echo "$arg" | tr '_' 'X' | tr '.' 'X'`
+arg_an=X
+
+echo "Start headless container"
+echo "========================"
+ID=`curl -E $SSL $SESSION -d "image=$IMAGE:$version" -d "name=${NAME}${arg_an}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
+#curl -E $SSL $SESSION -d \"name=$NAME\" -d \"image=images.canfar.net/unions/shapepipe\:0.7\" -d \"cmd=$2\" --data-urlencode \"args=$3\"
+echo $ID
+
+echo
+echo "Events (incl. errors)"
+echo "====================="
+cmd="curl -E $SSL $SESSION/$ID?view=events"
+echo $cmd
+$cmd
+
+echo
+echo "Logs (incl. stdout)"
+echo "==================="
+cmd="curl -E $SSL $SESSION/$ID?view=logs"
+echo $cmd
+$cmd
+

From bc66565c8e6ece3c20dee4fe46879fd385725619 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 19 Nov 2023 19:04:19 +0100
Subject: [PATCH 017/207] Installation of sextractor and psfex with conda

---
 Dockerfile                |   3 -
 environment.yml           |   4 +-
 install_shapepipe         | 125 --------------------------------------
 scripts/sh/init_canfar.sh |  13 ++++
 4 files changed, 16 insertions(+), 129 deletions(-)
 create mode 100755 scripts/sh/init_canfar.sh

diff --git a/Dockerfile b/Dockerfile
index dfcef1762..98e6c35fc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -27,8 +27,6 @@ RUN apt-get update --allow-releaseinfo-change && \
     apt-get install libatlas-base-dev liblapack-dev libblas-dev -y && \
     apt-get install vim -y && \
     apt-get install locate -y && \
-    apt-get install sextractor -y && \
-    apt-get install psfex -y && \
     apt-get clean
 
 RUN apt-get install acl -y && \
@@ -51,6 +49,5 @@ RUN conda env create --file environment.yml
 COPY shapepipe ./shapepipe
 COPY scripts ./scripts
 
-RUN ls ./scripts/sh
 RUN ./scripts/sh/init_canfar.sh
 #RUN conda activate shapepipe
diff --git a/environment.yml b/environment.yml
index 8bc1d736a..759813a80 100644
--- a/environment.yml
+++ b/environment.yml
@@ -4,7 +4,8 @@ channels:
 dependencies:
   - python=3.9
   - pip>=21.2.4
-  - numpy==1.21.6
+  - astromatic-psfex==3.21.1
+  - astromatic-source-extractor==2.25.0
   - astropy==5.1
   - automake
   - autoconf
@@ -14,6 +15,7 @@ dependencies:
   - libtool
   - matplotlib
   - numba
+  - numpy==1.21.6
   - pip:
     - cs_util
     - modopt
diff --git a/install_shapepipe b/install_shapepipe
index c370d91d0..96cc89395 100755
--- a/install_shapepipe
+++ b/install_shapepipe
@@ -25,20 +25,6 @@ libpng_ver="1.6.37"
 mpi4py_ver="3.1.3"
 openblas_ver="0.3.18"
 
-# SExtractor Package
-sex_url="https://github.com/astromatic/sextractor/archive/2.25.0.tar.gz"
-sex_tar="2.25.0.tar.gz"
-sex_dir="sextractor-2.25.0"
-sex_bin="sex"
-sex_version=TRUE
-
-# PSFEx Package
-psfex_url="https://github.com/astromatic/psfex/archive/3.21.1.tar.gz"
-psfex_tar="3.21.1.tar.gz"
-psfex_dir="psfex-3.21.1"
-psfex_bin="psfex"
-psfex_version=TRUE
-
 # WeightWatcher Package
 ww_url="http://snapshot.debian.org/archive/debian/20171211T160522Z/pool/main/w/weightwatcher/weightwatcher_1.12.orig.tar.gz"
 ww_tar="weightwatcher_1.12.orig.tar.gz"
@@ -84,8 +70,6 @@ ENV_NAME='shapepipe'
 BUILD_ENV=TRUE
 DEVELOP=FALSE
 VOS=FALSE
-INSTALL_SEX=TRUE
-INSTALL_PSFEX=TRUE
 INSTALL_WW=TRUE
 INSTALL_CDSCLIENT=TRUE
 ATLAS_SEARCH=FALSE
@@ -105,66 +89,6 @@ download_package() {
   rm $2
 }
 
-# Function to build SExtractor with OpenBLAS
-build_sex_blas() {
-  astromatic_setup
-  cd $BUILD_DIR/$1
-  ./autogen.sh
-  ./configure --prefix=$CONDA_PREFIX --enable-openblas --with-fftw-libdir=$FFTW_LIB \
-  --with-fftw-incdir=$FFTW_INC --with-openblas-libdir=$BLAS_LIB \
-  --with-openblas-incdir=$BLAS_INC --quiet
-  make -j --quiet
-  make install
-}
-
-# Function to build SExtractor with ATLAS
-build_sex_atlas() {
-  astromatic_setup
-  cd $BUILD_DIR/$1
-  ./autogen.sh
-  if [ "$ATLAS_SEARCH" == TRUE ]
-  then
-    ./configure --prefix=$CONDA_PREFIX --with-fftw-libdir=$FFTW_LIB \
-    --with-fftw-incdir=$FFTW_INC --quiet
-  else
-    ./configure --prefix=$CONDA_PREFIX --with-fftw-libdir=$FFTW_LIB \
-    --with-fftw-incdir=$FFTW_INC --with-atlas-libdir=$ATLAS_LIB \
-    --with-atlas-incdir=$ATLAS_INC --quiet
-  fi
-  make -j --quiet
-  make install
-}
-
-# Function to build PSFEx with OpenBLAS
-build_psfex_blas() {
-  astromatic_setup
-  cd $BUILD_DIR/$1
-  ./autogen.sh
-  ./configure --prefix=$CONDA_PREFIX --enable-openblas --enable-plplot=no \
-  --with-fftw-libdir=$FFTW_LIB --with-fftw-incdir=$FFTW_INC \
-  --with-openblas-libdir=$BLAS_LIB --with-openblas-incdir=$BLAS_INC --quiet
-  make -j --quiet
-  make install
-}
-
-# Function to build PSFEx with ATLAS
-build_psfex_atlas() {
-  astromatic_setup
-  cd $BUILD_DIR/$1
-  ./autogen.sh
-  if [ "$ATLAS_SEARCH" == TRUE ]
-  then
-    ./configure --prefix=$CONDA_PREFIX --enable-plplot=no \
-    --with-fftw-libdir=$FFTW_LIB --with-fftw-incdir=$FFTW_INC --quiet
-  else
-    ./configure --prefix=$CONDA_PREFIX --enable-plplot=no \
-    --with-fftw-libdir=$FFTW_LIB --with-fftw-incdir=$FFTW_INC \
-    --with-atlas-libdir=$ATLAS_LIB --with-atlas-incdir=$ATLAS_INC --quiet
-  fi
-  make -j --quiet
-  make install
-}
-
 # Function to build a standard package
 build_standard() {
   cd $BUILD_DIR/$1
@@ -290,8 +214,6 @@ start() {
 
 # Function to report package versions
 packages() {
-  check_binary2 $sex_bin "SExtractor" $sex_version $INSTALL_SEX
-  check_binary2 $psfex_bin "PSFEx" $psfex_version $INSTALL_PSFEX
   check_binary2 $ww_bin "WeightWatcher" $ww_version $INSTALL_WW
   check_binary2 $cdsclient_bin "CDSclient" $cdsclient_version $INSTALL_CDSCLIENT
   check_binary2 $mpi_bin "MPI" $mpi_version $USE_MPI $MPI_ROOT
@@ -332,8 +254,6 @@ package_report() {
   then
     activate_shapepipe
   fi
-  INSTALL_SEX=FALSE
-  INSTALL_PSFEX=FALSE
   INSTALL_WW=FALSE
   INSTALL_CDSCLIENT=FALSE
   USE_MPI=FALSE
@@ -381,8 +301,6 @@ setup() {
   check_status 'Operating System:' $SYSOS
   check_status 'Conda Version:' $CONDA_VERSION
   check_status 'Build Conda Environment:' $BUILD_ENV $ENV_NAME
-  check_status 'Install SExtractor:' $INSTALL_SEX
-  check_status 'Install PSFEx:' $INSTALL_PSFEX
   check_status 'Install WeightWatcher:' $INSTALL_WW
   check_status 'Install CDSclient:' $INSTALL_CDSCLIENT
   check_status 'Use MPI:' $USE_MPI $MPI_ROOT
@@ -467,8 +385,6 @@ Options:\n
 \t--develop\t option to install additional development packages\n
 \t--vos\t\t option to install virtual observatory software\n
 \t--no-env\t do not build Conda environment\n
-\t--no-sex\t do not build SExtractor\n
-\t--no-psfex\t do not build PSFEx\n
 \t--no-ww\t\t do not build WeightWatcher\n
 \t--no-cds\t do not build CDSclient\n
 \t--no-exe\t do not build any system executables\n\n
@@ -537,14 +453,6 @@ case $i in
     BUILD_ENV=FALSE
     shift
     ;;
-    --no-sex)
-    INSTALL_SEX=FALSE
-    shift
-    ;;
-    --no-psfex)
-    INSTALL_PSFEX=FALSE
-    shift
-    ;;
     --no-ww)
     INSTALL_WW=FALSE
     shift
@@ -590,8 +498,6 @@ case $i in
     shift
     ;;
     --no-exe)
-    INSTALL_SEX=FALSE
-    INSTALL_PSFEX=FALSE
     INSTALL_WW=FALSE
     INSTALL_CDSCLIENT=FALSE
     shift
@@ -716,37 +622,6 @@ fi
 # BUILD EXTERNAL EXECUTABLES
 ##############################################################################
 
-# Build SExtractor
-if [ "$INSTALL_SEX" == TRUE ] && check_binary $sex_bin
-then
-  report_progress 'SExtractor'
-  conda install -n $ENV_NAME -c conda-forge "fftw==${fftw_ver}" -y
-  download_package $sex_url $sex_tar
-  if [ "$use_atlas" == TRUE ]
-  then
-    build_sex_atlas $sex_dir
-  else
-    conda install -n $ENV_NAME -c conda-forge "openblas==${openblas_ver}" -y
-    build_sex_blas $sex_dir
-  fi
-fi
-
-# Build PSFEx
-if [ "$INSTALL_PSFEX" == TRUE ] && check_binary $psfex_bin
-then
-  report_progress 'PSFEx'
-  conda install "libpng==${libpng_ver}" -y
-  conda install -n $ENV_NAME -c conda-forge "fftw==${fftw_ver}" -y
-  download_package $psfex_url $psfex_tar
-  if [ "$use_atlas" == TRUE ]
-  then
-    build_psfex_atlas $psfex_dir
-  else
-    conda install -n $ENV_NAME -c conda-forge "openblas==${openblas_ver}" -y
-    build_psfex_blas $psfex_dir
-  fi
-fi
-
 # Build WeightWatcher
 if [ "$INSTALL_WW" == TRUE ] && check_binary $ww_bin
 then
diff --git a/scripts/sh/init_canfar.sh b/scripts/sh/init_canfar.sh
new file mode 100755
index 000000000..dd3346f94
--- /dev/null
+++ b/scripts/sh/init_canfar.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+echo "start init canfar"
+
+echo init_canfar > ~/init_canfar.log
+date >> ~/init_canfar.log
+
+. /opt/conda/etc/profile.d/conda.sh
+
+conda activate shapepipe
+
+echo "end init canfar"
+

From 0b3aac6277bedfbacd926e4f82004faf67c66615 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 19 Nov 2023 19:05:02 +0100
Subject: [PATCH 018/207] script to call curl with canfar contained updated,
 adding NCORE as argument

---
 scripts/sh/curl_canfar.sh | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/curl_canfar.sh b/scripts/sh/curl_canfar.sh
index 5e898a27d..43fb6cd08 100755
--- a/scripts/sh/curl_canfar.sh
+++ b/scripts/sh/curl_canfar.sh
@@ -1,24 +1,30 @@
 #!/usr/bin/bash
 
 # Usage
-# cat tile_num.txt | xargs -n 1 -P 1 ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.7 shapepipe/scripts/sh/init_canfar.sh
+~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.7 shapepipe/scripts/sh/init_canfar.sh 000.000
 
 SSL=~/.ssl/cadcproxy.pem
-SESSION=https://ws-uv.canfar.net/skaha/v0/session
+NCORE=16
+SESSION=https://ws-uv.canfar.net/skaha/v0/session?ram=16&cores=$NCORE
 IMAGE=images.canfar.net/unions/shapepipe
 NAME=shapepipe
 
+# version of image on canfar, e.g. 0:7, 0:8
 version=$1
+
+# command on canfar, e.g. shapepipe/scripts/sh/init_run_canfar.sh
 cmd=$2
-arg=$3
 
-arg_an=`echo "$arg" | tr '_' 'X' | tr '.' 'X'`
+# command line argument, e.g. 181.308
+arg="$3 $NCORE"
+
+#arg_an=`echo "$arg" | tr '_' 'X' | tr '.' 'X'`
 arg_an=X
 
+echo
 echo "Start headless container"
 echo "========================"
 ID=`curl -E $SSL $SESSION -d "image=$IMAGE:$version" -d "name=${NAME}${arg_an}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
-#curl -E $SSL $SESSION -d \"name=$NAME\" -d \"image=images.canfar.net/unions/shapepipe\:0.7\" -d \"cmd=$2\" --data-urlencode \"args=$3\"
 echo $ID
 
 echo

From 69317cb210e5d3b70fbd0cfe64c2d53984b4b98f Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 19 Nov 2023 18:17:38 +0000
Subject: [PATCH 019/207] added init scripts for canfar; job_sp added n_smp for
 further jobs

---
 pyproject.toml                | 49 -----------------------------------
 scripts/sh/init_canfar.sh     |  4 +--
 scripts/sh/init_run_canfar.sh | 21 +++++++++++++++
 scripts/sh/job_sp.bash        |  2 +-
 4 files changed, 24 insertions(+), 52 deletions(-)
 delete mode 100644 pyproject.toml
 create mode 100755 scripts/sh/init_run_canfar.sh

diff --git a/pyproject.toml b/pyproject.toml
deleted file mode 100644
index 59d487316..000000000
--- a/pyproject.toml
+++ /dev/null
@@ -1,49 +0,0 @@
-[tool.poetry]
-name = "shapepipe"
-version = "0.1.0"
-description = "Weak-lensing shape measurement"
-authors = [
-	"Sam Farrens",
-	"Axel Guinot",
-	"Martin Kilbinger <martin.kilbinger@cea.fr>",
-]
-readme = "README.rst"
-
-[tool.poetry.dependencies]
-python = ">=3.9,<3.13"
-cmake = "^3.27.2"
-treecorr = "^4.3.3"
-matplotlib = "^3.7.2"
-jupyter = "^1.0.0"
-pandas = "^2.1.0"
-
-cs-util = "^0.0.5"
-numpy = "^1.19.1"
-autoconf = "^2023.10.23.3"
-galsim = "^2.5.1"
-libtool = "^1.1.0"
-numba = "^0.58.1"
-modopt = "^1.6.1"
-# MKDEBUG astropy>5.2: RuntimeError: Invalid TFORM2: 1PE(625) when reading (compressed) tiles weight
-astropy = ">=5.0, <5.2"
-
-#python-pysap = { git = "https://github.com/martinkilbinger/pysap.git", branch = "fix_versions" }
-ngmix = { git = "https://github.com/aguinot/ngmix", branch = "stable_version" }
-stile = { git = "https://github.com/tobias-liaudat/Stile", tag = "v0.1" }
-pywavelets = "^1.4.1"
-joblib = "^1.3.2"
-sip-tpv = "^1.1"
-sqlitedict = "^2.1.0"
-
-[tool.poetry.dev-dependencies]
-pytest = "^6.2.5"
-pydocstyle = "^6.3.0"
-pytest-cov = "^4.1.0"
-black = "^23.7.0"
-
-[tool.black]
-line-length = 80
-
-[build-system]
-requires = ["poetry-core>=1.0.0"]
-build-backend = "poetry.core.masonry.api"
diff --git a/scripts/sh/init_canfar.sh b/scripts/sh/init_canfar.sh
index dd3346f94..d59035728 100755
--- a/scripts/sh/init_canfar.sh
+++ b/scripts/sh/init_canfar.sh
@@ -2,8 +2,8 @@
 
 echo "start init canfar"
 
-echo init_canfar > ~/init_canfar.log
-date >> ~/init_canfar.log
+#echo init_canfar > ~/init_canfar.log
+#date >> ~/init_canfar.log
 
 . /opt/conda/etc/profile.d/conda.sh
 
diff --git a/scripts/sh/init_run_canfar.sh b/scripts/sh/init_run_canfar.sh
new file mode 100755
index 000000000..1945d69fc
--- /dev/null
+++ b/scripts/sh/init_run_canfar.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+echo "start init canfar"
+
+#echo init_canfar > ~/init_canfar.log
+#date >> ~/init_canfar.log
+
+. /opt/conda/etc/profile.d/conda.sh
+
+conda activate shapepipe
+
+cd cosmostat/P3_v2/psfex 
+
+tile_ID=$1
+n_SMP=$2
+echo "tile_ID=$tile_ID n_SMP=$n_SMP"
+
+job_sp $tile_ID -p psfex -j 8 -n $n_SMP
+
+echo "end init canfar"
+
diff --git a/scripts/sh/job_sp.bash b/scripts/sh/job_sp.bash
index 15cb1428a..4d4e6fdcf 100755
--- a/scripts/sh/job_sp.bash
+++ b/scripts/sh/job_sp.bash
@@ -420,7 +420,7 @@ if [[ $do_job != 0 ]]; then
   ### Star detection, selection, PSF model. setools can exit with an error for CCD with insufficient stars,
   ### the script should continue
   STOP=0
-  command_sp "shapepipe_run -c $SP_CONFIG/config_tile_Sx_exp_${psf}.ini" "Run shapepipe (tile detection, exp $psf)"
+  command_cfg_shapepipe "config_tile_Sx_exp_${psf}.ini" "Run shapepipe (tile detection, exp $psf)" $n_smp
   STOP=1
 
 fi

From d35bd694c5d12d554866177c55ed62d50d9b67b0 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 19 Nov 2023 19:21:29 +0100
Subject: [PATCH 020/207] script to call curl for canfar container: added
 resources

---
 scripts/sh/curl_canfar.sh | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/scripts/sh/curl_canfar.sh b/scripts/sh/curl_canfar.sh
index 43fb6cd08..89bb4f64e 100755
--- a/scripts/sh/curl_canfar.sh
+++ b/scripts/sh/curl_canfar.sh
@@ -1,11 +1,12 @@
 #!/usr/bin/bash
 
 # Usage
-~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.7 shapepipe/scripts/sh/init_canfar.sh 000.000
+# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.7 shapepipe/scripts/sh/init_canfar.sh 000.000
 
 SSL=~/.ssl/cadcproxy.pem
 NCORE=16
-SESSION=https://ws-uv.canfar.net/skaha/v0/session?ram=16&cores=$NCORE
+SESSION=https://ws-uv.canfar.net/skaha/v0/session
+RESOURCES="ram=16&cores=$NCORE"
 IMAGE=images.canfar.net/unions/shapepipe
 NAME=shapepipe
 
@@ -24,7 +25,7 @@ arg_an=X
 echo
 echo "Start headless container"
 echo "========================"
-ID=`curl -E $SSL $SESSION -d "image=$IMAGE:$version" -d "name=${NAME}${arg_an}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
+ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}${arg_an}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
 echo $ID
 
 echo

From d93a60efa985b0df69849fe771f157f504950ac5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 19 Nov 2023 19:47:15 +0100
Subject: [PATCH 021/207] testing input numbers

---
 shapepipe/pipeline/file_handler.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index b7479f6f3..037f445b8 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -985,6 +985,8 @@ def _save_num_patterns(
                 + 'directory is used.'
             )
 
+        print("MKDEBUG elem", elem)
+
         # Save file list
         np.save(output_file, np.array(final_file_list))
 

From fb83a275d096b710f115008c186f882bf020cf13 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 Nov 2023 17:19:01 +0100
Subject: [PATCH 022/207] removed debug msg

---
 shapepipe/pipeline/file_handler.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index 037f445b8..b7479f6f3 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -985,8 +985,6 @@ def _save_num_patterns(
                 + 'directory is used.'
             )
 
-        print("MKDEBUG elem", elem)
-
         # Save file list
         np.save(output_file, np.array(final_file_list))
 

From e33972b27993a38eacd9d347b0fea57f8bfe3f98 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 Nov 2023 22:11:23 +0000
Subject: [PATCH 023/207] numpy error fixed with version upgrade

---
 environment.yml                    | 10 +++++-----
 install_shapepipe                  |  2 +-
 scripts/sh/init_run_tile_canfar.sh | 32 ++++++++++++++++++++++++++++++
 shapepipe/pipeline/file_io.py      |  2 +-
 4 files changed, 39 insertions(+), 7 deletions(-)
 create mode 100755 scripts/sh/init_run_tile_canfar.sh

diff --git a/environment.yml b/environment.yml
index 489080262..90f95717c 100644
--- a/environment.yml
+++ b/environment.yml
@@ -3,9 +3,10 @@ channels:
   - conda-forge
 dependencies:
   - python=3.9
-  - pip
-  - numpy
-  - astropy
+  - pip>=21.2.4
+  - astromatic-psfex==3.21.1
+  - astromatic-source-extractor==2.25.0
+  - astropy==5.1
   - automake
   - autoconf
   - cmake
@@ -14,9 +15,8 @@ dependencies:
   - libtool
   - matplotlib
   - numba
-  - pandas
+  - numpy
   - pip:
-    - jupyter
     - cs_util
     - modopt
     - PyQt5
diff --git a/install_shapepipe b/install_shapepipe
index c370d91d0..644398b50 100755
--- a/install_shapepipe
+++ b/install_shapepipe
@@ -193,7 +193,7 @@ check_conda() {
   CONDA_VERSION_MAJOR=$(cut -d'.' -f1 <<<$CONDA_VERSION)
   CONDA_VERSION_MINOR=$(cut -d'.' -f2 <<<$CONDA_VERSION)
   CONDA_VERSION_PATCH=$(cut -d'.' -f3 <<<$CONDA_VERSION)
-  CONDA_SH=/etc/profile.d/conda.sh
+  CONDA_SH=/opt/conda/etc/profile.d/conda.sh
   # Check Conda major version
   if [ "$CONDA_VERSION_MAJOR" -lt 4 ]
   then
diff --git a/scripts/sh/init_run_tile_canfar.sh b/scripts/sh/init_run_tile_canfar.sh
new file mode 100755
index 000000000..402cd7425
--- /dev/null
+++ b/scripts/sh/init_run_tile_canfar.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+echo "start init run tile canfar"
+
+#echo init_canfar > ~/init_canfar.log
+#date >> ~/init_canfar.log
+
+. /opt/conda/etc/profile.d/conda.sh
+
+conda activate shapepipe
+
+basedir=cosmostat/P3_v2/psfex 
+cd $basedir
+
+tile_ID=$1
+n_SMP=$2
+echo "tile_ID=$tile_ID n_SMP=$n_SMP"
+
+mkdir $tile_ID
+cd $tile_ID
+mkdir output
+cd output
+cp $basedir/log_run_sp.txt .
+for dir in $basedir/run_sp_*; do
+	ln -s $$dir
+done
+cd ..
+
+job_sp $tile_ID -p psfex -j 16 -n $n_SMP
+
+echo "end init run tile canfar"
+
diff --git a/shapepipe/pipeline/file_io.py b/shapepipe/pipeline/file_io.py
index a768f0c06..52e847147 100644
--- a/shapepipe/pipeline/file_io.py
+++ b/shapepipe/pipeline/file_io.py
@@ -1549,7 +1549,7 @@ def _get_fits_col_type(self, col_data):
             col_type = 'D'
         elif type(col_data[0]) is bool:
             col_type = 'L'
-        elif type(col_data[0]) in [str, np.str, np.str_, np.str0]:
+        elif type(col_data[0]) in [str, np.str_, np.str0]:
             col_type = 'A'
         else:
             col_type = 'D'

From 9aa16bebed13ad62453325681c6db3dfcd49cca5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 22 Nov 2023 08:24:36 +0000
Subject: [PATCH 024/207] Getting ready for exclusive-one-tile processing

---
 example/cfis/config_tile_Ma_onthefly.ini |  82 ++++++++++++++++
 example/cfis/config_tile_Sx.ini          | 119 +++++++++++++++++++++++
 scripts/sh/init_run_tile_canfar.sh       |  11 ++-
 3 files changed, 210 insertions(+), 2 deletions(-)
 create mode 100644 example/cfis/config_tile_Ma_onthefly.ini
 create mode 100644 example/cfis/config_tile_Sx.ini

diff --git a/example/cfis/config_tile_Ma_onthefly.ini b/example/cfis/config_tile_Ma_onthefly.ini
new file mode 100644
index 000000000..6f3723a0f
--- /dev/null
+++ b/example/cfis/config_tile_Ma_onthefly.ini
@@ -0,0 +1,82 @@
+# ShapePipe configuration file for masking of tiles
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_tile_Ma
+
+# Add date and time to RUN_NAME, optional, default: False
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = mask_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 8
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+### Mask tiles
+[MASK_RUNNER_RUN]
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+# Input file pattern(s), list of strings with length matching number of expected input file types
+# Cannot contain wild cards
+FILE_PATTERN = CFIS_image, CFIS_weight
+
+# FILE_EXT (optional) list of string extensions to identify input files
+FILE_EXT = .fits, .fits
+
+# Path of mask config file
+MASK_CONFIG_PATH = $SP_CONFIG/config_tile_onthefly.mask
+
+# External mask file flag, use if True, otherwise ignore
+USE_EXT_FLAG = False
+
+# External star catalogue flag, use external cat if True,
+# obtain from online catalogue if False
+USE_EXT_STAR = False
+
+# File name suffix for the output flag files (optional)
+PREFIX = pipeline
diff --git a/example/cfis/config_tile_Sx.ini b/example/cfis/config_tile_Sx.ini
new file mode 100644
index 000000000..c5513aa0b
--- /dev/null
+++ b/example/cfis/config_tile_Sx.ini
@@ -0,0 +1,119 @@
+# ShapePipe configuration file for tile detection/
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_tile_Sx
+
+# Add date and time to RUN_NAME, optional, default: True
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = sextractor_runner
+         
+
+# Run mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 16
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+[SEXTRACTOR_RUNNER_RUN]
+
+INPUT_MODULE = get_images_runner_run_1, uncompress_fits_runner, mask_runner_run_1
+
+INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner, last:mask_runner_run_1
+
+FILE_PATTERN = CFIS_image, CFIS_weight, pipeline_flag
+
+FILE_EXT = .fits, .fits, .fits
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+# SExtractor executable path
+EXEC_PATH = sex
+
+# SExtractor configuration files
+DOT_SEX_FILE = $SP_CONFIG/default_tile.sex
+DOT_PARAM_FILE = $SP_CONFIG/default.param
+DOT_CONV_FILE = $SP_CONFIG/default.conv
+
+# Use input weight image if True
+WEIGHT_IMAGE = True
+
+# Use input flag image if True
+FLAG_IMAGE = True
+
+# Use input PSF file if True
+PSF_FILE = False
+
+# Use distinct image for detection (SExtractor in
+# dual-image mode) if True
+DETECTION_IMAGE = False
+
+# Distinct weight image for detection (SExtractor
+# in dual-image mode)
+DETECTION_WEIGHT = False
+
+ZP_FROM_HEADER = False
+
+BKG_FROM_HEADER = False
+
+# Type of image check (optional), default not used, can be a list of
+# BACKGROUND, BACKGROUND_RMS, INIBACKGROUND,
+# MINIBACK_RMS, -BACKGROUND, #FILTERED,
+# OBJECTS, -OBJECTS, SEGMENTATION, APERTURES
+CHECKIMAGE = BACKGROUND 
+
+# File name suffix for the output sextractor files (optional)
+SUFFIX = sexcat
+
+## Post-processing
+
+# Necessary for tiles, to enable multi-exposure processing
+MAKE_POST_PROCESS = True
+
+# Multi-epoch mode: Path to file with single-exposure WCS header information
+LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite
+
+# World coordinate keywords, SExtractor output. Format: KEY_X,KEY_Y
+WORLD_POSITION = XWIN_WORLD,YWIN_WORLD
+
+# Number of pixels in x,y of a CCD. Format: Nx,Ny
+CCD_SIZE = 33,2080,1,4612
diff --git a/scripts/sh/init_run_tile_canfar.sh b/scripts/sh/init_run_tile_canfar.sh
index 402cd7425..9f0aa344f 100755
--- a/scripts/sh/init_run_tile_canfar.sh
+++ b/scripts/sh/init_run_tile_canfar.sh
@@ -9,9 +9,11 @@ echo "start init run tile canfar"
 
 conda activate shapepipe
 
-basedir=cosmostat/P3_v2/psfex 
+basedir=cosmostat/P3_v2/psfex
 cd $basedir
 
+cd tile_runs
+
 tile_ID=$1
 n_SMP=$2
 echo "tile_ID=$tile_ID n_SMP=$n_SMP"
@@ -26,7 +28,12 @@ for dir in $basedir/run_sp_*; do
 done
 cd ..
 
-job_sp $tile_ID -p psfex -j 16 -n $n_SMP
+export SP_RUN=.
+export SP_CONFIG=$basedir/cfis
+#shapepipe_run -c $SP_CONFIG/config_tile_Ma.ini
+shapepipe_run -c $SP_CONFIG/config_tile_Sx.iniig_tile_Sx.ini
+
+cd $basedir
 
 echo "end init run tile canfar"
 

From e5d03354346c041b4d220efc738e4f0e25238e83 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 22 Nov 2023 09:29:21 +0100
Subject: [PATCH 025/207] Added command line option to specify exclusive ID for
 processing

---
 shapepipe/pipeline/args.py         |  5 +++++
 shapepipe/pipeline/file_handler.py | 12 +++++++++++-
 shapepipe/pipeline/job_handler.py  |  4 ++++
 shapepipe/run.py                   |  6 +++++-
 4 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/shapepipe/pipeline/args.py b/shapepipe/pipeline/args.py
index e06e44ef9..21eecef84 100644
--- a/shapepipe/pipeline/args.py
+++ b/shapepipe/pipeline/args.py
@@ -128,5 +128,10 @@ def create_arg_parser():
         help='configuration file name',
     )
 
+    optional.add_argument(
+        '-e',
+        '--exclusive',
+        help='exclusive input filer number string',
+    )
     # Return parser
     return parser.parse_args()
diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index b7479f6f3..63992df58 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -32,12 +32,14 @@ class FileHandler(object):
         List of modules to be run
     config : CustomParser
         Configuaration parser instance
+    exclusive : str, optional
+        Run this file number string exclusively if given, the default is None
     verbose : bool, optional
         Verbose setting, default is True
 
     """
 
-    def __init__(self, run_name, modules, config, verbose=True):
+    def __init__(self, run_name, modules, config, exclusive=None, verbose=True):
 
         self._run_name = run_name
 
@@ -46,6 +48,7 @@ def __init__(self, run_name, modules, config, verbose=True):
             raise ValueError('Invalid module list, check for a trailing comma')
 
         self._config = config
+        self._exclusive = exclusive
         self._verbose = verbose
 
         self.module_runners = get_module_runners(self._module_list)
@@ -1110,6 +1113,13 @@ def _format_process_list(
                     + f'numbering scheme "{num_scheme}".'
                 )
 
+            if self._exclusive is not None:
+                if re.search(number, self._exclusive) is not None:
+                    print(f"Using exclusive number {self._exclusive}")
+                else:
+                    print(f"Skipping {number}, not equal to {self._exclusive}")
+                    continue
+
             if run_method == 'serial':
                 process_items = []
             else:
diff --git a/shapepipe/pipeline/job_handler.py b/shapepipe/pipeline/job_handler.py
index d6baebd89..bc80f35da 100644
--- a/shapepipe/pipeline/job_handler.py
+++ b/shapepipe/pipeline/job_handler.py
@@ -42,6 +42,8 @@ class JobHandler(object):
         Joblib backend, the default is None (which corresponds to 'loky')
     timeout : int, optional
         Timeout limit for a given job in seconds, the default is None
+    exclusive : str, optional
+        Run this file number string exclusively if given, the default is None
     verbose : bool, optional
         Verbose setting, default is True
 
@@ -58,6 +60,7 @@ def __init__(
         batch_size=None,
         backend=None,
         timeout=None,
+        exclusive=None,
         verbose=True,
     ):
 
@@ -72,6 +75,7 @@ def __init__(
         self._module = module
         self._module_runner = self.filehd.module_runners[self._module]
         self.error_count = 0
+        self.exclusive = exclusive
         self._verbose = verbose
 
         # Add the job parameters to the log
diff --git a/shapepipe/run.py b/shapepipe/run.py
index 2443eab50..80bebbda5 100644
--- a/shapepipe/run.py
+++ b/shapepipe/run.py
@@ -51,12 +51,14 @@ def set_up(self):
         self._set_run_name()
         self.modules = self.config.getlist('EXECUTION', 'MODULE')
         self.mode = self.config.get('EXECUTION', 'MODE').lower()
+        self.exclusive=self._args.exclusive
         self.verbose = self.config.getboolean('DEFAULT', 'VERBOSE')
         self.filehd = FileHandler(
             self._run_name,
             self.modules,
             self.config,
-            self.verbose,
+            exclusive=self._args.exclusive,
+            verbose=self.verbose,
         )
         self.error_count = 0
         self._prep_run()
@@ -330,6 +332,7 @@ def run_smp(pipe):
             config=pipe.config,
             log=pipe.log,
             job_type=pipe.run_method[module],
+            exclusive=pipe.exclusive,
             verbose=pipe.verbose,
         )
 
@@ -388,6 +391,7 @@ def run_mpi(pipe, comm):
                 log=pipe.log,
                 job_type=pipe.run_method[module],
                 parallel_mode='mpi',
+                exclusive=pipe.exclusive,
                 verbose=verbose,
             )
 

From d02347ea52885a170ffb09a4e462965fd70f729e Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 24 Nov 2023 10:51:16 +0100
Subject: [PATCH 026/207] curl script exclusive ID

---
 scripts/sh/curl_canfar.sh | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/scripts/sh/curl_canfar.sh b/scripts/sh/curl_canfar.sh
index 89bb4f64e..072097add 100755
--- a/scripts/sh/curl_canfar.sh
+++ b/scripts/sh/curl_canfar.sh
@@ -1,31 +1,33 @@
 #!/usr/bin/bash
 
 # Usage
-# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.7 shapepipe/scripts/sh/init_canfar.sh 000.000
+# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.8 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID exp NCORE
 
 SSL=~/.ssl/cadcproxy.pem
-NCORE=16
+NCORE=2
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
-RESOURCES="ram=16&cores=$NCORE"
+RESOURCES="ram=4&cores=$NCORE"
 IMAGE=images.canfar.net/unions/shapepipe
 NAME=shapepipe
 
 # version of image on canfar, e.g. 0:7, 0:8
 version=$1
 
-# command on canfar, e.g. shapepipe/scripts/sh/init_run_canfar.sh
+# command on canfar, e.g. shapepipe/scripts/sh/init_run_exclusive_canfar.sh
 cmd=$2
 
-# command line argument, e.g. 181.308
-arg="$3 $NCORE"
+# Image ID
+ID=$3
+
+# command line arguments
+arg="$ID $NCORE exp"
 
 #arg_an=`echo "$arg" | tr '_' 'X' | tr '.' 'X'`
-arg_an=X
 
 echo
 echo "Start headless container"
 echo "========================"
-ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}${arg_an}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
+ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
 echo $ID
 
 echo

From 12e6b63aa7a0419317cfafb36c6e84e7853d915c Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 24 Nov 2023 11:28:38 +0100
Subject: [PATCH 027/207] Dockerfile conda -> source activate

---
 Dockerfile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 98e6c35fc..cf9063246 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -49,5 +49,5 @@ RUN conda env create --file environment.yml
 COPY shapepipe ./shapepipe
 COPY scripts ./scripts
 
-RUN ./scripts/sh/init_canfar.sh
-#RUN conda activate shapepipe
+#RUN ./scripts/sh/init_canfar.sh
+RUN source activate shapepipe

From b05f2a56840b32947b100a5a725563792cb4e72d Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 24 Nov 2023 14:50:37 +0100
Subject: [PATCH 028/207] comment added

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index cf9063246..f24d5484c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -49,5 +49,5 @@ RUN conda env create --file environment.yml
 COPY shapepipe ./shapepipe
 COPY scripts ./scripts
 
-#RUN ./scripts/sh/init_canfar.sh
+# Activate conda environment using "source"
 RUN source activate shapepipe

From 45942d54503d75e489e768c4b06f5e0187560f98 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 24 Nov 2023 16:19:26 +0100
Subject: [PATCH 029/207] Updated Dockerfile

---
 Dockerfile | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index f24d5484c..d4ea036d8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -39,6 +39,8 @@ ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 
+SHELL ["/bin/bash", "--login", "-c"]
+
 COPY ./environment.yml ./
 COPY install_shapepipe README.rst setup.py setup.cfg ./
 RUN touch ./README.md
@@ -50,4 +52,6 @@ COPY shapepipe ./shapepipe
 COPY scripts ./scripts
 
 # Activate conda environment using "source"
-RUN source activate shapepipe
+#RUN . /opt/conda/etc/profile.d/conda.sh
+#RUN conda init bash
+RUN conda activate shapepipe

From 7d1891e552948980b4bbed2a0d20dba06dd4733c Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 24 Nov 2023 15:35:51 +0000
Subject: [PATCH 030/207] running with exclusive ID

---
 example/cfis/config_exp_psfex.ini       | 149 +++++++
 scripts/sh/init_run_exclusive_canfar.sh |  43 ++
 scripts/sh/job_sp_canfar.bash           | 535 ++++++++++++++++++++++++
 3 files changed, 727 insertions(+)
 create mode 100644 example/cfis/config_exp_psfex.ini
 create mode 100755 scripts/sh/init_run_exclusive_canfar.sh
 create mode 100755 scripts/sh/job_sp_canfar.bash

diff --git a/example/cfis/config_exp_psfex.ini b/example/cfis/config_exp_psfex.ini
new file mode 100644
index 000000000..bfc46675f
--- /dev/null
+++ b/example/cfis/config_exp_psfex.ini
@@ -0,0 +1,149 @@
+# ShapePipe configuration file for single-exposures. PSFex PSF model.
+# Process exposures after masking, from star detection to PSF model.
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_exp_SxSePsf
+
+# Add date and time to RUN_NAME, optional, default: True
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = sextractor_runner, setools_runner, psfex_runner
+         
+
+# Run mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
+INPUT_DIR = $SP_RUN/output
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 16
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+[SEXTRACTOR_RUNNER]
+
+# Input from two modules
+INPUT_MODULE = split_exp_runner, mask_runner
+
+# Read pipeline flag files created by mask module
+FILE_PATTERN = image, weight, pipeline_flag
+
+NUMBERING_SCHEME = -0000000-0
+
+# SExtractor executable path
+EXEC_PATH = sex
+
+# SExtractor configuration files
+DOT_SEX_FILE = $SP_CONFIG/default_exp.sex
+DOT_PARAM_FILE = $SP_CONFIG//default.param
+DOT_CONV_FILE = $SP_CONFIG/default.conv
+
+# Use input weight image if True
+WEIGHT_IMAGE = True
+
+# Use input flag image if True
+FLAG_IMAGE = True
+
+# Use input PSF file if True
+PSF_FILE = False
+
+# Use distinct image for detection (SExtractor in
+# dual-image mode) if True.
+DETECTION_IMAGE = False
+
+# Distinct weight image for detection (SExtractor
+# in dual-image mode)
+DETECTION_WEIGHT = False
+
+# True if photometry zero-point is to be read from exposure image header
+ZP_FROM_HEADER = True
+
+# If ZP_FROM_HEADER is True, zero-point key name
+ZP_KEY = PHOTZP
+
+# Background information from image header.
+# If BKG_FROM_HEADER is True, background value will be read from header.
+# In that case, the value of BACK_TYPE will be set atomatically to MANUAL.
+# This is used e.g. for the LSB images.
+BKG_FROM_HEADER = False
+# LSB images:
+# BKG_FROM_HEADER = True
+
+# If BKG_FROM_HEADER is True, background value key name
+# LSB images:
+#BKG_KEY = IMMODE
+
+# Type of image check (optional), default not used, can be a list of
+# BACKGROUND, BACKGROUND_RMS, INIBACKGROUND, MINIBACK_RMS, -BACKGROUND, 
+# FILTERED, OBJECTS, -OBJECTS, SEGMENTATION, APERTURES
+CHECKIMAGE = BACKGROUND
+
+# File name suffix for the output sextractor files (optional) SUFFIX = tile
+SUFFIX = sexcat
+
+## Post-processing
+
+# Not required for single exposures
+MAKE_POST_PROCESS = FALSE
+
+
+[SETOOLS_RUNNER]
+
+INPUT_DIR = last:sextractor_runner
+
+# Note: Make sure this doe not match the SExtractor background images
+# (sexcat_background*)
+FILE_PATTERN = sexcat
+
+NUMBERING_SCHEME = -0000000-0
+
+# SETools config file
+SETOOLS_CONFIG_PATH = $SP_CONFIG/star_selection.setools
+
+
+[PSFEX_RUNNER]
+
+# Use 80% sample for PSF model
+FILE_PATTERN = star_split_ratio_80
+
+NUMBERING_SCHEME = -0000000-0
+
+# Path to executable for the PSF model (optional)
+EXEC_PATH = psfex
+
+# Default psfex configuration file
+DOT_PSFEX_FILE = $SP_CONFIG/default.psfex
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
new file mode 100755
index 000000000..0e4a6fb34
--- /dev/null
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+echo "start init run exclusive canfar"
+
+#echo init_canfar > ~/init_canfar.log
+#date >> ~/init_canfar.log
+
+. /opt/conda/etc/profile.d/conda.sh
+
+conda activate shapepipe
+
+basedir=$HOME/cosmostat/P3_v2/psfex
+cd $basedir
+
+
+ID=$1
+n_SMP=$2
+typ=$3
+echo "ID=$ID n_SMP=$n_SMP type=$typ"
+
+cd ${typ}_runs
+
+mkdir $ID
+cd $ID
+mkdir output
+cd output
+cp $basedir/output/log_run_sp.txt .
+ln -s $basedir/output/log_exp_headers.sqlite
+for dir in $basedir/output/run_sp_*; do
+	ln -s $dir
+done
+cd ..
+
+#export SP_RUN=.
+#export SP_CONFIG=$HOME/shapepipe/example/cfis
+#shapepipe_run -c $SP_CONFIG/config_tile_Ma.ini
+#shapepipe_run -c $SP_CONFIG/config_tile_Sx.ini -e $ID
+job_sp_canfar.bash -p psfex -j 32 -e $ID
+
+cd $basedir
+
+echo "end init run tile canfar"
+
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
new file mode 100755
index 000000000..cbafd6f19
--- /dev/null
+++ b/scripts/sh/job_sp_canfar.bash
@@ -0,0 +1,535 @@
+#!/usr/bin/env bash
+
+# Name: job_sp_canfar.bash
+# Description: General script to process one or more tiles
+#              with all contributing exposures.
+#              This works as job submission script for
+#              the canfar batch system.
+#              called in interactive mode on a virtual
+#              machine.
+# Author: Martin Kilbinger <martin.kilbinger@cea.fr>
+
+
+# Command line arguments
+## Default values
+job=255
+config_dir=$HOME/shapepipe/example/cfis
+psf='mccd'
+retrieve='vos'
+star_cat_for_mask='onthefly'
+exclusive=''
+results='cosmostat/kilbinger/results_v2'
+n_smp=-1
+nsh_step=-1
+nsh_max=-1
+nsh_jobs=8
+
+## Help string
+usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID]
+\n\nOptions:\n
+   -h\tthis message\n
+   -j, --job JOB\tRunning JOB, bit-coded\n
+   \t   1: retrieve images (online if method=vos)\n
+   \t   2: prepare images (offline)\n
+   \t   4: mask tiles (online if star_cat_for_mask=onthefly)\n
+   \t   8: mask exposures (online if star_cat_for_mask=onthefly)\n
+   \t  16: detection of galaxies on tiles (offline)\n
+   \t  32: processing of stars on exposures (offline)\n
+   \t  64: galaxy selection on tiles (offline)\n
+   \t 128: shapes and morphology (offline)\n
+   \t 256: paste catalogues (offline)\n
+   \t 512: upload results (online)\n
+   -c, --config_dir DIR\n
+   \t config file directory, default='$config_dir'\n
+   -p, --psf MODEL\n
+    \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
+   -r, --retrieve METHOD\n
+   \tmethod to retrieve images, allowed are 'vos', 'symlink', default='$retrieve'\n
+   -s, --star_cat_for_mask\n
+   \tcatalogue for masking bright stars, allowed are 'onthefly', 'save',\n
+   \tdefault is '${star_cat_for_mask}'\n
+   -e, --exclusive ID\n
+   \texclusive input filer number string ID (default: None)\n
+   -o, --output_dir\n
+   \toutput (upload) directory on vos:cfis, default='$results'\n
+   -n, --n_smp\n
+   \tnumber of jobs (SMP mode only), default from original config files\n
+   --nsh_step NSTEP\n
+   --nsh_jobs NJOB\n
+   \tnumber of shape measurement parallel jobs, default=$nsh_jobs\n
+   \tnumber of objects per parallel shape module call, \n
+   \tdefault: optimal number is computed\n
+   --nsh_max NMAX\n
+   \tmax number of objects per parallel shape module call, \n
+   \tdefault: unlimited; has precedent over --nsh_step\n
+   TILE_ID_i\n
+   \ttile ID(s), e.g. 283.247 214.242\n
+"
+
+## Help if no arguments
+if [ -z $1 ]; then
+        echo -ne $usage
+        exit 1
+fi
+
+## Parse command line
+while [ $# -gt 0 ]; do
+  case "$1" in
+    -h)
+      echo -ne $usage
+      exit 0
+      ;;
+    -j|--job)
+      job="$2"
+      shift
+      ;;
+    -c|--config_dir)
+      config_dir="$2"
+      shift
+      ;;
+    -p|--psf)
+      psf="$2"
+      shift
+      ;;
+    -r|--retrieve)
+      retrieve="$2"
+      shift
+      ;;
+    -s|--star_cat_for_mask)
+      star_cat_for_mask="$2"
+      shift
+      ;;
+    -e|--exclusive)
+      exclusive="$2"
+      shift
+      ;;
+     -o|--output_dir)
+      results="$2"
+      shift
+      ;;
+    -n|--n_smp)
+      n_smp="$2"
+      shift
+      ;;
+    --nsh_max)
+      nsh_max="$2"
+      shift
+      ;;
+    --nsh_step)
+      nsh_step="$2"
+      shift
+      ;;
+    --nsh_jobs)
+      nsh_jobs="$2"
+      shift
+      ;;
+  esac
+  shift
+done
+
+## Check options
+if [ "$psf" != "psfex" ] && [ "$psf" != "mccd" ]; then
+  echo "PSF (option -p) needs to be 'psfex' or 'mccd'"
+  exit 2
+fi
+
+if [ "$star_cat_for_mask" != "onthefly" ] && [ "$star_cat_for_mask" != "save" ]; then
+  echo "Star cat for mask (option -s) needs to be 'onthefly' or 'save'"
+  exit 4
+fi
+
+if [ "$retrieve" != "vos" ] && [ "$retrieve" != "symlink" ]; then
+  echo "method to retrieve images (option -r) needs to be 'vos' or 'symlink'"
+  exit 5
+fi
+
+if [ $nsh_max != -1 ]; then
+  nsh_step=$nsh_max
+fi
+
+# For tar archives. TODO: Should be unique to each job
+export ID="test"
+
+## Paths
+
+## Path variables used in shapepipe config files
+
+# Run path and location of input image directories
+export SP_RUN=`pwd`
+
+# Config file path
+export SP_CONFIG=$SP_RUN/cfis
+export SP_CONFIG_MOD=$SP_RUN/cfis_mod
+
+## Other variables
+
+# Input tile numbers ASCII file
+export TILE_NUMBERS_PATH=tile_numbers.txt
+
+# Output
+OUTPUT=$SP_RUN/output
+
+# For tar archives
+output_rel=`realpath --relative-to=. $OUTPUT`
+
+# Stop on error, default=1
+STOP=1
+
+# Verbose mode (1: verbose, 0: quiet)
+VERBOSE=1
+
+# VCP options
+export CERTFILE=$HOME/.ssl/cadcproxy.pem
+export VCP="vcp --certfile=$CERTFILE"
+
+
+## Functions
+
+# Print string, executes command, and prints return value.
+function command () {
+   cmd=$1
+   str=$2
+
+   RED='\033[0;31m'
+   GREEN='\033[0;32m'
+   NC='\033[0m' # No Color
+   # Color escape characters show up in log files
+   #RED=''
+   #GREEN=''
+   #NC=''
+
+
+   if [ $# == 2 ]; then
+      if [ $VERBOSE == 1 ]; then
+           echo "$str: running '$cmd'"
+      fi
+      $cmd
+   else
+      if [ $VERBOSE == 1 ]; then
+         echo "$str: running '$cmd $4 \"$5 $6\"'"
+      fi
+      $cmd $4 "$5 $6"
+   fi	
+   res=$?
+
+   if [ $VERBOSE == 1 ]; then
+      if [ $res == 0 ]; then
+         echo -e "${GREEN}success, return value = $res${NC}"
+      else
+         echo -e "${RED}error, return value = $res${NC}"
+         if [ $STOP == 1 ]; then
+            echo "${RED}exiting 'canfar_sp.bash', error in command '$cmd'${NC}"
+            exit $res
+         else
+            echo "${RED}continuing 'canfar_sp.bash', error in command '$cmd'${NC}"
+         fi
+      fi
+   fi
+}
+
+# Run shapepipe command. If error occurs, upload sp log files before stopping script.
+function command_sp() {
+   local cmd=$1
+   local str=$2
+
+   command "$1" "$2"
+}
+
+# Set up config file and call shapepipe_run
+function command_cfg_shapepipe() {
+    local config_name=$1
+    local str=$2
+    local _n_smp=$3 
+    local _exclusive=$4
+
+    if [ "$exclusive" != "" ]; then
+      exclusive_flag="-e $_exclusive"
+    else
+      exclusive_flag=""
+    fi
+
+    config_upd=$(set_config_n_smp $config_name $_n_smp)
+    local cmd="shapepipe_run -c $config_upd $exclusive_flag"
+    command_sp "$cmd" "$str"
+}
+
+# Tar and upload files to vos
+function upload() {
+   base=$1
+   shift
+   ID=$1
+   shift
+   verbose=$1
+   shift
+   upl=("$@")
+
+   echo "Counting upload files"
+   n_upl=(`ls -l ${upl[@]} | wc`)
+   if [ $n_upl == 0 ]; then
+      if [ $STOP == 1 ]; then
+         echo "Exiting script, no file found for '$base' tar ball"
+         exit 3
+      fi
+   fi
+   tar czf ${base}_${ID}.tgz ${upl[@]}
+   command "$VCP ${base}_${ID}.tgz vos:cfis/$results" "Upload tar ball"
+}
+
+# Upload log files
+function upload_logs() {
+   id=$1
+   verbose=$2
+
+   upl="$output_rel/*/*/logs $output_rel/*/logs"
+   upload "logs" "$id" "$verbose" "${upl[@]}"
+}
+
+function set_config_n_smp() {
+  local config_name=$1
+  local _n_smp=$2
+
+  local config_orig="$SP_CONFIG/$config_name"
+
+  if [[ $_n_smp != -1 ]]; then
+    # Update SMP batch size
+    local config_upd="$SP_CONFIG_MOD/$config_name"
+    update_config $config_orig $config_upd "SMP_BATCH_SIZE" $_n_smp
+  else
+    # Keep original config file
+    local config_upd=$config_orig
+  fi
+
+  # Set "return" value (stdout)
+  echo "$config_upd"
+}
+
+# Update config file
+function update_config() {
+  local config_orig=$1
+  local config_upd=$2
+  local key=$3
+  local val_upd=$4
+
+  cat $config_orig \
+    | perl -ane 's/'$key'\s+=.+/'$key' = '$val_upd'/; print' > $config_upd
+}
+
+### Start ###
+
+echo "Start processing"
+
+# Create input and output directories
+mkdir -p $SP_RUN
+cd $SP_RUN
+mkdir -p $OUTPUT
+mkdir -p $SP_CONFIG_MOD
+
+# Processing
+
+## Check for input tile list
+#if [ ! -e $TILE_NUMBERS_PATH ]; then
+  #echo "Tile numbers file $TILE_NUMBERS_PATH not found, exiting"
+#fi
+
+### Retrieve config files
+if [[ $config_dir == *"vos:"* ]]; then
+  command_sp "$VCP $config_dir ." "Retrieve shapepipe config files"
+else
+  if [[ ! -L cfis ]]; then
+    command_sp "ln -s $config_dir cfis" "Retrieve shapepipe config files"
+  fi
+fi
+
+
+## Retrieve config files and images (online if retrieve=vos)
+## Retrieve and save star catalogues for masking (if star_cat_for_mask=save)
+(( do_job= $job & 1 ))
+if [[ $do_job != 0 ]]; then
+
+  ### Retrieve files
+  command_sp "shapepipe_run -c $SP_CONFIG/config_GitFeGie_$retrieve.ini" "Retrieve images"
+
+  ### Retrieve and save star catalogues for masking
+  if [ "$star_cat_for_mask" == "save" ]; then
+    #### For tiles
+    mkdir $SP_RUN/star_cat_tiles
+    command_sp "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_1/output $SP_RUN/star_cat_tiles" "Save star cats for masking (tile)"
+
+    #### For single-exposures
+    mkdir $SP_RUN/star_cat_exp
+    command_sp "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_2/output $SP_RUN/star_cat_exp exp" "Save star cats for masking (exp)"
+  fi
+
+fi
+
+## Prepare images (offline)
+(( do_job= $job & 2 ))
+if [[ $do_job != 0 ]]; then
+
+  ### Uncompress tile weights
+  command_cfg_shapepipe "config_tile_Uz.ini" "Run shapepipe (uncompress tile weights)" $n_smp $exclusive
+
+  ### Split images into single-HDU files, merge headers for WCS info
+  command_cfg_shapepipe "config_exp_SpMh.ini" "Run shapepipe (split images, merge headers)" $n_smp $exclusive
+
+fi
+
+## Mask tiles: add star, halo, and Messier object masks (online if "star_cat_for_mask" is "onthefly")
+(( do_job= $job & 4 ))
+if [[ $do_job != 0 ]]; then
+
+  ### Mask tiles
+  command_cfg_shapepipe "config_tile_Ma_$star_cat_for_mask.ini" "Run shapepipe (mask tiles)" $n_smp $exclusive
+
+fi
+
+## Mask exposures: add star, halo, and Messier object masks (online if "star_cat_for_mask" is "onthefly")
+(( do_job= $job & 8 ))
+if [[ $do_job != 0 ]]; then
+
+  ### Mask exposures
+  command_cfg_shapepipe "config_ext_Ma_$star_cat_for_mask.ini" "Run shapepipe (mask exposures)" $n_smp $exclusive
+
+fi
+
+
+## Remaining exposure processing (offline)
+(( do_job= $job & 16 ))
+if [[ $do_job != 0 ]]; then
+
+  ### Object detection on tiles
+  command_cfg_shapepipe "config_tile_Sx.ini" "Run shapepipe (tile detection)" $n_smp $exclusive
+
+fi
+
+## Exposure processing (offline)
+(( do_job= $job & 32 ))
+if [[ $do_job != 0 ]]; then
+
+  ### Star detection, selection, PSF model. setools can exit with an error for CCD with insufficient stars,
+  ### the script should continue
+  STOP=0
+  command_cfg_shapepipe "config_exp_${psf}.ini" "Run shapepipe (exp $psf)" $n_smp $exclusive
+  STOP=1
+
+fi
+
+## Process tiles up to shape measurement
+(( do_job= $job & 64 ))
+if [[ $do_job != 0 ]]; then
+
+  ### PSF model letter: 'P' (psfex) or 'M' (mccd)
+  letter=${psf:0:1}
+  Letter=${letter^}
+  command_sp "shapepipe_run -c $SP_CONFIG/config_tile_${Letter}iViSmVi.ini" "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)"
+
+fi
+
+## Shape measurement (offline)
+(( do_job= $job & 128 ))
+if [[ $do_job != 0 ]]; then
+
+  ### Prepare config files
+  n_min=0
+  if [[ $nsh_step == -1 ]]; then
+    n_obj=`get_number_objects.py`
+    nsh_step=`echo "$(($n_obj/$nsh_jobs))"`
+  fi
+
+  n_max=$((nsh_step - 1))
+  for k in $(seq 1 $nsh_jobs); do
+    cat $SP_CONFIG/config_tile_Ng_template.ini | \
+      perl -ane \
+        's/(ID_OBJ_MIN =) X/$1 '$n_min'/; s/(ID_OBJ_MAX =) X/$1 '$n_max'/; s/NgXu/Ng'$k'u/; s/X_interp/'$psf'_interp/g; print' \
+        > $SP_CONFIG_MOD/config_tile_Ng${k}u.ini
+    n_min=$((n_min + nsh_step))
+    if [ "$k" == $((nsh_jobs - 1)) ] && [ $nsh_max == -1 ]; then
+      n_max=-1
+    else
+      n_max=$((n_min + nsh_step - 1))
+    fi
+  done
+
+  ### Shapes, run $nsh_jobs parallel processes
+  VERBOSE=0
+  for k in $(seq 1 $nsh_jobs); do
+      command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix+galsim $k)" &
+  done
+  wait
+  VERBOSE=1
+
+fi
+
+## Create final catalogues (offline)
+(( do_job= $job & 256 ))
+if [[ $do_job != 0 ]]; then
+
+  cat $SP_CONFIG/config_merge_sep_cats_template.ini | \
+    perl -ane \
+      's/(N_SPLIT_MAX =) X/$1 '$nsh_jobs'/; print' \
+      > $SP_CONFIG_MOD/config_merge_sep_cats.ini
+ 
+  ### Merge separated shapes catalogues
+  command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_merge_sep_cats.ini" "Run shapepipe (tile: merge sep cats)" "$VERBOSE" "$ID"
+
+  ### Merge all relevant information into final catalogue
+  command_sp "shapepipe_run -c $SP_CONFIG/config_make_cat_$psf.ini" "Run shapepipe (tile: create final cat $psf)" "$VERBOSE" "$ID"
+
+fi
+
+## Upload results (online)
+(( do_job= $job & 512 ))
+if [[ $do_job != 0 ]]; then
+
+  ### module and pipeline log files
+  upload_logs "$ID" "$VERBOSE"
+
+  ### Final shape catalog
+  ### pipeline_flags are the tile masks, for random cats
+  ### SETools masks (selection), stats and plots
+  ### ${psf}_interp_exp for diagnostics, validation with leakage,
+  ### validation with residuals, rho stats
+
+  NAMES=(
+    "final_cat"
+    "pipeline_flag"
+    "setools_mask"
+    "setools_stat"
+    "setools_plot"
+  )
+  DIRS=(
+    "*/make_cat_runner/output"
+    "*/mask_runner_run_1/output"
+    "*/setools_runner/output/mask"
+    "*/setools_runner/output/stat"
+    "*/setools_runner/output/plot"
+  )
+  PATTERNS=(
+    "final_cat-*"
+    "pipeline_flag-???-???*"
+    "*"
+    "*"
+    "*"
+  )
+
+  # PSF validation
+  pattern="validation_psf-*"
+  if [ "$psf" == "psfex" ]; then
+    name="psfex_interp_exp"
+    dir="*/psfex_interp_runner/output"
+  else
+    name="mccd_fit_val_runner"
+    dir="*/mccd_fit_val_runner/output"
+  fi
+  upl=$output_rel/$dir/$pattern
+  upload "$name" "$ID" "$VERBOSE" "${upl[@]}"
+
+  for n in "${!NAMES[@]}"; do
+      name=${NAMES[$n]}
+      dir=${DIRS[$n]}
+      pattern=${PATTERNS[$n]}
+      upl=$output_rel/$dir/$pattern
+      upload "$name" "$ID" "$VERBOSE" "${upl[@]}"
+  done
+
+fi

From 02affa88cd0f02651182f90b1f77ea835b8ea31c Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sat, 25 Nov 2023 08:07:39 +0000
Subject: [PATCH 031/207] exp runs

---
 example/cfis/config_tile_Sx.ini         |  6 ++--
 scripts/sh/init_canfar.sh               |  7 +----
 scripts/sh/init_run_exclusive_canfar.sh |  4 +--
 scripts/sh/init_run_tile_canfar.sh      | 39 -------------------------
 scripts/sh/job_sp.bash                  | 22 --------------
 shapepipe/pipeline/file_handler.py      | 11 +++++--
 6 files changed, 14 insertions(+), 75 deletions(-)
 delete mode 100755 scripts/sh/init_run_tile_canfar.sh

diff --git a/example/cfis/config_tile_Sx.ini b/example/cfis/config_tile_Sx.ini
index c5513aa0b..09eb921c2 100644
--- a/example/cfis/config_tile_Sx.ini
+++ b/example/cfis/config_tile_Sx.ini
@@ -35,7 +35,7 @@ LOG_NAME = log_sp
 RUN_LOG_NAME = log_run_sp
 
 # Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
-INPUT_DIR = .
+INPUT_DIR = $SP_RUN/output
 
 # Output directory
 OUTPUT_DIR = $SP_RUN/output
@@ -45,7 +45,7 @@ OUTPUT_DIR = $SP_RUN/output
 [JOB]
 
 # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
-SMP_BATCH_SIZE = 16
+SMP_BATCH_SIZE = 2
 
 # Timeout value (optional), default is None, i.e. no timeout limit applied
 TIMEOUT = 96:00:00
@@ -53,7 +53,7 @@ TIMEOUT = 96:00:00
 
 ## Module options
 
-[SEXTRACTOR_RUNNER_RUN]
+[SEXTRACTOR_RUNNER]
 
 INPUT_MODULE = get_images_runner_run_1, uncompress_fits_runner, mask_runner_run_1
 
diff --git a/scripts/sh/init_canfar.sh b/scripts/sh/init_canfar.sh
index 8f5a955c9..8229aff23 100755
--- a/scripts/sh/init_canfar.sh
+++ b/scripts/sh/init_canfar.sh
@@ -2,17 +2,12 @@
 
 echo "start init canfar"
 
-<<<<<<< HEAD
 #echo init_canfar > ~/init_canfar.log
 #date >> ~/init_canfar.log
-=======
-echo init_canfar > ~/init_canfar.log
-date >> ~/init_canfar.log
->>>>>>> origin/exclusive
 
 . /opt/conda/etc/profile.d/conda.sh
 
-conda activate shapepipe
+source activate shapepipe
 
 echo "end init canfar"
 
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 0e4a6fb34..7f9f428e1 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -33,9 +33,9 @@ cd ..
 
 #export SP_RUN=.
 #export SP_CONFIG=$HOME/shapepipe/example/cfis
-#shapepipe_run -c $SP_CONFIG/config_tile_Ma.ini
 #shapepipe_run -c $SP_CONFIG/config_tile_Sx.ini -e $ID
-job_sp_canfar.bash -p psfex -j 32 -e $ID
+
+job_sp_canfar.bash -p psfex -j 32 -e $ID -n $n_SMP
 
 cd $basedir
 
diff --git a/scripts/sh/init_run_tile_canfar.sh b/scripts/sh/init_run_tile_canfar.sh
deleted file mode 100755
index 9f0aa344f..000000000
--- a/scripts/sh/init_run_tile_canfar.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-
-echo "start init run tile canfar"
-
-#echo init_canfar > ~/init_canfar.log
-#date >> ~/init_canfar.log
-
-. /opt/conda/etc/profile.d/conda.sh
-
-conda activate shapepipe
-
-basedir=cosmostat/P3_v2/psfex
-cd $basedir
-
-cd tile_runs
-
-tile_ID=$1
-n_SMP=$2
-echo "tile_ID=$tile_ID n_SMP=$n_SMP"
-
-mkdir $tile_ID
-cd $tile_ID
-mkdir output
-cd output
-cp $basedir/log_run_sp.txt .
-for dir in $basedir/run_sp_*; do
-	ln -s $$dir
-done
-cd ..
-
-export SP_RUN=.
-export SP_CONFIG=$basedir/cfis
-#shapepipe_run -c $SP_CONFIG/config_tile_Ma.ini
-shapepipe_run -c $SP_CONFIG/config_tile_Sx.iniig_tile_Sx.ini
-
-cd $basedir
-
-echo "end init run tile canfar"
-
diff --git a/scripts/sh/job_sp.bash b/scripts/sh/job_sp.bash
index 4d4e6fdcf..2a207d807 100755
--- a/scripts/sh/job_sp.bash
+++ b/scripts/sh/job_sp.bash
@@ -8,11 +8,6 @@
 #              called in interactive mode on a virtual
 #              machine.
 # Author: Martin Kilbinger <martin.kilbinger@cea.fr>
-# Date: v1.0 11/2020
-#       v1.1 01/2021
-
-# MKDEBUG TODO:
-# Option to change SMP_BATCH_SIZE, not for MPI
 
 
 # VM home, required for canfar run.
@@ -294,23 +289,6 @@ function upload_logs() {
    upload "logs" "$id" "$verbose" "${upl[@]}"
 }
 
-# Print script variables
-function print_env() {
-   echo "*** Environment ***"
-   echo "Data:"
-   echo " TILE_ARR=${TILE_ARR[@]}"
-   echo "Paths:"
-   echo " VM_HOME=$VM_HOME"
-   echo " SP_RUN=$SP_RUN"
-   echo " TILE_NUMBERS_PATH=$TILE_NUMBERS_PATH"
-   echo " OUTPUT=$OUTPUT"
-   echo " SP_CONFIG=$SP_CONFIG"
-   echo "Other variables:"
-   echo " VCP=$VCP"
-   echo " CERTFILE=$CERTFILE"
-   echo "***"
-}
-
 function set_config_n_smp() {
   local config_name=$1
   local _n_smp=$2
diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index 63992df58..51b02cdd7 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -1113,11 +1113,16 @@ def _format_process_list(
                     + f'numbering scheme "{num_scheme}".'
                 )
 
+            # If "exclusive" options is set: discard all non-matching IDs
             if self._exclusive is not None:
-                if re.search(number, self._exclusive) is not None:
-                    print(f"Using exclusive number {self._exclusive}")
+                id_to_test = f"-{self._exclusive.replace('.', '-')}"
+                if number == id_to_test:
+                    if self._verbose:
+                        print(f"Using exclusive number {self._exclusive} ({id_to_test})")
                 else:
-                    print(f"Skipping {number}, not equal to {self._exclusive}")
+                    if self._verbose:
+                        #print(f"Skipping {number}, not equal to {self._exclusive} ({id_to_test})")
+                        pass
                     continue
 
             if run_method == 'serial':

From d8ad3280f5270b8a874bb3216d58765788a832e9 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sat, 25 Nov 2023 14:59:47 +0100
Subject: [PATCH 032/207] local curl script NCORES -> 1

---
 scripts/sh/curl_canfar.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/sh/curl_canfar.sh b/scripts/sh/curl_canfar.sh
index 072097add..7b9e1de91 100755
--- a/scripts/sh/curl_canfar.sh
+++ b/scripts/sh/curl_canfar.sh
@@ -4,7 +4,7 @@
 # ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.8 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID exp NCORE
 
 SSL=~/.ssl/cadcproxy.pem
-NCORE=2
+NCORE=1
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
 RESOURCES="ram=4&cores=$NCORE"
 IMAGE=images.canfar.net/unions/shapepipe

From 60c3cd1b25ce28d99e271e00ce1af76e79559421 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 28 Nov 2023 18:23:57 +0100
Subject: [PATCH 033/207] Renamed science-portal scripts (local/remote)

---
 .../{curl_canfar.sh => curl_canfar_local.sh}  | 21 +----------------
 scripts/sh/curl_canfar_monitor_local.sh       | 23 +++++++++++++++++++
 .../{init_canfar.sh => init_canfar_remote.sh} |  0
 3 files changed, 24 insertions(+), 20 deletions(-)
 rename scripts/sh/{curl_canfar.sh => curl_canfar_local.sh} (64%)
 create mode 100755 scripts/sh/curl_canfar_monitor_local.sh
 rename scripts/sh/{init_canfar.sh => init_canfar_remote.sh} (100%)

diff --git a/scripts/sh/curl_canfar.sh b/scripts/sh/curl_canfar_local.sh
similarity index 64%
rename from scripts/sh/curl_canfar.sh
rename to scripts/sh/curl_canfar_local.sh
index 7b9e1de91..c875d4cb3 100755
--- a/scripts/sh/curl_canfar.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -22,25 +22,6 @@ ID=$3
 # command line arguments
 arg="$ID $NCORE exp"
 
-#arg_an=`echo "$arg" | tr '_' 'X' | tr '.' 'X'`
-
 echo
-echo "Start headless container"
-echo "========================"
 ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
-echo $ID
-
-echo
-echo "Events (incl. errors)"
-echo "====================="
-cmd="curl -E $SSL $SESSION/$ID?view=events"
-echo $cmd
-$cmd
-
-echo
-echo "Logs (incl. stdout)"
-echo "==================="
-cmd="curl -E $SSL $SESSION/$ID?view=logs"
-echo $cmd
-$cmd
-
+echo $ID >> IDs.txt
diff --git a/scripts/sh/curl_canfar_monitor_local.sh b/scripts/sh/curl_canfar_monitor_local.sh
new file mode 100755
index 000000000..412e33c01
--- /dev/null
+++ b/scripts/sh/curl_canfar_monitor_local.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/bash
+
+# --false-start --tcp-fastopen  faster
+
+# --http2   slower
+# --tlsv1.2 slower?
+# --insecure ?
+
+# -H "Accept-Encoding: gzip"    faster?
+
+SSL=~/.ssl/cadcproxy.pem
+SESSION=https://ws-uv.canfar.net/skaha/v0/session
+
+type=$1
+
+echo "type=$type"
+
+while [ 1 ]; do
+  ID=`tail -n 1 IDs.txt`
+  cmd="curl -E $SSL $SESSION/$ID?view=$type"
+  echo $cmd
+  $cmd
+done
diff --git a/scripts/sh/init_canfar.sh b/scripts/sh/init_canfar_remote.sh
similarity index 100%
rename from scripts/sh/init_canfar.sh
rename to scripts/sh/init_canfar_remote.sh

From d331171728891660662eb3c682029738afee4356 Mon Sep 17 00:00:00 2001
From: Samuel Farrens <samuel.farrens@gmail.com>
Date: Thu, 30 Nov 2023 17:48:04 +0100
Subject: [PATCH 034/207] added BigMac depdendency for macOS

---
 .github/workflows/ci-dev.yml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/ci-dev.yml b/.github/workflows/ci-dev.yml
index a260f6c9d..984a9e7d6 100644
--- a/.github/workflows/ci-dev.yml
+++ b/.github/workflows/ci-dev.yml
@@ -28,7 +28,8 @@ jobs:
         shell: bash -l {0}
         if: runner.os == 'macOS'
         run: |
-          brew install libomp
+          brew tap sfarrens/sf
+          brew install bigmac libomp
 
       - name: Set up conda
         uses: conda-incubator/setup-miniconda@v2

From e335922cdbf5de302ff2f98c5c89bf0667fb4f16 Mon Sep 17 00:00:00 2001
From: sfarrens <samuel.farrens@gmail.com>
Date: Fri, 1 Dec 2023 10:05:55 +0100
Subject: [PATCH 035/207] activate dev environment

---
 .github/workflows/ci-dev.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/ci-dev.yml b/.github/workflows/ci-dev.yml
index 984a9e7d6..9e666f776 100644
--- a/.github/workflows/ci-dev.yml
+++ b/.github/workflows/ci-dev.yml
@@ -46,6 +46,6 @@ jobs:
       - name: Run tests
         shell: bash -l {0}
         run: |
-          conda activate shapepipe
+          conda activate shapepipe-dev
           python setup.py test
           shapepipe_run -c example/config.ini

From 0737c0f2c5d35b1cf172432f604cc16607a03ec6 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 1 Dec 2023 10:14:31 +0000
Subject: [PATCH 036/207] trying to run Pi

---
 example/cfis/config_exp_Pi.ini             | 82 ++++++++++++++++++++++
 scripts/sh/init_run_sp_exclusive_canfar.sh | 25 +++++++
 2 files changed, 107 insertions(+)
 create mode 100644 example/cfis/config_exp_Pi.ini
 create mode 100755 scripts/sh/init_run_sp_exclusive_canfar.sh

diff --git a/example/cfis/config_exp_Pi.ini b/example/cfis/config_exp_Pi.ini
new file mode 100644
index 000000000..bf98c962b
--- /dev/null
+++ b/example/cfis/config_exp_Pi.ini
@@ -0,0 +1,82 @@
+# ShapePipe configuration file for single-HDU single exposure images..
+# PSFex PSF model; interpolation for validation.
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_exp_Pi
+
+# Add date and time to RUN_NAME, optional, default: True
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = psfex_interp_runner
+         
+
+# Run mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 8
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+[PSFEX_INTERP_RUNNER]
+
+# Use 20% sample for PSF validation
+FILE_PATTERN = star_split_ratio_80, star_split_ratio_20, psfex_cat
+
+FILE_EXT = .psf, .fits, .cat
+
+NUMBERING_SCHEME = -0000000-0
+
+# Run mode for psfex interpolation:
+#  CLASSIC: 'classical' run, interpolate to object positions
+#  MULTI-EPOCH: interpolate for multi-epoch images
+#  VALIDATION: validation for single-epoch images
+MODE = VALIDATION
+
+# Column names of position parameters
+POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE
+
+# If True, measure and store ellipticity of the PSF (using moments)
+GET_SHAPES = True
+
+# Minimum number of stars per CCD for PSF model to be computed
+STAR_THRESH = 22
+
+# Maximum chi^2 for PSF model to be computed on CCD
+CHI2_THRESH = 2
diff --git a/scripts/sh/init_run_sp_exclusive_canfar.sh b/scripts/sh/init_run_sp_exclusive_canfar.sh
new file mode 100755
index 000000000..3d8e25c79
--- /dev/null
+++ b/scripts/sh/init_run_sp_exclusive_canfar.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+echo "start init run sp exclusive canfar"
+
+. /opt/conda/etc/profile.d/conda.sh
+
+conda activate shapepipe
+
+basedir=$HOME/cosmostat/P3_v2/psfex
+cd $basedir
+
+
+ID=$1
+n_SMP=$2
+typ=$3
+echo "ID=$ID n_SMP=$n_SMP type=$typ"
+
+export SP_RUN=.
+export SP_CONFIG=$HOME/shapepipe/example/cfis
+shapepipe_run -c $SP_CONFIG/config_exp_Pi.ini -e $ID
+
+cd $basedir
+
+echo "end init run sp exclusive canfar"
+

From c65d75a58c2451aea214f8c009e4822419b142d8 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 1 Dec 2023 11:39:52 +0100
Subject: [PATCH 037/207] numpy -> 1.22 to avoid asscalar bug

---
 environment.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/environment.yml b/environment.yml
index 759813a80..ea42dda00 100644
--- a/environment.yml
+++ b/environment.yml
@@ -15,7 +15,7 @@ dependencies:
   - libtool
   - matplotlib
   - numba
-  - numpy==1.21.6
+  - numpy==1.22
   - pip:
     - cs_util
     - modopt

From 2a7fab4824cf109933976d7bd428fb3af739fd26 Mon Sep 17 00:00:00 2001
From: sfarrens <samuel.farrens@gmail.com>
Date: Fri, 1 Dec 2023 13:11:59 +0100
Subject: [PATCH 038/207] added cs_util to dev env

---
 environment-dev.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/environment-dev.yml b/environment-dev.yml
index b5325d02c..cd2977ab8 100644
--- a/environment-dev.yml
+++ b/environment-dev.yml
@@ -28,6 +28,7 @@ dependencies:
   - tqdm>=4.66
   - treecorr>=4.3
   - pip:
+    - cs_util==0.0.5
     - mccd==1.2.3
     - modopt==1.6.0
     - sip_tpv==1.1

From 1e7b63359ec258dea8e3db6033fdb2897d7b149e Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 3 Dec 2023 17:36:53 +0000
Subject: [PATCH 039/207] aux script to create links for exposure output runs
 for tile

---
 example/cfis/config_exp_Pi.ini               |   2 +-
 example/cfis/config_exp_psfex.ini            |  31 +-
 example/cfis/config_tile_PiViSmVi_canfar.ini | 188 ++++++++++++
 scripts/python/link_to_exp_for_tile.py       | 305 +++++++++++++++++++
 scripts/sh/init_run_exclusive_canfar.sh      |  33 +-
 scripts/sh/job_sp_canfar.bash                |   2 +-
 6 files changed, 542 insertions(+), 19 deletions(-)
 create mode 100644 example/cfis/config_tile_PiViSmVi_canfar.ini
 create mode 100755 scripts/python/link_to_exp_for_tile.py

diff --git a/example/cfis/config_exp_Pi.ini b/example/cfis/config_exp_Pi.ini
index bf98c962b..ae510058e 100644
--- a/example/cfis/config_exp_Pi.ini
+++ b/example/cfis/config_exp_Pi.ini
@@ -46,7 +46,7 @@ OUTPUT_DIR = $SP_RUN/output
 [JOB]
 
 # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
-SMP_BATCH_SIZE = 8
+SMP_BATCH_SIZE = 2
 
 # Timeout value (optional), default is None, i.e. no timeout limit applied
 TIMEOUT = 96:00:00
diff --git a/example/cfis/config_exp_psfex.ini b/example/cfis/config_exp_psfex.ini
index bfc46675f..178aaee58 100644
--- a/example/cfis/config_exp_psfex.ini
+++ b/example/cfis/config_exp_psfex.ini
@@ -9,7 +9,7 @@
 VERBOSE = True
 
 # Name of run (optional) default: shapepipe_run
-RUN_NAME = run_sp_exp_SxSePsf
+RUN_NAME = run_sp_exp_SxSePsfPi
 
 # Add date and time to RUN_NAME, optional, default: True
 ; RUN_DATETIME = False
@@ -19,7 +19,7 @@ RUN_NAME = run_sp_exp_SxSePsf
 [EXECUTION]
 
 # Module name, single string or comma-separated list of valid module runner names
-MODULE = sextractor_runner, setools_runner, psfex_runner
+MODULE = sextractor_runner, setools_runner, psfex_runner,psfex_interp_runner
          
 
 # Run mode, SMP or MPI
@@ -147,3 +147,30 @@ EXEC_PATH = psfex
 
 # Default psfex configuration file
 DOT_PSFEX_FILE = $SP_CONFIG/default.psfex
+
+[PSFEX_INTERP_RUNNER]
+
+# Use 20% sample for PSF validation
+FILE_PATTERN = star_split_ratio_80, star_split_ratio_20, psfex_cat
+
+FILE_EXT = .psf, .fits, .cat
+
+NUMBERING_SCHEME = -0000000-0
+
+# Run mode for psfex interpolation:
+#  CLASSIC: 'classical' run, interpolate to object positions
+#  MULTI-EPOCH: interpolate for multi-epoch images
+#  VALIDATION: validation for single-epoch images
+MODE = VALIDATION
+
+# Column names of position parameters
+POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE
+
+# If True, measure and store ellipticity of the PSF (using moments)
+GET_SHAPES = True
+
+# Minimum number of stars per CCD for PSF model to be computed
+STAR_THRESH = 22
+
+# Maximum chi^2 for PSF model to be computed on CCD
+CHI2_THRESH = 2
diff --git a/example/cfis/config_tile_PiViSmVi_canfar.ini b/example/cfis/config_tile_PiViSmVi_canfar.ini
new file mode 100644
index 000000000..67dfa153e
--- /dev/null
+++ b/example/cfis/config_tile_PiViSmVi_canfar.ini
@@ -0,0 +1,188 @@
+# ShapePipe configuration file for tile, from detection  up to shape measurement.
+# PSFEx PSF model.
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_tile_PsViSmVi
+
+# Add date and time to RUN_NAME, optional, default: False
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+#MODULE = psfex_interp_runner,
+
+MODULE = psfex_interp_runner, vignetmaker_runner, spread_model_runner,
+         vignetmaker_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 16
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+[PSFEX_INTERP_RUNNER]
+
+INPUT_DIR = last:sextractor_runner
+
+FILE_PATTERN = sexcat
+
+FILE_EXT = .fits
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+# Run mode for psfex interpolation:
+#  CLASSIC: 'classical' run, interpolate to object positions
+#  MULTI-EPOCH: interpolate for multi-epoch images
+#  VALIDATION: validation for single-epoch images
+MODE = MULTI-EPOCH
+
+# Column names of position parameters
+POSITION_PARAMS = XWIN_WORLD,YWIN_WORLD
+
+# If True, measure and store ellipticity of the PSF
+GET_SHAPES = True
+
+# Number of stars threshold
+STAR_THRESH = 20
+
+# chi^2 threshold
+CHI2_THRESH = 2
+
+# Multi-epoch mode parameters
+
+ME_DOT_PSF_DIR = psfex_runner
+
+# Input psf file pattern
+ME_DOT_PSF_PATTERN = star_split_ratio_80
+
+# Multi-epoch mode: Path to file with single-exposure WCS header information
+ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite
+
+
+# Create vignets for tiles weights
+[VIGNETMAKER_RUNNER_RUN_1]
+
+INPUT_DIR = last:sextractor_runner, last:uncompress_fits_runner
+
+FILE_PATTERN = sexcat, CFIS_weight
+
+FILE_EXT = .fits, .fits
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+MASKING = False
+MASK_VALUE = 0
+
+# Run mode for psfex interpolation:
+#  CLASSIC: 'classical' run, interpolate to object positions
+#  MULTI-EPOCH: interpolate for multi-epoch images
+#  VALIDATION: validation for single-epoch images
+MODE = CLASSIC
+
+# Coordinate frame type, one in PIX (pixel frame), SPHE (spherical coordinates)
+COORD = PIX
+POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE
+
+# Vignet size in pixels
+STAMP_SIZE = 51
+
+# Output file name prefix, file name is <PREFIX>_vignet.fits
+PREFIX = weight
+
+
+[SPREAD_MODEL_RUNNER]
+
+INPUT_DIR = last:sextractor_runner, last:psfex_interp_runner, last:vignetmaker_runner_run_1
+
+FILE_PATTERN = sexcat, galaxy_psf, weight_vignet
+
+FILE_EXT = .fits, .sqlite, .fits
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+# Pixel scale in arcsec
+PIXEL_SCALE = 0.186
+
+# Output mode:
+#  new: create a new catalog with: [number, mag, sm, sm_err]
+#  add: create a copy of the input SExtractor with the column sm and sm_err
+OUTPUT_MODE = new
+
+
+[VIGNETMAKER_RUNNER_RUN_2]
+
+# Create multi-epoch vignets for tiles corresponding to
+# positions on single-exposures
+
+INPUT_DIR = last:sextractor_runner
+
+FILE_PATTERN = sexcat
+
+FILE_EXT = .fits
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+MASKING = False
+MASK_VALUE = 0
+
+# Run mode for psfex interpolation:
+#  CLASSIC: 'classical' run, interpolate to object positions
+#  MULTI-EPOCH: interpolate for multi-epoch images
+#  VALIDATION: validation for single-epoch images
+MODE = MULTI-EPOCH
+
+# Coordinate frame type, one in PIX (pixel frame), SPHE (spherical coordinates)
+COORD = SPHE
+POSITION_PARAMS = XWIN_WORLD,YWIN_WORLD
+
+# Vignet size in pixels
+STAMP_SIZE = 51
+
+# Output file name prefix, file name is <PREFIX_>vignet.fits
+PREFIX =
+
+# Additional parameters for path and file pattern corresponding to single-exposure
+# run outputs
+ME_IMAGE_DIR = split_exp_runner, split_exp_runner, split_exp_runner, sextractor_runner_run_2
+ME_IMAGE_PATTERN = flag, image, weight, background
+ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite
diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
new file mode 100755
index 000000000..40d74e352
--- /dev/null
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -0,0 +1,305 @@
+#!/usr/bin/env python
+
+# -*- coding: utf-8 -*-
+
+"""Script link_to_esp_for_tile.py
+
+:Author: Martin Kilbinger
+
+"""
+
+import os
+import sys
+import re
+import copy
+
+from optparse import OptionParser
+
+
+class param:
+    """General class to store (default) variables
+
+    """
+    def __init__(self, **kwds):
+        self.__dict__.update(kwds)
+
+    def print(self, **kwds):
+        print(self.__dict__)
+
+    def var_list(self, **kwds):
+        return vars(self)
+
+
+def params_default():
+    """Params Default.
+    
+    Set default parameter values.
+
+    Returns
+    -------
+    class param
+        parameter values
+
+    """
+    p_def = param(
+        tile_base_dir  = '.',
+        exp_base_dir = '.',
+    )
+
+    return p_def
+
+
+def parse_options(p_def):
+    """Parse Options.
+    
+    Parse command line options.
+
+    Parameters
+    ----------
+    p_def: class param
+        parameter values
+
+    Returns
+    -------
+    list
+        command line options
+        command line str
+
+    """
+    usage  = "%prog [OPTIONS]"
+    parser = OptionParser(usage=usage)
+
+    # IO
+    parser.add_option(
+        '-i',
+        '--input_tile_dir',
+        dest='tile_base_dir',
+        type='string',
+        default=p_def.tile_base_dir,
+        help=f'input tile base directory, default=\'{p_def.tile_base_dir}\''
+    )
+    parser.add_option(
+        '-t',
+        '--tile_ID',
+        dest='tile_ID',
+        type='string',
+        help=f"input tile ID",
+    )
+    parser.add_option(
+        '-I',
+        '--input_exp_dir',
+        dest='exp_base_dir',
+        type='string',
+        default=p_def.exp_base_dir,
+        help=f'input exposure base directory, default=\'{p_def.exp_base_dir}\''
+    )
+    parser.add_option(
+        '-v',
+        '--verbose',
+        dest='verbose',
+        action='store_true',
+        help='verbose output'
+    )
+
+    options, args = parser.parse_args()
+
+    return options, args
+
+
+def check_options(options):
+    """Check Options.
+    
+    Check command line options.
+
+    Parameters
+    ----------
+    options: tuple
+        Command line options
+
+    Returns
+    -------
+    bool
+        Result of option check. False if invalid option value.
+
+    """
+    return True
+
+
+def update_param(p_def, options):
+    """Update Param.
+    
+    Return default parameter, updated and complemented according to options.
+
+    Parameters
+    ----------
+    p_def:  class param
+        parameter values
+    optiosn: tuple
+        command line options
+
+    Returns
+    -------
+    class param
+        updated paramter values
+
+    """
+    param = copy.copy(p_def)
+
+    # Update keys in param according to options values
+    for key in vars(param):
+        if key in vars(options):
+            setattr(param, key, getattr(options, key))
+
+    # Add remaining keys from options to param
+    for key in vars(options):
+        if not key in vars(param):
+            setattr(param, key, getattr(options, key))
+
+    # Do extra stuff if necessary
+
+    return param
+
+
+def matching_subdirs(base_dir, pattern):
+
+    # Find all matching subdirectories
+    subdirs = []
+    for entry in os.listdir(base_dir):
+        full_path = os.path.join(base_dir, entry)
+        if os.path.isdir(full_path) and entry.startswith(pattern):
+            subdirs.append(full_path)
+
+    # Sort according to creation date
+    subdirs.sort(key=os.path.getctime)
+
+    return subdirs
+
+
+def get_tile_out_dir(tile_base_dir, tile_ID):
+
+    tile_out_dir = f"{tile_base_dir}/{tile_ID}/output"
+
+    return tile_out_dir
+
+
+def get_exp_IDs(tile_base_dir, tile_ID, verbose=False):
+
+    tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID)
+
+    subdirs = matching_subdirs(tile_out_dir, "run_sp_GitFeGie")
+
+    if len(subdirs) != 1:
+        raise IOError(f"Exactly one matching directory in {tile_out_dir} expected, not {len(subdirs)}")
+
+    # Replace dot with dash in tile ID
+    tile_ID_sp = re.sub(r"\.", "-", tile_ID)
+    exp_ID_file = f"{subdirs[0]}/find_exposures_runner/output/exp_numbers-{tile_ID_sp}.txt"
+
+    exp_IDs = []
+    with open(exp_ID_file) as f_in:
+        for line in f_in:
+            name = line.strip()
+            # Remove any letter
+            ID = re.sub("[a-zA-Z]", "", name) 
+            exp_IDs.append(ID)
+
+    return exp_IDs
+
+
+def get_exp_single_HDU_IDs(exp_IDs, n_CPU):
+
+    exp_shdu_IDs = []
+    for exp_ID in exp_IDs:
+        for idx in range(n_CPU):
+            ID = f"{exp_ID}-{idx}"
+            exp_shdu_IDs.append(ID)
+
+    return exp_shdu_IDs
+
+    
+def get_paths(exp_base_dir, exp_shdu_IDs):
+
+    number = {}
+    paths = []
+    for exp_shdu_ID in exp_shdu_IDs:
+        name = f"{exp_base_dir}/{exp_shdu_ID}/output"
+        path = os.path.abspath(name)
+        subdirs = matching_subdirs(path, "run_sp_exp_SxSePsf")
+        n_subdirs = len(subdirs)
+
+        if n_subdirs not in number:
+            number[n_subdirs] = 1
+        else:
+            number[n_subdirs] += 1
+
+        if n_subdirs != 1:
+            msg = f"Exactly one matching directory in {path} expected, not {n_subdirs}"
+            print(msg)
+            if n_subdirs == 0:
+                continue
+        paths.append(f"{subdirs[0]}")
+
+    return paths, number
+
+
+def create_links_paths(tile_base_dir, tile_ID, paths):
+
+    tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID)
+
+    for path in paths:
+
+        head, tail = os.path.split(path)
+        src = path
+        dst = f"{tile_out_dir}/{tail}"
+        if os.path.exists(dst):
+            print("Warning: {dst} already exists, no link created")
+        else:
+            print(f"ln -s {src} {dst}")
+            os.symlink(src, dst)
+
+
+def update_log_files(tile_base_dir, tile_ID, paths):
+
+   tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID)
+
+   for path in paths:
+
+        head, tail = os.path.split(path)
+        src = path
+        dst = f"{tile_out_dir}/{tail}"
+            os.symlink(src, dst)
+
+
+
+def main(argv=None):
+
+    # Set default parameters
+    p_def = params_default()
+
+    # Command line options
+    options, args = parse_options(p_def)
+
+    if check_options(options) is False:
+        return 1
+
+    param = update_param(p_def, options)
+
+    tile_base_dir = param.tile_base_dir
+    exp_base_dir = param.exp_base_dir
+    tile_ID = param.tile_ID
+    n_CPU = 40
+    verbose = param.verbose
+
+    exp_IDs = get_exp_IDs(tile_base_dir, tile_ID, verbose=verbose)
+    exp_shdu_IDs = get_exp_single_HDU_IDs(exp_IDs, n_CPU)
+    paths, number = get_paths(exp_base_dir, exp_shdu_IDs)
+    print(number)
+
+    create_links_paths(tile_base_dir, tile_ID, paths)
+
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 7f9f428e1..42e8f5824 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -20,22 +20,25 @@ echo "ID=$ID n_SMP=$n_SMP type=$typ"
 
 cd ${typ}_runs
 
-mkdir $ID
+#mkdir $ID
+
 cd $ID
-mkdir output
-cd output
-cp $basedir/output/log_run_sp.txt .
-ln -s $basedir/output/log_exp_headers.sqlite
-for dir in $basedir/output/run_sp_*; do
-	ln -s $dir
-done
-cd ..
-
-#export SP_RUN=.
-#export SP_CONFIG=$HOME/shapepipe/example/cfis
-#shapepipe_run -c $SP_CONFIG/config_tile_Sx.ini -e $ID
-
-job_sp_canfar.bash -p psfex -j 32 -e $ID -n $n_SMP
+
+#mkdir output
+#cd output
+pwd
+#cp $basedir/output/log_run_sp.txt .
+#ln -s $basedir/output/log_exp_headers.sqlite
+#for dir in $basedir/output/run_sp_*; do
+	#ln -s $dir
+#done
+#cd ..
+
+export SP_RUN=.
+export SP_CONFIG=$HOME/shapepipe/example/cfis
+shapepipe_run -c $SP_CONFIG/config_exp_Pi.ini -e $ID
+
+#job_sp_canfar.bash -p psfex -j 32 -e $ID -n $n_SMP
 
 cd $basedir
 
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index cbafd6f19..621700f9a 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -421,7 +421,7 @@ if [[ $do_job != 0 ]]; then
   ### PSF model letter: 'P' (psfex) or 'M' (mccd)
   letter=${psf:0:1}
   Letter=${letter^}
-  command_sp "shapepipe_run -c $SP_CONFIG/config_tile_${Letter}iViSmVi.ini" "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)"
+  command_cfg_shapepipe "config_tile_${Letter}iViSmVi_canfar.ini" "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)" $n_smp $exclusive
 
 fi
 

From 85f0c99ad3d1d2433455a0d5124ab699e000636f Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 3 Dec 2023 18:58:42 +0100
Subject: [PATCH 040/207] Added aux script to update runs log file

---
 scripts/python/link_to_exp_for_tile.py |  1 +
 scripts/python/update_runs_log_file.py | 80 ++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 scripts/python/update_runs_log_file.py

diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index 40d74e352..64e83995b 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -160,6 +160,7 @@ class param
     return param
 
 
+# TODO: move to cs_util                                                          
 def matching_subdirs(base_dir, pattern):
 
     # Find all matching subdirectories
diff --git a/scripts/python/update_runs_log_file.py b/scripts/python/update_runs_log_file.py
new file mode 100644
index 000000000..c371eedfd
--- /dev/null
+++ b/scripts/python/update_runs_log_file.py
@@ -0,0 +1,80 @@
+import sys
+import os
+
+# TODO: move to cs_util
+def matching_subdirs(base_dir, pattern, where="start", tail=False):                                         
+                                                                                 
+    # Find all matching subdirectories                                           
+    subdirs = []                                                                 
+    for entry in os.listdir(base_dir):                                           
+        full_path = os.path.join(base_dir, entry)                                
+        if os.path.isdir(full_path):
+            found = False
+
+            # Look for pattern at start or end
+            if where == "start" and entry.startswith(pattern):               
+                found = True
+            if where == "end" and entry.endswith(pattern):
+                found = True
+
+            # Append for return
+            if found:
+                if not tail:
+                    path = full_path
+                else:
+                    head, tail = os.path.split(full_path) 
+                    path = tail
+                subdirs.append(path)
+                                                                                 
+    # Sort according to creation date                                            
+    if not tail:
+        subdirs.sort(key=os.path.getctime)                                           
+                                                                                 
+    return subdirs
+
+
+def get_module_runs(subdirs):
+
+    all_runs = {}
+    for subdir in subdirs:
+        runs = matching_subdirs(subdir, "_runner", where="end", tail=True)
+        all_runs[subdir] = runs
+
+    return all_runs
+
+
+def update_log_file(module_runs, log_name):
+
+    with open(log_name, "w") as f_out: 
+        for key in module_runs:
+            print(key, file=f_out, end=" ")
+            print(",".join(module_runs[key]), file=f_out)
+
+
+def main(argv=None):                                                             
+                                                                                 
+    # Set default parameters                                                     
+    #p_def = params_default()                                                     
+                                                                                 
+    # Command line options                                                       
+    #options, args = parse_options(p_def)                                         
+                                                                                 
+    #if check_options(options) is False:                                          
+        #return 1                                                                 
+                                                                                 
+    #param = update_param(p_def, options)                                         
+                                                                                 
+    base_dir = "./output"
+    pattern = "run_sp_"
+    log_name = f"{base_dir}/log_run_sp.txt"
+
+    subdirs = matching_subdirs(base_dir, pattern)
+    module_runs = get_module_runs(subdirs)
+    #save_prev(log_name)
+    update_log_file(module_runs, log_name)
+                                                                                 
+    return 0                                                                     
+                                                                                 
+                                                                                 
+if __name__ == "__main__":                                                       
+    sys.exit(main(sys.argv))

From d0c3d9fb9a091aac5765539f47894989079b8f15 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 3 Dec 2023 19:23:16 +0100
Subject: [PATCH 041/207] update runs log file script: deal with multiple runs
 of same module

---
 scripts/python/update_runs_log_file.py | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/scripts/python/update_runs_log_file.py b/scripts/python/update_runs_log_file.py
index c371eedfd..0ee5870ff 100644
--- a/scripts/python/update_runs_log_file.py
+++ b/scripts/python/update_runs_log_file.py
@@ -1,8 +1,9 @@
+import re
 import sys
 import os
 
 # TODO: move to cs_util
-def matching_subdirs(base_dir, pattern, where="start", tail=False):                                         
+def matching_subdirs(base_dir, pattern, tail=False):                                         
                                                                                  
     # Find all matching subdirectories                                           
     subdirs = []                                                                 
@@ -12,18 +13,19 @@ def matching_subdirs(base_dir, pattern, where="start", tail=False):
             found = False
 
             # Look for pattern at start or end
-            if where == "start" and entry.startswith(pattern):               
-                found = True
-            if where == "end" and entry.endswith(pattern):
-                found = True
+            if pattern in entry:               
 
-            # Append for return
-            if found:
+                # Get full path or last part ("tail")
                 if not tail:
                     path = full_path
                 else:
                     head, tail = os.path.split(full_path) 
                     path = tail
+
+                # Remove postfix in case of multiple runs of same module
+                path = re.sub("_run_.\d?", "", path)
+
+                # Append to result
                 subdirs.append(path)
                                                                                  
     # Sort according to creation date                                            
@@ -37,7 +39,7 @@ def get_module_runs(subdirs):
 
     all_runs = {}
     for subdir in subdirs:
-        runs = matching_subdirs(subdir, "_runner", where="end", tail=True)
+        runs = matching_subdirs(subdir, "_runner", tail=True)
         all_runs[subdir] = runs
 
     return all_runs

From 323d44a97e024cc2f78c13c56a2c221d243e07ab Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 4 Dec 2023 11:53:28 +0100
Subject: [PATCH 042/207] run_log: added function get_all_dirs

---
 scripts/sh/curl_canfar_local.sh |  2 +-
 shapepipe/pipeline/run_log.py   | 35 +++++++++++++++++++++++++++++----
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index c875d4cb3..e410c8d30 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -4,7 +4,7 @@
 # ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.8 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID exp NCORE
 
 SSL=~/.ssl/cadcproxy.pem
-NCORE=1
+NCORE=2
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
 RESOURCES="ram=4&cores=$NCORE"
 IMAGE=images.canfar.net/unions/shapepipe
diff --git a/shapepipe/pipeline/run_log.py b/shapepipe/pipeline/run_log.py
index 115e87de0..d0f9af608 100644
--- a/shapepipe/pipeline/run_log.py
+++ b/shapepipe/pipeline/run_log.py
@@ -170,6 +170,32 @@ def get_last(runs, module):
     return last_run.split(' ')[0]
 
 
+def get_all_dirs(run_log_file, module):
+    """Get All Dirs.
+
+    Return directory paths corresponding to all runs of given module.
+
+    Parameters
+    ----------
+    run_log_file : str
+        Run log file name
+    module : str
+        Module name
+
+    Returns
+    -------
+    list
+        Directory names of all module runs
+
+    """
+    runs = get_list(run_log_file)
+    all_runs = get_all(runs, module)
+
+    all_dirs = [f"{run}/{module}/output" for run in all_runs[0].split(" ")]
+ 
+    return all_dirs
+
+
 def get_last_dir(run_log_file, module):
     """Get Last Dir.
 
@@ -188,9 +214,10 @@ def get_last_dir(run_log_file, module):
         Directory name of last module run
 
     """
-    runs = get_list(run_log_file)
-    all_runs = get_all(runs, module)
-    last_run = all_runs[0].split(' ')[0]
-    last_dir = f'{last_run}/{module}/output'
+    all_dirs = get_all_dirs(run_log_file, module)
+    last_dir = all_dirs[0]
 
     return last_dir
+
+
+

From dedbc3f7017e93953a4f4ba4c7e6f8ef835aa559 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 4 Dec 2023 13:22:31 +0100
Subject: [PATCH 043/207] Fixed new function get_all_dirs

---
 scripts/python/link_to_exp_for_tile.py | 13 -------------
 shapepipe/pipeline/run_log.py          |  5 ++++-
 2 files changed, 4 insertions(+), 14 deletions(-)

diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index 64e83995b..55fc09d03 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -259,19 +259,6 @@ def create_links_paths(tile_base_dir, tile_ID, paths):
             os.symlink(src, dst)
 
 
-def update_log_files(tile_base_dir, tile_ID, paths):
-
-   tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID)
-
-   for path in paths:
-
-        head, tail = os.path.split(path)
-        src = path
-        dst = f"{tile_out_dir}/{tail}"
-            os.symlink(src, dst)
-
-
-
 def main(argv=None):
 
     # Set default parameters
diff --git a/shapepipe/pipeline/run_log.py b/shapepipe/pipeline/run_log.py
index d0f9af608..c182eeac7 100644
--- a/shapepipe/pipeline/run_log.py
+++ b/shapepipe/pipeline/run_log.py
@@ -191,7 +191,10 @@ def get_all_dirs(run_log_file, module):
     runs = get_list(run_log_file)
     all_runs = get_all(runs, module)
 
-    all_dirs = [f"{run}/{module}/output" for run in all_runs[0].split(" ")]
+    all_dirs = []
+    for run in all_runs:
+        dir_name = run.split(" ")[0]
+        all_dirs.append(f"{dir_name}/{module}/output")
  
     return all_dirs
 

From e67f549889f23ce92ba60efc631b40f102ce8f26 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 4 Dec 2023 12:24:53 +0000
Subject: [PATCH 044/207] Fixed (as for MCCD) FITS key bug

---
 example/cfis/config_tile_PiViSmVi_canfar.ini  | 10 +++----
 scripts/python/link_to_exp_for_tile.py        | 28 ++++++-------------
 .../psfex_interp_package/psfex_interp.py      |  8 ++++--
 shapepipe/modules/vignetmaker_runner.py       |  6 ++--
 shapepipe/pipeline/file_handler.py            |  2 +-
 5 files changed, 24 insertions(+), 30 deletions(-)

diff --git a/example/cfis/config_tile_PiViSmVi_canfar.ini b/example/cfis/config_tile_PiViSmVi_canfar.ini
index 67dfa153e..ed9e3d339 100644
--- a/example/cfis/config_tile_PiViSmVi_canfar.ini
+++ b/example/cfis/config_tile_PiViSmVi_canfar.ini
@@ -58,7 +58,7 @@ TIMEOUT = 96:00:00
 
 [PSFEX_INTERP_RUNNER]
 
-INPUT_DIR = last:sextractor_runner
+INPUT_DIR = run_sp_tile_Sx:sextractor_runner
 
 FILE_PATTERN = sexcat
 
@@ -99,7 +99,7 @@ ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite
 # Create vignets for tiles weights
 [VIGNETMAKER_RUNNER_RUN_1]
 
-INPUT_DIR = last:sextractor_runner, last:uncompress_fits_runner
+INPUT_DIR = run_sp_tile_Sx:sextractor_runner, last:uncompress_fits_runner
 
 FILE_PATTERN = sexcat, CFIS_weight
 
@@ -130,7 +130,7 @@ PREFIX = weight
 
 [SPREAD_MODEL_RUNNER]
 
-INPUT_DIR = last:sextractor_runner, last:psfex_interp_runner, last:vignetmaker_runner_run_1
+INPUT_DIR = run_sp_tile_Sx:sextractor_runner, last:psfex_interp_runner, last:vignetmaker_runner_run_1
 
 FILE_PATTERN = sexcat, galaxy_psf, weight_vignet
 
@@ -153,7 +153,7 @@ OUTPUT_MODE = new
 # Create multi-epoch vignets for tiles corresponding to
 # positions on single-exposures
 
-INPUT_DIR = last:sextractor_runner
+INPUT_DIR = run_sp_tile_Sx:sextractor_runner
 
 FILE_PATTERN = sexcat
 
@@ -183,6 +183,6 @@ PREFIX =
 
 # Additional parameters for path and file pattern corresponding to single-exposure
 # run outputs
-ME_IMAGE_DIR = split_exp_runner, split_exp_runner, split_exp_runner, sextractor_runner_run_2
+ME_IMAGE_DIR = split_exp_runner, split_exp_runner, split_exp_runner, sextractor_runner
 ME_IMAGE_PATTERN = flag, image, weight, background
 ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite
diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index 64e83995b..de18f92e8 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -218,14 +218,14 @@ def get_exp_single_HDU_IDs(exp_IDs, n_CPU):
     return exp_shdu_IDs
 
     
-def get_paths(exp_base_dir, exp_shdu_IDs):
+def get_paths(exp_base_dir, exp_shdu_IDs, pattern):
 
     number = {}
     paths = []
     for exp_shdu_ID in exp_shdu_IDs:
         name = f"{exp_base_dir}/{exp_shdu_ID}/output"
         path = os.path.abspath(name)
-        subdirs = matching_subdirs(path, "run_sp_exp_SxSePsf")
+        subdirs = matching_subdirs(path, pattern)
         n_subdirs = len(subdirs)
 
         if n_subdirs not in number:
@@ -253,25 +253,12 @@ def create_links_paths(tile_base_dir, tile_ID, paths):
         src = path
         dst = f"{tile_out_dir}/{tail}"
         if os.path.exists(dst):
-            print("Warning: {dst} already exists, no link created")
+            print(f"Warning: {dst} already exists, no link created")
         else:
             print(f"ln -s {src} {dst}")
             os.symlink(src, dst)
 
 
-def update_log_files(tile_base_dir, tile_ID, paths):
-
-   tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID)
-
-   for path in paths:
-
-        head, tail = os.path.split(path)
-        src = path
-        dst = f"{tile_out_dir}/{tail}"
-            os.symlink(src, dst)
-
-
-
 def main(argv=None):
 
     # Set default parameters
@@ -293,10 +280,13 @@ def main(argv=None):
 
     exp_IDs = get_exp_IDs(tile_base_dir, tile_ID, verbose=verbose)
     exp_shdu_IDs = get_exp_single_HDU_IDs(exp_IDs, n_CPU)
-    paths, number = get_paths(exp_base_dir, exp_shdu_IDs)
-    print(number)
 
-    create_links_paths(tile_base_dir, tile_ID, paths)
+    patterns = ["run_sp_exp_SxSePsf", "run_sp_exp_Pi"]
+    for pattern in patterns:
+        paths, number = get_paths(exp_base_dir, exp_shdu_IDs, pattern)
+        print(number)
+
+        create_links_paths(tile_base_dir, tile_ID, paths)
 
 
     return 0
diff --git a/shapepipe/modules/psfex_interp_package/psfex_interp.py b/shapepipe/modules/psfex_interp_package/psfex_interp.py
index 3ac1b25ea..ca7d6bea3 100644
--- a/shapepipe/modules/psfex_interp_package/psfex_interp.py
+++ b/shapepipe/modules/psfex_interp_package/psfex_interp.py
@@ -568,13 +568,15 @@ def _interpolate_me(self):
 
         all_id = np.copy(cat.get_data()['NUMBER'])
         key_ne = 'N_EPOCH'
-        if key_ne not in cat.get_data():
+        if key_ne not in cat.get_data().dtype.names:
+            print("MKDEBUG ", cat.get_data())
             raise KeyError(
-                f'Key {key_ne} not found in input galaxy catalogue, needed for'
+                f'Key {key_ne} not found in input galaxy catalogue'
+                + f'{self._galcat_path}, needed for'
                 + ' PSF interpolation to multi-epoch data; run previous module'
                 + ' (SExtractor) in multi-epoch mode'
             )
-        n_epoch = np.copy(cat.get_data()[key_me])
+        n_epoch = np.copy(cat.get_data()[key_ne])
 
         list_ext_name = cat.get_ext_name()
         hdu_ind = [
diff --git a/shapepipe/modules/vignetmaker_runner.py b/shapepipe/modules/vignetmaker_runner.py
index 972e54e16..afd6ed66b 100644
--- a/shapepipe/modules/vignetmaker_runner.py
+++ b/shapepipe/modules/vignetmaker_runner.py
@@ -93,8 +93,10 @@ def vignetmaker_runner(
             modules = config.getlist(module_config_sec, 'ME_IMAGE_DIR')
             image_dir = []
             for module in modules:
-                last_dir = get_last_dir(run_dirs['run_log'], module)
-                image_dir.append(last_dir)
+                #last_dir = get_last_dir(run_dirs['run_log'], module)
+                all_dirs = get_all_dirs(run_dirs['run_log'], module)
+                for my_dir in all_dirs:
+                    image_dir.append(my_dir)
             image_pattern = config.getlist(
                 module_config_sec,
                 'ME_IMAGE_PATTERN',
diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index 51b02cdd7..6ce2192a1 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -1118,7 +1118,7 @@ def _format_process_list(
                 id_to_test = f"-{self._exclusive.replace('.', '-')}"
                 if number == id_to_test:
                     if self._verbose:
-                        print(f"Using exclusive number {self._exclusive} ({id_to_test})")
+                        print(f"-- Using exclusive number {self._exclusive} ({id_to_test})")
                 else:
                     if self._verbose:
                         #print(f"Skipping {number}, not equal to {self._exclusive} ({id_to_test})")

From b6cb27d788347a72a2926434872acc13d8caea26 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 4 Dec 2023 15:15:17 +0000
Subject: [PATCH 045/207] vignet makers: can use last and all in additional
 input inage directories

---
 .../vignetmaker_package/vignetmaker.py        | 56 +++++++++++--------
 shapepipe/modules/vignetmaker_runner.py       | 23 +++++---
 2 files changed, 47 insertions(+), 32 deletions(-)

diff --git a/shapepipe/modules/vignetmaker_package/vignetmaker.py b/shapepipe/modules/vignetmaker_package/vignetmaker.py
index 047de8a6b..a7e2b2857 100644
--- a/shapepipe/modules/vignetmaker_package/vignetmaker.py
+++ b/shapepipe/modules/vignetmaker_package/vignetmaker.py
@@ -7,6 +7,7 @@
 """
 
 import re
+import os
 
 import numpy as np
 from astropy.wcs import WCS
@@ -183,22 +184,22 @@ def _get_stamp(self, img_path, pos, rad):
 
         return vign
 
-    def _get_stamp_me(self, image_dir, image_pattern):
+    def _get_stamp_me(self, image_dirs, image_pattern):
         """Get Stamp Multi-Epoch.
 
         Get stamps for multi-epoch data.
 
         Parameters
         ----------
-        image_dir : str
-            Path to the directory where the images are
+        image_dirs : list
+            Path to directories to search for input images
         image_pattern : str
             Common part of the file names
 
         Returns
         -------
         dict
-            Directory containing object id and vignets for each epoch
+            Dictionary containing object id and vignets for each epoch
 
         """
         cat = file_io.FITSCatalogue(self._galcat_path, SEx_catalogue=True)
@@ -226,10 +227,19 @@ def _get_stamp_me(self, image_dir, image_pattern):
                 if ccd == -1:
                     continue
 
-                img_path = (
-                    image_dir + '/' + image_pattern + '-'
-                    + exp_name + '-' + str(ccd) + '.fits'
-                )
+                # Look for input image
+                found = False
+                image_name = f"{image_pattern}-{exp_name}-{ccd}.fits"
+                for image_dir in image_dirs:
+                    img_path = f"{image_dir}/{image_name}"
+                    if os.path.exists(img_path):
+                        found = True
+                        break
+                if not found:
+                    raise FileNotFoundError(
+                        f"Could not find image {image_name}"
+                    )
+
                 ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0]
                 obj_id = all_id[ind_obj]
 
@@ -292,23 +302,23 @@ def _get_stamp_me(self, image_dir, image_pattern):
 
         return output_dict
 
-    def process_me(self, image_dir, image_pattern, f_wcs_path, rad):
+    def process_me(self, image_dirs, image_pattern, f_wcs_path, rad):
         """Process Multi-Epoch.
 
         Main function to create the stamps in the multi-epoch case.
 
         Parameters
         ----------
-        image_dir : list
-            List of directories where the image are; ff ``len(image_dir) == 1``
-            -> all images are in the same directory, else ``len(image_dir)``
-            must match ``len(image_pattern)``
+        image_dirs : list
+            Directories of image locations.
+            Each list item contains sublist in which images are searched.
+            Length of outer list has to match image_pattern, or be single item.
         image_pattern : list
             Common part of each kind of file names
         f_wcs_path : str
             Path to the log file containing the WCS for each CCDs
         rad : int
-            Radius of the stamp, must be odd
+            Radius of the stamp, must be an odd integer
 
         """
         self._f_wcs_file = SqliteDict(f_wcs_path)
@@ -316,17 +326,15 @@ def process_me(self, image_dir, image_pattern, f_wcs_path, rad):
 
         for idx in range(len(image_pattern)):
 
-            if len(image_dir) != len(image_pattern):
-                output_dict = self._get_stamp_me(
-                    image_dir[0],
-                    image_pattern[idx],
-                )
-
+            if len(image_dirs) != len(image_pattern):
+                index = 0
             else:
-                output_dict = self._get_stamp_me(
-                    image_dir[idx],
-                    image_pattern[idx],
-                )
+                index = idx
+
+            output_dict = self._get_stamp_me(
+                image_dirs[index],
+                image_pattern[idx],
+            )
 
             self._save_vignet_me(output_dict, image_pattern[idx])
 
diff --git a/shapepipe/modules/vignetmaker_runner.py b/shapepipe/modules/vignetmaker_runner.py
index afd6ed66b..9a83f1cd6 100644
--- a/shapepipe/modules/vignetmaker_runner.py
+++ b/shapepipe/modules/vignetmaker_runner.py
@@ -2,14 +2,14 @@
 
 Module runner for ``vignetmaker``.
 
-:Author: Axel Guinot
+:Authors: Axel Guinot, Martin Kilbinger
 
 """
 
 from shapepipe.modules.module_decorator import module_runner
 from shapepipe.modules.vignetmaker_package import vignetmaker as vm
 
-from shapepipe.pipeline.run_log import get_last_dir
+from shapepipe.pipeline.run_log import get_last_dir, get_all_dirs
 
 
 @module_runner(
@@ -91,12 +91,19 @@ def vignetmaker_runner(
         elif mode == 'MULTI-EPOCH':
             # Fetch image directory and patterns
             modules = config.getlist(module_config_sec, 'ME_IMAGE_DIR')
-            image_dir = []
+            image_dirs = []
             for module in modules:
-                #last_dir = get_last_dir(run_dirs['run_log'], module)
-                all_dirs = get_all_dirs(run_dirs['run_log'], module)
-                for my_dir in all_dirs:
-                    image_dir.append(my_dir)
+                module_name = module.split(":")[-1]
+                if "last" in module:
+                    dirs = [get_last_dir(run_dirs['run_log'], module_name)]
+                elif "all" in module:
+                    dirs = get_all_dirs(run_dirs['run_log'], module_name)
+                else:
+                    raise ValueError(
+                        "Expected qualifier 'last:' or 'all' before module"
+                        + f" '{module}' in config entry 'ME_IMAGE_DIR'")
+                image_dirs.append(dirs)
+
             image_pattern = config.getlist(
                 module_config_sec,
                 'ME_IMAGE_PATTERN',
@@ -105,7 +112,7 @@ def vignetmaker_runner(
             f_wcs_path = config.getexpanded(module_config_sec, 'ME_LOG_WCS')
 
             # Process inputs
-            vm_inst.process_me(image_dir, image_pattern, f_wcs_path, radius)
+            vm_inst.process_me(image_dirs, image_pattern, f_wcs_path, radius)
 
         # Invalid mode
         else:

From 096af60f2debf296d30dca8885ae72f852af7379 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 8 Dec 2023 09:30:12 +0100
Subject: [PATCH 046/207] Dockerfile + jupyter, activate

---
 Dockerfile                        | 4 +++-
 scripts/python/merge_final_cat.py | 2 --
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index d4ea036d8..6cd1923e7 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -54,4 +54,6 @@ COPY scripts ./scripts
 # Activate conda environment using "source"
 #RUN . /opt/conda/etc/profile.d/conda.sh
 #RUN conda init bash
-RUN conda activate shapepipe
+RUN ./scripts/sh/init_canfar.sh
+RUN source activate shapepipe
+RUN pip install jupyter
diff --git a/scripts/python/merge_final_cat.py b/scripts/python/merge_final_cat.py
index 1a160c449..076f5c935 100755
--- a/scripts/python/merge_final_cat.py
+++ b/scripts/python/merge_final_cat.py
@@ -20,8 +20,6 @@
 
 from optparse import OptionParser
 
-from tqdm import tqdm
-
 from shapepipe.utilities import cfis
 
 

From 3c372506c39bb41493f54aaa20e66f386f26aef6 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 8 Dec 2023 13:41:52 +0000
Subject: [PATCH 047/207] file handler raises error if no process

---
 shapepipe/pipeline/file_handler.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index 6ce2192a1..66baf12e6 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -1135,6 +1135,9 @@ def _format_process_list(
             ])
             process_list.append(process_items)
 
+        if len(process_list) == 0:
+            raise ValueError("Empty process list")
+
         return process_list
 
     def _save_process_list(

From 667eb7bd871b949882a0fdf256323add65bb7152 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 8 Dec 2023 13:42:12 +0000
Subject: [PATCH 048/207] combine mask outputs

---
 example/cfis/config_MaMa_onthefly.ini        |  2 +-
 example/cfis/config_exp_psfex.ini            |  9 +++--
 scripts/python/update_runs_log_file.py       |  2 ++
 scripts/sh/init_run_exclusive_canfar.sh      | 38 ++++++++++++--------
 scripts/sh/job_sp_canfar.bash                |  2 +-
 scripts/sh/prepare_tiles_for_final.bash      |  4 +--
 shapepipe/modules/mask_package/mask.py       | 15 ++++++++
 shapepipe/modules/setools_package/setools.py |  5 ++-
 shapepipe/modules/sextractor_runner.py       |  2 +-
 9 files changed, 55 insertions(+), 24 deletions(-)

diff --git a/example/cfis/config_MaMa_onthefly.ini b/example/cfis/config_MaMa_onthefly.ini
index bde813940..84f117e65 100644
--- a/example/cfis/config_MaMa_onthefly.ini
+++ b/example/cfis/config_MaMa_onthefly.ini
@@ -44,7 +44,7 @@ OUTPUT_DIR = $SP_RUN/output
 [JOB]
 
 # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
-SMP_BATCH_SIZE = 8
+SMP_BATCH_SIZE = 16
 
 # Timeout value (optional), default is None, i.e. no timeout limit applied
 TIMEOUT = 96:00:00
diff --git a/example/cfis/config_exp_psfex.ini b/example/cfis/config_exp_psfex.ini
index 178aaee58..11f375456 100644
--- a/example/cfis/config_exp_psfex.ini
+++ b/example/cfis/config_exp_psfex.ini
@@ -9,7 +9,8 @@
 VERBOSE = True
 
 # Name of run (optional) default: shapepipe_run
-RUN_NAME = run_sp_exp_SxSePsfPi
+#RUN_NAME = run_sp_exp_SxSePsfPi
+RUN_NAME = run_sp_exp_SxSePsf
 
 # Add date and time to RUN_NAME, optional, default: True
 ; RUN_DATETIME = False
@@ -19,7 +20,8 @@ RUN_NAME = run_sp_exp_SxSePsfPi
 [EXECUTION]
 
 # Module name, single string or comma-separated list of valid module runner names
-MODULE = sextractor_runner, setools_runner, psfex_runner,psfex_interp_runner
+MODULE = sextractor_runner, setools_runner, psfex_runner
+#psfex_interp_runner
          
 
 # Run mode, SMP or MPI
@@ -57,7 +59,8 @@ TIMEOUT = 96:00:00
 [SEXTRACTOR_RUNNER]
 
 # Input from two modules
-INPUT_MODULE = split_exp_runner, mask_runner
+INPUT_DIR = last:split_exp_runner, last:mask_runner_run_2
+#INPUT_MODULE = split_exp_runner, mask_runner_run_2
 
 # Read pipeline flag files created by mask module
 FILE_PATTERN = image, weight, pipeline_flag
diff --git a/scripts/python/update_runs_log_file.py b/scripts/python/update_runs_log_file.py
index 0ee5870ff..b244c28ec 100644
--- a/scripts/python/update_runs_log_file.py
+++ b/scripts/python/update_runs_log_file.py
@@ -1,3 +1,5 @@
+#!/usr/bin/env python
+
 import re
 import sys
 import os
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 42e8f5824..02c218271 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -24,21 +24,29 @@ cd ${typ}_runs
 
 cd $ID
 
-#mkdir output
-#cd output
-pwd
-#cp $basedir/output/log_run_sp.txt .
-#ln -s $basedir/output/log_exp_headers.sqlite
-#for dir in $basedir/output/run_sp_*; do
-	#ln -s $dir
-#done
-#cd ..
-
-export SP_RUN=.
-export SP_CONFIG=$HOME/shapepipe/example/cfis
-shapepipe_run -c $SP_CONFIG/config_exp_Pi.ini -e $ID
-
-#job_sp_canfar.bash -p psfex -j 32 -e $ID -n $n_SMP
+if [ ! -d "output" ]; then
+  mkdir output
+fi
+
+  cd output
+  #ln -s $basedir/output/log_exp_headers.sqlite
+  # Remove potentially obsolete link
+  rm run_sp_exp_SpMh*
+  for dir in $basedir/output/run_sp_*; do
+	  ln -s $dir
+  done
+  rm  run_sp_MaMa_*
+  ln -s $basedir/output/run_sp_combined_flag
+  cd ..
+  update_runs_log_file.py
+
+  pwd
+
+#export SP_RUN=.
+#export SP_CONFIG=$HOME/shapepipe/example/cfis
+#shapepipe_run -c $SP_CONFIG/config_exp_Pi.ini -e $ID
+
+job_sp_canfar.bash -p psfex -j 32 -e $ID -n $n_SMP
 
 cd $basedir
 
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 621700f9a..daf997378 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -388,7 +388,7 @@ fi
 if [[ $do_job != 0 ]]; then
 
   ### Mask exposures
-  command_cfg_shapepipe "config_ext_Ma_$star_cat_for_mask.ini" "Run shapepipe (mask exposures)" $n_smp $exclusive
+  command_cfg_shapepipe "config_exp_Ma_$star_cat_for_mask.ini" "Run shapepipe (mask exposures)" $n_smp $exclusive
 
 fi
 
diff --git a/scripts/sh/prepare_tiles_for_final.bash b/scripts/sh/prepare_tiles_for_final.bash
index c26f8e8c2..454d8fd77 100755
--- a/scripts/sh/prepare_tiles_for_final.bash
+++ b/scripts/sh/prepare_tiles_for_final.bash
@@ -70,7 +70,7 @@ if [ "$cat" == "final" ]; then
   INPUT="$pwd/$out_base/run_sp_Mc_*"
 elif [ "$cat" == "flag" ]; then
   run_dir="run_sp_combined_flag"
-  INPUT="$pwd/$out_base/run_sp_tile_Ma_*"
+  INPUT="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_2"
 else
   run_dir="run_sp_combined_image"
   INPUT="$pwd/$out_base/run_sp_Git_*"
@@ -90,7 +90,7 @@ if [ "$cat" == "final" ]; then
   )
 elif [ "$cat" == "flag" ]; then
   DIRS=(
-	  "mask_runner"
+	  "mask_runner_run_2"
   )
   PATTERNS=(
 	  "pipeline_flag-*"
diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py
index 69a1c3c97..230f2e897 100644
--- a/shapepipe/modules/mask_package/mask.py
+++ b/shapepipe/modules/mask_package/mask.py
@@ -113,6 +113,7 @@ def __init__(
         # Set error flag
         self._err = False
 
+
     def _get_config(self):
         """Get Config.
 
@@ -307,6 +308,20 @@ def make_mask(self):
         Main function to create the mask.
 
         """
+        output_file_name = (
+            f'{self._img_prefix}'
+            + f'{self._outname_base}{self._img_number}.fits'
+        )
+        if (
+            os.path.exists(f"output/run_sp_MaMa_2023-11-21_06-11-21/mask_runner_run_1/output/{output_file_name}")
+            or os.path.exists(f"output/run_sp_MaMa_2023-11-21_06-11-21/mask_runner_run_2/output/{output_file_name}")
+        ):
+            print("MKDEBUG skipping ", output_file_name)
+            return None, None
+        else:
+            print("MKDEBUG processing ", output_file_name)
+
+
         if self._config['MD']['make']:
             self.missing_data()
 
diff --git a/shapepipe/modules/setools_package/setools.py b/shapepipe/modules/setools_package/setools.py
index 78feae3d1..3d4d3eb9b 100644
--- a/shapepipe/modules/setools_package/setools.py
+++ b/shapepipe/modules/setools_package/setools.py
@@ -58,7 +58,10 @@ def __init__(
                 SEx_catalogue=True,
             )
             cat_file.open()
-            self._data = cat_file.get_data()
+            try:
+                self._data = cat_file.get_data()
+            except:
+                raise IOError(f"Could not load catalogue data from {cat}")
             cat_file.close()
 
         else:
diff --git a/shapepipe/modules/sextractor_runner.py b/shapepipe/modules/sextractor_runner.py
index 9e3bac7d3..e65374983 100644
--- a/shapepipe/modules/sextractor_runner.py
+++ b/shapepipe/modules/sextractor_runner.py
@@ -2,7 +2,7 @@
 
 Module runner for ``sextractor``.
 
-:Author: Axel Guinot
+:Author:s Axel Guinot, Martin Kilbinger
 
 """
 

From bc20ab2ba8f3b24b1334d8c6520845ea887a9199 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Dec 2023 09:46:43 +0100
Subject: [PATCH 049/207] canfar curl command: added kind (tile, exp) as option

---
 scripts/sh/curl_canfar_local.sh         | 13 ++++++++-----
 scripts/sh/prepare_tiles_for_final.bash |  2 +-
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index e410c8d30..befb77356 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -1,7 +1,7 @@
 #!/usr/bin/bash
 
 # Usage
-# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.8 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID exp NCORE
+# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.9 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID ind
 
 SSL=~/.ssl/cadcproxy.pem
 NCORE=2
@@ -16,12 +16,15 @@ version=$1
 # command on canfar, e.g. shapepipe/scripts/sh/init_run_exclusive_canfar.sh
 cmd=$2
 
-# Image ID
-ID=$3
+# Kind ("tile" or "exp")
+kind=$3
+
+# Image ID; has to be last argument to work with xargs
+ID=$4
+
 
 # command line arguments
-arg="$ID $NCORE exp"
+arg="$ID $NCORE $kind"
 
-echo
 ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
 echo $ID >> IDs.txt
diff --git a/scripts/sh/prepare_tiles_for_final.bash b/scripts/sh/prepare_tiles_for_final.bash
index c26f8e8c2..8407dd2d8 100755
--- a/scripts/sh/prepare_tiles_for_final.bash
+++ b/scripts/sh/prepare_tiles_for_final.bash
@@ -90,7 +90,7 @@ if [ "$cat" == "final" ]; then
   )
 elif [ "$cat" == "flag" ]; then
   DIRS=(
-	  "mask_runner"
+	  "mask_runner_run_2"
   )
   PATTERNS=(
 	  "pipeline_flag-*"

From 1b4b3bf66c38f1cffd839e39794bff5947493f04 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Dec 2023 17:24:25 +0000
Subject: [PATCH 050/207] curl remote job script init_run_exclusive_canfar:
 command line options properly

---
 example/cfis/config_tile_PiViSmVi_canfar.ini |   2 +-
 scripts/python/link_to_exp_for_tile.py       |  32 ++++--
 scripts/sh/init_run_exclusive_canfar.sh      | 104 ++++++++++++++++---
 scripts/sh/prepare_tiles_for_final.bash      |   4 +-
 4 files changed, 119 insertions(+), 23 deletions(-)

diff --git a/example/cfis/config_tile_PiViSmVi_canfar.ini b/example/cfis/config_tile_PiViSmVi_canfar.ini
index ed9e3d339..71bdc699e 100644
--- a/example/cfis/config_tile_PiViSmVi_canfar.ini
+++ b/example/cfis/config_tile_PiViSmVi_canfar.ini
@@ -183,6 +183,6 @@ PREFIX =
 
 # Additional parameters for path and file pattern corresponding to single-exposure
 # run outputs
-ME_IMAGE_DIR = split_exp_runner, split_exp_runner, split_exp_runner, sextractor_runner
+ME_IMAGE_DIR = last:split_exp_runner, last:split_exp_runner, last:split_exp_runner, all:sextractor_runner
 ME_IMAGE_PATTERN = flag, image, weight, background
 ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite
diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index de18f92e8..e6f93756f 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -165,10 +165,13 @@ def matching_subdirs(base_dir, pattern):
 
     # Find all matching subdirectories
     subdirs = []
-    for entry in os.listdir(base_dir):
-        full_path = os.path.join(base_dir, entry)
-        if os.path.isdir(full_path) and entry.startswith(pattern):
-            subdirs.append(full_path)
+    if os.path.exists(base_dir):
+        for entry in os.listdir(base_dir):
+            full_path = os.path.join(base_dir, entry)
+            if os.path.isdir(full_path) and entry.startswith(pattern):
+                subdirs.append(full_path)
+    else:
+        print(f"Warning: {base_dir} does not exist, continuing...")
 
     # Sort according to creation date
     subdirs.sort(key=os.path.getctime)
@@ -189,6 +192,8 @@ def get_exp_IDs(tile_base_dir, tile_ID, verbose=False):
 
     subdirs = matching_subdirs(tile_out_dir, "run_sp_GitFeGie")
 
+    if len(subdirs) == 0:
+        raise IOError(f"No matching directory '{pattern}' in {tile_out_dir} found")
     if len(subdirs) != 1:
         raise IOError(f"Exactly one matching directory in {tile_out_dir} expected, not {len(subdirs)}")
 
@@ -253,9 +258,24 @@ def create_links_paths(tile_base_dir, tile_ID, paths):
         src = path
         dst = f"{tile_out_dir}/{tail}"
         if os.path.exists(dst):
-            print(f"Warning: {dst} already exists, no link created")
+            src_ex = os.readlink(dst)
+            if src_ex == src:
+                print(f"Warning: {dst} already exists, no link created")
+                continue
+            else:
+                idx = 1
+                dst_orig = dst
+                while True:
+                    dst = f"{dst_orig}_{idx}"
+                    if os.path.exists(dst):
+                        idx += 1
+                    else:
+                        #print("MKDEBUG new ", dst)
+                        #print(f"ln -s {src} {dst}")
+                        os.symlink(src, dst)
+                        break
         else:
-            print(f"ln -s {src} {dst}")
+            #print(f"ln -s {src} {dst}")
             os.symlink(src, dst)
 
 
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 02c218271..292b999a1 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -1,9 +1,74 @@
 #!/bin/bash
 
-echo "start init run exclusive canfar"
+# init_run_exclusive_canfar.sh
+
+# Command line arguments
+## Default values
+job=-1
+exclusive=-1
+n_smp=1
+kind=-1
+
+## Help string
+usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
+\n\nOptions:\n
+   -h\tthis message\n
+   -j, --job JOB\tRUnning JOB, bit-coded\n
+   -e, --exclusive ID\timage ID\n
+   -p, --psf MODEL\n
+    \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
+   -k, --kind KIND\n
+    \timage kind, allowed are 'tile' and 'exp'\n
+   -n, --n_smp N_SMOp\n
+    \tnumber of jobs (SMP mode only), default from original config files\n
+"
+
+## Help if no arguments                                                         
+if [ -z $1 ]; then                                                              
+        echo -ne $usage                                                         
+        exit 1                                                                  
+fi 
+
+## Parse command line                                                           
+while [ $# -gt 0 ]; do                                                          
+  case "$1" in                                                                  
+    -h)                                                                         
+      echo -ne $usage                                                           
+      exit 0                                                                    
+      ;;                                                                        
+    -j|--job)                                                                   
+      job="$2"                                                                  
+      shift                                                                     
+      ;; 
+    -e|--exclusive)                                                             
+      exclusive="$2"                                                            
+      shift                                                                     
+      ;;
+    -n|--n_smp)                                                                 
+      n_smp="$2"                                                                
+      shift                                                                     
+      ;;                                                                        
+  esac                                                                          
+  shift                                                                         
+done
+
+# Check options
+if [ "$job" == "-1" ]; then
+  echo "No job indicated, use option -j"
+  exit 2
+fi
+
+if [ "$exclusive" == "-1" ]; then
+  echo "No image ID indicated, use option -e"
+  exit 3
+fi
 
-#echo init_canfar > ~/init_canfar.log
-#date >> ~/init_canfar.log
+if [ "kind" == "-1" ]; then
+  echo "No image kind indicated, use option -k"
+  exit 4
+fi
+
+echo "start init run exclusive canfar"
 
 . /opt/conda/etc/profile.d/conda.sh
 
@@ -13,14 +78,17 @@ basedir=$HOME/cosmostat/P3_v2/psfex
 cd $basedir
 
 
-ID=$1
-n_SMP=$2
-typ=$3
-echo "ID=$ID n_SMP=$n_SMP type=$typ"
+echo "ID=$ID n_SMP=$n_SMP kind=$kind"
 
-cd ${typ}_runs
+if [ "$kind" == "tile" ]; then
+  link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs
+fi
 
-#mkdir $ID
+cd ${kind}_runs
+
+if [ ! -d "$ID" ]; then
+  mkdir $ID
+fi
 
 cd $ID
 
@@ -28,25 +96,33 @@ if [ ! -d "output" ]; then
   mkdir output
 fi
 
+if [ "1" == "1" ]; then
   cd output
-  #ln -s $basedir/output/log_exp_headers.sqlite
+
+  if [ ! -f log_exp_headers.sqlite ]; then
+    ln -s $basedir/output/log_exp_headers.sqlite
+  fi
+
   # Remove potentially obsolete link
-  rm run_sp_exp_SpMh*
+  #rm run_sp_exp_SpMh*
+  #rm  run_sp_MaMa_*
+
   for dir in $basedir/output/run_sp_*; do
-	  ln -s $dir
+	  ln -sf $dir
   done
-  rm  run_sp_MaMa_*
   ln -s $basedir/output/run_sp_combined_flag
+
   cd ..
   update_runs_log_file.py
 
   pwd
+fi
 
 #export SP_RUN=.
 #export SP_CONFIG=$HOME/shapepipe/example/cfis
 #shapepipe_run -c $SP_CONFIG/config_exp_Pi.ini -e $ID
 
-job_sp_canfar.bash -p psfex -j 32 -e $ID -n $n_SMP
+job_sp_canfar.bash -p psfex -j 64 -e $ID -n $n_SMP
 
 cd $basedir
 
diff --git a/scripts/sh/prepare_tiles_for_final.bash b/scripts/sh/prepare_tiles_for_final.bash
index 454d8fd77..c74b67ea7 100755
--- a/scripts/sh/prepare_tiles_for_final.bash
+++ b/scripts/sh/prepare_tiles_for_final.bash
@@ -70,7 +70,7 @@ if [ "$cat" == "final" ]; then
   INPUT="$pwd/$out_base/run_sp_Mc_*"
 elif [ "$cat" == "flag" ]; then
   run_dir="run_sp_combined_flag"
-  INPUT="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_2"
+  INPUT="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1"
 else
   run_dir="run_sp_combined_image"
   INPUT="$pwd/$out_base/run_sp_Git_*"
@@ -90,7 +90,7 @@ if [ "$cat" == "final" ]; then
   )
 elif [ "$cat" == "flag" ]; then
   DIRS=(
-	  "mask_runner_run_2"
+	  "mask_runner_run_1"
   )
   PATTERNS=(
 	  "pipeline_flag-*"

From bd82f95ae96043c2de6ac577dae311c74a03e133 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 14 Dec 2023 21:35:06 +0100
Subject: [PATCH 051/207] curl local command: added -k kind

---
 scripts/sh/curl_canfar_local.sh | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index befb77356..e7d64aada 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -4,9 +4,9 @@
 # ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.9 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID ind
 
 SSL=~/.ssl/cadcproxy.pem
-NCORE=2
+N_SMP=2
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
-RESOURCES="ram=4&cores=$NCORE"
+RESOURCES="ram=4&cores=$N_SMP"
 IMAGE=images.canfar.net/unions/shapepipe
 NAME=shapepipe
 
@@ -22,9 +22,9 @@ kind=$3
 # Image ID; has to be last argument to work with xargs
 ID=$4
 
-
-# command line arguments
-arg="$ID $NCORE $kind"
+# command line arguments for remote script:
+# collect into string
+arg="-j $JOB -e $ID -n $N_SMP -k $kind"
 
 ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
 echo $ID >> IDs.txt

From 33ea4a18c30cedcdb35bcac5d226bda4b6a0f3b0 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 15 Dec 2023 09:33:55 +0000
Subject: [PATCH 052/207] summary missing ID 32 fixed (?)

---
 scripts/python/summary_run.py | 744 ++++++++++++++++++++++++++++++++++
 1 file changed, 744 insertions(+)
 create mode 100755 scripts/python/summary_run.py

diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
new file mode 100755
index 000000000..35d42b39f
--- /dev/null
+++ b/scripts/python/summary_run.py
@@ -0,0 +1,744 @@
+#!/usr/bin/env python
+
+import sys
+import os
+import re
+
+import logging
+
+from collections import Counter
+
+from tqdm import tqdm
+
+
+def get_IDs_from_file(path):
+    """Get IDs From File.
+
+    Return IDs from text file. Removes letters and replaces
+    dots "." with dashes "-".
+
+    Parameters
+    ----------
+    path: str
+        input file path
+
+    Returns
+    --------
+    list
+        IDs
+
+    """
+    numbers = []
+    with open(path) as f_in:
+        for line in f_in:
+            entry = line.rstrip()
+            number = re.sub("[a-zA-Z]", "", entry)
+            numbers.append(number)
+
+    return numbers
+
+
+def replace_dot_dash(numbers):
+
+    results = [re.sub("\.", "-", number) for number in numbers]
+
+    return results
+
+
+def replace_dash_dot_if_tile(numbers):
+
+    pattern = re.compile(r"(?<!\d{3}-\d{3})-")
+    results = [pattern.sub(".", number) for number in numbers]
+    
+    return results
+
+
+def replace_dot_dash(numbers):
+
+    results = [re.sub("\.", "-", number) for number in numbers]
+
+    return results
+
+
+
+def get_all_exposures(exp_number_file_list, verbose=False):
+    """Get All Exposures.
+
+    Return all exposure names from a list of text files.
+
+    Parameters
+    ----------
+    exp_number_list: list
+        input file names
+
+    """
+    exposures = set()
+    for idx, path in enumerate(exp_number_file_list):
+        exps = get_IDs_from_file(path)
+        exposures.update(exps)
+
+    return list(exposures)
+
+
+def get_all_shdus(exposures, n_CCD):
+    """Get All SHDUs.
+
+    Return all single-exposure single-HDU (CCD) IDs.
+
+    Parameters
+    ----------
+    exposures: list
+        exposure names
+    n_CCD: int
+        number of CCDs per exposure
+
+    Returns
+    --------
+    list
+        single-exposure single-HDU IDs
+
+    """
+    shdus = []
+    for exposure in exposures:
+        for idx_CCD in range(n_CCD):
+            shdus.append(f"{exposure}-{idx_CCD}")
+
+    return shdus
+
+
+def set_as_list(item=None, n=None, default=1):
+    """Set As List.
+
+    Return input as list.
+
+    Parameters
+    -----------
+    item: str, int, or list, optional
+        input item(s); default is None, in which
+        case the return is [1] * n
+    n: int, optional
+        number of list items to return, default is None,
+        in which case the number will be set to 1. If item and
+        n are not None, n has to be equal to len(item)
+    default: int, optional
+        value to return if item is not given;
+        default is 1
+
+    Raises
+    -------
+    IndexError
+        if n != len(item)
+
+    Returns
+    -------
+    list
+        input item(s) as list
+    """
+    my_n = n or 1
+
+    if not item:
+        result = [default] * my_n
+    elif not isinstance(item, list):
+        result = [item] * my_n
+    else:
+        result = item
+        if len(item) != my_n:
+            raise IndexError(f"item has length {len(item)} != {n}")
+
+    return result
+
+
+def check_special(module, paths_in_dir, names_in_dir):
+
+    if module == "setools_runner":
+        inds_special = []
+        for idx in range(len(paths_in_dir)):
+            base_path = paths_in_dir[idx].replace(names_in_dir[idx], "")
+
+            stats_dir = f"{base_path}/../stat"
+            stats_files = os.listdir(stats_dir)
+            if len(stats_files) != 1:
+                raise ValueError(
+                    f"Expected exactly one stats file in {stats_dir}, not"
+                    + f" {len(stats_files)}"
+                )
+
+            stats_path = os.path.join(stats_dir, stats_files[0])
+            with open(stats_path) as f_in:
+                lines = f_in.readlines()
+                for line in lines:
+                    entry = line.rstrip()
+                    m = re.search(line, "Nb stars = (\S*)")
+                    if m:
+                        value = int(m[2])
+                        if value == 0:
+                            inds_special.append(idx)
+                        else:
+                            print(f"b stars = {value}, not special")
+                        break
+
+        print(inds_special)
+        for idx in inds_special:
+            paths_in_dir.pop(idx)
+            names_in_dir.pop(idx)
+
+        return paths_in_dir, names_in_dir, len(inds_special)
+
+
+class job_data(object):
+    """Job Data.
+
+    Class to handle a job.
+
+    Parameters
+    ----------
+    bit: int
+        bit-coded job number
+    run_dir: str or list
+        run directory(ies)
+    modules: list
+        module names
+    key_expected: int or str
+        number of expected output files; if str: will be updated
+        with runtime value
+    n_mult: int or list, optional
+        multiplicity of output files, default `None`, in which
+        case it is set to 1
+    pattern: list, optional
+        if not None, file pattern to match; defafult is `None`
+    output_dir: str, optional
+        output directory, defaul is "./output"
+    output_subdirs: str, optional
+        output subdirectories if not `None`; default is `None`
+    output_subdirs_suffix: str, optional
+        output subdir suffix if not `None`; default is `None`
+    verbose: bool, optional
+        verbose output if True; default is False
+
+    """
+    def __init__(
+        self,
+        bit,
+        run_dir,
+        modules,
+        key_expected,
+        n_mult=None,
+        pattern=None,
+        output_dir="./output",
+        output_subdirs=None,
+        output_subdirs_suffix=None,
+        verbose=False,
+    ):
+        self._bit = bit
+        self._run_dir = set_as_list(item=run_dir, n=len(modules))
+        self._modules = modules
+        self._key_expected = set_as_list(item=key_expected, n=len(modules))
+        self._n_mult = set_as_list(item=n_mult, n=len(modules))
+        self._pattern = set_as_list(item=pattern, n=len(modules), default="")
+        self._output_dir = output_dir
+        self._output_subdirs = output_subdirs or [""]
+        self._output_subdirs_suffix = set_as_list(
+            output_subdirs_suffix, len(modules), default="."
+        )
+        self._verbose = verbose
+
+    def print_intro(self):
+        """Print Intro.
+
+        Print header line for job statistics.
+
+        """
+        logging.info(f" (Job {self._bit})")
+
+    @classmethod
+    def print_stats_header(self):
+        """Print Stats Header.
+
+        Print overall header information for stats output.
+
+        """
+        logging.info(
+            "module                          expected     found   miss_expl"
+            + " missing uniq_miss  fr_found"
+        )
+        logging.info("=" * 50)
+
+    @classmethod
+    def print_stats(
+        self,
+        module,
+        n_expected,
+        n_found,
+        n_missing_explained,
+        n_missing,
+        n_mult,
+    ):
+        """Print Stats.
+
+        Print output file statistics.
+
+        Parameters
+        ----------
+        module: str
+            module name
+        n_expected: int
+            number of expected files
+        n_found: int
+            number of found files
+        n_missing_explained: int
+            number of missing but explained files
+        n_missing: int
+            number of missing files
+        n_mult: int
+            multipicity
+
+        """
+        if n_expected > 0:
+            fraction_found = n_found / n_expected
+        else:
+            fraction_found = 1
+
+        n_missing_per_mult = n_missing / n_mult
+
+        logging.info(
+            f"{module:30s} {n_expected:9d} {n_found:9d}"
+            + f" {n_missing_explained:9d} {n_missing:9d}"
+            + f" {n_missing_per_mult:9.1f} {fraction_found:9.1%}"
+        )
+
+    @classmethod
+    def is_ID_in_str(self, ID, path):
+        if ID in path:
+            return True
+        #if re.sub("\.", "-", ID) in path:
+            #return True
+        #return False
+
+    @classmethod
+    def is_not_in_any(self, ID, list_str):
+        return not any(ID in string for string in list_str)
+
+    @classmethod
+    def get_unique(self, names):
+        n_all = len(names)
+        names_unique = list(set(names))
+        n_unique = len(names_unique)
+
+        if n_all != n_unique:
+            if True:  # self._verbose:
+                logging.warning(
+                    f"{n_all - n_unique} duplicates removed from {n_all} IDs"
+                )
+
+        return names_unique
+
+    def output_missing(
+        self, module, key_expected, names_in_dir, n_mult, par_runtime=None
+    ):
+        output_path = f"missing_job_{self._bit}_{module}.txt"
+
+        list_expected = get_par_runtime(par_runtime, key_expected, kind="list")
+
+        pattern = re.compile(r"\d+[\d-]+")
+        IDs = []
+        for name in names_in_dir:
+            match = pattern.search(name)
+            if match:
+                IDs.append(match.group())
+            else:
+                raise ValueError(f"No ID found in {name}")
+
+        ID_counts = Counter(IDs)
+        missing_IDs = [
+            ID for ID, count in ID_counts.items()
+            if count < n_mult
+        ]
+
+        n_all = len(missing_IDs)
+        missing_IDs_unique = self.get_unique(missing_IDs)
+        n_unique = len(missing_IDs_unique)
+
+        if n_unique > 0:
+            IDs_dot = replace_dash_dot_if_tile(missing_IDs_unique)
+            with open(output_path, "w") as f_out:
+                for ID in IDs_dot:
+                    print(ID, file=f_out)
+
+        return missing_IDs_unique
+
+    def output_missing_job(self, missing_IDs):
+        output_path = f"missing_job_{self._bit}_all.txt"
+
+        missing_IDs_all = set(missing_IDs)
+
+        if len(missing_IDs_all) > 0:
+            with open(output_path, "w") as f_out:
+                for ID in missing_IDs_all:
+                    print(ID, file=f_out)
+        else:
+            logging.warning("no missing IDs in output_missing_job")
+
+    def get_names_in_dir(self, iterable, module, idx):
+
+        # Initialise output file names
+        names_in_dir = []
+        paths_in_dir = []
+
+        # Loop over subdirs
+        for jdx, subdir in enumerate(iterable):
+            base_and_subdir = (
+                f"{self._output_dir}/{subdir}/"
+                + f"{self._output_subdirs_suffix[idx]}"
+            )
+            if os.path.isdir(base_and_subdir):
+
+                matches = []
+
+                # Loop over entries (files and dirs)
+                with os.scandir(base_and_subdir) as entries:
+                    for entry in entries:
+
+                        # Append directory name if matches module
+                        if entry.name.startswith(self._run_dir[idx]):
+                            matches.append(entry)
+
+                    # This entry does not match module -> next
+                    if not matches:
+                        continue
+
+                    # Sort according to creation time
+                    matches_sorted = sorted(
+                        matches,
+                        key=lambda entry: entry.name,
+                    )
+
+                    # Get most recent one
+                    last = matches_sorted[-1]
+
+                    # Get full path
+                    full_path = os.path.join(base_and_subdir, last.name)
+
+                    # Get module output directory
+                    directory = f"{full_path}/{module}/output"
+
+                    # Some modules have special requirements 
+                    if module == "setools_runner":
+                        directory = f"{directory}/rand_split"
+
+                    #if os.path.exists(directory):
+                    try:
+                        with os.scandir(directory) as entries2:
+                            # if entry2.is_file()
+                            files = [
+                                entry2.name
+                                for entry2 in entries2
+                                if entry2.name.startswith(self._pattern[idx])
+                            ]
+                            names_in_dir.extend(files)
+                            paths_in_dir.extend(
+                                [os.path.join(directory, file)
+                                for file in files]
+                            )
+                    except FileNotFoundError:
+                        pass
+                    except Exeption as e:
+                        print(f"Unknown error {e}")
+
+        return names_in_dir, paths_in_dir
+
+    def check_numbers(self, par_runtime=None, indices=None):
+        """Check Numbers.
+
+        Check output file numbers and IDs.
+
+        Parameters
+        ----------
+        par_runtime : dict, optional
+            runtime parameter. default is None
+        indices: list, optional
+            if not None (default), only check modules corresponding
+            to indices
+
+        """
+        # Update subdirs if not already set as list
+        if not isinstance(self._output_subdirs, list):
+            self._output_subdirs = get_par_runtime(
+                par_runtime, self._output_subdirs, kind="list"
+            )
+
+        self._paths_in_dir = {}
+        self._missing_IDs_unique = []
+
+        n_missing_job = 0
+
+        # Loop over modules
+        for idx, module in enumerate(self._modules):
+            if indices is not None and idx not in indices:
+                continue
+
+            # Look over subdirs
+            iterable = self._output_subdirs
+            if len(iterable) > 1 and self._verbose:
+                iterable = tqdm(iterable, desc="subdirs", leave=True)
+
+            # Get output file names and paths
+            names_in_dir, paths_in_dir = self.get_names_in_dir(
+                iterable,
+                module,
+                idx,
+            )
+
+            self._paths_in_dir[idx] = paths_in_dir
+
+            # If expected is string: Update parameter with runtime value
+            # and set as integer
+            if isinstance(self._key_expected[idx], str):
+                n_expected_base = get_par_runtime(
+                    par_runtime, self._key_expected[idx], kind="n"
+                )
+            else:
+                n_expected_base = self._key_expected[idx]
+
+            # Get some numbers
+            n_found = len(names_in_dir)
+            n_expected = n_expected_base * self._n_mult[idx]
+            n_missing = n_expected - n_found
+
+            n_missing_explained = 0
+            if False and n_missing > 0:
+                if module == "setools_runner":
+                    (
+                        paths_in_dir,
+                        names_in_dir,
+                        n_missing_explained,
+                    ) = check_special(module, paths_in_dir, names_in_dir)
+
+                n_missing = n_missing - n_missing_explained
+
+            # Print statistics
+            self.print_stats(
+                module,
+                n_expected,
+                n_found,
+                n_missing_explained,
+                n_missing,
+                self._n_mult[idx],
+            )
+
+            # Write missing IDs for module to file
+            if n_missing > 0:
+                missing_IDs_unique = self.output_missing(
+                    module,
+                    self._key_expected[idx],
+                    names_in_dir,
+                    self._n_mult[idx],
+                    par_runtime=par_runtime,
+                )
+                n_missing_job += n_missing
+                self._missing_IDs_unique.extend(missing_IDs_unique)
+
+        # Write missing IDs for entire job to file
+        if n_missing_job > 0:
+            self.output_missing_job(self._missing_IDs_unique)
+
+
+def get_par_runtime(par_runtime, key, kind="n"):
+    """Get Par RunTime.
+
+    Return runtime parameter value.
+
+    Parameters
+    ----------
+    par_runtime: dict
+        runtime parameter
+    key: str
+        key
+
+    """
+    combined_key = f"{kind}_{key}"
+    return par_runtime[combined_key]
+
+
+def print_par_runtime(par_runtime, verbose=True):
+    # Print runtime parameter values
+    if verbose:
+        logging.info("")
+        logging.info("===========")
+        logging.info("par_runtime")
+        logging.info("-----------")
+        for key, value in par_runtime.items():
+            if not key.startswith("list"):
+                logging.info(f"{key:30s} {value:6d}")
+            else:
+                logging.info(f"{key:29s} [{len(value):6d}]")
+        logging.info("===========")
+        logging.info("")
+
+
+def main(argv=None):
+    # Set default parameters
+    # p_def = params_default()
+
+    # Command line options
+    # options, args = parse_options(p_def)
+
+    # if check_options(options) is False:
+    # return 1
+
+    # param = update_param(p_def, options)
+
+    verbose = True
+    log_file_name = "summary_log.txt"
+    handlers = [logging.FileHandler(log_file_name), logging.StreamHandler()]
+    logging.basicConfig(
+        level=logging.INFO, format="%(message)s", handlers=handlers
+    )
+
+    main_dir = "."
+    retrieve = "vos"
+    tile_ID_path = f"{main_dir}/tile_numbers.txt"
+
+    # tile IDs with dots
+    list_tile_IDs_dot = get_IDs_from_file(tile_ID_path)
+
+    # tile IDs with dashes
+    list_tile_IDs = replace_dot_dash(list_tile_IDs_dot)
+    n_tile_IDs = len(list_tile_IDs)
+    n_CCD = 40
+
+    par_runtime = {}
+
+    par_runtime["n_tile_IDs"] = n_tile_IDs
+    par_runtime["list_tile_IDs"] = list_tile_IDs
+
+    jobs = {}
+
+    if retrieve == "vos":
+        n_link = 2
+    else:
+        n_link = 1
+
+    jobs["1"] = job_data(
+        1,
+        "run_sp_GitFeGie_",
+        [
+            "get_images_runner_run_1",
+            "find_exposures_runner",
+            "get_images_runner_run_2",
+        ],
+        ["tile_IDs", "tile_IDs", "exposures"],
+        pattern=["CFIS_", "", ""],
+        n_mult=[1 * n_link, 1, 3],
+        output_dir=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    jobs["2"] = job_data(
+        2,
+        ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh_2023-12"],
+        ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
+        ["tile_IDs", 0, "3*n_shdus+n_exposures"],
+        n_mult=[1, 1, 1],
+        output_dir=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    # TODO: rename run dirs to run_sp_tile_Ma, run_sp_exp_Ma
+    jobs["4"] = job_data(
+        4,
+        "run_sp_combined_flag",
+        ["mask_runner_run_1"],
+        ["tile_IDs"],
+        output_dir=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    jobs["8"] = job_data(
+        8,
+        "run_sp_combined_flag",
+        ["mask_runner_run_2"],
+        ["shdus"],
+        output_dir=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    jobs["16"] = job_data(
+        16,
+        "run_sp_tile_Sx",
+        ["sextractor_runner"],
+        ["tile_IDs"],
+        n_mult=2,
+        output_dir=f"{main_dir}/tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        verbose=verbose,
+    )
+
+    # TODO setools_runner output/mask
+    jobs["32"] = job_data(
+        32,
+        [
+            "run_sp_exp_SxSePsf",
+            "run_sp_exp_SxSePsf",
+            "run_sp_exp_SxSePsf",
+        ],  # "run_sp_exp_Pi"],
+        [
+            "sextractor_runner",
+            "setools_runner",
+            "psfex_runner",
+        ],  # "psfex_interp_runner"],
+        "shdus",
+        n_mult=[2, 2, 2],  # 1],
+        output_dir=f"{main_dir}/exp_runs",
+        output_subdirs="shdus",
+        output_subdirs_suffix="output",
+        verbose=verbose,
+    )
+
+    jobs["64"] = job_data(
+        "64",
+        "run_sp_tile_PsViSmVi",
+        [
+            "psfex_interp_runner",
+            "vignetmaker_runner_run_1",
+            "spread_model_runner",
+            "vignetmaker_runner_run_2",
+        ],
+        "tile_IDs",
+        n_mult=[1, 1, 1, 4],
+        output_dir=f"{main_dir}/tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        verbose=verbose,
+    )
+
+    job_data.print_stats_header()
+
+    for key in "1":
+        job = jobs[key]
+        job.print_intro()
+        job.check_numbers(par_runtime=par_runtime, indices=[0, 1])
+
+        all_exposures = get_all_exposures(job._paths_in_dir[1], verbose=True)
+        par_runtime["n_exposures"] = len(all_exposures)
+
+        job.check_numbers(par_runtime, indices=[2])
+
+    # Update runtime parameter
+    par_runtime["n_shdus"] = get_par_runtime(par_runtime, "exposures") * n_CCD
+    par_runtime["n_3*n_shdus+n_exposures"] = 3 * get_par_runtime(
+        par_runtime, "shdus"
+    ) + get_par_runtime(par_runtime, "exposures")
+    par_runtime["list_shdus"] = get_all_shdus(all_exposures, n_CCD)
+
+    print_par_runtime(par_runtime, verbose=verbose)
+
+    #for key in ["2", "4", "8", "16", "32", "64"]:
+    for key in ["32", "64"]:
+        job = jobs[key]
+        job.print_intro()
+        job.check_numbers(par_runtime=par_runtime)
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))

From ba17ebcd515131e5e19895cab56bf52135bda15d Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 15 Dec 2023 10:37:55 +0100
Subject: [PATCH 053/207] curl canfar local script added job, kind

---
 scripts/sh/curl_canfar_local.sh | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index e7d64aada..c0add5152 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -1,7 +1,7 @@
 #!/usr/bin/bash
 
 # Usage
-# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.9 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID ind
+# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.9 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID kind job
 
 SSL=~/.ssl/cadcproxy.pem
 N_SMP=2
@@ -19,12 +19,16 @@ cmd=$2
 # Kind ("tile" or "exp")
 kind=$3
 
+# Job number
+job=$4
+
 # Image ID; has to be last argument to work with xargs
-ID=$4
+ID=$5
 
 # command line arguments for remote script:
 # collect into string
-arg="-j $JOB -e $ID -n $N_SMP -k $kind"
+arg="-j $job -e $ID -n $N_SMP -k $kind"
 
+echo curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"
 ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
 echo $ID >> IDs.txt

From 9ac9dc1831faf827b92f4a3e5b325e79467e1d0d Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 17 Dec 2023 12:50:08 +0000
Subject: [PATCH 054/207] SP ngmxix (job 128) running on canfar

---
 example/cfis/config_tile_Ng_template.ini |  24 +---
 scripts/python/get_number_objects.py     |  17 ++-
 scripts/python/link_to_exp_for_tile.py   |  29 ++--
 scripts/python/summary_run.py            | 160 +++++++++++++++--------
 scripts/sh/init_run_exclusive_canfar.sh  |  99 +++++++++-----
 scripts/sh/job_sp_canfar.bash            |   4 +-
 6 files changed, 201 insertions(+), 132 deletions(-)

diff --git a/example/cfis/config_tile_Ng_template.ini b/example/cfis/config_tile_Ng_template.ini
index f9d733d71..5ad7aaf58 100644
--- a/example/cfis/config_tile_Ng_template.ini
+++ b/example/cfis/config_tile_Ng_template.ini
@@ -55,7 +55,7 @@ TIMEOUT = 96:00:00
 # Model-fitting shapes with ngmix
 [NGMIX_RUNNER]
 
-INPUT_DIR = last:sextractor_runner_run_1,last:X_interp_runner,last:vignetmaker_runner_run_2
+INPUT_DIR = run_sp_tile_Sx:sextractor_runner,last:X_interp_runner,last:vignetmaker_runner_run_2
 
 FILE_PATTERN = sexcat, image_vignet, background_vignet, galaxy_psf, weight_vignet, flag_vignet
 
@@ -75,25 +75,3 @@ PIXEL_SCALE = 0.186
 
 ID_OBJ_MIN = X
 ID_OBJ_MAX = X
-
-
-# Moment-based (KSB) shapes with galsim
-[GALSIM_SHAPES_V2_RUNNER]
-
-INPUT_DIR = last:sextractor_runner_run_2, last:vignetmaker_runner_run_1, last:X_interp_runner,last:vignetmaker_runner_run_2
-
-FILE_PATTERN = sexcat, weight_vignet, image_vignet, background_vignet, galaxy_psf, weight_vignet, flag_vignet
-
-FILE_EXT = .fits, .fits, .sqlite, .sqlite, .sqlite, .sqlite, .sqlite
-
-# NUMBERING_SCHEME (optional) string with numbering pattern for input files
-NUMBERING_SCHEME = -000-000
-
-# Multi-epoch mode: Path to file with single-exposure WCS header information
-LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite
-
-# Magnitude zero-point
-MAG_ZP = 30.0
-
-ID_OBJ_MIN = X
-ID_OBJ_MAX = X
diff --git a/scripts/python/get_number_objects.py b/scripts/python/get_number_objects.py
index 67cdb294d..0f3ae41b1 100755
--- a/scripts/python/get_number_objects.py
+++ b/scripts/python/get_number_objects.py
@@ -17,7 +17,7 @@
 from optparse import OptionParser                                               
 from astropy.io import fits
 
-from shapepipe.pipeline.run_log import get_last_dir                             
+from shapepipe.pipeline.run_log import get_last_dir, get_all_dirs
 from shapepipe.utilities import cfis                                            
 
 
@@ -281,10 +281,21 @@ def main(argv=None):
     # Save command line arguments to log file
     f_log = cfis.log_command(argv, close_no_return=False)
 
-    module = 'sextractor_runner_run_1'
     pattern = 'sexcat'
     run_log_file = 'output/log_run_sp.txt'
-    last_dir = get_last_dir(run_log_file, module)
+
+    # For v1
+    #module = 'sextractor_runner_run_1'
+
+    # For v2
+    module = "sextractor_runner"
+    all_dir = get_all_dirs(run_log_file, module)
+    paths = []
+    for path in all_dir:
+        if "run_sp_tile_Sx" in path:
+            paths.append(path)
+    paths = sorted(paths)
+    last_dir = paths[-1]
 
     file_list = glob.glob(f'{last_dir}/{pattern}*.fits')
     if len(file_list) == 0:
diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index d750b97b7..f6e01021b 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -218,6 +218,8 @@ def get_exp_IDs(tile_base_dir, tile_ID, verbose=False):
             ID = re.sub("[a-zA-Z]", "", name) 
             exp_IDs.append(ID)
 
+    if verbose:
+        print("Exposures: ", exp_IDs)
     return exp_IDs
 
 
@@ -237,6 +239,7 @@ def get_paths(exp_base_dir, exp_shdu_IDs, pattern):
     number = {}
     paths = []
     for exp_shdu_ID in exp_shdu_IDs:
+
         name = f"{exp_base_dir}/{exp_shdu_ID}/output"
         path = os.path.abspath(name)
         subdirs = matching_subdirs(path, pattern)
@@ -253,14 +256,18 @@ def get_paths(exp_base_dir, exp_shdu_IDs, pattern):
                 + f"  not {n_subdirs}"
             )
             print(msg)
+            # More than one match: sort according to name = creation time 
+            subdirs = sorted(subdirs)
             if n_subdirs == 0:
                 continue
-        paths.append(f"{subdirs[0]}")
+
+        # Append matching subdir; if more than one append newest
+        paths.append(f"{subdirs[-1]}")
 
     return paths, number
 
 
-def create_links_paths(tile_base_dir, tile_ID, paths):
+def create_links_paths(tile_base_dir, tile_ID, paths, verbose=False):
 
     tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID)
 
@@ -272,8 +279,9 @@ def create_links_paths(tile_base_dir, tile_ID, paths):
         if os.path.exists(dst):
             src_existing = os.readlink(dst)
             if src_existing == src:
-                print(src, dst)
-                    #f"Warning: {src} <- {dst} already exists, no link created"
+                if verbose:
+                    #print("link {src} <- {dst}")
+                    f"Warning: {src} <- {dst} already exists, no link created"
                 #)
                 continue
             else:
@@ -284,12 +292,13 @@ def create_links_paths(tile_base_dir, tile_ID, paths):
                     if os.path.exists(dst):
                         idx += 1
                     else:
-                        #print("MKDEBUG new ", dst)
-                        #print(f"ln -s {src} {dst}")
+                        if verbose:
+                            print(f"link {src} <- {dst}")
                         os.symlink(src, dst)
                         break
         else:
-            #print(f"ln -s {src} {dst}")
+            if verbose:
+                print(f"link {src} <- {dst}")
             os.symlink(src, dst)
 
 
@@ -319,12 +328,8 @@ def main(argv=None):
     for pattern in patterns:
         paths, number = get_paths(exp_base_dir, exp_shdu_IDs, pattern)
         print(number)
-        if "2159307-31" in paths:
-            print("found")
-        else:
-            print("not found")
 
-        create_links_paths(tile_base_dir, tile_ID, paths)
+        create_links_paths(tile_base_dir, tile_ID, paths, verbose=verbose)
 
 
     return 0
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index aedf090f6..e8cc4f0d5 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -206,12 +206,13 @@ class job_data(object):
         case it is set to 1
     pattern: list, optional
         if not None, file pattern to match; defafult is `None`
-    output_dir: str, optional
-        output directory, defaul is "./output"
+    path_lef: str, optional
+        left (first) part of output directory, defaul is "./output"
     output_subdirs: str, optional
         output subdirectories if not `None`; default is `None`
-    output_subdirs_suffix: str, optional
-        output subdir suffix if not `None`; default is `None`
+    path_right: str, optional
+        right (last) part of output subdir suffix if not `None`;
+        default is `None`
     verbose: bool, optional
         verbose output if True; default is False
 
@@ -224,9 +225,9 @@ def __init__(
         key_expected,
         n_mult=None,
         pattern=None,
-        output_dir="./output",
+        path_left="./output",
         output_subdirs=None,
-        output_subdirs_suffix=None,
+        path_right=None,
         verbose=False,
     ):
         self._bit = bit
@@ -235,10 +236,10 @@ def __init__(
         self._key_expected = set_as_list(item=key_expected, n=len(modules))
         self._n_mult = set_as_list(item=n_mult, n=len(modules))
         self._pattern = set_as_list(item=pattern, n=len(modules), default="")
-        self._output_dir = output_dir
+        self._path_left = path_left
         self._output_subdirs = output_subdirs or [""]
-        self._output_subdirs_suffix = set_as_list(
-            output_subdirs_suffix, len(modules), default="."
+        self._path_right = set_as_list(
+            path_right, len(modules), default="."
         )
         self._verbose = verbose
 
@@ -333,7 +334,13 @@ def get_unique(self, names):
         return names_unique
 
     def output_missing(
-        self, module, key_expected, names_in_dir, paths_in_dir, n_mult, par_runtime=None
+        self,
+        module,
+        key_expected,
+        names_in_dir,
+        paths_in_dir,
+        n_mult,
+        par_runtime=None,
     ):
         output_path = f"missing_job_{self._bit}_{module}.txt"
 
@@ -348,9 +355,6 @@ def output_missing(
             match = pattern.search(name)
             if match:
                 IDs.append(match.group())
-
-                if match.group() == '2079613-1':
-                    print(name, path)
             else:
                 raise ValueError(f"No ID found in {name}")
 
@@ -358,9 +362,6 @@ def output_missing(
         ## Count occurences
         ID_counts = Counter(IDs)
 
-        #import pdb
-        #pdb.set_trace()
-
         ## Add to missing if ocurence less than n_mult
         missing_IDs = []
         for ID in list_expected:
@@ -379,10 +380,10 @@ def output_missing(
 
         return missing_IDs_unique
 
-    def output_missing_job(self, missing_IDs):
+    def output_missing_job(self):
         output_path = f"missing_job_{self._bit}_all.txt"
 
-        missing_IDs_all = set(missing_IDs)
+        missing_IDs_all = set(self._missing_IDs_job)
 
         if len(missing_IDs_all) > 0:
             with open(output_path, "w") as f_out:
@@ -391,6 +392,42 @@ def output_missing_job(self, missing_IDs):
         else:
             logging.warning("no missing IDs in output_missing_job")
 
+    @classmethod
+    def get_last_full_path(self, base_and_subdir, matches):
+        """Get Last Full Path
+
+        Return full path of last file in list.
+
+        """
+        # Sort according to creation time
+        matches_sorted = sorted(
+            matches,
+            key=lambda entry: entry.name,
+        )
+
+        # Get most recent one
+        last = matches_sorted[-1]
+
+        # Get full path
+        full_path = os.path.join(base_and_subdir, last.name)
+
+        return full_path
+
+    @classmethod
+    def get_module_output_dir(self, full_path, module):
+        """Get Module Output Dir.
+
+        Return output directory name for given module.
+
+        """
+        directory = f"{full_path}/{module}/output"
+
+        # Some modules have special requirements 
+        if module == "setools_runner":
+            directory = f"{directory}/rand_split"
+
+        return directory
+
     def get_names_in_dir(self, iterable, module, idx):
 
         # Initialise output file names
@@ -400,8 +437,8 @@ def get_names_in_dir(self, iterable, module, idx):
         # Loop over subdirs
         for jdx, subdir in enumerate(iterable):
             base_and_subdir = (
-                f"{self._output_dir}/{subdir}/"
-                + f"{self._output_subdirs_suffix[idx]}"
+                f"{self._path_left}/{subdir}/"
+                + f"{self._path_right[idx]}"
             )
             if os.path.isdir(base_and_subdir):
 
@@ -419,25 +456,16 @@ def get_names_in_dir(self, iterable, module, idx):
                     if not matches:
                         continue
 
-                    # Sort according to creation time
-                    matches_sorted = sorted(
-                        matches,
-                        key=lambda entry: entry.name,
+                    full_path = self.get_last_full_path(
+                        base_and_subdir, matches
                     )
 
-                    # Get most recent one
-                    last = matches_sorted[-1]
-
-                    # Get full path
-                    full_path = os.path.join(base_and_subdir, last.name)
-
                     # Get module output directory
-                    directory = f"{full_path}/{module}/output"
-
-                    # Some modules have special requirements 
-                    if module == "setools_runner":
-                        directory = f"{directory}/rand_split"
+                    directory = self.get_module_output_dir(
+                        full_path, module
+                    )
 
+                    # Look over files
                     # os.path.whether exists is twice faster than try/except
                     if os.path.exists(directory):
                         with os.scandir(directory) as entries2:
@@ -446,6 +474,8 @@ def get_names_in_dir(self, iterable, module, idx):
                                 for entry2 in entries2
                                 if entry2.name.startswith(self._pattern[idx])
                             ]
+
+                            # Append matching files
                             names_in_dir.extend(files)
                             paths_in_dir.extend(
                                 [os.path.join(directory, file)
@@ -454,6 +484,17 @@ def get_names_in_dir(self, iterable, module, idx):
 
         return names_in_dir, paths_in_dir
 
+    def update_subdirs(self, par_runtime):
+        """Update Subdirs.
+
+        Update subdir names with runtime information if required.
+
+        """
+        if not isinstance(self._output_subdirs, list):
+            self._output_subdirs = get_par_runtime(
+                par_runtime, self._output_subdirs, kind="list"
+            )
+
     def check_numbers(self, par_runtime=None, indices=None):
         """Check Numbers.
 
@@ -469,14 +510,11 @@ def check_numbers(self, par_runtime=None, indices=None):
 
         """
         # Update subdirs if not already set as list
-        if not isinstance(self._output_subdirs, list):
-            self._output_subdirs = get_par_runtime(
-                par_runtime, self._output_subdirs, kind="list"
-            )
+        self.update_subdirs(par_runtime)
 
+        # Initialise variables
         self._paths_in_dir = {}
-        self._missing_IDs_unique = []
-
+        self._missing_IDs_job = []
         n_missing_job = 0
 
         # Loop over modules
@@ -513,8 +551,8 @@ def check_numbers(self, par_runtime=None, indices=None):
             n_missing = n_expected - n_found
 
             n_missing_explained = 0
-            if False and n_missing > 0:
-                if module == "setools_runner":
+            if n_missing > 0:
+                if False and module == "setools_runner":
                     (
                         paths_in_dir,
                         names_in_dir,
@@ -535,7 +573,7 @@ def check_numbers(self, par_runtime=None, indices=None):
 
             # Write missing IDs for module to file
             if n_missing > 0:
-                missing_IDs_unique = self.output_missing(
+                missing_IDs = self.output_missing(
                     module,
                     self._key_expected[idx],
                     names_in_dir,
@@ -544,11 +582,11 @@ def check_numbers(self, par_runtime=None, indices=None):
                     par_runtime=par_runtime,
                 )
                 n_missing_job += n_missing
-                self._missing_IDs_unique.extend(missing_IDs_unique)
+                self._missing_IDs_job.extend(missing_IDs)
 
         # Write missing IDs for entire job to file
         if n_missing_job > 0:
-            self.output_missing_job(self._missing_IDs_unique)
+            self.output_missing_job()
 
 
 def get_par_runtime(par_runtime, key, kind="n"):
@@ -638,7 +676,7 @@ def main(argv=None):
         ["tile_IDs", "tile_IDs", "exposures"],
         pattern=["CFIS_", "", ""],
         n_mult=[1 * n_link, 1, 3],
-        output_dir=f"{main_dir}/output",
+        path_left=f"{main_dir}/output",
         verbose=verbose,
     )
 
@@ -648,7 +686,7 @@ def main(argv=None):
         ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
         ["tile_IDs", 0, "3*n_shdus+n_exposures"],
         n_mult=[1, 1, 1],
-        output_dir=f"{main_dir}/output",
+        path_left=f"{main_dir}/output",
         verbose=verbose,
     )
 
@@ -657,7 +695,7 @@ def main(argv=None):
         "run_sp_combined_flag",
         ["mask_runner_run_1"],
         ["tile_IDs"],
-        output_dir=f"{main_dir}/output",
+        path_left=f"{main_dir}/output",
         verbose=verbose,
     )
 
@@ -666,7 +704,7 @@ def main(argv=None):
         "run_sp_combined_flag",
         ["mask_runner_run_2"],
         ["shdus"],
-        output_dir=f"{main_dir}/output",
+        path_left=f"{main_dir}/output",
         verbose=verbose,
     )
 
@@ -676,7 +714,7 @@ def main(argv=None):
         ["sextractor_runner"],
         ["tile_IDs"],
         n_mult=2,
-        output_dir=f"{main_dir}/tile_runs",
+        path_left=f"{main_dir}/tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
         verbose=verbose,
     )
@@ -696,9 +734,9 @@ def main(argv=None):
         ],  # "psfex_interp_runner"],
         "shdus",
         n_mult=[2, 2, 2],  # 1],
-        output_dir=f"{main_dir}/exp_runs",
+        path_left=f"{main_dir}/exp_runs",
         output_subdirs="shdus",
-        output_subdirs_suffix="output",
+        path_right="output",
         verbose=verbose,
     )
 
@@ -713,7 +751,17 @@ def main(argv=None):
         ],
         "tile_IDs",
         n_mult=[1, 1, 1, 4],
-        output_dir=f"{main_dir}/tile_runs",
+        path_left=f"{main_dir}/tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        verbose=verbose,
+    )
+
+    jobs["128"] = job_data(
+        "128",
+        "run_sp_tile_ngmix_Ng1u",
+        ["ngmix_runner"],
+        "tile_IDs",
+        path_left=f"{main_dir}/tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
         verbose=verbose,
     )
@@ -739,8 +787,8 @@ def main(argv=None):
 
     print_par_runtime(par_runtime, verbose=verbose)
 
-    #for key in ["2", "4", "8", "16", "32", "64"]:
-    for key in ["32", "64"]:
+    for key in ["2", "4", "8", "16", "32", "64", "128"]:
+    #for key in ["128"]:
         job = jobs[key]
         job.print_intro()
         job.check_numbers(par_runtime=par_runtime)
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 6b8903710..ff8c6d50e 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -6,8 +6,9 @@
 ## Default values
 job=-1
 ID=-1
-n_SMP=1
+N_SMP=1
 kind=-1
+dry_run=0
 
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
@@ -20,8 +21,10 @@ usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
     \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
    -k, --kind KIND\n
     \timage kind, allowed are 'tile' and 'exp'\n
-   -n, --n_SMP N_SMOp\n
+   -N, --N_SMP N_SMOp\n
     \tnumber of jobs (SMP mode only), default from original config files\n
+   -n, --dry_run\n
+    \tdry run, no actuall processing\n
 "
 
 ## Help if no arguments                                                         
@@ -45,7 +48,7 @@ while [ $# -gt 0 ]; do
       ID="$2"                                                            
       shift                                                                     
       ;;
-    -n|--n_SMP)                                                                 
+    -N|--N_SMP)                                                                 
       n_SMP="$2"                                                                
       shift                                                                     
       ;;                                                                        
@@ -53,6 +56,9 @@ while [ $# -gt 0 ]; do
       kind="$2"                                                                
       shift                                                                     
       ;;                                                                        
+    -n|--dry_run)
+      dry_run=1
+      ;;
   esac                                                                          
   shift                                                                         
 done
@@ -75,6 +81,10 @@ fi
 
 echo "start init run exclusive canfar"
 
+if [ "$dry_run" == 1 ]; then
+  echo "in dry run mode"
+fi
+
 . /opt/conda/etc/profile.d/conda.sh
 
 conda activate shapepipe
@@ -83,47 +93,59 @@ basedir=$HOME/cosmostat/P3_v2/psfex
 cd $basedir
 
 
-echo "ID=$ID n_SMP=$n_SMP kind=$kind"
+if [ "$dry_run" == "0" ]; then
 
-if [ "$kind" == "tile" ]; then
-  rm -rf tile_runs/$ID/output/run_exp_SxSePsf*
-  link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs
-fi
+  if [ "$kind" == "tile" ]; then
+    rm -rf tile_runs/$ID/output/run_exp_SxSePsf*
+    link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs
+  fi
 
-cd ${kind}_runs
+  cd ${kind}_runs
 
-if [ ! -d "$ID" ]; then
-  mkdir $ID
-fi
+  if [ ! -d "$ID" ]; then
+    mkdir $ID
+  fi
 
-cd $ID
+  cd $ID
+  pwd
 
-if [ ! -d "output" ]; then
-  mkdir output
-fi
+  if [ ! -d "output" ]; then
+    mkdir output
+  fi
 
-cd output
+  cd output
 
-if [ ! -f log_exp_headers.sqlite ]; then
-  ln -s $basedir/output/log_exp_headers.sqlite
-fi
+  if [ ! -f log_exp_headers.sqlite ]; then
+    ln -s $basedir/output/log_exp_headers.sqlite
+  fi
 
-# Remove potentially obsolete link
-#rm run_sp_exp_SpMh*
-#rm  run_sp_MaMa_*
+  # Remove potentially obsolete link
+  #rm run_sp_exp_SpMh*
+  #rm  run_sp_MaMa_*
 
-for dir in $basedir/output/run_sp_*; do
- ln -sf $dir
-done
-if [ ! -e run_sp_combined_flag ]; then
-  ln -s $basedir/output/run_sp_combined_flag
-fi
+  for dir in $basedir/output/run_sp_*; do
+  ln -sf $dir
+  done
+  if [ ! -e run_sp_combined_flag ]; then
+    ln -s $basedir/output/run_sp_combined_flag
+  fi
+
+  # Remove unfinished ngmix dirs
+  if [ -e "run_sp_tile_ngmix_Ng1u/ngmix_runner" ]; then
+    echo "previous empty ngmix run found, removing"
+    n_out=`ls -rlt run_sp_tile_ngmix_Ng7u/ngmix_runner/output | wc -l`
+    if [ "$n_out" == "1" ]; then
+      rm -rf run_sp_tile_ngmix_Ng*u
+    fi
+  fi
 
-cd ..
-update_runs_log_file.py
+  cd ..
+  update_runs_log_file.py
 
-echo -n "pwd: "
-pwd
+  echo -n "pwd: "
+  pwd
+
+fi
 
 #export SP_RUN=.
 #export SP_CONFIG=$HOME/shapepipe/example/cfis
@@ -132,10 +154,15 @@ pwd
 echo -n "environment: "
 echo $CONDA_PREFIX
 
-cmd="job_sp_canfar.bash -p psfex -j $job -e $ID -n $n_SMP"
-echo "Running commnd $cmd ..."
+cmd="job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP"
+echo -n "Running commnd '$cmd' ..."
 
-$cmd
+if [ "$dry_run" == 1 ]; then
+  echo " dry run"
+else
+  echo
+  $cmd
+fi
 
 cd $basedir
 
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 78bcfc58f..97280f374 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -55,8 +55,8 @@ usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID]
    -n, --n_smp N_SMP\n
    \tnumber of jobs (SMP mode only), default from original config files\n
    --nsh_step NSTEP\n
-   --nsh_jobs NJOB\n
    \tnumber of shape measurement parallel jobs, default=$nsh_jobs\n
+   --nsh_jobs NJOB\n
    \tnumber of objects per parallel shape module call, \n
    \tdefault: optimal number is computed\n
    --nsh_max NMAX\n
@@ -432,7 +432,7 @@ if [[ $do_job != 0 ]]; then
   ### Prepare config files
   n_min=0
   if [[ $nsh_step == -1 ]]; then
-    n_obj=`get_number_objects.py`
+    n_obj=`get_number_objects`
     nsh_step=`echo "$(($n_obj/$nsh_jobs))"`
   fi
 

From 1d25a8b0a1c8ad456547b875918260953f644575 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 17 Dec 2023 13:51:37 +0100
Subject: [PATCH 055/207] curl canfar local script updated

---
 scripts/sh/curl_canfar_local.sh | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index e410c8d30..9481adc7c 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -23,5 +23,8 @@ ID=$3
 arg="$ID $NCORE exp"
 
 echo
-ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
+curl_cmd="curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d kcmd=$cmd\" --data-urlencode \"args=$arg\""
+echo $curl_cmd
+ID=`$curl_cmd`
+#ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
 echo $ID >> IDs.txt

From ca6b602b754bb772738cf3aa1e199875e8bb341e Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 19 Dec 2023 10:12:56 +0100
Subject: [PATCH 056/207] curl scripts updated

---
 scripts/sh/curl_canfar_local.sh         | 120 ++++++++++++++++++++----
 scripts/sh/curl_canfar_monitor_local.sh |   4 +-
 scripts/sh/init_run_exclusive_canfar.sh |   5 +-
 scripts/sh/job_curl_canfar_local.sh     |  16 ++++
 4 files changed, 126 insertions(+), 19 deletions(-)
 create mode 100644 scripts/sh/job_curl_canfar_local.sh

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index c0add5152..3ec61555d 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -3,32 +3,120 @@
 # Usage
 # ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.9 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID kind job
 
+# Command line arguments
+## Default values
 SSL=~/.ssl/cadcproxy.pem
-N_SMP=2
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
-RESOURCES="ram=4&cores=$N_SMP"
 IMAGE=images.canfar.net/unions/shapepipe
 NAME=shapepipe
 
-# version of image on canfar, e.g. 0:7, 0:8
-version=$1
+job=-1
+ID=-1
+N_SMP=1
+kind=-1
+version=0.9
+cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
+dry_run=0
+
+# TODO psf
 
-# command on canfar, e.g. shapepipe/scripts/sh/init_run_exclusive_canfar.sh
-cmd=$2
+## Help string
+usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
+\n\nOptions:\n
+   -h\tthis message\n
+   -j, --job JOB\tRUnning JOB, bit-coded\n
+   -e, --exclusive ID
+    \timage ID\n
+   -p, --psf MODEL\n
+    \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
+   -k, --kind KIND\n
+    \timage kind, allowed are 'tile' and 'exp'\n
+   -N, --N_SMP N_SMOp\n
+    \tnumber of jobs (SMP mode only), default from original config files\n
+   -V, --version\n
+    \tversion of docker image, default='$version'\n
+   -C, --command_remote\n
+    \tremote command to run on canfar, default='$cmd_remote'\n
+   -n, --dry_run LEVEL\n
+    \tdry run, from LEVEL=2 (no processing) to 0 (full run)\n
+"
 
-# Kind ("tile" or "exp")
-kind=$3
+## Help if no arguments
+if [ -z $1 ]; then
+        echo -ne $usage
+        exit 1
+fi
 
-# Job number
-job=$4
+## Parse command line
+while [ $# -gt 0 ]; do
+  case "$1" in
+    -h)
+      echo -ne $usage
+      exit 0
+      ;;
+    -j|--job)
+      job="$2"
+      shift
+      ;;
+    -e|--exclusive)
+      ID="$2"
+      shift
+      ;;
+    -N|--N_SMP)
+      n_SMP="$2"
+      shift
+      ;;
+    -k|--kind)
+      kind="$2"
+      shift
+      ;;
+    -n|--dry_run)
+      dry_run="$2"
+      shift
+      ;;
+  esac
+  shift
+done
 
-# Image ID; has to be last argument to work with xargs
-ID=$5
+# Check options                                                                 
+if [ "$job" == "-1" ]; then                                                     
+  echo "No job indicated, use option -j"                                        
+  exit 2                                                                        
+fi                                                                              
+                                                                                
+if [ "$exclusive" == "-1" ]; then                                               
+  echo "No image ID indicated, use option -e"                                   
+  exit 3                                                                        
+fi                                                                              
+                                                                                
+if [ "kind" == "-1" ]; then                                                     
+  echo "No image kind indicated, use option -k"                                 
+  exit 4                                                                        
+fi
+
+if [ "$dry_run" != 0 ] && [ "$dry_run" != 1 ] && [ "$dry_run" != 2 ]; then
+  echo "Invalid dry_run option, allowed are 0, 1, and 2"
+  exit 5
+fi
 
 # command line arguments for remote script:
 # collect into string
-arg="-j $job -e $ID -n $N_SMP -k $kind"
 
-echo curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"
-ID=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd" --data-urlencode "args=$arg"`
-echo $ID >> IDs.txt
+if [ "$dry_run" == "1" ]; then
+  arg_dry_run="-n $dry_run"
+else
+  arg_dry_run=""
+fi
+
+RESOURCES="ram=4&cores=$N_SMP"
+arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run"
+
+
+if [ "$dry_run" == 2 ]; then
+  echo "Running command dry run:"
+  echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+else
+  session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"`
+  echo $session >> session_IDs.txt
+  echo "$session $ID" >> session_image_IDs.txt
+fi
diff --git a/scripts/sh/curl_canfar_monitor_local.sh b/scripts/sh/curl_canfar_monitor_local.sh
index 412e33c01..8260e583d 100755
--- a/scripts/sh/curl_canfar_monitor_local.sh
+++ b/scripts/sh/curl_canfar_monitor_local.sh
@@ -16,8 +16,8 @@ type=$1
 echo "type=$type"
 
 while [ 1 ]; do
-  ID=`tail -n 1 IDs.txt`
-  cmd="curl -E $SSL $SESSION/$ID?view=$type"
+  session_ID=`tail -n 1 session_IDs.txt`
+  cmd="curl -E $SSL $SESSION/$session_ID?view=$type"
   echo $cmd
   $cmd
 done
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 6b8903710..5ff13a8a3 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -9,6 +9,9 @@ ID=-1
 n_SMP=1
 kind=-1
 
+
+# TODO: psf
+
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
 \n\nOptions:\n
@@ -73,7 +76,7 @@ if [ "kind" == "-1" ]; then
   exit 4
 fi
 
-echo "start init run exclusive canfar"
+echo "start init_run_exclusive_canfar"
 
 . /opt/conda/etc/profile.d/conda.sh
 
diff --git a/scripts/sh/job_curl_canfar_local.sh b/scripts/sh/job_curl_canfar_local.sh
new file mode 100644
index 000000000..a06d4eb9c
--- /dev/null
+++ b/scripts/sh/job_curl_canfar_local.sh
@@ -0,0 +1,16 @@
+# Usage:
+# Edit the file "all.txt"
+# screen
+# bash run_curl.sh kind job
+
+rm -f session_IDs.txt session_image_IDs.txt
+
+script_local=$HOME/astro/repositories/github/shapepipe/scripts/sh/curl_canfar_local.sh
+version="0.9"
+cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
+kind="$1"
+job="$2"
+
+echo $kind $job
+cat all.txt | xargs -n 1 -P 10 $script_local -v $version -c $cmd_remote -k $kind -j $job -e
+

From c643d0c1500a48cdaa2c4657fdb1b9bcd179e643 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 19 Dec 2023 09:21:50 +0000
Subject: [PATCH 057/207] run summary more OO

---
 scripts/python/summary_run.py           | 90 +++++++++++++++----------
 scripts/sh/init_run_exclusive_canfar.sh | 34 ++++++++--
 2 files changed, 83 insertions(+), 41 deletions(-)

diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index e8cc4f0d5..11a2725b7 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -3,6 +3,7 @@
 import sys
 import os
 import re
+import fnmatch
 
 import logging
 
@@ -336,12 +337,14 @@ def get_unique(self, names):
     def output_missing(
         self,
         module,
-        key_expected,
-        names_in_dir,
-        paths_in_dir,
-        n_mult,
+        idx,
         par_runtime=None,
     ):
+        key_expected = self._key_expected[idx]
+        names_in_dir = self._names_in_dir[idx]
+        paths_in_dir = self._paths_in_dir[idx]
+        n_mult = self._n_mult[idx]
+
         output_path = f"missing_job_{self._bit}_{module}.txt"
 
         list_expected = get_par_runtime(par_runtime, key_expected, kind="list")
@@ -428,11 +431,46 @@ def get_module_output_dir(self, full_path, module):
 
         return directory
 
+    def get_matches_final(self, directory, idx):
+
+        # Look over files
+        # os.path.whether exists is twice faster than try/except
+
+        if os.path.exists(directory):
+            pattern =  f"{self._pattern[idx]}*"
+            for entry2 in os.scandir(directory):
+                if (
+                    entry2.is_file()
+                    and (
+                        fnmatch.fnmatch(entry2.name, pattern)
+                    )
+                ):
+                    # Append matching files
+                    self._names_in_dir[idx].append(entry2.name)
+                    self._paths_in_dir[idx].append(
+                        os.path.join(directory, entry2.name)
+                    )
+
+        #if os.path.exists(directory):
+            #with os.scandir(directory) as entries2:
+                #files = [
+                    #entry2.name
+                    #for entry2 in entries2
+                    #if entry2.name.startswith(self._pattern[idx])
+                #]
+
+                ## Append matching files
+                #self._names_in_dir[idx].extend(files)
+                #self._paths_in_dir[idx].extend(
+                    #[os.path.join(directory, file)
+                    #for file in files]
+                #)
+
     def get_names_in_dir(self, iterable, module, idx):
 
-        # Initialise output file names
-        names_in_dir = []
-        paths_in_dir = []
+        # Initialise output file names and paths
+        self._names_in_dir[idx] = []
+        self._paths_in_dir[idx] = []
 
         # Loop over subdirs
         for jdx, subdir in enumerate(iterable):
@@ -465,24 +503,8 @@ def get_names_in_dir(self, iterable, module, idx):
                         full_path, module
                     )
 
-                    # Look over files
-                    # os.path.whether exists is twice faster than try/except
-                    if os.path.exists(directory):
-                        with os.scandir(directory) as entries2:
-                            files = [
-                                entry2.name
-                                for entry2 in entries2
-                                if entry2.name.startswith(self._pattern[idx])
-                            ]
-
-                            # Append matching files
-                            names_in_dir.extend(files)
-                            paths_in_dir.extend(
-                                [os.path.join(directory, file)
-                                for file in files]
-                            )
-
-        return names_in_dir, paths_in_dir
+                    # Find matching file names and paths
+                    self.get_matches_final(directory, idx)
 
     def update_subdirs(self, par_runtime):
         """Update Subdirs.
@@ -513,6 +535,7 @@ def check_numbers(self, par_runtime=None, indices=None):
         self.update_subdirs(par_runtime)
 
         # Initialise variables
+        self._names_in_dir = {}
         self._paths_in_dir = {}
         self._missing_IDs_job = []
         n_missing_job = 0
@@ -528,14 +551,12 @@ def check_numbers(self, par_runtime=None, indices=None):
                 iterable = tqdm(iterable, desc="subdirs", leave=True)
 
             # Get output file names and paths
-            names_in_dir, paths_in_dir = self.get_names_in_dir(
+            self.get_names_in_dir(
                 iterable,
                 module,
                 idx,
             )
 
-            self._paths_in_dir[idx] = paths_in_dir
-
             # If expected is string: Update parameter with runtime value
             # and set as integer
             if isinstance(self._key_expected[idx], str):
@@ -546,16 +567,18 @@ def check_numbers(self, par_runtime=None, indices=None):
                 n_expected_base = self._key_expected[idx]
 
             # Get some numbers
-            n_found = len(names_in_dir)
+            n_found = len(self._names_in_dir[idx])
             n_expected = n_expected_base * self._n_mult[idx]
             n_missing = n_expected - n_found
 
             n_missing_explained = 0
             if n_missing > 0:
+                # TODO: make check_special class function, deal with
+                # paths, names in dir
                 if False and module == "setools_runner":
                     (
-                        paths_in_dir,
-                        names_in_dir,
+                        self._paths_in_dir[idx],
+                        self._names_in_dir[idx],
                         n_missing_explained,
                     ) = check_special(module, paths_in_dir, names_in_dir)
 
@@ -575,10 +598,7 @@ def check_numbers(self, par_runtime=None, indices=None):
             if n_missing > 0:
                 missing_IDs = self.output_missing(
                     module,
-                    self._key_expected[idx],
-                    names_in_dir,
-                    paths_in_dir,
-                    self._n_mult[idx],
+                    idx,
                     par_runtime=par_runtime,
                 )
                 n_missing_job += n_missing
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index ff8c6d50e..500bab61c 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -9,6 +9,7 @@ ID=-1
 N_SMP=1
 kind=-1
 dry_run=0
+nsh_jobs=8
 
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
@@ -130,12 +131,33 @@ if [ "$dry_run" == "0" ]; then
     ln -s $basedir/output/run_sp_combined_flag
   fi
 
-  # Remove unfinished ngmix dirs
-  if [ -e "run_sp_tile_ngmix_Ng1u/ngmix_runner" ]; then
-    echo "previous empty ngmix run found, removing"
-    n_out=`ls -rlt run_sp_tile_ngmix_Ng7u/ngmix_runner/output | wc -l`
-    if [ "$n_out" == "1" ]; then
-      rm -rf run_sp_tile_ngmix_Ng*u
+  # Indentify and remove unfinished ngmix dirs
+  min_n_out=2
+  for k in $(seq 1 $nsh_jobs); do
+    ngmix_run="run_sp_tile_ngmix_Ng${k}u/ngmix_runner"
+    if [ -e "$ngmix_run" ]; then
+      ngmix_out="$ngmix_run/output"
+      n_out=`ls -rlt $ngmix_out | wc -l`
+      if [ "$n_out" -lt "$min_n_out" ]; then
+          min_n_out=$n_out
+      fi
+      #echo $k $n_out $min_n_out
+    else
+      echo "ngmix separated run #$k not found"
+      min_n_out=0
+    fi
+  done
+  if [ "$min_n_out" -lt "2" ]; then
+    echo "At least one ngmix separated run no output files"
+    for k in $(seq 1 $nsh_jobs); do
+      cmd="rm -rf run_sp_tile_ngmix_Ng${k}u"
+      echo $cmd
+      `$cmd`
+    done
+  else
+    if [ "$job" == "128" ]; then
+      echo "ngmix found complete, all is well, exiting"
+      exit 0
     fi
   fi
 

From 53d9d35a53aaae74235e96666f4944fb6e5bedb2 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 21 Dec 2023 13:22:22 +0000
Subject: [PATCH 058/207] update_runs_log_file script: fixed bug when run dir
 is empty

---
 scripts/python/update_runs_log_file.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/scripts/python/update_runs_log_file.py b/scripts/python/update_runs_log_file.py
index b244c28ec..a08890117 100644
--- a/scripts/python/update_runs_log_file.py
+++ b/scripts/python/update_runs_log_file.py
@@ -42,7 +42,8 @@ def get_module_runs(subdirs):
     all_runs = {}
     for subdir in subdirs:
         runs = matching_subdirs(subdir, "_runner", tail=True)
-        all_runs[subdir] = runs
+        if len(runs) > 0:
+            all_runs[subdir] = runs
 
     return all_runs
 

From ce1179eea49af9b2fe53b2625c9809fe26ed52fd Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 21 Dec 2023 14:42:39 +0000
Subject: [PATCH 059/207] improved canfar job scripts; fixed some make cat bugs

---
 example/cfis/config_make_cat_psfex.ini        |   2 +-
 scripts/python/summary_run.py                 | 663 +-----------------
 scripts/sh/init_run_exclusive_canfar.sh       |  67 +-
 scripts/sh/job_curl_canfar_local.sh           |   3 +-
 .../modules/make_cat_package/make_cat.py      |   2 +-
 5 files changed, 51 insertions(+), 686 deletions(-)

diff --git a/example/cfis/config_make_cat_psfex.ini b/example/cfis/config_make_cat_psfex.ini
index fdf5414b5..a7407d990 100644
--- a/example/cfis/config_make_cat_psfex.ini
+++ b/example/cfis/config_make_cat_psfex.ini
@@ -55,7 +55,7 @@ TIMEOUT = 96:00:00
 [MAKE_CAT_RUNNER]
 
 # Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
-INPUT_DIR = last:sextractor_runner_run_1, last:spread_model_runner, last:psfex_interp_runner, last:merge_sep_cats_runner
+INPUT_DIR = run_sp_tile_Sx:sextractor_runner, last:spread_model_runner, last:psfex_interp_runner, last:merge_sep_cats_runner
 
 # Input file pattern(s), list of strings with length matching number of expected input file types
 # Cannot contain wild cards
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index 11a2725b7..462467e33 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -1,659 +1,14 @@
 #!/usr/bin/env python
 
 import sys
-import os
-import re
-import fnmatch
 
-import logging
-
-from collections import Counter
-
-from tqdm import tqdm
-
-
-def get_IDs_from_file(path):
-    """Get IDs From File.
-
-    Return IDs from text file. Removes letters and replaces
-    dots "." with dashes "-".
-
-    Parameters
-    ----------
-    path: str
-        input file path
-
-    Returns
-    --------
-    list
-        IDs
-
-    """
-    numbers = []
-    with open(path) as f_in:
-        for line in f_in:
-            entry = line.rstrip()
-            number = re.sub("[a-zA-Z]", "", entry)
-            numbers.append(number)
-
-    return numbers
-
-
-def replace_dot_dash(numbers):
-
-    results = [re.sub("\.", "-", number) for number in numbers]
-
-    return results
-
-
-def replace_dash_dot_if_tile(numbers):
-
-    pattern = re.compile(r"(\d{3})-(\d{3})")
-    results = [pattern.sub(r"\1.\2", number) for number in numbers]
-    
-    return results
-
-
-def replace_dot_dash(numbers):
-
-    results = [re.sub("\.", "-", number) for number in numbers]
-
-    return results
-
-
-
-def get_all_exposures(exp_number_file_list, verbose=False):
-    """Get All Exposures.
-
-    Return all exposure names from a list of text files.
-
-    Parameters
-    ----------
-    exp_number_list: list
-        input file names
-
-    """
-    exposures = set()
-    for idx, path in enumerate(exp_number_file_list):
-        exps = get_IDs_from_file(path)
-        exposures.update(exps)
-
-    return list(exposures)
-
-
-def get_all_shdus(exposures, n_CCD):
-    """Get All SHDUs.
-
-    Return all single-exposure single-HDU (CCD) IDs.
-
-    Parameters
-    ----------
-    exposures: list
-        exposure names
-    n_CCD: int
-        number of CCDs per exposure
-
-    Returns
-    --------
-    list
-        single-exposure single-HDU IDs
-
-    """
-    shdus = []
-    for exposure in exposures:
-        for idx_CCD in range(n_CCD):
-            shdus.append(f"{exposure}-{idx_CCD}")
-
-    return shdus
-
-
-def set_as_list(item=None, n=None, default=1):
-    """Set As List.
-
-    Return input as list.
-
-    Parameters
-    -----------
-    item: str, int, or list, optional
-        input item(s); default is None, in which
-        case the return is [1] * n
-    n: int, optional
-        number of list items to return, default is None,
-        in which case the number will be set to 1. If item and
-        n are not None, n has to be equal to len(item)
-    default: int, optional
-        value to return if item is not given;
-        default is 1
-
-    Raises
-    -------
-    IndexError
-        if n != len(item)
-
-    Returns
-    -------
-    list
-        input item(s) as list
-    """
-    my_n = n or 1
-
-    if not item:
-        result = [default] * my_n
-    elif not isinstance(item, list):
-        result = [item] * my_n
-    else:
-        result = item
-        if len(item) != my_n:
-            raise IndexError(f"item has length {len(item)} != {n}")
-
-    return result
-
-
-def check_special(module, paths_in_dir, names_in_dir):
-
-    if module == "setools_runner":
-        inds_special = []
-        for idx in range(len(paths_in_dir)):
-            base_path = paths_in_dir[idx].replace(names_in_dir[idx], "")
-
-            stats_dir = f"{base_path}/../stat"
-            stats_files = os.listdir(stats_dir)
-            if len(stats_files) != 1:
-                raise ValueError(
-                    f"Expected exactly one stats file in {stats_dir}, not"
-                    + f" {len(stats_files)}"
-                )
-
-            stats_path = os.path.join(stats_dir, stats_files[0])
-            with open(stats_path) as f_in:
-                lines = f_in.readlines()
-                for line in lines:
-                    entry = line.rstrip()
-                    m = re.search(line, "Nb stars = (\S*)")
-                    if m:
-                        value = int(m[2])
-                        if value == 0:
-                            inds_special.append(idx)
-                        else:
-                            print(f"b stars = {value}, not special")
-                        break
-
-        print(inds_special)
-        for idx in inds_special:
-            paths_in_dir.pop(idx)
-            names_in_dir.pop(idx)
-
-        return paths_in_dir, names_in_dir, len(inds_special)
-
-
-class job_data(object):
-    """Job Data.
-
-    Class to handle a job.
-
-    Parameters
-    ----------
-    bit: int
-        bit-coded job number
-    run_dir: str or list
-        run directory(ies)
-    modules: list
-        module names
-    key_expected: int or str
-        number of expected output files; if str: will be updated
-        with runtime value
-    n_mult: int or list, optional
-        multiplicity of output files, default `None`, in which
-        case it is set to 1
-    pattern: list, optional
-        if not None, file pattern to match; defafult is `None`
-    path_lef: str, optional
-        left (first) part of output directory, defaul is "./output"
-    output_subdirs: str, optional
-        output subdirectories if not `None`; default is `None`
-    path_right: str, optional
-        right (last) part of output subdir suffix if not `None`;
-        default is `None`
-    verbose: bool, optional
-        verbose output if True; default is False
-
-    """
-    def __init__(
-        self,
-        bit,
-        run_dir,
-        modules,
-        key_expected,
-        n_mult=None,
-        pattern=None,
-        path_left="./output",
-        output_subdirs=None,
-        path_right=None,
-        verbose=False,
-    ):
-        self._bit = bit
-        self._run_dir = set_as_list(item=run_dir, n=len(modules))
-        self._modules = modules
-        self._key_expected = set_as_list(item=key_expected, n=len(modules))
-        self._n_mult = set_as_list(item=n_mult, n=len(modules))
-        self._pattern = set_as_list(item=pattern, n=len(modules), default="")
-        self._path_left = path_left
-        self._output_subdirs = output_subdirs or [""]
-        self._path_right = set_as_list(
-            path_right, len(modules), default="."
-        )
-        self._verbose = verbose
-
-    def print_intro(self):
-        """Print Intro.
-
-        Print header line for job statistics.
-
-        """
-        logging.info(f" (Job {self._bit})")
-
-    @classmethod
-    def print_stats_header(self):
-        """Print Stats Header.
-
-        Print overall header information for stats output.
-
-        """
-        logging.info(
-            "module                          expected     found   miss_expl"
-            + " missing uniq_miss  fr_found"
-        )
-        logging.info("=" * 50)
-
-    @classmethod
-    def print_stats(
-        self,
-        module,
-        n_expected,
-        n_found,
-        n_missing_explained,
-        n_missing,
-        n_mult,
-    ):
-        """Print Stats.
-
-        Print output file statistics.
-
-        Parameters
-        ----------
-        module: str
-            module name
-        n_expected: int
-            number of expected files
-        n_found: int
-            number of found files
-        n_missing_explained: int
-            number of missing but explained files
-        n_missing: int
-            number of missing files
-        n_mult: int
-            multipicity
-
-        """
-        if n_expected > 0:
-            fraction_found = n_found / n_expected
-        else:
-            fraction_found = 1
-
-        n_missing_per_mult = n_missing / n_mult
-
-        logging.info(
-            f"{module:30s} {n_expected:9d} {n_found:9d}"
-            + f" {n_missing_explained:9d} {n_missing:9d}"
-            + f" {n_missing_per_mult:9.1f} {fraction_found:9.1%}"
-        )
-
-    @classmethod
-    def is_ID_in_str(self, ID, path):
-        if ID in path:
-            return True
-        #if re.sub("\.", "-", ID) in path:
-            #return True
-        #return False
-
-    @classmethod
-    def is_not_in_any(self, ID, list_str):
-        return not any(ID in string for string in list_str)
-
-    @classmethod
-    def get_unique(self, names):
-        n_all = len(names)
-        names_unique = list(set(names))
-        n_unique = len(names_unique)
-
-        if n_all != n_unique:
-            if True:  # self._verbose:
-                logging.warning(
-                    f"{n_all - n_unique} duplicates removed from {n_all} IDs"
-                )
-
-        return names_unique
-
-    def output_missing(
-        self,
-        module,
-        idx,
-        par_runtime=None,
-    ):
-        key_expected = self._key_expected[idx]
-        names_in_dir = self._names_in_dir[idx]
-        paths_in_dir = self._paths_in_dir[idx]
-        n_mult = self._n_mult[idx]
-
-        output_path = f"missing_job_{self._bit}_{module}.txt"
-
-        list_expected = get_par_runtime(par_runtime, key_expected, kind="list")
-        
-        # Count image IDs in names that were found earlier
-
-        ## Extract image IDs from names
-        IDs = []
-        pattern = re.compile(r"(?:\d{3}-\d{3}|\d{7}-\d+)")
-        for name, path in zip(names_in_dir, paths_in_dir):
-            match = pattern.search(name)
-            if match:
-                IDs.append(match.group())
-            else:
-                raise ValueError(f"No ID found in {name}")
-
-
-        ## Count occurences
-        ID_counts = Counter(IDs)
-
-        ## Add to missing if ocurence less than n_mult
-        missing_IDs = []
-        for ID in list_expected:
-            if ID_counts[ID] < n_mult:
-                missing_IDs.append(ID)
-
-        n_all = len(missing_IDs)
-        missing_IDs_unique = self.get_unique(missing_IDs)
-        n_unique = len(missing_IDs_unique)
-
-        if n_unique > 0:
-            IDs_dot = replace_dash_dot_if_tile(missing_IDs_unique)
-            with open(output_path, "w") as f_out:
-                for ID in IDs_dot:
-                    print(ID, file=f_out)
-
-        return missing_IDs_unique
-
-    def output_missing_job(self):
-        output_path = f"missing_job_{self._bit}_all.txt"
-
-        missing_IDs_all = set(self._missing_IDs_job)
-
-        if len(missing_IDs_all) > 0:
-            with open(output_path, "w") as f_out:
-                for ID in missing_IDs_all:
-                    print(ID, file=f_out)
-        else:
-            logging.warning("no missing IDs in output_missing_job")
-
-    @classmethod
-    def get_last_full_path(self, base_and_subdir, matches):
-        """Get Last Full Path
-
-        Return full path of last file in list.
-
-        """
-        # Sort according to creation time
-        matches_sorted = sorted(
-            matches,
-            key=lambda entry: entry.name,
-        )
-
-        # Get most recent one
-        last = matches_sorted[-1]
-
-        # Get full path
-        full_path = os.path.join(base_and_subdir, last.name)
-
-        return full_path
-
-    @classmethod
-    def get_module_output_dir(self, full_path, module):
-        """Get Module Output Dir.
-
-        Return output directory name for given module.
-
-        """
-        directory = f"{full_path}/{module}/output"
-
-        # Some modules have special requirements 
-        if module == "setools_runner":
-            directory = f"{directory}/rand_split"
-
-        return directory
-
-    def get_matches_final(self, directory, idx):
-
-        # Look over files
-        # os.path.whether exists is twice faster than try/except
-
-        if os.path.exists(directory):
-            pattern =  f"{self._pattern[idx]}*"
-            for entry2 in os.scandir(directory):
-                if (
-                    entry2.is_file()
-                    and (
-                        fnmatch.fnmatch(entry2.name, pattern)
-                    )
-                ):
-                    # Append matching files
-                    self._names_in_dir[idx].append(entry2.name)
-                    self._paths_in_dir[idx].append(
-                        os.path.join(directory, entry2.name)
-                    )
-
-        #if os.path.exists(directory):
-            #with os.scandir(directory) as entries2:
-                #files = [
-                    #entry2.name
-                    #for entry2 in entries2
-                    #if entry2.name.startswith(self._pattern[idx])
-                #]
-
-                ## Append matching files
-                #self._names_in_dir[idx].extend(files)
-                #self._paths_in_dir[idx].extend(
-                    #[os.path.join(directory, file)
-                    #for file in files]
-                #)
-
-    def get_names_in_dir(self, iterable, module, idx):
-
-        # Initialise output file names and paths
-        self._names_in_dir[idx] = []
-        self._paths_in_dir[idx] = []
-
-        # Loop over subdirs
-        for jdx, subdir in enumerate(iterable):
-            base_and_subdir = (
-                f"{self._path_left}/{subdir}/"
-                + f"{self._path_right[idx]}"
-            )
-            if os.path.isdir(base_and_subdir):
-
-                matches = []
-
-                # Loop over entries (files and dirs)
-                with os.scandir(base_and_subdir) as entries:
-                    for entry in entries:
-
-                        # Append directory name if matches module
-                        if entry.name.startswith(self._run_dir[idx]):
-                            matches.append(entry)
-
-                    # This entry does not match module -> next
-                    if not matches:
-                        continue
-
-                    full_path = self.get_last_full_path(
-                        base_and_subdir, matches
-                    )
-
-                    # Get module output directory
-                    directory = self.get_module_output_dir(
-                        full_path, module
-                    )
-
-                    # Find matching file names and paths
-                    self.get_matches_final(directory, idx)
-
-    def update_subdirs(self, par_runtime):
-        """Update Subdirs.
-
-        Update subdir names with runtime information if required.
-
-        """
-        if not isinstance(self._output_subdirs, list):
-            self._output_subdirs = get_par_runtime(
-                par_runtime, self._output_subdirs, kind="list"
-            )
-
-    def check_numbers(self, par_runtime=None, indices=None):
-        """Check Numbers.
-
-        Check output file numbers and IDs.
-
-        Parameters
-        ----------
-        par_runtime : dict, optional
-            runtime parameter. default is None
-        indices: list, optional
-            if not None (default), only check modules corresponding
-            to indices
-
-        """
-        # Update subdirs if not already set as list
-        self.update_subdirs(par_runtime)
-
-        # Initialise variables
-        self._names_in_dir = {}
-        self._paths_in_dir = {}
-        self._missing_IDs_job = []
-        n_missing_job = 0
-
-        # Loop over modules
-        for idx, module in enumerate(self._modules):
-            if indices is not None and idx not in indices:
-                continue
-
-            # Look over subdirs
-            iterable = self._output_subdirs
-            if len(iterable) > 1 and self._verbose:
-                iterable = tqdm(iterable, desc="subdirs", leave=True)
-
-            # Get output file names and paths
-            self.get_names_in_dir(
-                iterable,
-                module,
-                idx,
-            )
-
-            # If expected is string: Update parameter with runtime value
-            # and set as integer
-            if isinstance(self._key_expected[idx], str):
-                n_expected_base = get_par_runtime(
-                    par_runtime, self._key_expected[idx], kind="n"
-                )
-            else:
-                n_expected_base = self._key_expected[idx]
-
-            # Get some numbers
-            n_found = len(self._names_in_dir[idx])
-            n_expected = n_expected_base * self._n_mult[idx]
-            n_missing = n_expected - n_found
-
-            n_missing_explained = 0
-            if n_missing > 0:
-                # TODO: make check_special class function, deal with
-                # paths, names in dir
-                if False and module == "setools_runner":
-                    (
-                        self._paths_in_dir[idx],
-                        self._names_in_dir[idx],
-                        n_missing_explained,
-                    ) = check_special(module, paths_in_dir, names_in_dir)
-
-                n_missing = n_missing - n_missing_explained
-
-            # Print statistics
-            self.print_stats(
-                module,
-                n_expected,
-                n_found,
-                n_missing_explained,
-                n_missing,
-                self._n_mult[idx],
-            )
-
-            # Write missing IDs for module to file
-            if n_missing > 0:
-                missing_IDs = self.output_missing(
-                    module,
-                    idx,
-                    par_runtime=par_runtime,
-                )
-                n_missing_job += n_missing
-                self._missing_IDs_job.extend(missing_IDs)
-
-        # Write missing IDs for entire job to file
-        if n_missing_job > 0:
-            self.output_missing_job()
-
-
-def get_par_runtime(par_runtime, key, kind="n"):
-    """Get Par RunTime.
-
-    Return runtime parameter value.
-
-    Parameters
-    ----------
-    par_runtime: dict
-        runtime parameter
-    key: str
-        key
-
-    """
-    combined_key = f"{kind}_{key}"
-    return par_runtime[combined_key]
-
-
-def print_par_runtime(par_runtime, verbose=True):
-    # Print runtime parameter values
-    if verbose:
-        logging.info("")
-        logging.info("===========")
-        logging.info("par_runtime")
-        logging.info("-----------")
-        for key, value in par_runtime.items():
-            if not key.startswith("list"):
-                logging.info(f"{key:30s} {value:6d}")
-            else:
-                logging.info(f"{key:29s} [{len(value):6d}]")
-        logging.info("===========")
-        logging.info("")
+from shapepipe.utilities.summary import *
 
 
 def main(argv=None):
-    # Set default parameters
-    # p_def = params_default()
-
-    # Command line options
-    # options, args = parse_options(p_def)
-
-    # if check_options(options) is False:
-    # return 1
 
-    # param = update_param(p_def, options)
 
+    # Setting
     verbose = True
     log_file_name = "summary_log.txt"
     handlers = [logging.FileHandler(log_file_name), logging.StreamHandler()]
@@ -776,13 +131,19 @@ def main(argv=None):
         verbose=verbose,
     )
 
+    n_sh = 8
+    run_dirs = [f"run_sp_tile_ngmix_Ng{idx+1}u" for idx in range(n_sh)]
+    output_path_missing_IDs = [
+        f"missing_job_128_ngmix_runner_{idx+1}.txt" for idx in range(n_sh)
+    ]
     jobs["128"] = job_data(
         "128",
-        "run_sp_tile_ngmix_Ng1u",
-        ["ngmix_runner"],
+        run_dirs,
+        ["ngmix_runner"] * 8,
         "tile_IDs",
         path_left=f"{main_dir}/tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        output_path_missing_IDs=output_path_missing_IDs,
         verbose=verbose,
     )
 
@@ -807,8 +168,8 @@ def main(argv=None):
 
     print_par_runtime(par_runtime, verbose=verbose)
 
-    for key in ["2", "4", "8", "16", "32", "64", "128"]:
-    #for key in ["128"]:
+    #for key in ["2", "4", "8", "16", "32", "64", "128"]:
+    for key in ["128"]:
         job = jobs[key]
         job.print_intro()
         job.check_numbers(par_runtime=par_runtime)
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 9461a0b72..2dbcf41a5 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -78,7 +78,7 @@ if [ "$exclusive" == "-1" ]; then
   exit 3
 fi
 
-if [ "kind" == "-1" ]; then
+if [ "$kind" == "-1" ]; then
   echo "No image kind indicated, use option -k"
   exit 4
 fi
@@ -99,6 +99,7 @@ cd $basedir
 
 if [ "$dry_run" == "0" ]; then
 
+  # Update links to exposure run directories
   if [ "$kind" == "tile" ]; then
     rm -rf tile_runs/$ID/output/run_exp_SxSePsf*
     link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs
@@ -127,42 +128,48 @@ if [ "$dry_run" == "0" ]; then
   #rm run_sp_exp_SpMh*
   #rm  run_sp_MaMa_*
 
+  # Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
   for dir in $basedir/output/run_sp_*; do
-  ln -sf $dir
+    ln -sf $dir
   done
   if [ ! -e run_sp_combined_flag ]; then
     ln -s $basedir/output/run_sp_combined_flag
   fi
 
-  # Indentify and remove unfinished ngmix dirs
-  min_n_out=2
-  for k in $(seq 1 $nsh_jobs); do
-    ngmix_run="run_sp_tile_ngmix_Ng${k}u/ngmix_runner"
-    if [ -e "$ngmix_run" ]; then
-      ngmix_out="$ngmix_run/output"
-      n_out=`ls -rlt $ngmix_out | wc -l`
-      if [ "$n_out" -lt "$min_n_out" ]; then
-          min_n_out=$n_out
-      fi
-      #echo $k $n_out $min_n_out
-    else
-      echo "ngmix separated run #$k not found"
-      min_n_out=0
-    fi
-  done
-  if [ "$min_n_out" -lt "2" ]; then
-    echo "At least one ngmix separated run no output files"
+  (( do_job= $job & 128 ))
+  if [[ $do_job != 0 ]]; then
+
+    # Indentify and remove unfinished ngmix dirs
+    min_n_out=2
     for k in $(seq 1 $nsh_jobs); do
-      cmd="rm -rf run_sp_tile_ngmix_Ng${k}u"
-      echo $cmd
-      `$cmd`
+      ngmix_run="run_sp_tile_ngmix_Ng${k}u/ngmix_runner"
+      if [ -e "$ngmix_run" ]; then
+        ngmix_out="$ngmix_run/output"
+        n_out=`ls -rlt $ngmix_out | wc -l`
+        if [ "$n_out" -lt "$min_n_out" ]; then
+            min_n_out=$n_out
+        fi
+        #echo $k $n_out $min_n_out
+      else
+        echo "ngmix separated run #$k not found"
+        min_n_out=0
+      fi
     done
-  else
-    if [ "$job" == "128" ]; then
-      echo "ngmix found complete, all is well, exiting"
-      exit 0
+    if [ "$min_n_out" -lt "2" ]; then
+      echo "At least one ngmix separated run no output files"
+      for k in $(seq 1 $nsh_jobs); do
+        cmd="rm -rf run_sp_tile_ngmix_Ng${k}u"
+        echo $cmd
+        `$cmd`
+      done
+    else
+      if [ "$job" == "128" ]; then
+        echo "ngmix found complete, all is well, exiting"
+        exit 0
+      fi
     fi
-  fi
+
+  fi 
 
   cd ..
   update_runs_log_file.py
@@ -172,10 +179,6 @@ if [ "$dry_run" == "0" ]; then
 
 fi
 
-#export SP_RUN=.
-#export SP_CONFIG=$HOME/shapepipe/example/cfis
-#shapepipe_run -c $SP_CONFIG/config_exp_Pi.ini -e $ID
-
 echo -n "environment: "
 echo $CONDA_PREFIX
 
diff --git a/scripts/sh/job_curl_canfar_local.sh b/scripts/sh/job_curl_canfar_local.sh
index a06d4eb9c..e8a16513f 100644
--- a/scripts/sh/job_curl_canfar_local.sh
+++ b/scripts/sh/job_curl_canfar_local.sh
@@ -5,7 +5,8 @@
 
 rm -f session_IDs.txt session_image_IDs.txt
 
-script_local=$HOME/astro/repositories/github/shapepipe/scripts/sh/curl_canfar_local.sh
+#script_local=$HOME/astro/repositories/github/shapepipe/scripts/sh/curl_canfar_local.sh
+script_local=./curl_canfar_local.sh
 version="0.9"
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 kind="$1"
diff --git a/shapepipe/modules/make_cat_package/make_cat.py b/shapepipe/modules/make_cat_package/make_cat.py
index 6bbe26648..4e30e3552 100644
--- a/shapepipe/modules/make_cat_package/make_cat.py
+++ b/shapepipe/modules/make_cat_package/make_cat.py
@@ -16,7 +16,7 @@
 from sqlitedict import SqliteDict
 
 from shapepipe.pipeline import file_io
-from shapepipe.utitities import galaxy
+from shapepipe.utilities import galaxy
 
 
 def prepare_final_cat_file(output_path, file_number_string):

From a005119ad5503a6fca3ce28f7e5b703e414f14c5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 21 Dec 2023 15:44:44 +0100
Subject: [PATCH 060/207] added curl to Dockerimage

---
 Dockerfile | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Dockerfile b/Dockerfile
index 6cd1923e7..4cfd891d8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -27,6 +27,7 @@ RUN apt-get update --allow-releaseinfo-change && \
     apt-get install libatlas-base-dev liblapack-dev libblas-dev -y && \
     apt-get install vim -y && \
     apt-get install locate -y && \
+    apt-get install curl -y && \
     apt-get clean
 
 RUN apt-get install acl -y && \

From 22ee0f3a53a688df7aee7116ba2e7c8c64c40c6e Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 21 Dec 2023 15:49:57 +0100
Subject: [PATCH 061/207] Remove temp hack from mask

---
 shapepipe/modules/mask_package/mask.py | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py
index 230f2e897..b8b81a3cc 100644
--- a/shapepipe/modules/mask_package/mask.py
+++ b/shapepipe/modules/mask_package/mask.py
@@ -312,15 +312,6 @@ def make_mask(self):
             f'{self._img_prefix}'
             + f'{self._outname_base}{self._img_number}.fits'
         )
-        if (
-            os.path.exists(f"output/run_sp_MaMa_2023-11-21_06-11-21/mask_runner_run_1/output/{output_file_name}")
-            or os.path.exists(f"output/run_sp_MaMa_2023-11-21_06-11-21/mask_runner_run_2/output/{output_file_name}")
-        ):
-            print("MKDEBUG skipping ", output_file_name)
-            return None, None
-        else:
-            print("MKDEBUG processing ", output_file_name)
-
 
         if self._config['MD']['make']:
             self.missing_data()

From b682e7c2b74775489b4929f0982da2fb8cbf759d Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 21 Dec 2023 15:51:13 +0100
Subject: [PATCH 062/207] removed unused code from mask

---
 shapepipe/modules/mask_package/mask.py | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py
index b8b81a3cc..e34eb9583 100644
--- a/shapepipe/modules/mask_package/mask.py
+++ b/shapepipe/modules/mask_package/mask.py
@@ -308,11 +308,6 @@ def make_mask(self):
         Main function to create the mask.
 
         """
-        output_file_name = (
-            f'{self._img_prefix}'
-            + f'{self._outname_base}{self._img_number}.fits'
-        )
-
         if self._config['MD']['make']:
             self.missing_data()
 

From 7fc3645751dc05ccb4ab43ec1d7399f82577acb2 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sat, 23 Dec 2023 11:01:57 +0000
Subject: [PATCH 063/207] curl scripts updated

---
 scripts/python/link_to_exp_for_tile.py  |   2 +-
 scripts/python/summary_run.py           |   6 +-
 scripts/sh/curl_canfar_local.sh         |   2 +-
 scripts/sh/curl_canfar_monitor_local.sh |   8 +-
 scripts/sh/init_run_exclusive_canfar.sh | 175 ++++++++++++++----------
 scripts/sh/job_sp_canfar.bash           |  16 ++-
 6 files changed, 122 insertions(+), 87 deletions(-)

diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index f6e01021b..9d19003d8 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -327,7 +327,7 @@ def main(argv=None):
     patterns = ["run_sp_exp_SxSePsf", "run_sp_exp_Pi"]
     for pattern in patterns:
         paths, number = get_paths(exp_base_dir, exp_shdu_IDs, pattern)
-        print(number)
+        #print(number)
 
         create_links_paths(tile_base_dir, tile_ID, paths, verbose=verbose)
 
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index 462467e33..df44a7be7 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -24,7 +24,7 @@ def main(argv=None):
     list_tile_IDs_dot = get_IDs_from_file(tile_ID_path)
 
     # tile IDs with dashes
-    list_tile_IDs = replace_dot_dash(list_tile_IDs_dot)
+    list_tile_IDs = job_data.replace_dot_dash(list_tile_IDs_dot)
     n_tile_IDs = len(list_tile_IDs)
     n_CCD = 40
 
@@ -168,8 +168,8 @@ def main(argv=None):
 
     print_par_runtime(par_runtime, verbose=verbose)
 
-    #for key in ["2", "4", "8", "16", "32", "64", "128"]:
-    for key in ["128"]:
+    for key in ["2", "4", "8", "16", "32", "64", "128"]:
+    #for key in ["128"]:
         job = jobs[key]
         job.print_intro()
         job.check_numbers(par_runtime=par_runtime)
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 3ec61555d..bacf09576 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/bash
+#!/usr/bin/env bash
 
 # Usage
 # ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.9 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID kind job
diff --git a/scripts/sh/curl_canfar_monitor_local.sh b/scripts/sh/curl_canfar_monitor_local.sh
index 8260e583d..4ba0bf875 100755
--- a/scripts/sh/curl_canfar_monitor_local.sh
+++ b/scripts/sh/curl_canfar_monitor_local.sh
@@ -1,10 +1,4 @@
-#!/usr/bin/bash
-
-# --false-start --tcp-fastopen  faster
-
-# --http2   slower
-# --tlsv1.2 slower?
-# --insecure ?
+#!/usr/bin/env bash
 
 # -H "Accept-Encoding: gzip"    faster?
 
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 2dbcf41a5..3f1559c4b 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -10,6 +10,7 @@ N_SMP=1
 kind=-1
 dry_run=0
 nsh_jobs=8
+VERBOSE=1
 
 
 # TODO: psf
@@ -83,6 +84,44 @@ if [ "$kind" == "-1" ]; then
   exit 4
 fi
 
+# Functions
+
+## Print string, executes command, and prints return value.
+function command () {
+   cmd=$1
+   dry_run=$2
+
+   RED='\033[0;31m'
+   GREEN='\033[0;32m'
+   NC='\033[0m' # No Color
+   # Color escape characters show up in log files
+   #RED=''
+   #GREEN=''
+   #NC=''
+
+   if [ $VERBOSE == 1 ]; then
+        echo "running '$cmd' (dry run=$dry_run)"
+   fi
+   if [ "$dry_run" == "0" ]; then
+        $cmd
+        res=$?
+
+        if [ $VERBOSE == 1 ]; then
+            if [ $res == 0 ]; then
+              echo -e "${GREEN}success, return value = $res${NC}"
+            else
+              echo -e "${RED}error, return value = $res${NC}"
+              if [ $STOP == 1 ]; then
+                  echo "${RED}exiting  $(basename "$0")', error in command '$cmd'${NC}"
+                  exit $res
+              else
+                  echo "${RED}continuing '$(basename "$0")', error in command '$cmd'${NC}"
+              fi
+            fi
+        fi
+   fi
+}
+
 echo "start init_run_exclusive_canfar"
 
 if [ "$dry_run" == 1 ]; then
@@ -97,100 +136,88 @@ basedir=$HOME/cosmostat/P3_v2/psfex
 cd $basedir
 
 
-if [ "$dry_run" == "0" ]; then
-
-  # Update links to exposure run directories
-  if [ "$kind" == "tile" ]; then
-    rm -rf tile_runs/$ID/output/run_exp_SxSePsf*
-    link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs
-  fi
+# Update links to exposure run directories
+if [ "$kind" == "tile" ]; then
+  command "rm -rf tile_runs/$ID/output/run_exp_SxSePsf*" $dry_run
+  command "link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs" $dry_run
+fi
 
-  cd ${kind}_runs
 
-  if [ ! -d "$ID" ]; then
-    mkdir $ID
-  fi
+cd ${kind}_runs
 
-  cd $ID
-  pwd
+if [ ! -d "$ID" ]; then
+  command "mkdir $ID" $dry_run
+fi
 
-  if [ ! -d "output" ]; then
-    mkdir output
-  fi
+cd $ID
+pwd
 
-  cd output
+if [ ! -d "output" ]; then
+  command "mkdir output" $dry_run
+fi
 
-  if [ ! -f log_exp_headers.sqlite ]; then
-    ln -s $basedir/output/log_exp_headers.sqlite
-  fi
+cd output
 
-  # Remove potentially obsolete link
-  #rm run_sp_exp_SpMh*
-  #rm  run_sp_MaMa_*
+if [ ! -f log_exp_headers.sqlite ]; then
+  command "ln -s $basedir/output/log_exp_headers.sqlite" $dry_run
+fi
 
-  # Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
-  for dir in $basedir/output/run_sp_*; do
-    ln -sf $dir
-  done
-  if [ ! -e run_sp_combined_flag ]; then
-    ln -s $basedir/output/run_sp_combined_flag
-  fi
+# Remove potentially obsolete link
+#rm run_sp_exp_SpMh*
+#rm  run_sp_MaMa_*
 
-  (( do_job= $job & 128 ))
-  if [[ $do_job != 0 ]]; then
+# Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
+for dir in $basedir/output/run_sp_*; do
+  command "ln -sf $dir" $dry_run
+done
+if [ ! -e run_sp_combined_flag ]; then
+  command "ln -s $basedir/output/run_sp_combined_flag" $dry_run
+fi
 
-    # Indentify and remove unfinished ngmix dirs
-    min_n_out=2
-    for k in $(seq 1 $nsh_jobs); do
-      ngmix_run="run_sp_tile_ngmix_Ng${k}u/ngmix_runner"
-      if [ -e "$ngmix_run" ]; then
-        ngmix_out="$ngmix_run/output"
-        n_out=`ls -rlt $ngmix_out | wc -l`
-        if [ "$n_out" -lt "$min_n_out" ]; then
-            min_n_out=$n_out
-        fi
-        #echo $k $n_out $min_n_out
-      else
-        echo "ngmix separated run #$k not found"
-        min_n_out=0
+(( do_job= $job & 128 ))
+#if [[ $do_job != 0 ]]; then
+if [ 0 == 1 ]; then
+
+  # Indentify and remove unfinished ngmix dirs
+  min_n_out=2
+  for k in $(seq 1 $nsh_jobs); do
+    ngmix_run="run_sp_tile_ngmix_Ng${k}u/ngmix_runner"
+    if [ -e "$ngmix_run" ]; then
+      ngmix_out="$ngmix_run/output"
+      n_out=`ls -rlt $ngmix_out | wc -l`
+      if [ "$n_out" -lt "$min_n_out" ]; then
+          min_n_out=$n_out
       fi
-    done
-    if [ "$min_n_out" -lt "2" ]; then
-      echo "At least one ngmix separated run no output files"
-      for k in $(seq 1 $nsh_jobs); do
-        cmd="rm -rf run_sp_tile_ngmix_Ng${k}u"
-        echo $cmd
-        `$cmd`
-      done
+      #echo $k $n_out $min_n_out
     else
-      if [ "$job" == "128" ]; then
-        echo "ngmix found complete, all is well, exiting"
-        exit 0
-      fi
+      echo "ngmix separated run #$k not found"
+      min_n_out=0
     fi
+  done
+  if [ "$min_n_out" -lt "2" ]; then
+    echo "At least one ngmix separated run no output files"
+    for k in $(seq 1 $nsh_jobs); do
+      command "rm -rf run_sp_tile_ngmix_Ng${k}u" $dry_run
+    done
+  else
+    if [ "$job" == "128" ]; then
+      echo "ngmix found complete, all is well, exiting"
+      exit 0
+    fi
+  fi
 
-  fi 
-
-  cd ..
-  update_runs_log_file.py
+fi 
 
-  echo -n "pwd: "
-  pwd
+cd ..
+command update_runs_log_file.py $dry_run
 
-fi
+echo -n "pwd: "
+pwd
 
 echo -n "environment: "
 echo $CONDA_PREFIX
 
-cmd="job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP"
-echo -n "Running commnd '$cmd' ..."
-
-if [ "$dry_run" == 1 ]; then
-  echo " dry run"
-else
-  echo
-  $cmd
-fi
+command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP" $dry_run
 
 cd $basedir
 
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 97280f374..17695f41d 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -453,7 +453,21 @@ if [[ $do_job != 0 ]]; then
   ### Shapes, run $nsh_jobs parallel processes
   VERBOSE=0
   for k in $(seq 1 $nsh_jobs); do
-      command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix+galsim $k)" &
+
+      # if output dir for subrun exists but no output: re-run
+      ngmix_run=$OUTPUT/"run_sp_tile_ngmix_Ng${k}u/ngmix_runner"
+      if [ -e "$ngmix_run" ]; then
+        ngmix_out="$ngmix_run/output"
+        n_out=`ls -rlt $ngmix_out | wc -l`
+        if [ "$n_out" -lt 2 ]; then
+          command "rm -rf $OUTPUT/run_sp_tile_ngmix_Ng${k}u" "Re-running existing empty ngmix subrun $k"
+          command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix $k)" &
+        else
+          echo "Skipping existing non-empty ngmix subrun $k"
+        fi
+      else
+        command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix $k)" &
+      fi
   done
   wait
   VERBOSE=1

From 15a4b7bf79c9a3f365741f0aeb10d1fe1d70ac47 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 09:24:05 +0000
Subject: [PATCH 064/207] combine psf validation files: preles now with
 prepare_tiles_for_final.bash

---
 example/cfis/config_exp_Pi.ini          |   2 +-
 scripts/sh/curl_canfar_local.sh         |   2 +-
 scripts/sh/init_run_exclusive_canfar.sh |  34 +++--
 scripts/sh/job_curl_canfar_local.sh     |   8 +-
 scripts/sh/prepare_star_cat.bash        |  92 -------------
 scripts/sh/prepare_tiles_for_final.bash | 171 +++++++++++++++---------
 6 files changed, 133 insertions(+), 176 deletions(-)
 delete mode 100755 scripts/sh/prepare_star_cat.bash

diff --git a/example/cfis/config_exp_Pi.ini b/example/cfis/config_exp_Pi.ini
index ae510058e..12056341b 100644
--- a/example/cfis/config_exp_Pi.ini
+++ b/example/cfis/config_exp_Pi.ini
@@ -46,7 +46,7 @@ OUTPUT_DIR = $SP_RUN/output
 [JOB]
 
 # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
-SMP_BATCH_SIZE = 2
+SMP_BATCH_SIZE = 1
 
 # Timeout value (optional), default is None, i.e. no timeout limit applied
 TIMEOUT = 96:00:00
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index bacf09576..f17f16d31 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -14,7 +14,7 @@ job=-1
 ID=-1
 N_SMP=1
 kind=-1
-version=0.9
+version=1.0
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 dry_run=0
 
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 3f1559c4b..2d1e381d0 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -158,24 +158,29 @@ fi
 
 cd output
 
-if [ ! -f log_exp_headers.sqlite ]; then
-  command "ln -s $basedir/output/log_exp_headers.sqlite" $dry_run
-fi
+if [ 0 == 1 ]; then
 
-# Remove potentially obsolete link
-#rm run_sp_exp_SpMh*
-#rm  run_sp_MaMa_*
+  if [ ! -f log_exp_headers.sqlite ]; then
+    command "ln -s $basedir/output/log_exp_headers.sqlite" $dry_run
+  fi
+
+  # Remove potentially obsolete link
+  #rm run_sp_exp_SpMh*
+  #rm  run_sp_MaMa_*
+
+  # Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
+  for dir in $basedir/output/run_sp_*; do
+    command "ln -sf $dir" $dry_run
+  done
+  if [ ! -e run_sp_combined_flag ]; then
+    command "ln -s $basedir/output/run_sp_combined_flag" $dry_run
+  fi
 
-# Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
-for dir in $basedir/output/run_sp_*; do
-  command "ln -sf $dir" $dry_run
-done
-if [ ! -e run_sp_combined_flag ]; then
-  command "ln -s $basedir/output/run_sp_combined_flag" $dry_run
 fi
 
 (( do_job= $job & 128 ))
 #if [[ $do_job != 0 ]]; then
+# The following is now dealt with in job_sh_canar.bash
 if [ 0 == 1 ]; then
 
   # Indentify and remove unfinished ngmix dirs
@@ -217,7 +222,10 @@ pwd
 echo -n "environment: "
 echo $CONDA_PREFIX
 
-command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP" $dry_run
+#command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP" $dry_run
+
+export SP_RUN=.
+command "shapepipe_run -c $HOME/shapepipe/example/cfis/config_exp_Pi.ini" $dry_run
 
 cd $basedir
 
diff --git a/scripts/sh/job_curl_canfar_local.sh b/scripts/sh/job_curl_canfar_local.sh
index e8a16513f..600a15964 100644
--- a/scripts/sh/job_curl_canfar_local.sh
+++ b/scripts/sh/job_curl_canfar_local.sh
@@ -5,13 +5,13 @@
 
 rm -f session_IDs.txt session_image_IDs.txt
 
-#script_local=$HOME/astro/repositories/github/shapepipe/scripts/sh/curl_canfar_local.sh
-script_local=./curl_canfar_local.sh
-version="0.9"
+script_local=curl_canfar_local.sh
+version="1.0"
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
+N_SMP=1
 kind="$1"
 job="$2"
 
 echo $kind $job
-cat all.txt | xargs -n 1 -P 10 $script_local -v $version -c $cmd_remote -k $kind -j $job -e
+cat all.txt | xargs -n 1 -P 1 $script_local -v $version -c $cmd_remote -N $N_SMP -k $kind -j $job -e
 
diff --git a/scripts/sh/prepare_star_cat.bash b/scripts/sh/prepare_star_cat.bash
deleted file mode 100755
index ff8cb167f..000000000
--- a/scripts/sh/prepare_star_cat.bash
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env bash
-
-# Name: prepare_star_cat.bash
-# Description: Create directory and links to all PSF or star catalogue files
-#              from previous ShapePipe runs.
-# Author: Martin Kilbinger <martin.kilbinger@cea.fr>
-
-
-# Command line arguments
-
-## Default values
-psf='mccd'
-
-## Help string
-usage="Usage: $(basename "$0") [OPTIONS]
-\n\nOptions:\n
-   -h\tthis message\n
-   -p, --psf MODEL\n
-    \tPSF model, one in ['psfex'|'mccd'|'setools'], default='$psf'\n
-"
-
-## Parse command line
-while [ $# -gt 0 ]; do
-  case "$1" in
-    -h)
-      echo -ne $usage
-      exit 0
-      ;;
-    -p|--psf)
-      psf="$2"
-      shift
-      ;;
-    *)
-      echo -ne usage
-      exit 1
-      ;;
-  esac
-  shift
-done
-
-
-## Path variables
-if [ "$psf" == "psfex" ] || [ "$psf" == "mccd" ]; then
-  psfval_file_base="validation_psf"
-  dir_individual="psf_validation_ind"
-else
-  psfval_file_base="mask/star_selection"
-  dir_individual="star_all_ind"
-fi
-
-pwd=`pwd`
-
-
-## Functions
-function link_s () {
-    target=$1
-    link_name=$2
- 
-    if [ -L "$link_name" ]; then
-	      let "n_skipped+=1"
-    else
-        ln -s $target $link_name
-	      let "n_created+=1"
-    fi
-
-    return $n
-}
-
-
-# Create output dirs
-if [ ! -d "$dir_individual" ]; then
-    mkdir -p $dir_individual
-fi
-
-if [ "$psf" == "psfex" ]; then
-  runner="psfex_interp_runner"
-elif [ "$psf" == "mccd" ]; then
-  runner="mccd_fit_val_runner"
-else
-  runner="setools_runner"
-fi
-
-# Find all psf validation files and create links.
-# Assumes untar_results.sh has been run before.
-n_skipped=0
-n_created=0
-FILES=output/*/${runner}/output/${psfval_file_base}*
-for val in ${FILES[@]}; do
-    base=`basename $val`
-    link_s "$pwd/$val" "$dir_individual/$base"
-done
-echo " Created $n_created links, skipped $n_skipped files"
diff --git a/scripts/sh/prepare_tiles_for_final.bash b/scripts/sh/prepare_tiles_for_final.bash
index cf56d5895..8aff01e00 100755
--- a/scripts/sh/prepare_tiles_for_final.bash
+++ b/scripts/sh/prepare_tiles_for_final.bash
@@ -1,23 +1,25 @@
 #!/usr/bin/env bash
 
 # Name: prepare_tiles_for_final.bash
-# Description: Create shapepipe run directory with
-#              links to all `final_cat` fits files
+# Description: Create new shapepipe run directory with
+#              links to source files from combined existing runs
 # Author: Martin Kilbinger <martin.kilbinger@cea.fr>
-# Date: 06/2020
-# Version: 0.1
+
 
 # Command line arguments
 
 ## Default values
-cat='final'  
+cat='final'
+psf="mccd"
 
 ## Help string
 usage="Usage: $(basename "$0") [OPTIONS]
 \n\nOptions:\n
    -h\tthis message\n
+   -p, --psf MODEL\n
+    \tPSF model, one in ['psfex'|'mccd'|'setools'], default='$psf'\n
    -c, --cat TYPE\n
-    \tCatalogue type, one in ['final'|'flag'|'image'], default='$cat'\n
+    \tCatalogue type, one in ['final'|'flag'|'psf'|'image'], default='$cat'\n
 "
 
 ## Parse command line
@@ -31,6 +33,10 @@ while [ $# -gt 0 ]; do
       cat="$2"
       shift
       ;;
+    -p|--psf)
+      psf="$2"
+      shift
+      ;;
     *)
       echo -ne $usage
       exit 1
@@ -40,92 +46,127 @@ while [ $# -gt 0 ]; do
 done
 
 
+## Check options
+if [ "$cat" != "final" ] \
+  && [ "$cat" != "flag" ] \
+  && [ "$cat" != "psf" ] \
+  && [ "$cat" != "image" ]; then
+  echo "cat (option -c) needs to be 'final', 'flag', 'psf', or 'image'"
+  exit 2
+fi
+
+## Check options
+if [ "$psf" != "psfex" ] \
+  && [ "$psf" != "mccd" ] \
+  && [ "$psf" != "setools" ]; then
+  echo "PSF (option -p) needs to be 'psfex' or 'mccd'"
+  exit 2
+fi
+
+
 ## Functions
 function link_s () {
     target=$1
     link_name=$2
 
-    if [ -e "$link_name" ]; then
+    if [ -L "$link_name" ]; then
         echo "link with name $link_name already exists, skipping..."
+        let "n_skipped+=1"
     else
         echo "create link $target <- $link_name"
         ln -s $target $link_name
+        let "n_created+=1"
     fi
 }
 
-## Check options
-if [ "$cat" != "final" ] && [ "$cat" != "flag" ] && [ "$cat" != "image" ]; then
-  echo "cat (option -c) needs to be 'final', 'flag', or 'image'"
-  exit 2
-fi
 
+# Start program
 
-### Start ###
+n_skipped=0
+n_created=0
 
 pwd=`pwd`
 out_base="output"
 
+# Set paths:
+## run_out: target output new run directory
+## run_in: source input run base directory
+## module: source input module runner sub-directory
+## pattern: source file pattern
+
 if [ "$cat" == "final" ]; then
-  run_dir="run_sp_combined"
-  INPUT="$pwd/$out_base/run_sp_Mc_*"
+
+  run_out="run_sp_combined"
+  run_in="$pwd/$out_base/run_sp_Mc_*"
+  module="make_catalog_runner"
+  pattern="final_cat-*"
+
 elif [ "$cat" == "flag" ]; then
-  run_dir="run_sp_combined_flag"
-  INPUT="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1"
+
+  run_out="run_sp_combined_flag"
+  run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1"
+  module="mask_runner_run_1"
+  pattenr="pipeline_flag-*"
+
+elif [ "$cat" == "image" ]; then
+
+  run_out="run_sp_combined_image"
+  run_in="$pwd/$out_base/run_sp_Git_*"
+  module="get_images_runner"
+  pattern="CFIS_image-*"
+
+elif [ "$cat" == "psf" ]; then
+
+  run_out="run_sp_combined_psf"
+
+  #MKDEBUG TODO: add option
+  # v1
+  #run_in="$pwf/$out_base/run_sp_exp_Pi_*"
+  # v2
+  run_in="exp_runs/*/$out_base/"
+
+  pattern="validation_psf-*"
+  if [ "$psf" == "psfex" ]; then
+    module="psfex_interp_runner"
+  elif [ "$psf" == "setools" ]; then
+    module="setools_runner"
+  else
+    module="mccd_interp_runner"
+  fi
+
 else
-  run_dir="run_sp_combined_image"
-  INPUT="$pwd/$out_base/run_sp_Git_*"
+
+  echo "Invalid catalogue type $cat"
+  exit 2
+
 fi
 
-log_path="$pwd/$out_base/log_run_sp.txt"
-OUTPUT="$pwd/$out_base/$run_dir"
+OUTPUT="$pwd/$out_base/$run_out"
 mkdir -p $OUTPUT
 
-# Directories and file patterns to create/link
-if [ "$cat" == "final" ]; then
-  DIRS=(
-	  "make_catalog_runner"
-  )
-  PATTERNS=(
-	  "final_cat-*"
-  )
-elif [ "$cat" == "flag" ]; then
-  DIRS=(
-<<<<<<< HEAD
-	  "mask_runner_run_1"
-=======
-	  "mask_runner_run_2"
->>>>>>> bd82f95ae96043c2de6ac577dae311c74a03e133
-  )
-  PATTERNS=(
-	  "pipeline_flag-*"
-  )
-else
-  DIRS=(
-    "get_images_runner"
-  )
-  PATTERNS=(
-	  "CFIS_image-*"
-  )
-fi
 
 # Create links
-for n in "${!PATTERNS[@]}"; do
-    pattern=${PATTERNS[$n]}
-    dir=$OUTPUT/${DIRS[$n]}/output
-    echo $n $pattern $dir
-    mkdir -p $dir
-    FILES=(`find $INPUT -name "$pattern"`)
-    n_files=${#FILES[@]}
-    i=0
-    for file in ${FILES[@]}; do
-	    target=$file
-	    link_name=$dir/`basename $file`
-	    link_s $target $link_name
-        ((i=i+1))
-    done
-    echo " $n_files target files, $i links created/skipped"
+
+## target directory
+outdir=$OUTPUT/$module/output
+mkdir -p $outdir
+
+## identify source files
+FILES=(`find $run_in -name "$pattern"`)
+n_files=${#FILES[@]}
+
+## Look over source files
+i=0
+for file in ${FILES[@]}; do
+
+ target=$file
+ link_name=$outdir/`basename $file`
+ link_s $target $link_name
+ ((i=i+1))
+
 done
 
+echo " $n_files target files, $i links created/skipped"
+
 # Update log file
-modules=`echo ${DIRS[@]} | tr ' ' ,`
-echo "./$out_base/$run_dir $modules" >> $log_path
+update_runs_log_file.py

From 0d56e23b1e0cab77b6a5ed66cc7693d307e51d16 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:35:20 +0100
Subject: [PATCH 065/207] Update post_processing.md

post processing doc: linked to (new) vos_retrieve file
---
 docs/source/post_processing.md | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/docs/source/post_processing.md b/docs/source/post_processing.md
index ebd123889..017afa15f 100644
--- a/docs/source/post_processing.md
+++ b/docs/source/post_processing.md
@@ -3,10 +3,13 @@
 This page shows all required steps of post-processing the results from one or
 more `ShapePipe` runs. Post-processing combines various individual `ShapePipe`
 output files, and creates joint results, for example combining individual tile
-catalogues in a large sky area. The output of post-processing is a joint _shape
+catalogues into a large sky area. The output of post-processing is a joint _shape
 catalogue_, containing all required information to create a calibrated shear
 catalogue via _metacalibration_), a joint star catalogue, and PSF diagnostic plots.
 
+If main ShapePipe processing happened at the old canfar VM system (e.g. CFIS v0 and v1), go
+[here|vos_retrieve.md] for details how to retrieve the ShapePipe output files.
+
 Some of the following steps pertain specifically to runs carried out on [canfar](https://www.canfar.net/en),
 but most are general.
 

From fde5982c147585bededb4d1600330c4a71c3c3c6 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 14:40:42 +0000
Subject: [PATCH 066/207] prepare tiles script loop tests

---
 scripts/sh/prepare_tiles_for_final.bash | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/prepare_tiles_for_final.bash b/scripts/sh/prepare_tiles_for_final.bash
index 8aff01e00..aa2b755c2 100755
--- a/scripts/sh/prepare_tiles_for_final.bash
+++ b/scripts/sh/prepare_tiles_for_final.bash
@@ -123,7 +123,7 @@ elif [ "$cat" == "psf" ]; then
   # v1
   #run_in="$pwf/$out_base/run_sp_exp_Pi_*"
   # v2
-  run_in="exp_runs/*/$out_base/"
+  run_in="$pwd/exp_runs/*/$out_base/"
 
   pattern="validation_psf-*"
   if [ "$psf" == "psfex" ]; then
@@ -152,12 +152,15 @@ outdir=$OUTPUT/$module/output
 mkdir -p $outdir
 
 ## identify source files
-FILES=(`find $run_in -name "$pattern"`)
-n_files=${#FILES[@]}
+#FILES=(`find $run_in -type f -name "$pattern" -print0 | xargs -0 echo`)
+#n_files=${#FILES[@]}
 
 ## Look over source files
 i=0
-for file in ${FILES[@]}; do
+#for file in ${FILES[@]}; do
+
+find $run_in -type f -name "$pattern" | while IFS= read -r file; do
+
 
  target=$file
  link_name=$outdir/`basename $file`
@@ -166,7 +169,8 @@ for file in ${FILES[@]}; do
 
 done
 
-echo " $n_files target files, $i links created/skipped"
+#echo " $n_files target files, $i links created/skipped"
+echo " $i total, "n_skipped skipped, "n_created links created"
 
 # Update log file
 update_runs_log_file.py

From ac0a3399cceec843f9cde3c869793c82bd0d7f3f Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:42:00 +0100
Subject: [PATCH 067/207] curl canfar local script minor change

---
 scripts/sh/job_curl_canfar_local.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/sh/job_curl_canfar_local.sh b/scripts/sh/job_curl_canfar_local.sh
index e8a16513f..7e4f0206d 100644
--- a/scripts/sh/job_curl_canfar_local.sh
+++ b/scripts/sh/job_curl_canfar_local.sh
@@ -6,7 +6,7 @@
 rm -f session_IDs.txt session_image_IDs.txt
 
 #script_local=$HOME/astro/repositories/github/shapepipe/scripts/sh/curl_canfar_local.sh
-script_local=./curl_canfar_local.sh
+script_local=curl_canfar_local.sh
 version="0.9"
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 kind="$1"

From 4048bf17a602fee9d30b45a9a3df7dd1e93b5b75 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:54:27 +0100
Subject: [PATCH 068/207] added vos doc md file

---
 docs/source/vos_retrieve.md | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 docs/source/vos_retrieve.md

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
new file mode 100644
index 000000000..74c590b3a
--- /dev/null
+++ b/docs/source/vos_retrieve.md
@@ -0,0 +1,14 @@
+## Retrieve files from VOspace
+
+This page describes how ShapePipe output files can be retrieved via the Virtual Observatory Space
+on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete.
+
+1. Retrieve ShapePipe result files 
+
+  For a local run on the same machine as for post-processing, nothing needs to be done. In some cases, the run was carried out on a remote machine or cluster, and the resulting ShapePipe output files need to be retrieved.
+
+  In the specific case of canfar_avail_results.py, this is done as follows.
+
+    A. Check availability of results
+
+      A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check which tiles have finished running, and whose results have been uploaded, use

From 0a3f80e94333ddbbc57deee10d09b0c58948d8f0 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:55:12 +0100
Subject: [PATCH 069/207] Update post_processing.md

---
 docs/source/post_processing.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/source/post_processing.md b/docs/source/post_processing.md
index 017afa15f..555ffdf85 100644
--- a/docs/source/post_processing.md
+++ b/docs/source/post_processing.md
@@ -8,7 +8,7 @@ catalogue_, containing all required information to create a calibrated shear
 catalogue via _metacalibration_), a joint star catalogue, and PSF diagnostic plots.
 
 If main ShapePipe processing happened at the old canfar VM system (e.g. CFIS v0 and v1), go
-[here|vos_retrieve.md] for details how to retrieve the ShapePipe output files.
+[here](vos_retrieve.md) for details how to retrieve the ShapePipe output files.
 
 Some of the following steps pertain specifically to runs carried out on [canfar](https://www.canfar.net/en),
 but most are general.

From d81bdf2de69034c45450d5b57b2fa87e2b7b5508 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:55:45 +0100
Subject: [PATCH 070/207] Update vos_retrieve.md

---
 docs/source/vos_retrieve.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
index 74c590b3a..9c82dbd44 100644
--- a/docs/source/vos_retrieve.md
+++ b/docs/source/vos_retrieve.md
@@ -9,6 +9,6 @@ on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete
 
   In the specific case of canfar_avail_results.py, this is done as follows.
 
-    A. Check availability of results
+  A. Check availability of results
 
-      A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check which tiles have finished running, and whose results have been uploaded, use
+    A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check which tiles have finished running, and whose results have been uploaded, use

From 672001da1cad9eb274494e2779420189c53085cf Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:56:31 +0100
Subject: [PATCH 071/207] Update vos_retrieve.md

---
 docs/source/vos_retrieve.md | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
index 9c82dbd44..1527e482f 100644
--- a/docs/source/vos_retrieve.md
+++ b/docs/source/vos_retrieve.md
@@ -5,10 +5,11 @@ on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete
 
 1. Retrieve ShapePipe result files 
 
-  For a local run on the same machine as for post-processing, nothing needs to be done. In some cases, the run was carried out on a remote machine or cluster, and the resulting ShapePipe output files need to be retrieved.
+   For a local run on the same machine as for post-processing, nothing needs to be done. In some cases, the run was carried out on a remote machine or cluster, and the resulting ShapePipe output files  
+  need to be retrieved.
 
-  In the specific case of canfar_avail_results.py, this is done as follows.
+   In the specific case of canfar_avail_results.py, this is done as follows.
 
-  A. Check availability of results
+   A. Check availability of results
 
-    A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check which tiles have finished running, and whose results have been uploaded, use
+      A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check which tiles have finished running, and whose results have been uploaded, use

From cc96a0c468e167d50398ce8c5aa8d98ded34312f Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:56:49 +0100
Subject: [PATCH 072/207] Update vos_retrieve.md

---
 docs/source/vos_retrieve.md | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
index 1527e482f..7beb79611 100644
--- a/docs/source/vos_retrieve.md
+++ b/docs/source/vos_retrieve.md
@@ -10,6 +10,7 @@ on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete
 
    In the specific case of canfar_avail_results.py, this is done as follows.
 
-   A. Check availability of results
+   A. Check availability of results  
 
-      A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check which tiles have finished running, and whose results have been uploaded, use
+      A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check 
+      which tiles have finished running, and whose results have been uploaded, use

From 87bb2b7b440809d2e912d66ec0cdaeefc95c50ba Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:57:11 +0100
Subject: [PATCH 073/207] Update vos_retrieve.md

---
 docs/source/vos_retrieve.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
index 7beb79611..ff0a4ef8e 100644
--- a/docs/source/vos_retrieve.md
+++ b/docs/source/vos_retrieve.md
@@ -10,7 +10,7 @@ on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete
 
    In the specific case of canfar_avail_results.py, this is done as follows.
 
-   A. Check availability of results  
+   1. Check availability of results  
 
       A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check 
       which tiles have finished running, and whose results have been uploaded, use

From 76c08a607c3f19c21782d585c39ad431a8514297 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:58:57 +0100
Subject: [PATCH 074/207] Update vos_retrieve.md

copied vos sections
---
 docs/source/vos_retrieve.md | 35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
index ff0a4ef8e..c0374cd19 100644
--- a/docs/source/vos_retrieve.md
+++ b/docs/source/vos_retrieve.md
@@ -13,4 +13,37 @@ on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete
    1. Check availability of results  
 
       A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check 
-      which tiles have finished running, and whose results have been uploaded, use
+      which tiles have finished running, and whose results have been uploaded, use 
+      ```bash
+      canfar_avail_results -i tile_numbers.txt -v -p PSF --input_path INPUT_PATH
+      ```
+      where PSF is one in [`psfex`|`mccd`], and INPUT_PATH the input path on vos, default `vos:cfis/cosmostat/kilbinger/results`.
+      See `-h` for all options.
+
+   2. Download results
+
+      All results files will be downloaded with
+      ```bash
+      canfar_download_results -i tile_numbers.txt -v -p PSF --input_vos INPUT_VOS
+      ```
+      Use the same options as for same as for `canfar_avail_results`.
+      
+      This command can be run in the same directory at subsequent times, to complete an ongoing run: Only newer files will be downloaded
+      from the `vos` directory. This also assures that partially downloaded or corrupt files will be replaced.
+
+      Checking the `vos` directorty can be slow for large patches.
+      To only download files that are not yet present locally (in `.`), first write the missing ones to an ascii file, using again the
+      script `canfar_avail_results`, but this time with `.` as input path:
+      ```bash
+      canfar_avail_results -i tile_numbers.txt --input_path . -p PSF -v -o missing.txt
+      '''
+      Then, download only the missing files with
+      ```bash
+      canfar_download_results -i missing.txt --input_vos cosmostat/kilbinger/results_mccd_oc2 -p mccd -v
+      ```
+
+   3. Un-tar results
+     ```bash
+      untar_results -p PSF
+      ```
+      On success, `ShapePipe` output `fits` and `log` files will be now in various subdirs of the `output` directory.

From faa0836e811af6f70c8525075ccc7f8c3bd373a7 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:59:14 +0100
Subject: [PATCH 075/207] Update vos_retrieve.md

---
 docs/source/vos_retrieve.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
index c0374cd19..2d7183813 100644
--- a/docs/source/vos_retrieve.md
+++ b/docs/source/vos_retrieve.md
@@ -36,7 +36,7 @@ on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete
       script `canfar_avail_results`, but this time with `.` as input path:
       ```bash
       canfar_avail_results -i tile_numbers.txt --input_path . -p PSF -v -o missing.txt
-      '''
+      ```
       Then, download only the missing files with
       ```bash
       canfar_download_results -i missing.txt --input_vos cosmostat/kilbinger/results_mccd_oc2 -p mccd -v

From 85f6d91d11b5b52b54b44ca44823df865c740cbb Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 15:59:49 +0100
Subject: [PATCH 076/207] Update vos_retrieve.md

---
 docs/source/vos_retrieve.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md
index 2d7183813..3606752c8 100644
--- a/docs/source/vos_retrieve.md
+++ b/docs/source/vos_retrieve.md
@@ -47,3 +47,5 @@ on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete
       untar_results -p PSF
       ```
       On success, `ShapePipe` output `fits` and `log` files will be now in various subdirs of the `output` directory.
+
+At this step all required `ShapePipe` resulting output files are available in the current working directory.

From 4f816359e6c6ea47069a2d0ca9821e62de06d859 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 16:46:04 +0000
Subject: [PATCH 077/207] combine runs script renamed

---
 scripts/python/summary_run.py                 |  14 +-
 ...tiles_for_final.bash => combine_runs.bash} |  29 +-
 scripts/sh/post_proc_sp.bash                  |   4 +-
 shapepipe/utilities/summary.py                | 672 ++++++++++++++++++
 4 files changed, 701 insertions(+), 18 deletions(-)
 rename scripts/sh/{prepare_tiles_for_final.bash => combine_runs.bash} (88%)
 create mode 100755 shapepipe/utilities/summary.py

diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index df44a7be7..bfd926194 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -147,6 +147,16 @@ def main(argv=None):
         verbose=verbose,
     )
 
+
+    jobs["1024"] = job_data(
+        "1024",
+        "run_sp_combined_psf",
+        ["psfex_interp_runner"],
+        "shdus",
+        path_left=f"{main_dir}/output",
+        verbose=verbose
+    )
+
     job_data.print_stats_header()
 
     for key in "1":
@@ -168,8 +178,8 @@ def main(argv=None):
 
     print_par_runtime(par_runtime, verbose=verbose)
 
-    for key in ["2", "4", "8", "16", "32", "64", "128"]:
-    #for key in ["128"]:
+    #for key in ["2", "4", "8", "16", "32", "64", "128"]:
+    for key in ["1024"]:
         job = jobs[key]
         job.print_intro()
         job.check_numbers(par_runtime=par_runtime)
diff --git a/scripts/sh/prepare_tiles_for_final.bash b/scripts/sh/combine_runs.bash
similarity index 88%
rename from scripts/sh/prepare_tiles_for_final.bash
rename to scripts/sh/combine_runs.bash
index aa2b755c2..b26ab39b5 100755
--- a/scripts/sh/prepare_tiles_for_final.bash
+++ b/scripts/sh/combine_runs.bash
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-# Name: prepare_tiles_for_final.bash
+# Name: combine_runs.bash
 # Description: Create new shapepipe run directory with
 #              links to source files from combined existing runs
 # Author: Martin Kilbinger <martin.kilbinger@cea.fr>
@@ -94,31 +94,28 @@ out_base="output"
 ## module: source input module runner sub-directory
 ## pattern: source file pattern
 
+run_out="run_sp_combined_$cat"
+
 if [ "$cat" == "final" ]; then
 
-  run_out="run_sp_combined"
   run_in="$pwd/$out_base/run_sp_Mc_*"
   module="make_catalog_runner"
   pattern="final_cat-*"
 
 elif [ "$cat" == "flag" ]; then
 
-  run_out="run_sp_combined_flag"
   run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1"
   module="mask_runner_run_1"
   pattenr="pipeline_flag-*"
 
 elif [ "$cat" == "image" ]; then
 
-  run_out="run_sp_combined_image"
   run_in="$pwd/$out_base/run_sp_Git_*"
   module="get_images_runner"
   pattern="CFIS_image-*"
 
 elif [ "$cat" == "psf" ]; then
 
-  run_out="run_sp_combined_psf"
-
   #MKDEBUG TODO: add option
   # v1
   #run_in="$pwf/$out_base/run_sp_exp_Pi_*"
@@ -141,6 +138,7 @@ else
 
 fi
 
+
 OUTPUT="$pwd/$out_base/$run_out"
 mkdir -p $OUTPUT
 
@@ -152,20 +150,23 @@ outdir=$OUTPUT/$module/output
 mkdir -p $outdir
 
 ## identify source files
+
+# The following can result in an "Argument list too long" error
 #FILES=(`find $run_in -type f -name "$pattern" -print0 | xargs -0 echo`)
-#n_files=${#FILES[@]}
 
-## Look over source files
 i=0
-#for file in ${FILES[@]}; do
+for dir in $run_in; do
+  FILES=(`find $dir -type f -name "$pattern" -print0 | xargs -0 echo`)
 
-find $run_in -type f -name "$pattern" | while IFS= read -r file; do
+  ## Look over source files
+  for file in ${FILES[@]}; do
 
+  target=$file
+  link_name=$outdir/`basename $file`
+  link_s $target $link_name
+  ((i=i+1))
 
- target=$file
- link_name=$outdir/`basename $file`
- link_s $target $link_name
- ((i=i+1))
+  done
 
 done
 
diff --git a/scripts/sh/post_proc_sp.bash b/scripts/sh/post_proc_sp.bash
index 72c620e68..930d5b79d 100755
--- a/scripts/sh/post_proc_sp.bash
+++ b/scripts/sh/post_proc_sp.bash
@@ -70,7 +70,7 @@ SP_CONFIG=$SP_BASE/example/cfis
 # PSF
 
 ## Collect all psfinterp results 
-prepare_star_cat -p $psf
+combine_runs -p $psf -t psf
 
 ## Merge all psfinterp results and compute PSF residuals
 shapepipe_run -c $SP_CONFIG/config_MsPl_$psf.ini 
@@ -79,7 +79,7 @@ shapepipe_run -c $SP_CONFIG/config_MsPl_$psf.ini
 # Galaxies
 
 ## Prepare output directory with links to all 'final_cat' result files
-prepare_tiles_for_final
+combine_runs
 
 ## Merge final output files to single mother catalog
 input_final=output/run_sp_combined/make_catalog_runner/output
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
new file mode 100755
index 000000000..ac69c86a1
--- /dev/null
+++ b/shapepipe/utilities/summary.py
@@ -0,0 +1,672 @@
+"""SUMMARY
+
+Author: Martin Kilbinger <martin.kilbinger@cea.fr>
+
+"""
+
+import sys
+import os
+import re
+import fnmatch
+
+import logging
+
+from collections import Counter
+
+from tqdm import tqdm
+
+
+def get_IDs_from_file(path):
+    """Get IDs From File.
+
+    Return IDs from text file. Removes letters and replaces
+    dots "." with dashes "-".
+
+    Parameters
+    ----------
+    path: str
+        input file path
+
+    Returns
+    --------
+    list
+        IDs
+
+    """
+    numbers = []
+    with open(path) as f_in:
+        for line in f_in:
+            entry = line.rstrip()
+            number = re.sub("[a-zA-Z]", "", entry)
+            numbers.append(number)
+
+    return numbers
+
+
+
+def get_all_exposures(exp_number_file_list, verbose=False):
+    """Get All Exposures.
+
+    Return all exposure names from a list of text files.
+
+    Parameters
+    ----------
+    exp_number_list: list
+        input file names
+
+    """
+    exposures = set()
+    for idx, path in enumerate(exp_number_file_list):
+        exps = get_IDs_from_file(path)
+        exposures.update(exps)
+
+    return list(exposures)
+
+
+def get_all_shdus(exposures, n_CCD):
+    """Get All SHDUs.
+
+    Return all single-exposure single-HDU (CCD) IDs.
+
+    Parameters
+    ----------
+    exposures: list
+        exposure names
+    n_CCD: int
+        number of CCDs per exposure
+
+    Returns
+    --------
+    list
+        single-exposure single-HDU IDs
+
+    """
+    shdus = []
+    for exposure in exposures:
+        for idx_CCD in range(n_CCD):
+            shdus.append(f"{exposure}-{idx_CCD}")
+
+    return shdus
+
+
+def set_as_list(item=None, n=None, default=1):
+    """Set As List.
+
+    Return input as list.
+
+    Parameters
+    -----------
+    item: str, int, or list, optional
+        input item(s); default is None, in which
+        case the return is [1] * n
+    n: int, optional
+        number of list items to return, default is None,
+        in which case the number will be set to 1. If item and
+        n are not None, n has to be equal to len(item)
+    default: int, optional
+        value to return if item is not given;
+        default is 1
+
+    Raises
+    -------
+    IndexError
+        if n != len(item)
+
+    Returns
+    -------
+    list
+        input item(s) as list
+    """
+    my_n = n or 1
+
+    if not item:
+        result = [default] * my_n
+    elif not isinstance(item, list):
+        result = [item] * my_n
+    else:
+        result = item
+        if len(item) != my_n:
+            raise IndexError(f"item has length {len(item)} != {n}")
+
+    return result
+
+
+def check_special(module, paths_in_dir, names_in_dir):
+
+    if module == "setools_runner":
+        inds_special = []
+        for idx in range(len(paths_in_dir)):
+            base_path = paths_in_dir[idx].replace(names_in_dir[idx], "")
+
+            stats_dir = f"{base_path}/../stat"
+            stats_files = os.listdir(stats_dir)
+            if len(stats_files) != 1:
+                raise ValueError(
+                    f"Expected exactly one stats file in {stats_dir}, not"
+                    + f" {len(stats_files)}"
+                )
+
+            stats_path = os.path.join(stats_dir, stats_files[0])
+            with open(stats_path) as f_in:
+                lines = f_in.readlines()
+                for line in lines:
+                    entry = line.rstrip()
+                    m = re.search(line, "Nb stars = (\S*)")
+                    if m:
+                        value = int(m[2])
+                        if value == 0:
+                            inds_special.append(idx)
+                        else:
+                            print(f"b stars = {value}, not special")
+                        break
+
+        print(inds_special)
+        for idx in inds_special:
+            paths_in_dir.pop(idx)
+            names_in_dir.pop(idx)
+
+        return paths_in_dir, names_in_dir, len(inds_special)
+
+
+class job_data(object):
+    """Job Data.
+
+    Class to handle a job.
+
+    Parameters
+    ----------
+    bit: int
+        bit-coded job number
+    run_dir: str or list
+        run directory(ies)
+    modules: list
+        module names
+    key_expected: int or str
+        number of expected output files; if str: will be updated
+        with runtime value
+    n_mult: int or list, optional
+        multiplicity of output files, default `None`, in which
+        case it is set to 1
+    pattern: list, optional
+        if not None, file pattern to match; defafult is `None`
+    path_lef: str, optional
+        left (first) part of output directory, defaul is "./output"
+    output_subdirs: str, optional
+        output subdirectories if not `None`; default is `None`
+    path_right: str, optional
+        right (last) part of output subdir suffix if not `None`;
+        default is `None`
+    output_path_missing_IDs: list, optional
+        output path of missing ID, if `None` (default) will be
+        given by job bit and module.
+    verbose: bool, optional
+        verbose output if True; default is False
+
+    """
+    def __init__(
+        self,
+        bit,
+        run_dir,
+        modules,
+        key_expected,
+        n_mult=None,
+        pattern=None,
+        path_left="./output",
+        output_subdirs=None,
+        path_right=None,
+        output_path_missing_IDs=None,
+        verbose=False,
+    ):
+        self._bit = bit
+        self._run_dir = set_as_list(item=run_dir, n=len(modules))
+        self._modules = modules
+        self._key_expected = set_as_list(item=key_expected, n=len(modules))
+        self._n_mult = set_as_list(item=n_mult, n=len(modules))
+        self._pattern = set_as_list(item=pattern, n=len(modules), default="")
+        self._path_left = path_left
+        self._output_subdirs = output_subdirs or [""]
+        self._path_right = set_as_list(
+            path_right, len(modules), default="."
+        )
+        self._output_path_missing_IDs=output_path_missing_IDs
+        self._verbose = verbose
+
+    def print_intro(self):
+        """Print Intro.
+
+        Print header line for job statistics.
+
+        """
+        logging.info(f" (Job {self._bit})")
+
+    @classmethod
+    def print_stats_header(self):
+        """Print Stats Header.
+
+        Print overall header information for stats output.
+
+        """
+        logging.info(
+            "module                          expected     found   miss_expl"
+            + " missing uniq_miss  fr_found"
+        )
+        logging.info("=" * 100)
+
+    @classmethod
+    def print_stats(
+        self,
+        module,
+        n_expected,
+        n_found,
+        n_missing_explained,
+        n_missing,
+        n_mult,
+    ):
+        """Print Stats.
+
+        Print output file statistics.
+
+        Parameters
+        ----------
+        module: str
+            module name
+        n_expected: int
+            number of expected files
+        n_found: int
+            number of found files
+        n_missing_explained: int
+            number of missing but explained files
+        n_missing: int
+            number of missing files
+        n_mult: int
+            multipicity
+
+        """
+        if n_expected > 0:
+            fraction_found = n_found / n_expected
+        else:
+            fraction_found = 1
+
+        n_missing_per_mult = n_missing / n_mult
+
+        logging.info(
+            f"{module:30s} {n_expected:9d} {n_found:9d}"
+            + f" {n_missing_explained:9d} {n_missing:9d}"
+            + f" {n_missing_per_mult:9.1f} {fraction_found:9.1%}"
+        )
+
+    @classmethod
+    def is_ID_in_str(self, ID, path):
+        if ID in path:
+            return True
+        #if re.sub("\.", "-", ID) in path:
+            #return True
+        #return False
+
+    @classmethod
+    def is_not_in_any(self, ID, list_str):
+        return not any(ID in string for string in list_str)
+
+    @classmethod
+    def replace_dot_dash(self, numbers):
+
+        results = [re.sub("\.", "-", number) for number in numbers]
+
+        return results
+
+    @classmethod
+    def replace_dash_dot_if_tile(self, numbers):
+
+        pattern = re.compile(r"(\d{3})-(\d{3})")
+        results = [pattern.sub(r"\1.\2", number) for number in numbers]
+    
+        return results
+
+    @classmethod
+    def get_unique(self, names):
+        n_all = len(names)
+        names_unique = list(set(names))
+        n_unique = len(names_unique)
+
+        if n_all != n_unique:
+            if True:  # self._verbose:
+                logging.warning(
+                    f"{n_all - n_unique} duplicates removed from {n_all} IDs"
+                )
+
+        return names_unique
+
+    @classmethod
+    def write_IDs_to_file(self, output_path, IDs):
+        """Write IDs to file.
+
+        Write list if image IDs to text file.
+
+        Parameters
+        ----------
+        output_path: str
+            output file path
+        IDs: list
+            image IDs
+
+        """
+        IDs_dot = self.replace_dash_dot_if_tile(IDs)
+        with open(output_path, "w") as f_out:
+            for ID in IDs_dot:
+                print(ID, file=f_out)
+
+    def output_missing(
+        self,
+        module,
+        idx,
+        par_runtime=None,
+    ):
+        """Output Missing.
+
+        Writes IDs of missing images to disk.
+
+        """
+        key_expected = self._key_expected[idx]
+        names_in_dir = self._names_in_dir[idx]
+        paths_in_dir = self._paths_in_dir[idx]
+        n_mult = self._n_mult[idx]
+
+        list_expected = get_par_runtime(par_runtime, key_expected, kind="list")
+        
+        # Count image IDs in names that were found earlier
+
+        ## Extract image IDs from names
+        IDs = []
+        pattern = re.compile(r"(?:\d{3}-\d{3}|\d{7}-\d+)")
+        for name, path in zip(names_in_dir, paths_in_dir):
+            match = pattern.search(name)
+            if match:
+                IDs.append(match.group())
+            else:
+                raise ValueError(f"No ID found in {name}")
+
+
+        ## Count occurences
+        ID_counts = Counter(IDs)
+
+        ## Add to missing if ocurence less than n_mult
+        missing_IDs = []
+        for ID in list_expected:
+            if ID_counts[ID] < n_mult:
+                missing_IDs.append(ID)
+
+        n_all = len(missing_IDs)
+        missing_IDs_unique = self.get_unique(missing_IDs)
+        n_unique = len(missing_IDs_unique)
+
+        if n_unique > 0:
+            if not self._output_path_missing_IDs:
+                output_path = f"missing_job_{self._bit}_{module}.txt"
+            else:
+                output_path = self._output_path_missing_IDs[idx]
+
+        self.write_IDs_to_file(output_path, missing_IDs_unique)
+
+        return missing_IDs_unique
+
+    def output_missing_job(self):
+        output_path = f"missing_job_{self._bit}_all.txt"
+
+        missing_IDs_all = set(self._missing_IDs_job)
+
+        if len(missing_IDs_all) > 0:
+            self.write_IDs_to_file(output_path, missing_IDs_all)
+        else:
+            logging.warning("no missing IDs in output_missing_job")
+
+    @classmethod
+    def get_last_full_path(self, base_and_subdir, matches):
+        """Get Last Full Path
+
+        Return full path of last file in list.
+
+        """
+        # Sort according to creation time
+        matches_sorted = sorted(
+            matches,
+            key=lambda entry: entry.name,
+        )
+
+        # Get most recent one
+        last = matches_sorted[-1]
+
+        # Get full path
+        full_path = os.path.join(base_and_subdir, last.name)
+
+        return full_path
+
+    @classmethod
+    def get_module_output_dir(self, full_path, module):
+        """Get Module Output Dir.
+
+        Return output directory name for given module.
+
+        """
+        directory = f"{full_path}/{module}/output"
+
+        # Some modules have special requirements 
+        if module == "setools_runner":
+            directory = f"{directory}/rand_split"
+
+        return directory
+
+    def get_matches_final(self, directory, idx):
+
+        # Look over files
+        # os.path.whether exists is twice faster than try/except
+
+        if os.path.exists(directory):
+            pattern =  f"{self._pattern[idx]}*"
+            for entry2 in os.scandir(directory):
+                if (
+                    entry2.is_file()
+                    and (
+                        fnmatch.fnmatch(entry2.name, pattern)
+                    )
+                ):
+                    # Append matching files
+                    self._names_in_dir[idx].append(entry2.name)
+                    self._paths_in_dir[idx].append(
+                        os.path.join(directory, entry2.name)
+                    )
+
+        #if os.path.exists(directory):
+            #with os.scandir(directory) as entries2:
+                #files = [
+                    #entry2.name
+                    #for entry2 in entries2
+                    #if entry2.name.startswith(self._pattern[idx])
+                #]
+
+                ## Append matching files
+                #self._names_in_dir[idx].extend(files)
+                #self._paths_in_dir[idx].extend(
+                    #[os.path.join(directory, file)
+                    #for file in files]
+                #)
+
+    def get_names_in_dir(self, iterable, module, idx):
+
+        # Initialise output file names and paths
+        self._names_in_dir[idx] = []
+        self._paths_in_dir[idx] = []
+
+        # Loop over subdirs
+        for jdx, subdir in enumerate(iterable):
+            base_and_subdir = (
+                f"{self._path_left}/{subdir}/"
+                + f"{self._path_right[idx]}"
+            )
+            print("MKDEBUG ", base_and_subdir)
+            if os.path.isdir(base_and_subdir):
+
+                matches = []
+
+                # Loop over entries (files and dirs)
+                with os.scandir(base_and_subdir) as entries:
+                    for entry in entries:
+
+                        print("MKDEBUG ", entry, self._run_dir[idx])
+                        # Append directory name if matches module
+                        if entry.name.startswith(self._run_dir[idx]):
+                            print("MKDEBUG matches")
+                            matches.append(entry)
+
+                    # This entry does not match module -> next
+                    if not matches:
+                        continue
+
+                    full_path = self.get_last_full_path(
+                        base_and_subdir, matches
+                    )
+
+                    # Get module output directory
+                    directory = self.get_module_output_dir(
+                        full_path, module
+                    )
+                    print("MKDEBUG ", directory)
+
+                    # Find matching file names and paths
+                    self.get_matches_final(directory, idx)
+            else:
+                print(f"Directory base_and_subdir {base_and_subdir} not found")
+
+    def update_subdirs(self, par_runtime):
+        """Update Subdirs.
+
+        Update subdir names with runtime information if required.
+
+        """
+        if not isinstance(self._output_subdirs, list):
+            self._output_subdirs = get_par_runtime(
+                par_runtime, self._output_subdirs, kind="list"
+            )
+
+    def check_numbers(self, par_runtime=None, indices=None):
+        """Check Numbers.
+
+        Check output file numbers and IDs.
+
+        Parameters
+        ----------
+        par_runtime : dict, optional
+            runtime parameter. default is None
+        indices: list, optional
+            if not None (default), only check modules corresponding
+            to indices
+
+        """
+        # Update subdirs if not already set as list
+        self.update_subdirs(par_runtime)
+
+        # Initialise variables
+        self._names_in_dir = {}
+        self._paths_in_dir = {}
+        self._missing_IDs_job = []
+        n_missing_job = 0
+
+        # Loop over modules
+        for idx, module in enumerate(self._modules):
+            if indices is not None and idx not in indices:
+                continue
+
+            # Look over subdirs
+            iterable = self._output_subdirs
+            if len(iterable) > 1 and self._verbose:
+                iterable = tqdm(iterable, desc="subdirs", leave=False)
+
+            # Get output file names and paths
+            self.get_names_in_dir(
+                iterable,
+                module,
+                idx,
+            )
+
+            # If expected is string: Update parameter with runtime value
+            # and set as integer
+            if isinstance(self._key_expected[idx], str):
+                n_expected_base = get_par_runtime(
+                    par_runtime, self._key_expected[idx], kind="n"
+                )
+            else:
+                n_expected_base = self._key_expected[idx]
+
+            # Get some numbers
+            n_found = len(self._names_in_dir[idx])
+            n_expected = n_expected_base * self._n_mult[idx]
+            n_missing = n_expected - n_found
+
+            n_missing_explained = 0
+            if n_missing > 0:
+                # TODO: make check_special class function, deal with
+                # paths, names in dir
+                if False and module == "setools_runner":
+                    (
+                        self._paths_in_dir[idx],
+                        self._names_in_dir[idx],
+                        n_missing_explained,
+                    ) = check_special(module, paths_in_dir, names_in_dir)
+
+                n_missing = n_missing - n_missing_explained
+
+            # Print statistics
+            self.print_stats(
+                module,
+                n_expected,
+                n_found,
+                n_missing_explained,
+                n_missing,
+                self._n_mult[idx],
+            )
+
+            # Write missing IDs for module to file
+            if n_missing > 0:
+                missing_IDs = self.output_missing(
+                    module,
+                    idx,
+                    par_runtime=par_runtime,
+                )
+                n_missing_job += n_missing
+                self._missing_IDs_job.extend(missing_IDs)
+
+        # Write missing IDs for entire job to file
+        if n_missing_job > 0:
+            self.output_missing_job()
+
+
+def get_par_runtime(par_runtime, key, kind="n"):
+    """Get Par RunTime.
+
+    Return runtime parameter value.
+
+    Parameters
+    ----------
+    par_runtime: dict
+        runtime parameter
+    key: str
+        key
+
+    """
+    combined_key = f"{kind}_{key}"
+    return par_runtime[combined_key]
+
+
+def print_par_runtime(par_runtime, verbose=True):
+    # Print runtime parameter values
+    if verbose:
+        logging.info("")
+        logging.info("===========")
+        logging.info("par_runtime")
+        logging.info("-----------")
+        for key, value in par_runtime.items():
+            if not key.startswith("list"):
+                logging.info(f"{key:30s} {value:6d}")
+            else:
+                logging.info(f"{key:29s} [{len(value):6d}]")
+        logging.info("===========")
+        logging.info("")

From d4cb47ce14ed9f8fcdd38af42cf4f68488f22560 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 25 Dec 2023 18:02:41 +0100
Subject: [PATCH 078/207] Update post_processing.md

cleaned up psf post proc
---
 docs/source/post_processing.md | 77 ++++++----------------------------
 1 file changed, 13 insertions(+), 64 deletions(-)

diff --git a/docs/source/post_processing.md b/docs/source/post_processing.md
index 555ffdf85..8d9922dbb 100644
--- a/docs/source/post_processing.md
+++ b/docs/source/post_processing.md
@@ -10,59 +10,7 @@ catalogue via _metacalibration_), a joint star catalogue, and PSF diagnostic plo
 If main ShapePipe processing happened at the old canfar VM system (e.g. CFIS v0 and v1), go
 [here](vos_retrieve.md) for details how to retrieve the ShapePipe output files.
 
-Some of the following steps pertain specifically to runs carried out on [canfar](https://www.canfar.net/en),
-but most are general.
-
-1. Retrieve `ShapePipe` result files
-
-   For a local run on the same machine as for post-processing, nothing needs to be done.
-   In some cases, the run was carried out on a remote machine or cluster, and the resulting `ShapePipe`
-   output files need to be retrieved.
-   
-   In the specific case of canfar_avail_results.py, this is done as follows.
-   
-   A. Check availability of results
-
-      A `canfar` job can submit a large number of tiles, whose processing time can vary a lot.
-      We assume that the submitted tile ID list is available locally via the ascii file `tile_numbers.txt`. 
-      To check which tiles have finished running, and whose results have been uploaded, use
-      ```bash
-      canfar_avail_results -i tile_numbers.txt -v -p PSF --input_path INPUT_PATH
-      ```
-      where PSF is one in [`psfex`|`mccd`], and INPUT_PATH the input path on vos, default `vos:cfis/cosmostat/kilbinger/results`.
-      See `-h` for all options.
-
-   B. Download results
-
-      All results files will be downloaded with
-      ```bash
-      canfar_download_results -i tile_numbers.txt -v -p PSF --input_vos INPUT_VOS
-      ```
-      Use the same options as for same as for `canfar_avail_results`.
-      
-      This command can be run in the same directory at subsequent times, to complete an ongoing run: Only newer files will be downloaded
-      from the `vos` directory. This also assures that partially downloaded or corrupt files will be replaced.
-
-      Checking the `vos` directorty can be slow for large patches.
-      To only download files that are not yet present locally (in `.`), first write the missing ones to an ascii file, using again the
-      script `canfar_avail_results`, but this time with `.` as input path:
-      ```bash
-      canfar_avail_results -i tile_numbers.txt --input_path . -p PSF -v -o missing.txt
-      '''
-      Then, download only the missing files with
-      ```bash
-      canfar_download_results -i missing.txt --input_vos cosmostat/kilbinger/results_mccd_oc2 -p mccd -v
-      ```
-
-   C. Un-tar results
-     ```bash
-      untar_results -p PSF
-      ```
-      On success, `ShapePipe` output `fits` and `log` files will be now in various subdirs of the `output` directory.
-
-At this step all required `ShapePipe` resulting output files are available in the current working directory.
-
-2. Optional: Split output in sub-samples
+1. Optional: Split output into sub-samples
 
    An optional intermediate step is to create directories for sub-samples, for example one directory
    for each patch on the sky. This will create symbolic links to the results `.tgz` files downloaded in
@@ -73,33 +21,34 @@ At this step all required `ShapePipe` resulting output files are available in th
     ```
     The following steps will then be done in the directory `tiles_W3`.
 
-3. Run PSF diagnostics, create merged catalogue
+2. Run PSF diagnostics, create merged catalogue
 
    Type
    ```bash
    post_proc_sp -p PSF
    ```
-   to automatically perform a number of post-processing steps. Chose the PSF model with the option
+   to automatically perform a number of post-processing steps. Choose the PSF model with the option
    `-p psfex|mccd`. In detail, these are (and can also be done individually
    by hand):
    
-   A. Analyse psf validation files
+   1. Analyse psf validation files
    
       ```bash
-      prepare_star_cat -p PSF
+      combine_runs -t psf -p PSF
       ```
       with options as for `post_proc_sp`.
-      This script identifies all psf validation files (from all processed tiles downloaded to `pwd`), creates symbolic links,
-      merges the catalogues, and creates plots of PSF ellipticity, size, and residuals over the focal plane.
+      This script creates a new combined psf run in the ShapePipe `output` directory, by identifying all psf validation files
+      and creating symbolic links. The run log file is updated.
 
-   B. Create plots of the PSF and their residuals in the focal plane, as a diagnostic of the overall PSF model.
-     As a scale-dependend test, which propagates directly to the shear correlation function, the rho statistics are computed,
-     see {cite:p}`rowe:10` and {cite:p}`jarvis:16`,
+   3. Merge individual psf validation files into one catalogue. Create plots of the PSF and their residuals in the focal plane,
+      as a diagnostic of the overall PSF model.
+      As a scale-dependend test, which propagates directly to the shear correlation function, the rho statistics are computed,
+      see {cite:p}`rowe:10` and {cite:p}`jarvis:16`,
       ```bash
       shapepipe_run -c /path/to/shapepipe/example/cfis/config_MsPl_PSF.ini
       ``` 
 
-   C. Prepare output directory
+   4. Prepare output directory
    
       Create links to all 'final_cat' result files with 
       ```bash
@@ -108,7 +57,7 @@ At this step all required `ShapePipe` resulting output files are available in th
       The corresponding output directory that is created is `output/run_sp_combined/make_catalog_runner/output`.
       On success, it contains links to all `final_cat` output catalogues
 
-   D. Merge final output files
+   5. Merge final output files
    
       Create a single main shape catalog:
       ```bash

From 2ffba3b486afac805100caf98fa61f35461c2b47 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 26 Dec 2023 10:45:25 +0000
Subject: [PATCH 079/207] P3 proceesing to final cat

---
 example/cfis/config_MsPl_psfex.ini |  4 +-
 example/cfis/config_Ms_psfex.ini   | 68 ++++++++++++++++++++++++++++++
 scripts/sh/combine_runs.bash       |  8 +++-
 scripts/sh/job_sp_canfar.bash      | 11 ++---
 shapepipe/utilities/summary.py     |  4 --
 5 files changed, 79 insertions(+), 16 deletions(-)
 create mode 100644 example/cfis/config_Ms_psfex.ini

diff --git a/example/cfis/config_MsPl_psfex.ini b/example/cfis/config_MsPl_psfex.ini
index 7fcb3ba20..d21fdd126 100644
--- a/example/cfis/config_MsPl_psfex.ini
+++ b/example/cfis/config_MsPl_psfex.ini
@@ -35,7 +35,7 @@ LOG_NAME = log_sp
 RUN_LOG_NAME = log_run_sp
 
 # Input directory, containing input files, single string or list of names
-INPUT_DIR = $SP_RUN/psf_validation_ind
+INPUT_DIR = $SP_RUN/output
 
 # Output directory
 OUTPUT_DIR = $SP_RUN/output
@@ -54,7 +54,7 @@ TIMEOUT = 96:00:00
 ## Module options
 [MERGE_STARCAT_RUNNER]
 
-INPUT_DIR = psf_validation_ind
+INPUT_DIR = last:psfex_interp_runner
 
 PSF_MODEL = psfex
 
diff --git a/example/cfis/config_Ms_psfex.ini b/example/cfis/config_Ms_psfex.ini
new file mode 100644
index 000000000..5a105e773
--- /dev/null
+++ b/example/cfis/config_Ms_psfex.ini
@@ -0,0 +1,68 @@
+# ShapePipe configuration file for post-processing.
+# merge star cat.
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_Ms
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = merge_starcat_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN/output
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 4
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+[MERGE_STARCAT_RUNNER]
+
+INPUT_DIR = last:psfex_interp_runner
+
+PSF_MODEL = psfex
+
+NUMBERING_SCHEME = -0000000-0
+
+# Input file pattern(s), list of strings with length matching number of expected input file types
+# Cannot contain wild cards
+FILE_PATTERN = validation_psf
+
+# FILE_EXT (optional) list of string extensions to identify input files
+FILE_EXT = .fits
diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index b26ab39b5..89e844c63 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -98,7 +98,11 @@ run_out="run_sp_combined_$cat"
 
 if [ "$cat" == "final" ]; then
 
-  run_in="$pwd/$out_base/run_sp_Mc_*"
+  # v1
+  #run_in="$pwd/$out_base/run_sp_Mc_*"
+  # v2
+  run_in="$pwd/tile_runs/*/$out_base/run_sp_Mc_*"
+
   module="make_catalog_runner"
   pattern="final_cat-*"
 
@@ -120,7 +124,7 @@ elif [ "$cat" == "psf" ]; then
   # v1
   #run_in="$pwf/$out_base/run_sp_exp_Pi_*"
   # v2
-  run_in="$pwd/exp_runs/*/$out_base/"
+  run_in="$pwd/exp_runs/*/$out_base/run_sp_exp_Pi_*"
 
   pattern="validation_psf-*"
   if [ "$psf" == "psfex" ]; then
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 17695f41d..744e00161 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -161,10 +161,10 @@ export SP_RUN=`pwd`
 export SP_CONFIG=$SP_RUN/cfis
 export SP_CONFIG_MOD=$SP_RUN/cfis_mod
 
-## Other variables
+# To find ssl certificate
+export VM_HOME=$HOME
 
-# Input tile numbers ASCII file
-export TILE_NUMBERS_PATH=tile_numbers.txt
+## Other variables
 
 # Output
 OUTPUT=$SP_RUN/output
@@ -326,11 +326,6 @@ mkdir -p $SP_CONFIG_MOD
 
 # Processing
 
-## Check for input tile list
-#if [ ! -e $TILE_NUMBERS_PATH ]; then
-  #echo "Tile numbers file $TILE_NUMBERS_PATH not found, exiting"
-#fi
-
 ### Retrieve config files
 if [[ $config_dir == *"vos:"* ]]; then
   command_sp "$VCP $config_dir ." "Retrieve shapepipe config files"
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index ac69c86a1..fc160c972 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -502,7 +502,6 @@ def get_names_in_dir(self, iterable, module, idx):
                 f"{self._path_left}/{subdir}/"
                 + f"{self._path_right[idx]}"
             )
-            print("MKDEBUG ", base_and_subdir)
             if os.path.isdir(base_and_subdir):
 
                 matches = []
@@ -511,10 +510,8 @@ def get_names_in_dir(self, iterable, module, idx):
                 with os.scandir(base_and_subdir) as entries:
                     for entry in entries:
 
-                        print("MKDEBUG ", entry, self._run_dir[idx])
                         # Append directory name if matches module
                         if entry.name.startswith(self._run_dir[idx]):
-                            print("MKDEBUG matches")
                             matches.append(entry)
 
                     # This entry does not match module -> next
@@ -529,7 +526,6 @@ def get_names_in_dir(self, iterable, module, idx):
                     directory = self.get_module_output_dir(
                         full_path, module
                     )
-                    print("MKDEBUG ", directory)
 
                     # Find matching file names and paths
                     self.get_matches_final(directory, idx)

From 9f81502236391cb3f257b665c4ef9cbed3427240 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sat, 6 Jan 2024 10:35:29 +0000
Subject: [PATCH 080/207] config files updated

---
 example/cfis/config_GitFeGie_symlink.ini |  2 +
 example/cfis/config_exp_Ma_onthefly.ini  | 76 ++++++++++++++++++++++++
 example/cfis/config_exp_psfex.ini        | 10 ++--
 example/cfis/config_tile_Ma_onthefly.ini |  4 +-
 example/cfis/config_tile_Sx.ini          |  6 +-
 5 files changed, 86 insertions(+), 12 deletions(-)
 create mode 100644 example/cfis/config_exp_Ma_onthefly.ini

diff --git a/example/cfis/config_GitFeGie_symlink.ini b/example/cfis/config_GitFeGie_symlink.ini
index 22e834533..971df44d4 100644
--- a/example/cfis/config_GitFeGie_symlink.ini
+++ b/example/cfis/config_GitFeGie_symlink.ini
@@ -80,6 +80,8 @@ INPUT_NUMBERING = \d{3}\.\d{3}
 # Output file pattern without number
 OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight-
 
+CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Git/get_images_runner_run_1/output
+
 # Copy/download method, one in 'vos', 'symlink'
 RETRIEVE = symlink
 
diff --git a/example/cfis/config_exp_Ma_onthefly.ini b/example/cfis/config_exp_Ma_onthefly.ini
new file mode 100644
index 000000000..5f629500d
--- /dev/null
+++ b/example/cfis/config_exp_Ma_onthefly.ini
@@ -0,0 +1,76 @@
+# ShapePipe configuration file for masking of exposures
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_exp_Ma
+
+# Add date and time to RUN_NAME, optional, default: False
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = mask_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 16
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+### Mask exposures
+[MASK_RUNNER]
+
+# Parent module
+INPUT_DIR = last:split_exp_runner
+
+# Update numbering convention, accounting for HDU number of
+# single-exposure single-HDU files
+NUMBERING_SCHEME = -0000000-0
+
+# Path of mask config file
+MASK_CONFIG_PATH = $SP_CONFIG/config_onthefly.mask
+
+# External mask file flag, use if True, otherwise ignore
+USE_EXT_FLAG = True
+
+# External star catalogue flag, use external cat if True,
+# obtain from online catalogue if False
+USE_EXT_STAR = False
+
+# File name suffix for the output flag files (optional)
+PREFIX = pipeline
diff --git a/example/cfis/config_exp_psfex.ini b/example/cfis/config_exp_psfex.ini
index 11f375456..52ca81f24 100644
--- a/example/cfis/config_exp_psfex.ini
+++ b/example/cfis/config_exp_psfex.ini
@@ -9,8 +9,8 @@
 VERBOSE = True
 
 # Name of run (optional) default: shapepipe_run
-#RUN_NAME = run_sp_exp_SxSePsfPi
-RUN_NAME = run_sp_exp_SxSePsf
+RUN_NAME = run_sp_exp_SxSePsfPi
+#RUN_NAME = run_sp_exp_SxSePsf
 
 # Add date and time to RUN_NAME, optional, default: True
 ; RUN_DATETIME = False
@@ -20,8 +20,7 @@ RUN_NAME = run_sp_exp_SxSePsf
 [EXECUTION]
 
 # Module name, single string or comma-separated list of valid module runner names
-MODULE = sextractor_runner, setools_runner, psfex_runner
-#psfex_interp_runner
+MODULE = sextractor_runner, setools_runner, psfex_runner, psfex_interp_runner
          
 
 # Run mode, SMP or MPI
@@ -59,8 +58,7 @@ TIMEOUT = 96:00:00
 [SEXTRACTOR_RUNNER]
 
 # Input from two modules
-INPUT_DIR = last:split_exp_runner, last:mask_runner_run_2
-#INPUT_MODULE = split_exp_runner, mask_runner_run_2
+INPUT_DIR = last:split_exp_runner, run_sp_exp_Ma:mask_runner
 
 # Read pipeline flag files created by mask module
 FILE_PATTERN = image, weight, pipeline_flag
diff --git a/example/cfis/config_tile_Ma_onthefly.ini b/example/cfis/config_tile_Ma_onthefly.ini
index 6f3723a0f..1b1fbbbea 100644
--- a/example/cfis/config_tile_Ma_onthefly.ini
+++ b/example/cfis/config_tile_Ma_onthefly.ini
@@ -34,7 +34,7 @@ LOG_NAME = log_sp
 RUN_LOG_NAME = log_run_sp
 
 # Input directory, containing input files, single string or list of names
-INPUT_DIR = .
+INPUT_DIR = $SP_RUN/output
 
 # Output directory
 OUTPUT_DIR = $SP_RUN/output
@@ -53,7 +53,7 @@ TIMEOUT = 96:00:00
 ## Module options
 
 ### Mask tiles
-[MASK_RUNNER_RUN]
+[MASK_RUNNER]
 
 # Input directory, containing input files, single string or list of names
 INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner
diff --git a/example/cfis/config_tile_Sx.ini b/example/cfis/config_tile_Sx.ini
index 09eb921c2..1c418245d 100644
--- a/example/cfis/config_tile_Sx.ini
+++ b/example/cfis/config_tile_Sx.ini
@@ -1,4 +1,4 @@
-# ShapePipe configuration file for tile detection/
+# ShapePipe configuration file for tile detection
 
 
 ## Default ShapePipe options
@@ -55,9 +55,7 @@ TIMEOUT = 96:00:00
 
 [SEXTRACTOR_RUNNER]
 
-INPUT_MODULE = get_images_runner_run_1, uncompress_fits_runner, mask_runner_run_1
-
-INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner, last:mask_runner_run_1
+INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner, run_sp_tile_Ma:mask_runner
 
 FILE_PATTERN = CFIS_image, CFIS_weight, pipeline_flag
 

From 6eb11cfa2080ce49f5ce524d9be4cc4fc868fd3a Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 15 Jan 2024 11:00:58 +0000
Subject: [PATCH 081/207] PSFEx interp runner: allowing all: for
 ME_DOT_PSF_PDIRS

---
 example/cfis/config_tile_PiViSmVi_canfar.ini  |  2 +-
 .../psfex_interp_package/psfex_interp.py      | 51 +++++++++++--------
 shapepipe/modules/psfex_interp_runner.py      | 17 +++++--
 3 files changed, 45 insertions(+), 25 deletions(-)

diff --git a/example/cfis/config_tile_PiViSmVi_canfar.ini b/example/cfis/config_tile_PiViSmVi_canfar.ini
index 71bdc699e..51900b525 100644
--- a/example/cfis/config_tile_PiViSmVi_canfar.ini
+++ b/example/cfis/config_tile_PiViSmVi_canfar.ini
@@ -87,7 +87,7 @@ CHI2_THRESH = 2
 
 # Multi-epoch mode parameters
 
-ME_DOT_PSF_DIR = psfex_runner
+ME_DOT_PSF_DIR = all:psfex_runner
 
 # Input psf file pattern
 ME_DOT_PSF_PATTERN = star_split_ratio_80
diff --git a/shapepipe/modules/psfex_interp_package/psfex_interp.py b/shapepipe/modules/psfex_interp_package/psfex_interp.py
index ca7d6bea3..ea3db1de7 100644
--- a/shapepipe/modules/psfex_interp_package/psfex_interp.py
+++ b/shapepipe/modules/psfex_interp_package/psfex_interp.py
@@ -2,7 +2,7 @@
 
 This module computes the PSFs from a PSFEx model at several galaxy positions.
 
-:Authors: Morgan Schmitz and Axel Guinot
+:Authors: Morgan Schmitz, Axel Guinot, Martin Kilbinger
 
 """
 
@@ -115,7 +115,7 @@ class PSFExInterpolator(object):
     Parameters
     ----------
     dotpsf_path : str
-        Path to PSFEx output file
+        Path to PSFEx output file; can be `None` in multi-epoch mode
     galcat_path : str
         Path to SExtractor-like galaxy catalogue
     output_path : str
@@ -151,18 +151,19 @@ def __init__(
     ):
 
         # Path to PSFEx output file
+        self._dotpsf_path = dotpsf_path
         if (
-            isinstance(dotpsf_path, type(None))
-            or os.path.isfile(dotpsf_path)
+            not isinstance(dotpsf_path, type(None))
+            and not os.path.isfile(dotpsf_path)
         ):
-            self._dotpsf_path = dotpsf_path
-        else:
             raise ValueError(f'Cound not find file {dotpsf_path}.')
+
         # Path to catalogue containing galaxy positions
         if os.path.isfile(galcat_path):
             self._galcat_path = galcat_path
         else:
             raise ValueError(f'Cound not find file {galcat_path}.')
+
         # Path to output file to be written
         self._output_path = output_path + '/galaxy_psf'
         # Path to output file to be written for validation
@@ -512,25 +513,28 @@ def _write_output_validation(self, star_dict, psfex_cat_dict):
 
         output.save_as_fits(data, sex_cat_path=self._galcat_path)
 
-    def process_me(self, dot_psf_dir, dot_psf_pattern, f_wcs_path):
+    def process_me(self, dot_psf_dirs, dot_psf_pattern, f_wcs_path):
         """Process Multi-Epoch.
 
-        Process the multi-epoch.
+        Process multi-epoc PSF interpolation.
 
         Parameters
         ----------
-        dot_psf_dir : str
-            Path to the directory containing the ``.psf`` files
+        dot_psf_dirs : list
+            Paths to the directory containing the ``.psf`` files
         dot_psf_pattern : str
             Common pattern of the ``.psf`` files
         f_wcs_path : str
             Path to the log file containing the WCS for each CCDs
 
         """
-        if os.path.exists(dot_psf_dir):
-            self._dot_psf_dir = dot_psf_dir
-        else:
-            raise ValueError(f'Cound not find directory {dot_psf_dir}.')
+        if not any(
+             os.path.exists(dot_psf_dir)
+             for dot_psf_dir in dot_psf_dirs
+        ):
+            raise ValueError('Cound not find any dot psf directory.')
+
+        self._dot_psf_dirs = dot_psf_dirs
 
         self._dot_psf_pattern = dot_psf_pattern
 
@@ -569,7 +573,6 @@ def _interpolate_me(self):
         all_id = np.copy(cat.get_data()['NUMBER'])
         key_ne = 'N_EPOCH'
         if key_ne not in cat.get_data().dtype.names:
-            print("MKDEBUG ", cat.get_data())
             raise KeyError(
                 f'Key {key_ne} not found in input galaxy catalogue'
                 + f'{self._galcat_path}, needed for'
@@ -595,10 +598,18 @@ def _interpolate_me(self):
             for ccd in ccd_list:
                 if ccd == -1:
                     continue
-                dot_psf_path = (
-                    f'{self._dot_psf_dir}/{self._dot_psf_pattern}-{exp_name}'
-                    + f'-{ccd}.psf'
-                )
+                found = False
+                for dot_psf_dir in self._dot_psf_dirs:
+                    dot_psf_path = (
+                        f'{dot_psf_dir}/{self._dot_psf_pattern}-{exp_name}'
+                        + f'-{ccd}.psf'
+                    )
+                    if os.path.exists(dot_psf_path):
+                        found = True
+                        break
+                if not found:
+                    raise ValueError("No dot psf file found")
+
                 ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0]
                 obj_id = all_id[ind_obj]
                 gal_pos = np.array(
@@ -641,7 +652,7 @@ def _interpolate_me(self):
                     and self.interp_PSFs == FILE_NOT_FOUND
                 ):
                     self._w_log.info(
-                        f'Psf model file {self._dotpsf_path} not found. '
+                        f'Psf model file {dot_psf_path} not found. '
                         + 'Object inside this ccd will lose an epoch.'
                     )
                     continue
diff --git a/shapepipe/modules/psfex_interp_runner.py b/shapepipe/modules/psfex_interp_runner.py
index f18b543fb..e9c0cca54 100644
--- a/shapepipe/modules/psfex_interp_runner.py
+++ b/shapepipe/modules/psfex_interp_runner.py
@@ -2,14 +2,14 @@
 
 Module runner for ``psfex_interp``.
 
-:Author: Axel Guinot
+:Author: Axel Guinot, Martin Kilbinger
 
 """
 
 from shapepipe.modules.module_decorator import module_runner
 from shapepipe.modules.psfex_interp_package import psfex_interp
 
-from shapepipe.pipeline.run_log import get_last_dir
+from shapepipe.pipeline.run_log import get_last_dir, get_all_dirs
 
 
 @module_runner(
@@ -66,7 +66,16 @@ def psfex_interp_runner(
             module_config_sec,
             'ME_DOT_PSF_DIR',
         )
-        dot_psf_dir = get_last_dir(run_dirs['run_log'], module)
+        module_name = module.split(":")[-1]
+        if "last" in module:
+            dot_psf_dirs = [get_last_dir(run_dirs['run_log'], module_name)]
+        elif "all" in module:
+            dot_psf_dirs = get_all_dirs(run_dirs["run_log"], module_name)
+        else:
+            raise ValueError(
+                "Expected qualifier 'last:' or 'all' before module"
+               + f" '{module}' in config entry 'ME_DOT_PSF_DIR'")
+
         dot_psf_pattern = config.get(
             module_config_sec,
             'ME_DOT_PSF_PATTERN',
@@ -90,7 +99,7 @@ def psfex_interp_runner(
         )
 
         # Process inputs multi-epoch
-        psfex_interp_inst.process_me(dot_psf_dir, dot_psf_pattern, f_wcs_path)
+        psfex_interp_inst.process_me(dot_psf_dirs, dot_psf_pattern, f_wcs_path)
 
     # Run in VALIDATION mode
     elif mode == 'VALIDATION':

From 485da581e940fe79605c1616bb913ef6aa93f130 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 15 Jan 2024 12:33:20 +0000
Subject: [PATCH 082/207] init run exc script: added -d option; updates

---
 scripts/sh/init_run_exclusive_canfar.sh | 100 +++++++++---------------
 1 file changed, 38 insertions(+), 62 deletions(-)

diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 2d1e381d0..05ca2a848 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -10,6 +10,7 @@ N_SMP=1
 kind=-1
 dry_run=0
 nsh_jobs=8
+dir=`pwd`
 VERBOSE=1
 
 
@@ -28,6 +29,8 @@ usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
     \timage kind, allowed are 'tile' and 'exp'\n
    -N, --N_SMP N_SMOp\n
     \tnumber of jobs (SMP mode only), default from original config files\n
+   -d, --directory\n
+    \trun directory, default is pwd ($dir)\n
    -n, --dry_run\n
     \tdry run, no actuall processing\n
 "
@@ -61,6 +64,10 @@ while [ $# -gt 0 ]; do
       kind="$2"                                                                
       shift                                                                     
       ;;                                                                        
+    -d|--directory)
+      dir="$2"
+      shift
+      ;;
     -n|--dry_run)
       dry_run=1
       ;;
@@ -132,14 +139,11 @@ fi
 
 conda activate shapepipe
 
-basedir=$HOME/cosmostat/P3_v2/psfex
-cd $basedir
-
+cd $dir
+echo $pwd
 
-# Update links to exposure run directories
-if [ "$kind" == "tile" ]; then
-  command "rm -rf tile_runs/$ID/output/run_exp_SxSePsf*" $dry_run
-  command "link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs" $dry_run
+if [ ! -d ${kind}_runs ]; then
+  command "mkdir ${kind}_runs" $dry_run
 fi
 
 
@@ -158,62 +162,38 @@ fi
 
 cd output
 
-if [ 0 == 1 ]; then
-
-  if [ ! -f log_exp_headers.sqlite ]; then
-    command "ln -s $basedir/output/log_exp_headers.sqlite" $dry_run
-  fi
-
-  # Remove potentially obsolete link
-  #rm run_sp_exp_SpMh*
-  #rm  run_sp_MaMa_*
+if [ ! -f log_exp_headers.sqlite ]; then
+  command "ln -s $dir/output/log_exp_headers.sqlite" $dry_run
+fi
 
-  # Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
-  for dir in $basedir/output/run_sp_*; do
-    command "ln -sf $dir" $dry_run
-  done
-  if [ ! -e run_sp_combined_flag ]; then
-    command "ln -s $basedir/output/run_sp_combined_flag" $dry_run
-  fi
 
-fi
+# Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
+for dir in $dir/output/run_sp_*; do
+  command "ln -sf $dir" $dry_run
+done
 
-(( do_job= $job & 128 ))
-#if [[ $do_job != 0 ]]; then
-# The following is now dealt with in job_sh_canar.bash
-if [ 0 == 1 ]; then
-
-  # Indentify and remove unfinished ngmix dirs
-  min_n_out=2
-  for k in $(seq 1 $nsh_jobs); do
-    ngmix_run="run_sp_tile_ngmix_Ng${k}u/ngmix_runner"
-    if [ -e "$ngmix_run" ]; then
-      ngmix_out="$ngmix_run/output"
-      n_out=`ls -rlt $ngmix_out | wc -l`
-      if [ "$n_out" -lt "$min_n_out" ]; then
-          min_n_out=$n_out
-      fi
-      #echo $k $n_out $min_n_out
-    else
-      echo "ngmix separated run #$k not found"
-      min_n_out=0
-    fi
-  done
-  if [ "$min_n_out" -lt "2" ]; then
-    echo "At least one ngmix separated run no output files"
-    for k in $(seq 1 $nsh_jobs); do
-      command "rm -rf run_sp_tile_ngmix_Ng${k}u" $dry_run
-    done
-  else
-    if [ "$job" == "128" ]; then
-      echo "ngmix found complete, all is well, exiting"
-      exit 0
+# Update links to exposure run directories, which were created in job 32
+(( do_job= $job & 64 ))
+if [[ $do_job != 0 ]]; then
+  if [ "$kind" == "tile" ]; then
+    cd ../../..
+    #command "rm -rf tile_runs/$ID/output/run_exp_SxSePsf*" $dry_run
+    command "link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs" $dry_run
+    cd ${kind}_runs/$ID/output
+
+    # Remove duplicate job-32 runs (tile detection)
+    n_16=`ls -rt1d run_sp_tile_Sx_* | wc -l`
+    if [ "$n_16" != "1" ]; then
+      n_remove="$(($n_16-1))"
+      echo "removing $n_remove duplicate old job-32 runs"
+      rm -rf `ls -rt1d run_sp_tile_Sx_* | head -$n_remove`
     fi
   fi
-
-fi 
+fi
 
 cd ..
+
+# Update log file
 command update_runs_log_file.py $dry_run
 
 echo -n "pwd: "
@@ -222,12 +202,8 @@ pwd
 echo -n "environment: "
 echo $CONDA_PREFIX
 
-#command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP" $dry_run
+command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP" $dry_run
 
-export SP_RUN=.
-command "shapepipe_run -c $HOME/shapepipe/example/cfis/config_exp_Pi.ini" $dry_run
-
-cd $basedir
+cd $dir
 
 echo "end init run tile canfar"
-

From ef3a2c92df2879cba9ffa3ea6b091eb1b5ccb5da Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 15 Jan 2024 12:33:56 +0000
Subject: [PATCH 083/207] job sp canfar script: remove old vos upload code

---
 scripts/sh/job_sp_canfar.bash | 58 -----------------------------------
 1 file changed, 58 deletions(-)

diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 744e00161..91f67619b 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -38,7 +38,6 @@ usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID]
    \t  64: galaxy selection on tiles (offline)\n
    \t 128: shapes and morphology (offline)\n
    \t 256: paste catalogues (offline)\n
-   \t 512: upload results (online)\n
    -c, --config_dir DIR\n
    \t config file directory, default='$config_dir'\n
    -p, --psf MODEL\n
@@ -485,60 +484,3 @@ if [[ $do_job != 0 ]]; then
   command_sp "shapepipe_run -c $SP_CONFIG/config_make_cat_$psf.ini" "Run shapepipe (tile: create final cat $psf)" "$VERBOSE" "$ID"
 
 fi
-
-## Upload results (online)
-(( do_job= $job & 512 ))
-if [[ $do_job != 0 ]]; then
-
-  ### module and pipeline log files
-  upload_logs "$ID" "$VERBOSE"
-
-  ### Final shape catalog
-  ### pipeline_flags are the tile masks, for random cats
-  ### SETools masks (selection), stats and plots
-  ### ${psf}_interp_exp for diagnostics, validation with leakage,
-  ### validation with residuals, rho stats
-
-  NAMES=(
-    "final_cat"
-    "pipeline_flag"
-    "setools_mask"
-    "setools_stat"
-    "setools_plot"
-  )
-  DIRS=(
-    "*/make_cat_runner/output"
-    "*/mask_runner_run_1/output"
-    "*/setools_runner/output/mask"
-    "*/setools_runner/output/stat"
-    "*/setools_runner/output/plot"
-  )
-  PATTERNS=(
-    "final_cat-*"
-    "pipeline_flag-???-???*"
-    "*"
-    "*"
-    "*"
-  )
-
-  # PSF validation
-  pattern="validation_psf-*"
-  if [ "$psf" == "psfex" ]; then
-    name="psfex_interp_exp"
-    dir="*/psfex_interp_runner/output"
-  else
-    name="mccd_fit_val_runner"
-    dir="*/mccd_fit_val_runner/output"
-  fi
-  upl=$output_rel/$dir/$pattern
-  upload "$name" "$ID" "$VERBOSE" "${upl[@]}"
-
-  for n in "${!NAMES[@]}"; do
-      name=${NAMES[$n]}
-      dir=${DIRS[$n]}
-      pattern=${PATTERNS[$n]}
-      upl=$output_rel/$dir/$pattern
-      upload "$name" "$ID" "$VERBOSE" "${upl[@]}"
-  done
-
-fi

From a20cb4f8214f6bc4088744c12c30d881b009ceb5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 15 Jan 2024 12:35:40 +0000
Subject: [PATCH 084/207] summary create library and param files

---
 scripts/python/summary_params_pre_v2.py | 223 ++++++++++++++++++++++++
 scripts/python/summary_run.py           | 174 ++----------------
 shapepipe/utilities/summary.py          |  39 ++++-
 3 files changed, 273 insertions(+), 163 deletions(-)
 create mode 100644 scripts/python/summary_params_pre_v2.py

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
new file mode 100644
index 000000000..ec310b237
--- /dev/null
+++ b/scripts/python/summary_params_pre_v2.py
@@ -0,0 +1,223 @@
+# Parameters for summary run
+
+import os
+from shapepipe.utilities.summary import *
+
+def init_par_runtime(list_tile_IDs):
+    
+    # Numbers updated at runtime 
+    par_runtime = {}
+
+    par_runtime["n_tile_IDs"] = len(list_tile_IDs)
+    par_runtime["list_tile_IDs"] = list_tile_IDs
+
+    return par_runtime
+
+
+def update_par_runtime_after_find_exp(par_runtime, all_exposures):
+    
+    n_CCD = 40
+    
+    # Single-HDU single exposure images
+    par_runtime["n_shdus"] = get_par_runtime(par_runtime, "exposures") * n_CCD
+    par_runtime["list_shdus"] = get_all_shdus(all_exposures, n_CCD)
+
+    ## For split_exposure_runner, the output is image, weight,flag per single-HDU image
+    ## and a header per exposure.
+    par_runtime["n_3*n_shdus+n_exposures"] = (
+        3 * get_par_runtime(par_runtime, "shdus")
+        + get_par_runtime(par_runtime, "exposures")
+    )
+    
+    return par_runtime
+
+
+def set_jobs_v2_pre_v2(patch, retrieve, verbose):
+    """ Return information about shapepipe jobs
+    
+    """
+    print(f"Set job info for patch {patch}")
+
+    # Main input and output directory
+    main_dir = f"{os.environ['HOME']}/cosmostat/v2/pre_v2/psfex/{patch}"
+
+    # Logging
+    path = f"{main_dir}/summary"
+    if not os.path.isdir(path):
+        os.mkdir(path)
+    log_file_name = f"{path}/summary_log.txt"
+    handlers = [logging.FileHandler(log_file_name), logging.StreamHandler()]
+    logging.basicConfig(
+        level=logging.INFO, format="%(message)s", handlers=handlers
+    )
+
+    logging.info(f"Checking main directory = {main_dir}")
+
+    # Number of links created for retrieved images
+    if retrieve == "vos":
+        n_link = 2
+    else:
+        n_link = 1
+
+    # Tile IDs
+    tile_ID_path = f"{main_dir}/tile_numbers.txt"
+
+    ## Tile IDs with dots
+    list_tile_IDs_dot = get_IDs_from_file(tile_ID_path)
+
+    jobs = {}
+
+#        "run_sp_GitFeGie_",
+    # Set the first job (retrieve images)
+    jobs["1"] = job_data(
+        1,
+         "run_sp_Git",
+       [
+            "get_images_runner_run_1",
+            "find_exposures_runner",
+            "get_images_runner_run_2",
+        ],
+        ["tile_IDs", "tile_IDs", "exposures"],
+        pattern=["CFIS_", "", ""],
+        n_mult=[1 * n_link, 1, 3],
+        path_left=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    jobs["2"] = job_data(
+        2,
+        ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh_2023-12"],
+        ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
+        ["tile_IDs", 0, "3*n_shdus+n_exposures"],
+        n_mult=[1, 1, 1],
+        path_left=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    if patch == "P3":
+        run_dir_mask_tiles = "run_sp_combined_flag"
+        run_dir_maks_exp = run_dir_tiles
+        mask_module_tiles = "mask_runner_run_1"
+        mask_module_exp = "mask_runner_run_2"
+    else:
+        run_dir_mask_tiles = "run_sp_tile_Ma"
+        run_dir_mask_exp = "run_sp_exp_Ma"
+        mask_module_tiles = "mask_runner"
+        mask_module_exp = "mask_runner"
+
+    jobs["4"] = job_data(
+        4,
+        run_dir_mask_tiles,
+        [mask_module_tiles],
+        ["tile_IDs"],
+        path_left=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    jobs["8"] = job_data(
+        8,
+        run_dir_mask_exp,
+        [mask_module_exp],
+        ["shdus"],
+        path_left=f"{main_dir}/output",
+        verbose=verbose,
+    )
+
+    jobs["16"] = job_data(
+        16,
+        "run_sp_tile_Sx",
+        ["sextractor_runner"],
+        ["tile_IDs"],
+        n_mult=2,
+        path_left=f"{main_dir}/tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        verbose=verbose,
+    )
+
+    # TODO 1 setools_runner output/rand_split
+    # TODO 2 add back Pi
+    jobs["32"] = job_data(
+        32,
+        [
+            "run_sp_exp_SxSePsf",
+            "run_sp_exp_SxSePsf",
+            "run_sp_exp_SxSePsf",
+        ],  # "run_sp_exp_Pi"],
+        [
+            "sextractor_runner",
+            "setools_runner",
+            "psfex_runner",
+        ],  # "psfex_interp_runner"],
+        "shdus",
+        n_mult=[2, 2, 2],  # 1],
+        path_left=f"{main_dir}/exp_runs",
+        output_subdirs="shdus",
+        path_right="output",
+        verbose=verbose,
+    )
+
+    # For P3
+    jobs["33"] = job_data(
+        33,
+        "run_sp_exp_Pi",
+        ["psfex_interp_runner"],
+        "shdus",
+        path_left=f"{main_dir}/exp_runs",
+        output_subdirs="shdus",
+        path_right="output",
+        verbose=verbose,
+    )
+
+    jobs["64"] = job_data(
+        "64",
+        "run_sp_tile_PsViSmVi",
+        [
+            "psfex_interp_runner",
+            "vignetmaker_runner_run_1",
+            "spread_model_runner",
+            "vignetmaker_runner_run_2",
+        ],
+        "tile_IDs",
+        n_mult=[1, 1, 1, 4],
+        path_left=f"{main_dir}/tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        verbose=verbose,
+    )
+
+    n_sh = 8
+    run_dirs = [f"run_sp_tile_ngmix_Ng{idx+1}u" for idx in range(n_sh)]
+    output_path_missing_IDs = [
+        f"missing_job_128_ngmix_runner_{idx+1}.txt" for idx in range(n_sh)
+    ]
+    jobs["128"] = job_data(
+        "128",
+        run_dirs,
+        ["ngmix_runner"] * 8,
+        "tile_IDs",
+        path_left=f"{main_dir}/tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        output_path_missing_IDs=output_path_missing_IDs,
+        verbose=verbose,
+    )
+
+    jobs["256"] = job_data(
+        "256",
+        ["run_sp_Ms", "run_sp_Mc"],
+        ["merge_sep_cats_runner", "make_cat_runner"],
+        "tile_IDs",
+        path_left=f"{main_dir}/tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        verbose=verbose,
+    )
+
+    # Post-processing
+    jobs["1024"] = job_data(
+        "1024",
+        "run_sp_combined_psf",
+        ["psfex_interp_runner"],
+        "shdus",
+        path_left=f"{main_dir}/output",
+        verbose=verbose,
+    )
+    
+    return jobs, list_tile_IDs_dot
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index bfd926194..bb6e25d05 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -1,162 +1,27 @@
 #!/usr/bin/env python
 
 import sys
+import os
 
 from shapepipe.utilities.summary import *
 
 
 def main(argv=None):
 
+    patch = argv[1]
 
-    # Setting
-    verbose = True
-    log_file_name = "summary_log.txt"
-    handlers = [logging.FileHandler(log_file_name), logging.StreamHandler()]
-    logging.basicConfig(
-        level=logging.INFO, format="%(message)s", handlers=handlers
-    )
-
-    main_dir = "."
     retrieve = "vos"
-    tile_ID_path = f"{main_dir}/tile_numbers.txt"
-
-    # tile IDs with dots
-    list_tile_IDs_dot = get_IDs_from_file(tile_ID_path)
+    verbose = True
+    
+    import summary_params_pre_v2 as params
 
-    # tile IDs with dashes
+    jobs, list_tile_IDs_dot = params.set_jobs_v2_pre_v2(patch, retrieve, verbose)
+    
     list_tile_IDs = job_data.replace_dot_dash(list_tile_IDs_dot)
-    n_tile_IDs = len(list_tile_IDs)
-    n_CCD = 40
-
-    par_runtime = {}
-
-    par_runtime["n_tile_IDs"] = n_tile_IDs
-    par_runtime["list_tile_IDs"] = list_tile_IDs
-
-    jobs = {}
-
-    if retrieve == "vos":
-        n_link = 2
-    else:
-        n_link = 1
-
-    jobs["1"] = job_data(
-        1,
-        "run_sp_GitFeGie_",
-        [
-            "get_images_runner_run_1",
-            "find_exposures_runner",
-            "get_images_runner_run_2",
-        ],
-        ["tile_IDs", "tile_IDs", "exposures"],
-        pattern=["CFIS_", "", ""],
-        n_mult=[1 * n_link, 1, 3],
-        path_left=f"{main_dir}/output",
-        verbose=verbose,
-    )
-
-    jobs["2"] = job_data(
-        2,
-        ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh_2023-12"],
-        ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
-        ["tile_IDs", 0, "3*n_shdus+n_exposures"],
-        n_mult=[1, 1, 1],
-        path_left=f"{main_dir}/output",
-        verbose=verbose,
-    )
-
-    jobs["4"] = job_data(
-        4,
-        "run_sp_combined_flag",
-        ["mask_runner_run_1"],
-        ["tile_IDs"],
-        path_left=f"{main_dir}/output",
-        verbose=verbose,
-    )
-
-    jobs["8"] = job_data(
-        8,
-        "run_sp_combined_flag",
-        ["mask_runner_run_2"],
-        ["shdus"],
-        path_left=f"{main_dir}/output",
-        verbose=verbose,
-    )
-
-    jobs["16"] = job_data(
-        16,
-        "run_sp_tile_Sx",
-        ["sextractor_runner"],
-        ["tile_IDs"],
-        n_mult=2,
-        path_left=f"{main_dir}/tile_runs",
-        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
-        verbose=verbose,
-    )
-
-    # TODO setools_runner output/rand_split
-    jobs["32"] = job_data(
-        32,
-        [
-            "run_sp_exp_SxSePsf",
-            "run_sp_exp_SxSePsf",
-            "run_sp_exp_SxSePsf",
-        ],  # "run_sp_exp_Pi"],
-        [
-            "sextractor_runner",
-            "setools_runner",
-            "psfex_runner",
-        ],  # "psfex_interp_runner"],
-        "shdus",
-        n_mult=[2, 2, 2],  # 1],
-        path_left=f"{main_dir}/exp_runs",
-        output_subdirs="shdus",
-        path_right="output",
-        verbose=verbose,
-    )
-
-    jobs["64"] = job_data(
-        "64",
-        "run_sp_tile_PsViSmVi",
-        [
-            "psfex_interp_runner",
-            "vignetmaker_runner_run_1",
-            "spread_model_runner",
-            "vignetmaker_runner_run_2",
-        ],
-        "tile_IDs",
-        n_mult=[1, 1, 1, 4],
-        path_left=f"{main_dir}/tile_runs",
-        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
-        verbose=verbose,
-    )
-
-    n_sh = 8
-    run_dirs = [f"run_sp_tile_ngmix_Ng{idx+1}u" for idx in range(n_sh)]
-    output_path_missing_IDs = [
-        f"missing_job_128_ngmix_runner_{idx+1}.txt" for idx in range(n_sh)
-    ]
-    jobs["128"] = job_data(
-        "128",
-        run_dirs,
-        ["ngmix_runner"] * 8,
-        "tile_IDs",
-        path_left=f"{main_dir}/tile_runs",
-        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
-        output_path_missing_IDs=output_path_missing_IDs,
-        verbose=verbose,
-    )
-
-
-    jobs["1024"] = job_data(
-        "1024",
-        "run_sp_combined_psf",
-        ["psfex_interp_runner"],
-        "shdus",
-        path_left=f"{main_dir}/output",
-        verbose=verbose
-    )
-
+    
+    # Numbers updated at runtime
+    par_runtime = params.init_par_runtime(list_tile_IDs)
+    
     job_data.print_stats_header()
 
     for key in "1":
@@ -166,20 +31,19 @@ def main(argv=None):
 
         all_exposures = get_all_exposures(job._paths_in_dir[1], verbose=True)
         par_runtime["n_exposures"] = len(all_exposures)
+        par_runtime["list_exposures"] = all_exposures
 
         job.check_numbers(par_runtime, indices=[2])
 
-    # Update runtime parameter
-    par_runtime["n_shdus"] = get_par_runtime(par_runtime, "exposures") * n_CCD
-    par_runtime["n_3*n_shdus+n_exposures"] = 3 * get_par_runtime(
-        par_runtime, "shdus"
-    ) + get_par_runtime(par_runtime, "exposures")
-    par_runtime["list_shdus"] = get_all_shdus(all_exposures, n_CCD)
-
+    par_runtime = params.update_par_runtime_after_find_exp(par_runtime, all_exposures)
+    
     print_par_runtime(par_runtime, verbose=verbose)
 
-    #for key in ["2", "4", "8", "16", "32", "64", "128"]:
-    for key in ["1024"]:
+    # Get all keys after "1"
+    keys = sorted(jobs.keys(), key=int)
+    _ = keys.pop(0)
+
+    for key in keys:
         job = jobs[key]
         job.print_intro()
         job.check_numbers(par_runtime=par_runtime)
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index fc160c972..c39e943c7 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -189,8 +189,10 @@ class job_data(object):
         case it is set to 1
     pattern: list, optional
         if not None, file pattern to match; defafult is `None`
-    path_lef: str, optional
-        left (first) part of output directory, defaul is "./output"
+    path_main: str, optional
+        main (left-most) part of output directory, default is "."       
+    path_left: str, optional
+        left (first) part of output directory, default is "./output"
     output_subdirs: str, optional
         output subdirectories if not `None`; default is `None`
     path_right: str, optional
@@ -211,7 +213,8 @@ def __init__(
         key_expected,
         n_mult=None,
         pattern=None,
-        path_left="./output",
+        path_main=".",
+        path_left="output",
         output_subdirs=None,
         path_right=None,
         output_path_missing_IDs=None,
@@ -223,6 +226,7 @@ def __init__(
         self._key_expected = set_as_list(item=key_expected, n=len(modules))
         self._n_mult = set_as_list(item=n_mult, n=len(modules))
         self._pattern = set_as_list(item=pattern, n=len(modules), default="")
+        self._path_main = path_main
         self._path_left = path_left
         self._output_subdirs = output_subdirs or [""]
         self._path_right = set_as_list(
@@ -377,7 +381,9 @@ def output_missing(
 
         ## Extract image IDs from names
         IDs = []
-        pattern = re.compile(r"(?:\d{3}-\d{3}|\d{7}-\d+)")
+        pattern = re.compile(
+            r"(?:\d{3}-\d{3}|\d{7}-\d+|\d{7})"
+        )
         for name, path in zip(names_in_dir, paths_in_dir):
             match = pattern.search(name)
             if match:
@@ -401,7 +407,9 @@ def output_missing(
 
         if n_unique > 0:
             if not self._output_path_missing_IDs:
-                output_path = f"missing_job_{self._bit}_{module}.txt"
+                output_path = (
+                    f"{self._path_main}/summary/missing_job_{self._bit}_{module}.txt"
+                )
             else:
                 output_path = self._output_path_missing_IDs[idx]
 
@@ -499,7 +507,8 @@ def get_names_in_dir(self, iterable, module, idx):
         # Loop over subdirs
         for jdx, subdir in enumerate(iterable):
             base_and_subdir = (
-                f"{self._path_left}/{subdir}/"
+                f"{self._path_main}/"
+                + f"{self._path_left}/{subdir}/"
                 + f"{self._path_right[idx]}"
             )
             if os.path.isdir(base_and_subdir):
@@ -530,7 +539,8 @@ def get_names_in_dir(self, iterable, module, idx):
                     # Find matching file names and paths
                     self.get_matches_final(directory, idx)
             else:
-                print(f"Directory base_and_subdir {base_and_subdir} not found")
+                #print(f"Directory base_and_subdir {base_and_subdir} not found")
+                pass
 
     def update_subdirs(self, par_runtime):
         """Update Subdirs.
@@ -571,11 +581,17 @@ def check_numbers(self, par_runtime=None, indices=None):
             if indices is not None and idx not in indices:
                 continue
 
+            if self._verbose:
+                print(f"** module {module}")
+
             # Look over subdirs
             iterable = self._output_subdirs
             if len(iterable) > 1 and self._verbose:
                 iterable = tqdm(iterable, desc="subdirs", leave=False)
 
+            if self._verbose:
+                print(f"*** subdirs {self._output_subdirs}")
+
             # Get output file names and paths
             self.get_names_in_dir(
                 iterable,
@@ -649,6 +665,13 @@ def get_par_runtime(par_runtime, key, kind="n"):
 
     """
     combined_key = f"{kind}_{key}"
+    if (
+        combined_key == "list_3*n_shdus+n_exposures"
+        and combined_key not in par_runtime
+    ):
+        print("{combined_key} not set, TBD")
+        return []
+
     return par_runtime[combined_key]
 
 
@@ -663,6 +686,6 @@ def print_par_runtime(par_runtime, verbose=True):
             if not key.startswith("list"):
                 logging.info(f"{key:30s} {value:6d}")
             else:
-                logging.info(f"{key:29s} [{len(value):6d}]")
+                logging.info(f"{key:29s} {len(value):6d} entries")
         logging.info("===========")
         logging.info("")

From 29b463b220b1ba932be6fa138ff86cb867170bef Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 15 Jan 2024 12:37:01 +0000
Subject: [PATCH 085/207] minor changes

---
 scripts/python/link_to_exp_for_tile.py | 3 +--
 scripts/sh/job_curl_canfar_local.sh    | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index 9d19003d8..fc8ca9a69 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -324,10 +324,9 @@ def main(argv=None):
     exp_IDs = get_exp_IDs(tile_base_dir, tile_ID, verbose=verbose)
     exp_shdu_IDs = get_exp_single_HDU_IDs(exp_IDs, n_CPU)
 
-    patterns = ["run_sp_exp_SxSePsf", "run_sp_exp_Pi"]
+    patterns = ["run_sp_exp_SxSePsf"] #, "run_sp_exp_Pi"]
     for pattern in patterns:
         paths, number = get_paths(exp_base_dir, exp_shdu_IDs, pattern)
-        #print(number)
 
         create_links_paths(tile_base_dir, tile_ID, paths, verbose=verbose)
 
diff --git a/scripts/sh/job_curl_canfar_local.sh b/scripts/sh/job_curl_canfar_local.sh
index 600a15964..665f6ea79 100644
--- a/scripts/sh/job_curl_canfar_local.sh
+++ b/scripts/sh/job_curl_canfar_local.sh
@@ -5,7 +5,7 @@
 
 rm -f session_IDs.txt session_image_IDs.txt
 
-script_local=curl_canfar_local.sh
+script_local=~/shapepipe/scripts/sh/curl_canfar_local.sh
 version="1.0"
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 N_SMP=1

From cb67e8f32ff4ef8877103c531b0f7902dd5f478e Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 15 Jan 2024 16:12:35 +0000
Subject: [PATCH 086/207] curl local script: now working with -e ID and -f
 file_IDs, in dry and real run

---
 scripts/sh/curl_canfar_local.sh | 67 ++++++++++++++++++++++++++-------
 1 file changed, 54 insertions(+), 13 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index f17f16d31..4b85d7cef 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -1,17 +1,18 @@
 #!/usr/bin/env bash
 
-# Usage
-# ~/astro/repositories/github/shapepipe/scripts/sh/curl_canfar.sh 0.9 shapepipe/scripts/sh/init_run_exlusive_canfar.sh ID kind job
-
-# Command line arguments
-## Default values
+# Global variables
 SSL=~/.ssl/cadcproxy.pem
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
 IMAGE=images.canfar.net/unions/shapepipe
 NAME=shapepipe
 
+
+# Command line arguments
+
+## Default values
 job=-1
 ID=-1
+file_IDs=-1
 N_SMP=1
 kind=-1
 version=1.0
@@ -21,12 +22,14 @@ dry_run=0
 # TODO psf
 
 ## Help string
-usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
+usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
 \n\nOptions:\n
    -h\tthis message\n
    -j, --job JOB\tRUnning JOB, bit-coded\n
    -e, --exclusive ID
     \timage ID\n
+   -f, --file_IDs path
+    \tfile containing IDs\n
    -p, --psf MODEL\n
     \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
    -k, --kind KIND\n
@@ -62,6 +65,10 @@ while [ $# -gt 0 ]; do
       ID="$2"
       shift
       ;;
+    -f|--file_IDs)
+      file_IDs="$2"
+      shift
+      ;;
     -N|--N_SMP)
       n_SMP="$2"
       shift
@@ -84,8 +91,8 @@ if [ "$job" == "-1" ]; then
   exit 2                                                                        
 fi                                                                              
                                                                                 
-if [ "$exclusive" == "-1" ]; then                                               
-  echo "No image ID indicated, use option -e"                                   
+if [ "$ID" == "-1" ] && [ "$file_IDs" == "-1" ]; then                                               
+  echo "No image ID(s) indicated, use option -e ID or -f file_IDs"                                   
   exit 3                                                                        
 fi                                                                              
                                                                                 
@@ -109,14 +116,48 @@ else
 fi
 
 RESOURCES="ram=4&cores=$N_SMP"
-arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run"
+
+# TODO: dir as command line argument to this script
+dir=`pwd`
+arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
 
 
 if [ "$dry_run" == 2 ]; then
+
   echo "Running command dry run:"
-  echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+
+  if [ "$ID" == "-1" ]; then
+
+    for ID in `cat $file_IDs`; do
+      arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+      echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+    done
+
+  else
+
+    arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+    echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+
+  fi
+
 else
-  session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"`
-  echo $session >> session_IDs.txt
-  echo "$session $ID" >> session_image_IDs.txt
+
+  if [ "$ID" == "-1" ]; then
+
+    for ID in `cat $file_IDs`; do
+      arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+      session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"`
+      echo $session >> session_IDs.txt
+      echo "$session $ID" >> session_image_IDs.txt
+    done
+
+  else
+
+    arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+    session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"`
+    echo $session >> session_IDs.txt
+    echo "$session $ID" >> session_image_IDs.txt
+
+  fi
+
 fi

From f0acd65e274ef646c4e258ba710cf3eb63acc7a4 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 16 Jan 2024 15:56:22 +0000
Subject: [PATCH 087/207] summary: fixed main path, verbose

---
 scripts/python/summary_params_pre_v2.py    | 47 +++++++++++++---------
 scripts/python/summary_run.py              |  2 +-
 scripts/sh/init_run_sp_exclusive_canfar.sh | 25 ------------
 shapepipe/utilities/summary.py             | 14 +++++--
 4 files changed, 40 insertions(+), 48 deletions(-)
 delete mode 100755 scripts/sh/init_run_sp_exclusive_canfar.sh

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index ec310b237..635dc15da 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -39,10 +39,10 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
     print(f"Set job info for patch {patch}")
 
     # Main input and output directory
-    main_dir = f"{os.environ['HOME']}/cosmostat/v2/pre_v2/psfex/{patch}"
+    path_main = f"{os.environ['HOME']}/cosmostat/v2/pre_v2/psfex/{patch}"
 
     # Logging
-    path = f"{main_dir}/summary"
+    path = f"{path_main}/summary"
     if not os.path.isdir(path):
         os.mkdir(path)
     log_file_name = f"{path}/summary_log.txt"
@@ -51,7 +51,7 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         level=logging.INFO, format="%(message)s", handlers=handlers
     )
 
-    logging.info(f"Checking main directory = {main_dir}")
+    logging.info(f"Checking main directory = {path_main}")
 
     # Number of links created for retrieved images
     if retrieve == "vos":
@@ -60,7 +60,7 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         n_link = 1
 
     # Tile IDs
-    tile_ID_path = f"{main_dir}/tile_numbers.txt"
+    tile_ID_path = f"{path_main}/tile_numbers.txt"
 
     ## Tile IDs with dots
     list_tile_IDs_dot = get_IDs_from_file(tile_ID_path)
@@ -80,7 +80,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         ["tile_IDs", "tile_IDs", "exposures"],
         pattern=["CFIS_", "", ""],
         n_mult=[1 * n_link, 1, 3],
-        path_left=f"{main_dir}/output",
+        path_main=path_main,
+        path_left="output",
         verbose=verbose,
     )
 
@@ -90,13 +91,14 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
         ["tile_IDs", 0, "3*n_shdus+n_exposures"],
         n_mult=[1, 1, 1],
-        path_left=f"{main_dir}/output",
+        path_main=path_main,
+        path_left="output",
         verbose=verbose,
     )
 
-    if patch == "P3":
+    if patch == "PX":
         run_dir_mask_tiles = "run_sp_combined_flag"
-        run_dir_maks_exp = run_dir_tiles
+        run_dir_mask_exp = run_dir_mask_tiles
         mask_module_tiles = "mask_runner_run_1"
         mask_module_exp = "mask_runner_run_2"
     else:
@@ -110,7 +112,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         run_dir_mask_tiles,
         [mask_module_tiles],
         ["tile_IDs"],
-        path_left=f"{main_dir}/output",
+        path_main=path_main,
+        path_left="output",
         verbose=verbose,
     )
 
@@ -119,7 +122,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         run_dir_mask_exp,
         [mask_module_exp],
         ["shdus"],
-        path_left=f"{main_dir}/output",
+        path_main=path_main,
+        path_left="output",
         verbose=verbose,
     )
 
@@ -129,7 +133,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         ["sextractor_runner"],
         ["tile_IDs"],
         n_mult=2,
-        path_left=f"{main_dir}/tile_runs",
+        path_main=path_main,
+        path_left="tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
         verbose=verbose,
     )
@@ -150,7 +155,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         ],  # "psfex_interp_runner"],
         "shdus",
         n_mult=[2, 2, 2],  # 1],
-        path_left=f"{main_dir}/exp_runs",
+        path_main=path_main,
+        path_left="exp_runs",
         output_subdirs="shdus",
         path_right="output",
         verbose=verbose,
@@ -162,7 +168,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         "run_sp_exp_Pi",
         ["psfex_interp_runner"],
         "shdus",
-        path_left=f"{main_dir}/exp_runs",
+        path_main=path_main,
+        path_left="exp_runs",
         output_subdirs="shdus",
         path_right="output",
         verbose=verbose,
@@ -179,7 +186,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         ],
         "tile_IDs",
         n_mult=[1, 1, 1, 4],
-        path_left=f"{main_dir}/tile_runs",
+        path_main=path_main,
+        path_left="tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
         verbose=verbose,
     )
@@ -187,14 +195,15 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
     n_sh = 8
     run_dirs = [f"run_sp_tile_ngmix_Ng{idx+1}u" for idx in range(n_sh)]
     output_path_missing_IDs = [
-        f"missing_job_128_ngmix_runner_{idx+1}.txt" for idx in range(n_sh)
+        f"{path_main}/summary/missing_job_128_ngmix_runner_{idx+1}.txt" for idx in range(n_sh)
     ]
     jobs["128"] = job_data(
         "128",
         run_dirs,
         ["ngmix_runner"] * 8,
         "tile_IDs",
-        path_left=f"{main_dir}/tile_runs",
+        path_main=path_main,
+        path_left="tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
         output_path_missing_IDs=output_path_missing_IDs,
         verbose=verbose,
@@ -205,7 +214,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         ["run_sp_Ms", "run_sp_Mc"],
         ["merge_sep_cats_runner", "make_cat_runner"],
         "tile_IDs",
-        path_left=f"{main_dir}/tile_runs",
+        path_main=path_main,
+        path_left="tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
         verbose=verbose,
     )
@@ -216,7 +226,8 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         "run_sp_combined_psf",
         ["psfex_interp_runner"],
         "shdus",
-        path_left=f"{main_dir}/output",
+        path_main=path_main,
+        path_left="output",
         verbose=verbose,
     )
     
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index bb6e25d05..973d74bd4 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -11,7 +11,7 @@ def main(argv=None):
     patch = argv[1]
 
     retrieve = "vos"
-    verbose = True
+    verbose = False
     
     import summary_params_pre_v2 as params
 
diff --git a/scripts/sh/init_run_sp_exclusive_canfar.sh b/scripts/sh/init_run_sp_exclusive_canfar.sh
deleted file mode 100755
index 3d8e25c79..000000000
--- a/scripts/sh/init_run_sp_exclusive_canfar.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-
-echo "start init run sp exclusive canfar"
-
-. /opt/conda/etc/profile.d/conda.sh
-
-conda activate shapepipe
-
-basedir=$HOME/cosmostat/P3_v2/psfex
-cd $basedir
-
-
-ID=$1
-n_SMP=$2
-typ=$3
-echo "ID=$ID n_SMP=$n_SMP type=$typ"
-
-export SP_RUN=.
-export SP_CONFIG=$HOME/shapepipe/example/cfis
-shapepipe_run -c $SP_CONFIG/config_exp_Pi.ini -e $ID
-
-cd $basedir
-
-echo "end init run sp exclusive canfar"
-
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index c39e943c7..e594e7e8f 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -160,7 +160,7 @@ def check_special(module, paths_in_dir, names_in_dir):
                             print(f"b stars = {value}, not special")
                         break
 
-        print(inds_special)
+        #print(inds_special)
         for idx in inds_special:
             paths_in_dir.pop(idx)
             names_in_dir.pop(idx)
@@ -418,7 +418,7 @@ def output_missing(
         return missing_IDs_unique
 
     def output_missing_job(self):
-        output_path = f"missing_job_{self._bit}_all.txt"
+        output_path = f"{self._path_main}/summary/missing_job_{self._bit}_all.txt"
 
         missing_IDs_all = set(self._missing_IDs_job)
 
@@ -511,6 +511,9 @@ def get_names_in_dir(self, iterable, module, idx):
                 + f"{self._path_left}/{subdir}/"
                 + f"{self._path_right[idx]}"
             )
+            if self._verbose:
+                print(f"**** base_and_subdir {base_and_subdir}")
+
             if os.path.isdir(base_and_subdir):
 
                 matches = []
@@ -527,6 +530,9 @@ def get_names_in_dir(self, iterable, module, idx):
                     if not matches:
                         continue
 
+                    if self._verbose:
+                        print("Matching entries: ", matches)
+
                     full_path = self.get_last_full_path(
                         base_and_subdir, matches
                     )
@@ -539,8 +545,8 @@ def get_names_in_dir(self, iterable, module, idx):
                     # Find matching file names and paths
                     self.get_matches_final(directory, idx)
             else:
-                #print(f"Directory base_and_subdir {base_and_subdir} not found")
-                pass
+                if self._verbose:
+                    print(f"Directory {base_and_subdir} not found")
 
     def update_subdirs(self, par_runtime):
         """Update Subdirs.

From 1bc602b99aa9ab703ea9ac166b3599ba9edb089c Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 16 Jan 2024 16:09:14 +0000
Subject: [PATCH 088/207] Started canfar howto

---
 docs/source/canfar.md | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
 create mode 100644 docs/source/canfar.md

diff --git a/docs/source/canfar.md b/docs/source/canfar.md
new file mode 100644
index 000000000..991d53ea7
--- /dev/null
+++ b/docs/source/canfar.md
@@ -0,0 +1,31 @@
+
+Steps from testing to parallel running:
+
+1. In ID directory, run shapepipe with config file
+
+2. In ID directory, run job
+
+   job_sp_canfar -j JOB
+
+3. In base directory, run single image
+
+  First in dry mode
+
+  init_run_exclusive_canfar.sh -j 64 -e 271.281 -p psfex -k tile -n
+
+  Then for real, remove option -n
+
+4. In base dir, run single image with curl
+
+    First in dry-mode=2 (showing curl command)
+    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile -n 2
+
+    First in dry-mode=1 (using curl command)
+    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile -n 1
+
+    Then real run
+    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile
+
+5. In base dir, run collection of images
+
+    curl_canfar_local.sh -j 64 -f tile_numbers.txt -p psfex -k tile

From d6ff43722360503103f63a1f923b24ae1611494c Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 16 Jan 2024 16:09:37 +0000
Subject: [PATCH 089/207] Added summary run notebook

---
 scripts/jupyter/summary_run.ipynb | 368 ++++++++++++++++++++++++++++++
 1 file changed, 368 insertions(+)
 create mode 100644 scripts/jupyter/summary_run.ipynb

diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb
new file mode 100644
index 000000000..26983d292
--- /dev/null
+++ b/scripts/jupyter/summary_run.ipynb
@@ -0,0 +1,368 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "130112a4-f2ca-4d26-b884-d8b054676f9c",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The autoreload extension is already loaded. To reload it, use:\n",
+      "  %reload_ext autoreload\n"
+     ]
+    }
+   ],
+   "source": [
+    "%load_ext autoreload\n",
+    "%autoreload 2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "c5e463a7-448f-4548-ab81-e660cfe57045",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/arc/home/kilbinger/shapepipe/scripts/jupyter\n",
+      "Defaulting to user installation because normal site-packages is not writeable\n",
+      "Processing /arc/home/kilbinger/shapepipe\n",
+      "  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
+      "\u001b[?25hRequirement already satisfied: joblib>=0.13 in /opt/conda/lib/python3.7/site-packages (from shapepipe==1.0.1) (1.2.0)\n",
+      "Requirement already satisfied: modopt>=1.2 in /arc/home/kilbinger/.local/lib/python3.7/site-packages (from shapepipe==1.0.1) (1.6.1)\n",
+      "Requirement already satisfied: numpy>=1.14 in /opt/conda/lib/python3.7/site-packages (from shapepipe==1.0.1) (1.21.6)\n",
+      "Requirement already satisfied: importlib-metadata>=3.7.0 in /opt/conda/lib/python3.7/site-packages (from modopt>=1.2->shapepipe==1.0.1) (4.11.4)\n",
+      "Requirement already satisfied: scipy>=1.5.4 in /opt/conda/lib/python3.7/site-packages (from modopt>=1.2->shapepipe==1.0.1) (1.7.3)\n",
+      "Requirement already satisfied: progressbar2>=3.53.1 in /arc/home/kilbinger/.local/lib/python3.7/site-packages (from modopt>=1.2->shapepipe==1.0.1) (4.2.0)\n",
+      "Requirement already satisfied: typing-extensions>=3.6.4 in /opt/conda/lib/python3.7/site-packages (from importlib-metadata>=3.7.0->modopt>=1.2->shapepipe==1.0.1) (4.5.0)\n",
+      "Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.7/site-packages (from importlib-metadata>=3.7.0->modopt>=1.2->shapepipe==1.0.1) (3.15.0)\n",
+      "Requirement already satisfied: python-utils>=3.0.0 in /arc/home/kilbinger/.local/lib/python3.7/site-packages (from progressbar2>=3.53.1->modopt>=1.2->shapepipe==1.0.1) (3.5.2)\n",
+      "Building wheels for collected packages: shapepipe\n",
+      "  Building wheel for shapepipe (setup.py) ... \u001b[?25ldone\n",
+      "\u001b[?25h  Created wheel for shapepipe: filename=shapepipe-1.0.1-py3-none-any.whl size=250346 sha256=bfed22a8e108ca0fa5f4243fe7723a481c32c2e5d6eef1af62a5262e63ab5f12\n",
+      "  Stored in directory: /tmp/pip-ephem-wheel-cache-nxs_30ro/wheels/83/8a/ec/cb0f2e7d438c89659ea7a80e8c13634e560f73bd6f82e48ce7\n",
+      "Successfully built shapepipe\n",
+      "Installing collected packages: shapepipe\n",
+      "  Attempting uninstall: shapepipe\n",
+      "    Found existing installation: shapepipe 1.0.1\n",
+      "    Uninstalling shapepipe-1.0.1:\n",
+      "      Successfully uninstalled shapepipe-1.0.1\n",
+      "Successfully installed shapepipe-1.0.1\n"
+     ]
+    }
+   ],
+   "source": [
+    "\n",
+    "!pip install ../.."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "196beca5-10a1-4cf5-9462-be145167cc70",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "import shapepipe\n",
+    "from shapepipe.utilities.summary import *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "id": "ca63c72d-212c-463e-a792-71efbac0b908",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# Setting\n",
+    "patch = \"P3\"\n",
+    "\n",
+    "retrieve = \"vos\"\n",
+    "verbose = False"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "id": "dcb5604c-d61f-4705-8295-63875455cadb",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# Load parameters\n",
+    "%run ~/shapepipe/scripts/python/summary_params_pre_v2 {patch}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "id": "e69b7dab-1fea-4fcc-a8d9-0720e1d628c3",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P3\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Set job info for patch P3\n"
+     ]
+    }
+   ],
+   "source": [
+    "jobs, list_tile_IDs = set_jobs_v2_pre_v2(patch, retrieve, verbose)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "id": "2c3a9dde-cf88-493f-926e-7ae7e8e10916",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# Initialize runtime dicionary.\n",
+    "par_runtime = init_par_runtime(list_tile_IDs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "id": "b7c63a22-ead1-4d6a-b081-a74ade515439",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "module                          expected     found   miss_expl missing uniq_miss  fr_found\n",
+      "====================================================================================================\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Start program\n",
+    "job_data.print_stats_header()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "id": "4720ae18-0633-4646-b392-b1b24e0294c3",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      " (Job 1)\n",
+      "get_images_runner_run_1             2536      2536         0         0       0.0    100.0%\n",
+      "find_exposures_runner               1268      1268         0         0       0.0    100.0%\n",
+      "get_images_runner_run_2             3420      3420         0         0       0.0    100.0%\n"
+     ]
+    }
+   ],
+   "source": [
+    "for key in \"1\":\n",
+    "    job = jobs[key]\n",
+    "    job.print_intro()\n",
+    "    job.check_numbers(par_runtime=par_runtime, indices=[0, 1])\n",
+    "\n",
+    "    all_exposures = get_all_exposures(job._paths_in_dir[1], verbose=True)\n",
+    "    par_runtime[\"n_exposures\"] = len(all_exposures)\n",
+    "\n",
+    "    job.check_numbers(par_runtime, indices=[2])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "id": "f149f404-64e7-4d92-8f54-f300ed620130",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# Update runtime dictionary with numbers of exposures\n",
+    "par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "id": "607fed1b-005a-4d3a-811c-51b1c5049c19",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "print_par_runtime(par_runtime, verbose=verbose)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "id": "78a9065f-8983-41cf-a34c-21892fc52dd2",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "# Get all keys after \"1\"\n",
+    "keys = sorted(jobs.keys(), key=int)\n",
+    "_ = keys.pop(0)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "id": "79e39954-1155-4ca3-b0b2-64bc5670db53",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      " (Job 2)\n",
+      "uncompress_fits_runner              1268      1268         0         0       0.0    100.0%\n",
+      "merge_headers_runner                   0         0         0         0       0.0    100.0%\n",
+      "split_exp_runner                  137940    137940         0         0       0.0    100.0%\n",
+      " (Job 4)\n",
+      "mask_runner                         1268      1268         0         0       0.0    100.0%\n",
+      " (Job 8)\n",
+      "mask_runner                        45600     45600         0         0       0.0    100.0%\n",
+      " (Job 16)\n"
+     ]
+    },
+    {
+     "ename": "KeyboardInterrupt",
+     "evalue": "",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_48/963628441.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m     \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjobs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m     \u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_intro\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m     \u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_numbers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpar_runtime\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpar_runtime\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/.local/lib/python3.7/site-packages/shapepipe/utilities/summary.py\u001b[0m in \u001b[0;36mcheck_numbers\u001b[0;34m(self, par_runtime, indices)\u001b[0m\n\u001b[1;32m    603\u001b[0m                 \u001b[0miterable\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    604\u001b[0m                 \u001b[0mmodule\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 605\u001b[0;31m                 \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    606\u001b[0m             )\n\u001b[1;32m    607\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m~/.local/lib/python3.7/site-packages/shapepipe/utilities/summary.py\u001b[0m in \u001b[0;36mget_names_in_dir\u001b[0;34m(self, iterable, module, idx)\u001b[0m\n\u001b[1;32m    515\u001b[0m                 \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"**** base_and_subdir {base_and_subdir}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    516\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 517\u001b[0;31m             \u001b[0;32mif\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase_and_subdir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    518\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    519\u001b[0m                 \u001b[0mmatches\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/opt/conda/lib/python3.7/genericpath.py\u001b[0m in \u001b[0;36misdir\u001b[0;34m(s)\u001b[0m\n\u001b[1;32m     40\u001b[0m     \u001b[0;34m\"\"\"Return true if the pathname refers to an existing directory.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m         \u001b[0mst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     43\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0mOSError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     44\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+     ]
+    }
+   ],
+   "source": [
+    "for key in keys:\n",
+    "    job = jobs[key]\n",
+    "    job.print_intro()\n",
+    "    job.check_numbers(par_runtime=par_runtime)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "id": "8d2243cb-5aa6-4e82-88f6-8689f15e5b61",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      " (Job 64)\n",
+      "psfex_interp_runner                 1268       945         0       323     323.0     74.5%\n",
+      "vignetmaker_runner_run_1            1268       971         0       297     297.0     76.6%\n",
+      "spread_model_runner                 1268       173         0      1095    1095.0     13.6%\n",
+      "vignetmaker_runner_run_2            5072       690         0      4382    1095.5     13.6%\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Update some runs\n",
+    "for key in [\"64\"]:\n",
+    "    job = jobs[key]\n",
+    "    job.print_intro()\n",
+    "    job.check_numbers(par_runtime=par_runtime)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e8a38747-21b7-4f74-b667-62094f17154e",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      " (Job 64)\n",
+      "psfex_interp_runner                 1268       965         0       303     303.0     76.1%\n",
+      "vignetmaker_runner_run_1            1268       993         0       275     275.0     78.3%\n",
+      "spread_model_runner                 1268       187         0      1081    1081.0     14.7%\n"
+     ]
+    }
+   ],
+   "source": [
+    "for key in [\"64\"]:\n",
+    "    job = jobs[key]\n",
+    "    job.print_intro()\n",
+    "    job.check_numbers(par_runtime=par_runtime)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "82cb7e0b-a8fa-4a55-840f-55ec0452bf7f",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.12"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}

From 1a81ae3b189a322589d837922f190da322be67bf Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 17 Jan 2024 15:27:54 +0000
Subject: [PATCH 090/207] psfex_interp: continue instead of error if one of the
 .psf files not found

---
 .../psfex_interp_package/psfex_interp.py      | 174 +++++++++---------
 1 file changed, 90 insertions(+), 84 deletions(-)

diff --git a/shapepipe/modules/psfex_interp_package/psfex_interp.py b/shapepipe/modules/psfex_interp_package/psfex_interp.py
index ea3db1de7..74064c296 100644
--- a/shapepipe/modules/psfex_interp_package/psfex_interp.py
+++ b/shapepipe/modules/psfex_interp_package/psfex_interp.py
@@ -29,82 +29,6 @@
 FILE_NOT_FOUND = 'File_not_found'
 
 
-def interpsfex(dotpsfpath, pos, thresh_star, thresh_chi2):
-    """Interpolate PSFEx.
-
-    Use PSFEx generated model to perform spatial PSF interpolation.
-
-    Parameters
-    ----------
-    dotpsfpath : str
-        Path to ``.psf`` file (PSFEx output)
-    pos : numpy.ndarray
-        Positions where the PSF model should be evaluated
-    thresh_star : int
-        Threshold of stars under which the PSF is not interpolated
-    thresh_chi2 : int
-        Threshold for chi squared
-
-    Returns
-    -------
-    numpy.ndarray
-        Array of PSFs, each row is the PSF image at the corresponding position
-        requested
-
-    """
-    if not os.path.exists(dotpsfpath):
-        return FILE_NOT_FOUND
-
-    # read PSF model and extract basis and polynomial degree and scale position
-    PSF_model = fits.open(dotpsfpath)[1]
-
-    # Check number of stars used to compute the PSF
-    if PSF_model.header['ACCEPTED'] < thresh_star:
-        return NOT_ENOUGH_STARS
-    if PSF_model.header['CHI2'] > thresh_chi2:
-        return BAD_CHI2
-
-    PSF_basis = np.array(PSF_model.data)[0][0]
-    try:
-        deg = PSF_model.header['POLDEG1']
-    except KeyError:
-        # constant PSF model
-        return PSF_basis[0, :, :]
-
-    # scale coordinates
-    x_interp, x_scale = (
-        PSF_model.header['POLZERO1'],
-        PSF_model.header['POLSCAL1']
-    )
-    y_interp, y_scale = (
-        PSF_model.header['POLZERO2'],
-        PSF_model.header['POLSCAL2']
-
-    )
-    xs, ys = (pos[:, 0] - x_interp) / x_scale, (pos[:, 1] - y_interp) / y_scale
-
-    # compute polynomial coefficients
-    coeffs = np.array([[x ** idx for idx in range(deg + 1)] for x in xs])
-    cross_coeffs = np.array([
-        np.concatenate([
-            [(x ** idx_j) * (y ** idx_i) for idx_j in range(deg - idx_i + 1)]
-            for idx_i in range(1, deg + 1)
-        ])
-        for x, y in zip(xs, ys)
-    ])
-    coeffs = np.hstack((coeffs, cross_coeffs))
-
-    # compute interpolated PSF
-    PSFs = np.array([
-        np.sum(
-            [coeff * atom for coeff, atom in zip(coeffs_posi, PSF_basis)],
-            axis=0,
-        )
-        for coeffs_posi in coeffs
-    ])
-
-    return PSFs
-
 
 class PSFExInterpolator(object):
     """The PSFEx Interpolator Class.
@@ -281,6 +205,88 @@ def _get_galaxy_positions(self):
             raise KeyError(pos_param_err)
         galcat.close()
 
+
+    def interpsfex(self, dotpsfpath, pos):
+        """Interpolate PSFEx.
+
+        Use PSFEx generated model to perform spatial PSF interpolation.
+
+        Parameters
+        ----------
+        dotpsfpath : str
+            Path to ``.psf`` file (PSFEx output)
+        pos : numpy.ndarray
+            Positions where the PSF model should be evaluated
+
+        Returns
+        -------
+        numpy.ndarray
+            Array of PSFs, each row is the PSF image at the corresponding position
+            requested
+    
+        """
+        if not os.path.exists(dotpsfpath):
+            return FILE_NOT_FOUND
+
+        # read PSF model and extract basis and polynomial degree and scale position
+        try:
+            PSF_model = fits.open(dotpsfpath)[1]
+        except OSError as err:
+            msg = f"Psf model file {dotpsfpath} empty or corrupt."
+            self._w_log.info(msg)
+            self._w_log.info(f"Error: {err=}, {type(err)=}")
+            raise
+
+        # Check number of stars used to compute the PSF
+        thresh_star = self._star_thresh
+        thresh_chi2 = self._chi2_thresh
+
+        if PSF_model.header['ACCEPTED'] < thresh_star:
+            return NOT_ENOUGH_STARS
+        if PSF_model.header['CHI2'] > thresh_chi2:
+            return BAD_CHI2
+
+        PSF_basis = np.array(PSF_model.data)[0][0]
+        try:
+            deg = PSF_model.header['POLDEG1']
+        except KeyError:
+            # constant PSF model
+            return PSF_basis[0, :, :]
+
+        # scale coordinates
+        x_interp, x_scale = (
+            PSF_model.header['POLZERO1'],
+            PSF_model.header['POLSCAL1']
+        )
+        y_interp, y_scale = (
+            PSF_model.header['POLZERO2'],
+            PSF_model.header['POLSCAL2']
+
+        )
+        xs, ys = (pos[:, 0] - x_interp) / x_scale, (pos[:, 1] - y_interp) / y_scale
+
+        # compute polynomial coefficients
+        coeffs = np.array([[x ** idx for idx in range(deg + 1)] for x in xs])
+        cross_coeffs = np.array([
+            np.concatenate([
+                [(x ** idx_j) * (y ** idx_i) for idx_j in range(deg - idx_i + 1)]
+                for idx_i in range(1, deg + 1)
+            ])
+            for x, y in zip(xs, ys)
+        ])
+        coeffs = np.hstack((coeffs, cross_coeffs))
+
+        # compute interpolated PSF
+        PSFs = np.array([
+            np.sum(
+                [coeff * atom for coeff, atom in zip(coeffs_posi, PSF_basis)],
+                axis=0,
+            )
+            for coeffs_posi in coeffs
+        ])
+
+        return PSFs
+
     def _interpolate(self):
         """Interpolate.
 
@@ -288,11 +294,9 @@ def _interpolate(self):
         positions.
 
         """
-        self.interp_PSFs = interpsfex(
+        self.interp_PSFs = self.interpsfex(
             self._dotpsf_path,
             self.gal_pos,
-            self._star_thresh,
-            self._chi2_thresh,
         )
 
     def _get_psfshapes(self):
@@ -608,7 +612,11 @@ def _interpolate_me(self):
                         found = True
                         break
                 if not found:
-                    raise ValueError("No dot psf file found")
+                    self._w_log.info(
+                        f"No .psf file found for exposure {exp_name} and"
+                        + f" ccd {ccd}"
+                    )
+                    continue
 
                 ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0]
                 obj_id = all_id[ind_obj]
@@ -620,11 +628,9 @@ def _interpolate_me(self):
                     )
                 ).T
 
-                self.interp_PSFs = interpsfex(
+                self.interp_PSFs = self.interpsfex(
                     dot_psf_path,
                     gal_pos,
-                    self._star_thresh,
-                    self._chi2_thresh,
                 )
 
                 if (
@@ -632,7 +638,7 @@ def _interpolate_me(self):
                     and self.interp_PSFs == NOT_ENOUGH_STARS
                 ):
                     self._w_log.info(
-                        f'Not enough stars find in the ccd {ccd} of the '
+                        f'Not enough stars found on ccd {ccd} of '
                         + f'exposure {exp_name}. Object inside this ccd will '
                         + 'lose an epoch.'
                     )

From 93d6c6ef5a18334427ddcaf87d9ab868846a324a Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 17 Jan 2024 15:49:17 +0000
Subject: [PATCH 091/207] fixed symlink config files

---
 example/cfis/config_Gie_vos.ini          | 101 +++++++++++++++++++++++
 example/cfis/config_GitFeGie_symlink.ini |   6 +-
 example/cfis/config_GitFeGie_vos.ini     |   1 +
 3 files changed, 107 insertions(+), 1 deletion(-)
 create mode 100644 example/cfis/config_Gie_vos.ini

diff --git a/example/cfis/config_Gie_vos.ini b/example/cfis/config_Gie_vos.ini
new file mode 100644
index 000000000..a326434e7
--- /dev/null
+++ b/example/cfis/config_Gie_vos.ini
@@ -0,0 +1,101 @@
+# ShapePipe configuration file for: get images
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = False
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_Gie
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = True
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = get_images_runner            
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 1
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+# Get exposures
+[GET_IMAGES_RUNNER]
+
+INPUT_DIR = last:find_exposures_runner
+
+FILE_PATTERN = exp_numbers
+
+FILE_EXT = .txt
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+
+# Paths
+
+# Output path (optional, default is [FILE]:OUTPUT_DIR
+# OUTPUT_PATH = input_images
+
+# Input path where original images are stored. Can be local path or vos url.
+# Single string or list of strings
+INPUT_PATH = vos:cfis/pitcairn, vos:cfis/weights, vos:cfis/flags
+# LSB images:
+#INPUT_PATH = vos:cfis/lsb_individual, vos:cfis/weights, vos:cfis/flags
+
+# Input file pattern including tile number as dummy template
+INPUT_FILE_PATTERN = 000000, 000000.weight, 000000.flag
+# LSB images
+#INPUT_FILE_PATTERN = 000000s, 000000p.weight, 000000p.flag
+
+# Input file extensions
+INPUT_FILE_EXT = .fits.fz, .fits.fz, .fits.fz
+
+# Input numbering scheme, python regexp
+INPUT_NUMBERING = \d{6}
+
+# Output file pattern without number
+OUTPUT_FILE_PATTERN = image-, weight-, flag-
+
+# Method to retrieve images, one in 'vos', 'symlink'
+RETRIEVE = vos
+
+# If RETRIEVE=vos, number of attempts to download
+# Optional, default=3
+N_TRY = 3
+
+# Retrieve command options, optional
+RETRIEVE_OPTIONS = --certfile=$VM_HOME/.ssl/cadcproxy.pem
diff --git a/example/cfis/config_GitFeGie_symlink.ini b/example/cfis/config_GitFeGie_symlink.ini
index 971df44d4..6f84d1482 100644
--- a/example/cfis/config_GitFeGie_symlink.ini
+++ b/example/cfis/config_GitFeGie_symlink.ini
@@ -80,7 +80,7 @@ INPUT_NUMBERING = \d{3}\.\d{3}
 # Output file pattern without number
 OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight-
 
-CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Git/get_images_runner_run_1/output
+#CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Git/get_images_runner_run_1/output
 
 # Copy/download method, one in 'vos', 'symlink'
 RETRIEVE = symlink
@@ -100,8 +100,12 @@ FILE_EXT = .fits
 # NUMBERING_SCHEME (optional) string with numbering pattern for input files
 NUMBERING_SCHEME = -000-000
 
+# Column number of exposure name in FITS header
 COLNUM = 3
 
+# Prefix to remove from exposure name
+EXP_PREFIX = p
+
 # Get exposures
 [GET_IMAGES_RUNNER_RUN_2]
 
diff --git a/example/cfis/config_GitFeGie_vos.ini b/example/cfis/config_GitFeGie_vos.ini
index eb06d372b..9ef72f198 100644
--- a/example/cfis/config_GitFeGie_vos.ini
+++ b/example/cfis/config_GitFeGie_vos.ini
@@ -86,6 +86,7 @@ RETRIEVE = vos
 # Copy command options, optional
 RETRIEVE_OPTIONS = --certfile=$VM_HOME/.ssl/cadcproxy.pem
 
+CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Git/get_images_runner_run_1/output
 
 [FIND_EXPOSURES_RUNNER]
 

From 9c0b9a540666b2eaa0e8e5162d22327306acd195 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 17 Jan 2024 15:49:42 +0000
Subject: [PATCH 092/207] Updated summary run

---
 scripts/jupyter/summary_run.ipynb       | 185 +++++++++++++++---------
 scripts/python/summary_params_pre_v2.py |  34 ++---
 scripts/python/summary_run.py           |   3 +-
 3 files changed, 135 insertions(+), 87 deletions(-)

diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb
index 26983d292..e57c72b1a 100644
--- a/scripts/jupyter/summary_run.ipynb
+++ b/scripts/jupyter/summary_run.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 17,
    "id": "130112a4-f2ca-4d26-b884-d8b054676f9c",
    "metadata": {
     "tags": []
@@ -22,50 +22,6 @@
     "%autoreload 2"
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": 16,
-   "id": "c5e463a7-448f-4548-ab81-e660cfe57045",
-   "metadata": {
-    "tags": []
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "/arc/home/kilbinger/shapepipe/scripts/jupyter\n",
-      "Defaulting to user installation because normal site-packages is not writeable\n",
-      "Processing /arc/home/kilbinger/shapepipe\n",
-      "  Preparing metadata (setup.py) ... \u001b[?25ldone\n",
-      "\u001b[?25hRequirement already satisfied: joblib>=0.13 in /opt/conda/lib/python3.7/site-packages (from shapepipe==1.0.1) (1.2.0)\n",
-      "Requirement already satisfied: modopt>=1.2 in /arc/home/kilbinger/.local/lib/python3.7/site-packages (from shapepipe==1.0.1) (1.6.1)\n",
-      "Requirement already satisfied: numpy>=1.14 in /opt/conda/lib/python3.7/site-packages (from shapepipe==1.0.1) (1.21.6)\n",
-      "Requirement already satisfied: importlib-metadata>=3.7.0 in /opt/conda/lib/python3.7/site-packages (from modopt>=1.2->shapepipe==1.0.1) (4.11.4)\n",
-      "Requirement already satisfied: scipy>=1.5.4 in /opt/conda/lib/python3.7/site-packages (from modopt>=1.2->shapepipe==1.0.1) (1.7.3)\n",
-      "Requirement already satisfied: progressbar2>=3.53.1 in /arc/home/kilbinger/.local/lib/python3.7/site-packages (from modopt>=1.2->shapepipe==1.0.1) (4.2.0)\n",
-      "Requirement already satisfied: typing-extensions>=3.6.4 in /opt/conda/lib/python3.7/site-packages (from importlib-metadata>=3.7.0->modopt>=1.2->shapepipe==1.0.1) (4.5.0)\n",
-      "Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.7/site-packages (from importlib-metadata>=3.7.0->modopt>=1.2->shapepipe==1.0.1) (3.15.0)\n",
-      "Requirement already satisfied: python-utils>=3.0.0 in /arc/home/kilbinger/.local/lib/python3.7/site-packages (from progressbar2>=3.53.1->modopt>=1.2->shapepipe==1.0.1) (3.5.2)\n",
-      "Building wheels for collected packages: shapepipe\n",
-      "  Building wheel for shapepipe (setup.py) ... \u001b[?25ldone\n",
-      "\u001b[?25h  Created wheel for shapepipe: filename=shapepipe-1.0.1-py3-none-any.whl size=250346 sha256=bfed22a8e108ca0fa5f4243fe7723a481c32c2e5d6eef1af62a5262e63ab5f12\n",
-      "  Stored in directory: /tmp/pip-ephem-wheel-cache-nxs_30ro/wheels/83/8a/ec/cb0f2e7d438c89659ea7a80e8c13634e560f73bd6f82e48ce7\n",
-      "Successfully built shapepipe\n",
-      "Installing collected packages: shapepipe\n",
-      "  Attempting uninstall: shapepipe\n",
-      "    Found existing installation: shapepipe 1.0.1\n",
-      "    Uninstalling shapepipe-1.0.1:\n",
-      "      Successfully uninstalled shapepipe-1.0.1\n",
-      "Successfully installed shapepipe-1.0.1\n"
-     ]
-    }
-   ],
-   "source": [
-    "\n",
-    "!pip install ../.."
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": 18,
@@ -81,7 +37,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 19,
    "id": "ca63c72d-212c-463e-a792-71efbac0b908",
    "metadata": {
     "tags": []
@@ -89,10 +45,9 @@
    "outputs": [],
    "source": [
     "# Setting\n",
-    "patch = \"P3\"\n",
+    "patch = \"P1\"\n",
     "\n",
-    "retrieve = \"vos\"\n",
-    "verbose = False"
+    "verbose = True"
    ]
   },
   {
@@ -110,7 +65,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 21,
    "id": "e69b7dab-1fea-4fcc-a8d9-0720e1d628c3",
    "metadata": {
     "tags": []
@@ -120,24 +75,24 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P3\n"
+      "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1\n"
      ]
     },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Set job info for patch P3\n"
+      "Set job info for patch P1\n"
      ]
     }
    ],
    "source": [
-    "jobs, list_tile_IDs = set_jobs_v2_pre_v2(patch, retrieve, verbose)"
+    "jobs, list_tile_IDs = set_jobs_v2_pre_v2(patch, verbose)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 22,
    "id": "2c3a9dde-cf88-493f-926e-7ae7e8e10916",
    "metadata": {
     "tags": []
@@ -150,7 +105,34 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 23,
+   "id": "1e9c1487-3cec-4394-9fcf-c12e92a0f984",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "===========\n",
+      "par_runtime\n",
+      "-----------\n",
+      "n_tile_IDs                       3527\n",
+      "list_tile_IDs                   3527 entries\n",
+      "===========\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print_par_runtime(par_runtime, verbose=verbose)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
    "id": "b7c63a22-ead1-4d6a-b081-a74ade515439",
    "metadata": {
     "tags": []
@@ -172,7 +154,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 27,
    "id": "4720ae18-0633-4646-b392-b1b24e0294c3",
    "metadata": {
     "tags": []
@@ -183,9 +165,39 @@
      "output_type": "stream",
      "text": [
       " (Job 1)\n",
-      "get_images_runner_run_1             2536      2536         0         0       0.0    100.0%\n",
-      "find_exposures_runner               1268      1268         0         0       0.0    100.0%\n",
-      "get_images_runner_run_2             3420      3420         0         0       0.0    100.0%\n"
+      "get_images_runner_run_1             7054      4402         0      2652    1326.0     62.4%\n",
+      "find_exposures_runner               3527       875         0      2652    2652.0     24.8%\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "** module get_images_runner_run_1\n",
+      "*** subdirs ['']\n",
+      "**** base_and_subdir /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1/output//.\n",
+      "Matching entries:  [<DirEntry 'run_sp_Git'>, <DirEntry 'run_sp_GitFeGie_2024-01-16_22-24-51'>]\n",
+      "** module find_exposures_runner\n",
+      "*** subdirs ['']\n",
+      "**** base_and_subdir /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1/output//.\n",
+      "Matching entries:  [<DirEntry 'run_sp_Git'>, <DirEntry 'run_sp_GitFeGie_2024-01-16_22-24-51'>]\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "get_images_runner_run_2             7119      1509         0      5610    1870.0     21.2%\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "** module get_images_runner_run_2\n",
+      "*** subdirs ['']\n",
+      "**** base_and_subdir /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1/output//.\n",
+      "Matching entries:  [<DirEntry 'run_sp_Git'>, <DirEntry 'run_sp_GitFeGie_2024-01-16_22-24-51'>]\n"
      ]
     }
    ],
@@ -195,15 +207,16 @@
     "    job.print_intro()\n",
     "    job.check_numbers(par_runtime=par_runtime, indices=[0, 1])\n",
     "\n",
-    "    all_exposures = get_all_exposures(job._paths_in_dir[1], verbose=True)\n",
+    "    all_exposures = get_all_exposures(job._paths_in_dir[1], verbose=verbose)\n",
     "    par_runtime[\"n_exposures\"] = len(all_exposures)\n",
+    "    par_runtime[\"list_exposures\"] = all_exposures\n",
     "\n",
     "    job.check_numbers(par_runtime, indices=[2])"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 28,
    "id": "f149f404-64e7-4d92-8f54-f300ed620130",
    "metadata": {
     "tags": []
@@ -216,12 +229,32 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 29,
    "id": "607fed1b-005a-4d3a-811c-51b1c5049c19",
    "metadata": {
     "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "===========\n",
+      "par_runtime\n",
+      "-----------\n",
+      "n_tile_IDs                       3527\n",
+      "list_tile_IDs                   3527 entries\n",
+      "n_exposures                      2373\n",
+      "list_exposures                  2373 entries\n",
+      "n_shdus                         94920\n",
+      "list_shdus                     94920 entries\n",
+      "n_3*n_shdus+n_exposures        287133\n",
+      "===========\n",
+      "\n"
+     ]
+    }
+   ],
    "source": [
     "print_par_runtime(par_runtime, verbose=verbose)"
    ]
@@ -313,7 +346,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 35,
    "id": "e8a38747-21b7-4f74-b667-62094f17154e",
    "metadata": {},
    "outputs": [
@@ -324,7 +357,8 @@
       " (Job 64)\n",
       "psfex_interp_runner                 1268       965         0       303     303.0     76.1%\n",
       "vignetmaker_runner_run_1            1268       993         0       275     275.0     78.3%\n",
-      "spread_model_runner                 1268       187         0      1081    1081.0     14.7%\n"
+      "spread_model_runner                 1268       187         0      1081    1081.0     14.7%\n",
+      "vignetmaker_runner_run_2            5072       749         0      4323    1080.8     14.8%\n"
      ]
     }
    ],
@@ -340,6 +374,27 @@
    "execution_count": null,
    "id": "82cb7e0b-a8fa-4a55-840f-55ec0452bf7f",
    "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      " (Job 64)\n"
+     ]
+    }
+   ],
+   "source": [
+    "for key in [\"64\"]:\n",
+    "    job = jobs[key]\n",
+    "    job.print_intro()\n",
+    "    job.check_numbers(par_runtime=par_runtime)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c57c576f-b7e8-4735-a047-5b63e245f9a4",
+   "metadata": {},
    "outputs": [],
    "source": []
   }
diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 635dc15da..31b63cb3c 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -32,7 +32,7 @@ def update_par_runtime_after_find_exp(par_runtime, all_exposures):
     return par_runtime
 
 
-def set_jobs_v2_pre_v2(patch, retrieve, verbose):
+def set_jobs_v2_pre_v2(patch, verbose):
     """ Return information about shapepipe jobs
     
     """
@@ -53,12 +53,6 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
 
     logging.info(f"Checking main directory = {path_main}")
 
-    # Number of links created for retrieved images
-    if retrieve == "vos":
-        n_link = 2
-    else:
-        n_link = 1
-
     # Tile IDs
     tile_ID_path = f"{path_main}/tile_numbers.txt"
 
@@ -67,8 +61,14 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
 
     jobs = {}
 
-#        "run_sp_GitFeGie_",
     # Set the first job (retrieve images)
+    
+    # With "CFIS_" only the linked images are counted. The original
+    # ones do not match the IDdash pattern.
+    # If images were downloaded in several runs:
+    # - Only copy original images, then (re-)set links in SP numbering format
+    # - get_images_runner_run_[12] consistent
+    # - remove previous output dirs since only last is searched
     jobs["1"] = job_data(
         1,
          "run_sp_Git",
@@ -79,33 +79,27 @@ def set_jobs_v2_pre_v2(patch, retrieve, verbose):
         ],
         ["tile_IDs", "tile_IDs", "exposures"],
         pattern=["CFIS_", "", ""],
-        n_mult=[1 * n_link, 1, 3],
+        n_mult=[2, 1, 3],
         path_main=path_main,
         path_left="output",
         verbose=verbose,
     )
 
+    #        n_mult=[1, 1, 1],
     jobs["2"] = job_data(
         2,
         ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh_2023-12"],
         ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
         ["tile_IDs", 0, "3*n_shdus+n_exposures"],
-        n_mult=[1, 1, 1],
         path_main=path_main,
         path_left="output",
         verbose=verbose,
     )
 
-    if patch == "PX":
-        run_dir_mask_tiles = "run_sp_combined_flag"
-        run_dir_mask_exp = run_dir_mask_tiles
-        mask_module_tiles = "mask_runner_run_1"
-        mask_module_exp = "mask_runner_run_2"
-    else:
-        run_dir_mask_tiles = "run_sp_tile_Ma"
-        run_dir_mask_exp = "run_sp_exp_Ma"
-        mask_module_tiles = "mask_runner"
-        mask_module_exp = "mask_runner"
+    run_dir_mask_tiles = "run_sp_tile_Ma"
+    run_dir_mask_exp = "run_sp_exp_Ma"
+    mask_module_tiles = "mask_runner"
+    mask_module_exp = "mask_runner"
 
     jobs["4"] = job_data(
         4,
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index 973d74bd4..b790300af 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -10,12 +10,11 @@ def main(argv=None):
 
     patch = argv[1]
 
-    retrieve = "vos"
     verbose = False
     
     import summary_params_pre_v2 as params
 
-    jobs, list_tile_IDs_dot = params.set_jobs_v2_pre_v2(patch, retrieve, verbose)
+    jobs, list_tile_IDs_dot = params.set_jobs_v2_pre_v2(patch, verbose)
     
     list_tile_IDs = job_data.replace_dot_dash(list_tile_IDs_dot)
     

From b19ad035208b5a53a9618ec62e08fcf9efb866c4 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 17 Jan 2024 15:50:14 +0000
Subject: [PATCH 093/207] revert to main psfex in link exp for tiles script

---
 scripts/python/link_to_exp_for_tile.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index fc8ca9a69..0ad205adf 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -252,7 +252,7 @@ def get_paths(exp_base_dir, exp_shdu_IDs, pattern):
 
         if n_subdirs != 1:
             msg = (
-                f"Exactly on directory matching {pattern} in {path} expected,"
+                f"Exactly one directory matching {pattern} in {path} expected,"
                 + f"  not {n_subdirs}"
             )
             print(msg)
@@ -324,7 +324,8 @@ def main(argv=None):
     exp_IDs = get_exp_IDs(tile_base_dir, tile_ID, verbose=verbose)
     exp_shdu_IDs = get_exp_single_HDU_IDs(exp_IDs, n_CPU)
 
-    patterns = ["run_sp_exp_SxSePsf"] #, "run_sp_exp_Pi"]
+    # Note: psfex P3 is mostly run_sp_exp_SxSePsf
+    patterns = ["run_sp_exp_SxSePsfPi"] #, "run_sp_exp_Pi"]
     for pattern in patterns:
         paths, number = get_paths(exp_base_dir, exp_shdu_IDs, pattern)
 

From af3855608a58c903fc8924fd88c9ffd4b93dfbfa Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 17 Jan 2024 15:50:47 +0000
Subject: [PATCH 094/207] curl job script: remoging session logs

---
 scripts/sh/curl_canfar_local.sh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 4b85d7cef..ed4d21bd5 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -142,6 +142,8 @@ if [ "$dry_run" == 2 ]; then
 
 else
 
+  rm -rf session_IDs.txt session_image_IDs.txt
+
   if [ "$ID" == "-1" ]; then
 
     for ID in `cat $file_IDs`; do

From 8c9921f80f10e7e887e0f85ae01407af9309f7ae Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 17 Jan 2024 15:51:22 +0000
Subject: [PATCH 095/207] comments

---
 shapepipe/modules/mccd_package/mccd_interpolation_script.py | 2 --
 shapepipe/utilities/summary.py                              | 5 +++--
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/shapepipe/modules/mccd_package/mccd_interpolation_script.py b/shapepipe/modules/mccd_package/mccd_interpolation_script.py
index 40e644e8b..c899b2b8f 100644
--- a/shapepipe/modules/mccd_package/mccd_interpolation_script.py
+++ b/shapepipe/modules/mccd_package/mccd_interpolation_script.py
@@ -435,8 +435,6 @@ def _interpolate_me(self):
                 ).T
 
                 self.interp_PSFs = interp_MCCD(mccd_model_path, gal_pos, ccd)
-                # self.interp_PSFs = interpsfex(
-                # dot_psf_path, gal_pos, self._star_thresh, self._chi2_thresh)
 
                 if (
                     isinstance(self.interp_PSFs, str)
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index e594e7e8f..001e975f6 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -412,8 +412,7 @@ def output_missing(
                 )
             else:
                 output_path = self._output_path_missing_IDs[idx]
-
-        self.write_IDs_to_file(output_path, missing_IDs_unique)
+            self.write_IDs_to_file(output_path, missing_IDs_unique)
 
         return missing_IDs_unique
 
@@ -541,6 +540,8 @@ def get_names_in_dir(self, iterable, module, idx):
                     directory = self.get_module_output_dir(
                         full_path, module
                     )
+                    if self._verbose:
+                        print(f"**** Output dir = {directory}")
 
                     # Find matching file names and paths
                     self.get_matches_final(directory, idx)

From 4276feaa62d958b2bd1dde065b0d742ef7d654df Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 19 Jan 2024 16:49:33 +0100
Subject: [PATCH 096/207] Update canfar.md

Started md and cleanup of canfar doc
---
 docs/source/canfar.md | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/docs/source/canfar.md b/docs/source/canfar.md
index 991d53ea7..d1779a153 100644
--- a/docs/source/canfar.md
+++ b/docs/source/canfar.md
@@ -1,5 +1,12 @@
+# Running `shapepipe` on the canfar science portal
+
+## Introduction
+
+## Steps from testing to parallel running
+
+Before starting a batch remote session job on a large number of images (step 6.),
+it is recommended to perform some or all of the testing steps (1. - 5.).
 
-Steps from testing to parallel running:
 
 1. In ID directory, run shapepipe with config file
 

From 3f1553315dd6ca71c3c533bb2744786797294893 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 19 Jan 2024 16:53:13 +0100
Subject: [PATCH 097/207] Update canfar.md

continue editing
---
 docs/source/canfar.md | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/docs/source/canfar.md b/docs/source/canfar.md
index d1779a153..e743e72bc 100644
--- a/docs/source/canfar.md
+++ b/docs/source/canfar.md
@@ -8,13 +8,19 @@ Before starting a batch remote session job on a large number of images (step 6.)
 it is recommended to perform some or all of the testing steps (1. - 5.).
 
 
-1. In ID directory, run shapepipe with config file
-
-2. In ID directory, run job
-
-   job_sp_canfar -j JOB
-
-3. In base directory, run single image
+1. Run the basic `shapepipe` runner script to test (one or several) modules in question, specified by a given config file, on one image.
+   This step has to be run in the image run directory. The command is
+   ```bash
+   shapepipe_run -c config.ini
+   ```
+
+2. Run the job script to test the job management, on one image.
+   This step has to be run in the image run directory. The command is
+   ```bash
+   job_sp_canfar -j JOB [OPTIONS]
+   ```
+
+5. In base directory, run single image
 
   First in dry mode
 

From cfefcfb000f6607b0279d48bad40bf340b6e8d31 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 19 Jan 2024 17:40:52 +0100
Subject: [PATCH 098/207] Update canfar.md

added monitoring and status
---
 docs/source/canfar.md | 80 ++++++++++++++++++++++++++++++-------------
 1 file changed, 56 insertions(+), 24 deletions(-)

diff --git a/docs/source/canfar.md b/docs/source/canfar.md
index e743e72bc..7a83e47e6 100644
--- a/docs/source/canfar.md
+++ b/docs/source/canfar.md
@@ -4,8 +4,8 @@
 
 ## Steps from testing to parallel running
 
-Before starting a batch remote session job on a large number of images (step 6.),
-it is recommended to perform some or all of the testing steps (1. - 5.).
+Before starting a batch remote session job on a large number of images (step 5.),
+it is recommended to perform some or all of the testing steps (1. - 4.).
 
 
 1. Run the basic `shapepipe` runner script to test (one or several) modules in question, specified by a given config file, on one image.
@@ -20,25 +20,57 @@ it is recommended to perform some or all of the testing steps (1. - 5.).
    job_sp_canfar -j JOB [OPTIONS]
    ```
 
-5. In base directory, run single image
-
-  First in dry mode
-
-  init_run_exclusive_canfar.sh -j 64 -e 271.281 -p psfex -k tile -n
-
-  Then for real, remove option -n
-
-4. In base dir, run single image with curl
-
-    First in dry-mode=2 (showing curl command)
-    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile -n 2
-
-    First in dry-mode=1 (using curl command)
-    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile -n 1
-
-    Then real run
-    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile
-
-5. In base dir, run collection of images
-
-    curl_canfar_local.sh -j 64 -f tile_numbers.txt -p psfex -k tile
+3. Run the pipeline script to test the processing step(s), on one image.
+   This step has to be run in the patch base directory.
+
+   1. First, run in dry mode:
+      ```bash
+      init_run_exclusive_canfar.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n
+      ```
+   2. Next, perform a real run with
+      ```bash
+      init_run_exclusive_canfar.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n
+      ```
+
+4. Run remote session script to test job submission using docker images, on one image.
+   This step has to be run in the patch base directory.
+   1. First, run in dry mode=2, to display curl command, with
+      ```bash
+      curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n 2
+      ```
+
+   2. Next, run in dry mode=1, to use curl command without processing:
+      ```bash
+      curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n 1
+      ```
+   3. Then, perform a real run, to use curl with processing:
+      ```bash
+      curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp]
+      ```
+   
+5. Full run: Call remote session script and docker image with collection of images
+      ```bash
+      curl_canfar_local.sh -j JOB -f path_IDs -p [psfex|mccd] -k [tile|exp]
+      ```
+      with `path_IDs` being a text file with one image ID per line.
+
+## Monitoring
+
+Monitoring of the currently active remote session can be performed using the session IDs `session_IDs.txt` written by the
+remote session script `curl_canfar_local.sh`. In the patch main directory, run
+```bash
+curl_canfar_monitor.sh logs
+```
+to print `stdout` of the remotely run pipeline script, and
+```bash
+curl_canfar_monitor.sh events
+```
+to display the remotely started docker image status.
+
+## Post-hoc summary
+
+In the patch main directory, run
+```bash
+summary_run PATCH
+```
+to print a summary with missing image IDs per job and module.

From 24480e2b1da1612cd9e390488954d817ef08c4f1 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 19 Jan 2024 17:41:07 +0100
Subject: [PATCH 099/207] Update canfar.md

monitoring
---
 docs/source/canfar.md | 80 ++++++++++++++++++++++++++++++-------------
 1 file changed, 56 insertions(+), 24 deletions(-)

diff --git a/docs/source/canfar.md b/docs/source/canfar.md
index e743e72bc..7a83e47e6 100644
--- a/docs/source/canfar.md
+++ b/docs/source/canfar.md
@@ -4,8 +4,8 @@
 
 ## Steps from testing to parallel running
 
-Before starting a batch remote session job on a large number of images (step 6.),
-it is recommended to perform some or all of the testing steps (1. - 5.).
+Before starting a batch remote session job on a large number of images (step 5.),
+it is recommended to perform some or all of the testing steps (1. - 4.).
 
 
 1. Run the basic `shapepipe` runner script to test (one or several) modules in question, specified by a given config file, on one image.
@@ -20,25 +20,57 @@ it is recommended to perform some or all of the testing steps (1. - 5.).
    job_sp_canfar -j JOB [OPTIONS]
    ```
 
-5. In base directory, run single image
-
-  First in dry mode
-
-  init_run_exclusive_canfar.sh -j 64 -e 271.281 -p psfex -k tile -n
-
-  Then for real, remove option -n
-
-4. In base dir, run single image with curl
-
-    First in dry-mode=2 (showing curl command)
-    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile -n 2
-
-    First in dry-mode=1 (using curl command)
-    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile -n 1
-
-    Then real run
-    curl_canfar_local.sh -j 64 -e 271.282 -p psfex -k tile
-
-5. In base dir, run collection of images
-
-    curl_canfar_local.sh -j 64 -f tile_numbers.txt -p psfex -k tile
+3. Run the pipeline script to test the processing step(s), on one image.
+   This step has to be run in the patch base directory.
+
+   1. First, run in dry mode:
+      ```bash
+      init_run_exclusive_canfar.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n
+      ```
+   2. Next, perform a real run with
+      ```bash
+      init_run_exclusive_canfar.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n
+      ```
+
+4. Run remote session script to test job submission using docker images, on one image.
+   This step has to be run in the patch base directory.
+   1. First, run in dry mode=2, to display curl command, with
+      ```bash
+      curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n 2
+      ```
+
+   2. Next, run in dry mode=1, to use curl command without processing:
+      ```bash
+      curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n 1
+      ```
+   3. Then, perform a real run, to use curl with processing:
+      ```bash
+      curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp]
+      ```
+   
+5. Full run: Call remote session script and docker image with collection of images
+      ```bash
+      curl_canfar_local.sh -j JOB -f path_IDs -p [psfex|mccd] -k [tile|exp]
+      ```
+      with `path_IDs` being a text file with one image ID per line.
+
+## Monitoring
+
+Monitoring of the currently active remote session can be performed using the session IDs `session_IDs.txt` written by the
+remote session script `curl_canfar_local.sh`. In the patch main directory, run
+```bash
+curl_canfar_monitor.sh logs
+```
+to print `stdout` of the remotely run pipeline script, and
+```bash
+curl_canfar_monitor.sh events
+```
+to display the remotely started docker image status.
+
+## Post-hoc summary
+
+In the patch main directory, run
+```bash
+summary_run PATCH
+```
+to print a summary with missing image IDs per job and module.

From 9a964c5fcf94f1bbc0ddd3176b8aa2a21a1a8adc Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 26 Jan 2024 10:55:39 +0000
Subject: [PATCH 100/207] updated canfar doc

---
 docs/source/canfar.md | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/docs/source/canfar.md b/docs/source/canfar.md
index 7a83e47e6..1f490c504 100644
--- a/docs/source/canfar.md
+++ b/docs/source/canfar.md
@@ -56,16 +56,28 @@ it is recommended to perform some or all of the testing steps (1. - 4.).
 
 ## Monitoring
 
+
+### Status and output of submitted job 
+
 Monitoring of the currently active remote session can be performed using the session IDs `session_IDs.txt` written by the
 remote session script `curl_canfar_local.sh`. In the patch main directory, run
 ```bash
+curl_canfar_monitor.sh events
+```
+to display the remotely started docker image status, and
+```bash
 curl_canfar_monitor.sh logs
 ```
-to print `stdout` of the remotely run pipeline script, and
+to print `stdout` of the remotely run pipeline script.
+
+### Number of submitted running jobs
+
+The script
 ```bash
-curl_canfar_monitor.sh events
+stats_headless_canfar.py
 ```
-to display the remotely started docker image status.
+returns the number of actively running headless jobs.
+
 
 ## Post-hoc summary
 
@@ -74,3 +86,9 @@ In the patch main directory, run
 summary_run PATCH
 ```
 to print a summary with missing image IDs per job and module.
+
+## Deleting jobs
+
+```bash
+ for id in `cat session_IDs.txt`; do echo $id; curl -X DELETE -E /arc/home/kilbinger/.ssl/cadcproxy.pem https://ws-uv.canfar.net/skaha/v0/session/$id;  done
+ ```

From e0100cad201ca91a0fec9f75a53ee6cc52eacdd6 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 26 Jan 2024 10:56:18 +0000
Subject: [PATCH 101/207] script with akaha lib to count headlerss jobs

---
 environment.yml                         |  1 +
 scripts/python/stats_headless_canfar.py | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+)
 create mode 100755 scripts/python/stats_headless_canfar.py

diff --git a/environment.yml b/environment.yml
index ea42dda00..548c7e618 100644
--- a/environment.yml
+++ b/environment.yml
@@ -22,6 +22,7 @@ dependencies:
     - PyQt5
     - pyqtgraph
     - reproject
+    - skaha
     - sip_tpv
     - sf_tools
     - sqlitedict
diff --git a/scripts/python/stats_headless_canfar.py b/scripts/python/stats_headless_canfar.py
new file mode 100755
index 000000000..1ede78eed
--- /dev/null
+++ b/scripts/python/stats_headless_canfar.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+
+# Name: stats_headless_canfar.py
+
+import sys
+from skaha.session import Session
+
+
+def main(argv=None):
+    session = Session()
+
+    n_headless = session.stats()["instances"]["headless"]
+
+    print(n_headless)
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))

From 984ec90c259fd02cab49f6c5c10c275810a779d5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 26 Jan 2024 10:56:59 +0000
Subject: [PATCH 102/207] cleaned up curl submit script

---
 scripts/sh/curl_canfar_local.sh | 92 ++++++++++++++++++++++++++++-----
 1 file changed, 80 insertions(+), 12 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index ed4d21bd5..b02f9205f 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -119,46 +119,114 @@ RESOURCES="ram=4&cores=$N_SMP"
 
 # TODO: dir as command line argument to this script
 dir=`pwd`
-arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+#arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+
+
+# Return argument for local script to be called via curl
+function set_arg() {
+  my_arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+  echo $my_arg
+}
+
+
+function call_curl() {
+  my_arg=$1
+
+}
+
+function update_session_logs() {
+  echo $my_session >> session_IDs.txt
+  echo "$my_session $ID" >> session_image_IDs.txt
+
+}
+
+function submit_batch() {
+  path=$1
+
+  for ID in `cat $path`; do
+    my_arg=$(set_arg)
+    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg"`
+    update_session_logs
+  done
+
+}
+
+n_max=200
+batch=20
+sleep=300
+
+((n_thresh=n_max- batch))
 
 
 if [ "$dry_run" == 2 ]; then
 
+  # Do not call curl (dry run = 2)
   echo "Running command dry run:"
 
   if [ "$ID" == "-1" ]; then
 
+    # Submit file (dry run = 2)
     for ID in `cat $file_IDs`; do
-      arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+      arg=$(set_arg)
       echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
     done
 
   else
 
-    arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+    # Submit image (dry run = 2)
+    arg=$(set_arg)
     echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
 
   fi
 
 else
 
+  # Call curl
   rm -rf session_IDs.txt session_image_IDs.txt
 
   if [ "$ID" == "-1" ]; then
 
-    for ID in `cat $file_IDs`; do
-      arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
-      session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"`
-      echo $session >> session_IDs.txt
-      echo "$session $ID" >> session_image_IDs.txt
-    done
+    # Submit file
+    n_jobs=`cat $file_IDs | wc -l`
+    if [ "$n_jobs" -gt "$n_max" ]; then
+
+      # Split into batches 
+      prefix="${file_IDs}_split_"
+      split -d -l $batch $file_IDs $prefix
+      n_split=`ls -l $prefix* | wc -l`
+      echo "Split '$file_IDs' into $n_split batches of size $batch"
+
+      count=1
+      for batch in $prefix*; do
+        echo "Number of running jobs = $n_running"
+        echo "Submitting batch $batch ($count/$n_split)"
+        submit_batch $batch
+        ((count=count+1))
+
+        n_running=`stats_headless_canfar.py`
+
+        while [ "$n_running" -gt "$n_thresh" ]; do
+          echo "Wait for #jobs = $n_running jobs to go < $n_thresh ..."
+          sleep $sleep
+          n_running=`stats_headless_canfar.py`
+        done
+
+      done
+
+    else
+
+      # Submit entire file (single batch)
+      echo "Submit '$file_IDs' in single batch"
+      submit_batch $file_IDs
+
+    fi
 
   else
 
-    arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+    # Submit image
+    arg=$(set_arg)
     session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"`
-    echo $session >> session_IDs.txt
-    echo "$session $ID" >> session_image_IDs.txt
+    update_session_logs
 
   fi
 

From 842e3824e4ac6dc4ccaf5cac9f26f47dd73f46e0 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 26 Jan 2024 10:57:56 +0000
Subject: [PATCH 103/207] minor modifs to summary

---
 scripts/jupyter/summary_run.ipynb       | 235 +++++++-----------------
 scripts/python/summary_params_pre_v2.py |   6 +-
 shapepipe/utilities/summary.py          |   7 +-
 3 files changed, 77 insertions(+), 171 deletions(-)

diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb
index e57c72b1a..8c42e3865 100644
--- a/scripts/jupyter/summary_run.ipynb
+++ b/scripts/jupyter/summary_run.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 20,
    "id": "130112a4-f2ca-4d26-b884-d8b054676f9c",
    "metadata": {
     "tags": []
@@ -24,7 +24,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 21,
    "id": "196beca5-10a1-4cf5-9462-be145167cc70",
    "metadata": {
     "tags": []
@@ -37,7 +37,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 22,
    "id": "ca63c72d-212c-463e-a792-71efbac0b908",
    "metadata": {
     "tags": []
@@ -45,14 +45,14 @@
    "outputs": [],
    "source": [
     "# Setting\n",
-    "patch = \"P1\"\n",
+    "patch = \"P3\"\n",
     "\n",
-    "verbose = True"
+    "verbose = False"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 23,
    "id": "dcb5604c-d61f-4705-8295-63875455cadb",
    "metadata": {
     "tags": []
@@ -65,7 +65,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 24,
    "id": "e69b7dab-1fea-4fcc-a8d9-0720e1d628c3",
    "metadata": {
     "tags": []
@@ -75,14 +75,14 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1\n"
+      "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P3\n"
      ]
     },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Set job info for patch P1\n"
+      "Set job info for patch P3\n"
      ]
     }
    ],
@@ -92,7 +92,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 25,
    "id": "2c3a9dde-cf88-493f-926e-7ae7e8e10916",
    "metadata": {
     "tags": []
@@ -105,34 +105,19 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 26,
    "id": "1e9c1487-3cec-4394-9fcf-c12e92a0f984",
    "metadata": {
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "===========\n",
-      "par_runtime\n",
-      "-----------\n",
-      "n_tile_IDs                       3527\n",
-      "list_tile_IDs                   3527 entries\n",
-      "===========\n",
-      "\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "print_par_runtime(par_runtime, verbose=verbose)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 27,
    "id": "b7c63a22-ead1-4d6a-b081-a74ade515439",
    "metadata": {
     "tags": []
@@ -154,7 +139,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 28,
    "id": "4720ae18-0633-4646-b392-b1b24e0294c3",
    "metadata": {
     "tags": []
@@ -165,58 +150,27 @@
      "output_type": "stream",
      "text": [
       " (Job 1)\n",
-      "get_images_runner_run_1             7054      4402         0      2652    1326.0     62.4%\n",
-      "find_exposures_runner               3527       875         0      2652    2652.0     24.8%\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "** module get_images_runner_run_1\n",
-      "*** subdirs ['']\n",
-      "**** base_and_subdir /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1/output//.\n",
-      "Matching entries:  [<DirEntry 'run_sp_Git'>, <DirEntry 'run_sp_GitFeGie_2024-01-16_22-24-51'>]\n",
-      "** module find_exposures_runner\n",
-      "*** subdirs ['']\n",
-      "**** base_and_subdir /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1/output//.\n",
-      "Matching entries:  [<DirEntry 'run_sp_Git'>, <DirEntry 'run_sp_GitFeGie_2024-01-16_22-24-51'>]\n"
-     ]
-    },
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "get_images_runner_run_2             7119      1509         0      5610    1870.0     21.2%\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "** module get_images_runner_run_2\n",
-      "*** subdirs ['']\n",
-      "**** base_and_subdir /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P1/output//.\n",
-      "Matching entries:  [<DirEntry 'run_sp_Git'>, <DirEntry 'run_sp_GitFeGie_2024-01-16_22-24-51'>]\n"
+      "get_images_runner_run_1             2536      2536         0         0       0.0    100.0%\n",
+      "find_exposures_runner               1268      1268         0         0       0.0    100.0%\n",
+      "get_images_runner_run_2             3420      3420         0         0       0.0    100.0%\n"
      ]
     }
    ],
    "source": [
     "for key in \"1\":\n",
-    "    job = jobs[key]\n",
-    "    job.print_intro()\n",
-    "    job.check_numbers(par_runtime=par_runtime, indices=[0, 1])\n",
+    "    jobs[key].print_intro()\n",
+    "    jobs[key].check_numbers(par_runtime=par_runtime, indices=[0, 1])\n",
     "\n",
-    "    all_exposures = get_all_exposures(job._paths_in_dir[1], verbose=verbose)\n",
+    "    all_exposures = get_all_exposures(jobs[key]._paths_in_dir[1], verbose=verbose)\n",
     "    par_runtime[\"n_exposures\"] = len(all_exposures)\n",
     "    par_runtime[\"list_exposures\"] = all_exposures\n",
     "\n",
-    "    job.check_numbers(par_runtime, indices=[2])"
+    "    jobs[key].check_numbers(par_runtime, indices=[2])"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 29,
    "id": "f149f404-64e7-4d92-8f54-f300ed620130",
    "metadata": {
     "tags": []
@@ -229,39 +183,19 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 30,
    "id": "607fed1b-005a-4d3a-811c-51b1c5049c19",
    "metadata": {
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "===========\n",
-      "par_runtime\n",
-      "-----------\n",
-      "n_tile_IDs                       3527\n",
-      "list_tile_IDs                   3527 entries\n",
-      "n_exposures                      2373\n",
-      "list_exposures                  2373 entries\n",
-      "n_shdus                         94920\n",
-      "list_shdus                     94920 entries\n",
-      "n_3*n_shdus+n_exposures        287133\n",
-      "===========\n",
-      "\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "print_par_runtime(par_runtime, verbose=verbose)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 31,
    "id": "78a9065f-8983-41cf-a34c-21892fc52dd2",
    "metadata": {
     "tags": []
@@ -275,7 +209,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 32,
    "id": "79e39954-1155-4ca3-b0b2-64bc5670db53",
    "metadata": {
     "tags": []
@@ -293,34 +227,45 @@
       "mask_runner                         1268      1268         0         0       0.0    100.0%\n",
       " (Job 8)\n",
       "mask_runner                        45600     45600         0         0       0.0    100.0%\n",
-      " (Job 16)\n"
-     ]
-    },
-    {
-     "ename": "KeyboardInterrupt",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
-      "\u001b[0;32m/tmp/ipykernel_48/963628441.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m     \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjobs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m     \u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_intro\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m     \u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_numbers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpar_runtime\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpar_runtime\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/.local/lib/python3.7/site-packages/shapepipe/utilities/summary.py\u001b[0m in \u001b[0;36mcheck_numbers\u001b[0;34m(self, par_runtime, indices)\u001b[0m\n\u001b[1;32m    603\u001b[0m                 \u001b[0miterable\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    604\u001b[0m                 \u001b[0mmodule\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 605\u001b[0;31m                 \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    606\u001b[0m             )\n\u001b[1;32m    607\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.local/lib/python3.7/site-packages/shapepipe/utilities/summary.py\u001b[0m in \u001b[0;36mget_names_in_dir\u001b[0;34m(self, iterable, module, idx)\u001b[0m\n\u001b[1;32m    515\u001b[0m                 \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"**** base_and_subdir {base_and_subdir}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    516\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 517\u001b[0;31m             \u001b[0;32mif\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbase_and_subdir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    518\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    519\u001b[0m                 \u001b[0mmatches\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/opt/conda/lib/python3.7/genericpath.py\u001b[0m in \u001b[0;36misdir\u001b[0;34m(s)\u001b[0m\n\u001b[1;32m     40\u001b[0m     \u001b[0;34m\"\"\"Return true if the pathname refers to an existing directory.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m         \u001b[0mst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     43\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0mOSError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     44\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+      " (Job 16)\n",
+      "sextractor_runner                   2536      2536         0         0       0.0    100.0%\n",
+      " (Job 32)\n",
+      "sextractor_runner                  91200     91200         0         0       0.0    100.0%\n",
+      "setools_runner                     91200     91032         0       168      84.0     99.8%\n",
+      "psfex_runner                       91200     91032         0       168      84.0     99.8%\n",
+      " (Job 33)\n",
+      "psfex_interp_runner                45600     41132         0      4468    4468.0     90.2%\n",
+      " (Job 64)\n",
+      "psfex_interp_runner                 1268      1268         0         0       0.0    100.0%\n",
+      "vignetmaker_runner_run_1            1268      1268         0         0       0.0    100.0%\n",
+      "spread_model_runner                 1268      1268         0         0       0.0    100.0%\n",
+      "vignetmaker_runner_run_2            5072      5072         0         0       0.0    100.0%\n",
+      " (Job 128)\n",
+      "ngmix_runner                        1268       189         0      1079    1079.0     14.9%\n",
+      "ngmix_runner                        1268       202         0      1066    1066.0     15.9%\n",
+      "ngmix_runner                        1268       203         0      1065    1065.0     16.0%\n",
+      "ngmix_runner                        1268       183         0      1085    1085.0     14.4%\n",
+      "ngmix_runner                        1268       204         0      1064    1064.0     16.1%\n",
+      "ngmix_runner                        1268       185         0      1083    1083.0     14.6%\n",
+      "ngmix_runner                        1268       199         0      1069    1069.0     15.7%\n",
+      "ngmix_runner                        1268       196         0      1072    1072.0     15.5%\n",
+      " (Job 256)\n",
+      "merge_sep_cats_runner               1268         0         0      1268    1268.0      0.0%\n",
+      "make_cat_runner                     1268         0         0      1268    1268.0      0.0%\n",
+      " (Job 1024)\n",
+      "psfex_interp_runner                45600     41132         0      4468    4468.0     90.2%\n"
      ]
     }
    ],
    "source": [
     "for key in keys:\n",
-    "    job = jobs[key]\n",
-    "    job.print_intro()\n",
-    "    job.check_numbers(par_runtime=par_runtime)"
+    "    jobs[key].print_intro()\n",
+    "    jobs[key].check_numbers(par_runtime=par_runtime)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": null,
    "id": "8d2243cb-5aa6-4e82-88f6-8689f15e5b61",
    "metadata": {},
    "outputs": [
@@ -328,72 +273,28 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      " (Job 64)\n",
-      "psfex_interp_runner                 1268       945         0       323     323.0     74.5%\n",
-      "vignetmaker_runner_run_1            1268       971         0       297     297.0     76.6%\n",
-      "spread_model_runner                 1268       173         0      1095    1095.0     13.6%\n",
-      "vignetmaker_runner_run_2            5072       690         0      4382    1095.5     13.6%\n"
+      " (Job 128)\n",
+      "ngmix_runner                        1268       413         0       855     855.0     32.6%\n",
+      "ngmix_runner                        1268       417         0       851     851.0     32.9%\n",
+      "ngmix_runner                        1268       425         0       843     843.0     33.5%\n",
+      "ngmix_runner                        1268       419         0       849     849.0     33.0%\n",
+      "ngmix_runner                        1268       436         0       832     832.0     34.4%\n",
+      "ngmix_runner                        1268       427         0       841     841.0     33.7%\n",
+      "ngmix_runner                        1268       422         0       846     846.0     33.3%\n"
      ]
     }
    ],
    "source": [
     "# Update some runs\n",
-    "for key in [\"64\"]:\n",
-    "    job = jobs[key]\n",
-    "    job.print_intro()\n",
-    "    job.check_numbers(par_runtime=par_runtime)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 35,
-   "id": "e8a38747-21b7-4f74-b667-62094f17154e",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      " (Job 64)\n",
-      "psfex_interp_runner                 1268       965         0       303     303.0     76.1%\n",
-      "vignetmaker_runner_run_1            1268       993         0       275     275.0     78.3%\n",
-      "spread_model_runner                 1268       187         0      1081    1081.0     14.7%\n",
-      "vignetmaker_runner_run_2            5072       749         0      4323    1080.8     14.8%\n"
-     ]
-    }
-   ],
-   "source": [
-    "for key in [\"64\"]:\n",
-    "    job = jobs[key]\n",
-    "    job.print_intro()\n",
-    "    job.check_numbers(par_runtime=par_runtime)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "id": "82cb7e0b-a8fa-4a55-840f-55ec0452bf7f",
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      " (Job 64)\n"
-     ]
-    }
-   ],
-   "source": [
-    "for key in [\"64\"]:\n",
-    "    job = jobs[key]\n",
-    "    job.print_intro()\n",
-    "    job.check_numbers(par_runtime=par_runtime)"
+    "for key in [\"128\"]:\n",
+    "    jobs[key].print_intro()\n",
+    "    jobs[key].check_numbers(par_runtime=par_runtime)"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "c57c576f-b7e8-4735-a047-5b63e245f9a4",
+   "id": "67b50a61-e3cc-4559-941d-f39c6a200294",
    "metadata": {},
    "outputs": [],
    "source": []
diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 31b63cb3c..204e9a157 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -141,12 +141,14 @@ def set_jobs_v2_pre_v2(patch, verbose):
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
-        ],  # "run_sp_exp_Pi"],
+            #"run_sp_exp_Pi"
+        ],
         [
             "sextractor_runner",
             "setools_runner",
             "psfex_runner",
-        ],  # "psfex_interp_runner"],
+            # "psfex_interp_runner"],
+        ],
         "shdus",
         n_mult=[2, 2, 2],  # 1],
         path_main=path_main,
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 001e975f6..cdffc1f23 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -464,7 +464,7 @@ def get_module_output_dir(self, full_path, module):
 
     def get_matches_final(self, directory, idx):
 
-        # Look over files
+        # Loop over files
         # os.path.whether exists is twice faster than try/except
 
         if os.path.exists(directory):
@@ -475,6 +475,7 @@ def get_matches_final(self, directory, idx):
                     and (
                         fnmatch.fnmatch(entry2.name, pattern)
                     )
+                    and entry2.stat().st_size > 0
                 ):
                     # Append matching files
                     self._names_in_dir[idx].append(entry2.name)
@@ -530,7 +531,9 @@ def get_names_in_dir(self, iterable, module, idx):
                         continue
 
                     if self._verbose:
-                        print("Matching entries: ", matches)
+                        print("**** Matching entries: ", end="")
+                        for match in matches:
+                            print(match.name)
 
                     full_path = self.get_last_full_path(
                         base_and_subdir, matches

From d9846e91bdb2bad93a9bdecb7478bc86c2d52eb5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 26 Jan 2024 10:59:03 +0000
Subject: [PATCH 104/207] Removed VM_HOME; jon sp canfar cleaned up

---
 example/cfis/config_Gie_vos.ini       |   4 +-
 example/cfis/config_GitFeGie_vos.ini  |   4 +-
 example/cfis/config_GitFe_symlink.ini | 105 ++++++++++++++++++++++++++
 example/cfis/config_Git_vos.ini       |  93 +++++++++++++++++++++++
 scripts/sh/job_sp_canfar.bash         |  83 +++++++++++++++-----
 5 files changed, 269 insertions(+), 20 deletions(-)
 create mode 100644 example/cfis/config_GitFe_symlink.ini
 create mode 100644 example/cfis/config_Git_vos.ini

diff --git a/example/cfis/config_Gie_vos.ini b/example/cfis/config_Gie_vos.ini
index a326434e7..ee4b92f30 100644
--- a/example/cfis/config_Gie_vos.ini
+++ b/example/cfis/config_Gie_vos.ini
@@ -98,4 +98,6 @@ RETRIEVE = vos
 N_TRY = 3
 
 # Retrieve command options, optional
-RETRIEVE_OPTIONS = --certfile=$VM_HOME/.ssl/cadcproxy.pem
+RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem
+
+CHECK_EXISTING_DIR = $SP_RUN/data_exp
diff --git a/example/cfis/config_GitFeGie_vos.ini b/example/cfis/config_GitFeGie_vos.ini
index 9ef72f198..75044bf44 100644
--- a/example/cfis/config_GitFeGie_vos.ini
+++ b/example/cfis/config_GitFeGie_vos.ini
@@ -84,7 +84,7 @@ OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight-
 RETRIEVE = vos
 
 # Copy command options, optional
-RETRIEVE_OPTIONS = --certfile=$VM_HOME/.ssl/cadcproxy.pem
+RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem
 
 CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Git/get_images_runner_run_1/output
 
@@ -152,4 +152,4 @@ RETRIEVE = vos
 N_TRY = 3
 
 # Retrieve command options, optional
-RETRIEVE_OPTIONS = --certfile=$VM_HOME/.ssl/cadcproxy.pem
+RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem
diff --git a/example/cfis/config_GitFe_symlink.ini b/example/cfis/config_GitFe_symlink.ini
new file mode 100644
index 000000000..4e7ce75cb
--- /dev/null
+++ b/example/cfis/config_GitFe_symlink.ini
@@ -0,0 +1,105 @@
+# ShapePipe configuration file for: get images and find exposures
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = False
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_GitFe
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = True
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = get_images_runner, find_exposures_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 1
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+# Get tiles
+[GET_IMAGES_RUNNER]
+
+FILE_PATTERN = tile_numbers
+
+FILE_EXT = .txt
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = 
+
+# Paths
+
+# Input path where original images are stored. Can be local path or vos url.
+# Single string or list of strings
+INPUT_PATH = $SP_RUN/data_tiles, $SP_RUN/data_tiles
+
+# Input file pattern including tile number as dummy template
+INPUT_FILE_PATTERN = CFIS.000.000.r, CFIS.000.000.r.weight
+
+# Input file extensions
+INPUT_FILE_EXT = .fits, .fits.fz
+
+# Input numbering scheme, python regexp
+INPUT_NUMBERING = \d{3}\.\d{3}
+
+# Output file pattern without number
+OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight-
+
+# Copy/download method, one in 'vos', 'symlink'
+RETRIEVE = symlink
+
+# Copy command options, optional
+RETRIEVE_OPTIONS = -L
+
+
+[FIND_EXPOSURES_RUNNER]
+
+INPUT_MODULE = get_images_runner
+
+FILE_PATTERN = CFIS_image
+
+FILE_EXT = .fits
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+# Column number of exposure name in FITS header
+COLNUM = 3
+
+# Prefix to remove from exposure name
+EXP_PREFIX = p
diff --git a/example/cfis/config_Git_vos.ini b/example/cfis/config_Git_vos.ini
new file mode 100644
index 000000000..26edf3efc
--- /dev/null
+++ b/example/cfis/config_Git_vos.ini
@@ -0,0 +1,93 @@
+# ShapePipe configuration file for: get images
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = False
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_Git
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = True
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = get_images_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 1
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+# Get tiles
+[GET_IMAGES_RUNNER]
+
+FILE_PATTERN = tile_numbers
+
+FILE_EXT = .txt
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = 
+
+# Paths
+
+# Input path where original images are stored. Can be local path or vos url.
+# Single string or list of strings
+INPUT_PATH = vos:cfis/tiles_DR5, vos:cfis/tiles_DR5
+
+# Input file pattern including tile number as dummy template
+INPUT_FILE_PATTERN = CFIS.000.000.r, CFIS.000.000.r.weight
+
+# Input file extensions
+INPUT_FILE_EXT = .fits, .fits.fz
+
+# Input numbering scheme, python regexp
+INPUT_NUMBERING = \d{3}\.\d{3}
+
+# Output file pattern without number
+OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight-
+
+# Copy/download method, one in 'vos', 'symlink'
+RETRIEVE = vos
+
+# If RETRIEVE=vos, number of attempts to download
+# Optional, default=3
+N_TRY = 3
+
+# Copy command options, optional
+RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem
+
+CHECK_EXISTING_DIR = $SP_RUN/data_tiles
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 91f67619b..f2b9c03d1 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -160,9 +160,6 @@ export SP_RUN=`pwd`
 export SP_CONFIG=$SP_RUN/cfis
 export SP_CONFIG_MOD=$SP_RUN/cfis_mod
 
-# To find ssl certificate
-export VM_HOME=$HOME
-
 ## Other variables
 
 # Output
@@ -341,17 +338,31 @@ fi
 if [[ $do_job != 0 ]]; then
 
   ### Retrieve files
-  command_sp "shapepipe_run -c $SP_CONFIG/config_GitFeGie_$retrieve.ini" "Retrieve images"
+  command_cfg_shapepipe \
+    "config_GitFeGie_$retrieve.ini" \
+     "Retrieve images" \
+     -1 \
+     $exclusive
+
+  #if [[ ! -d "data_tiles" ]]; then
+    #echo "Directory or link 'data_tiles' does not exist, exiting"
+    #exit 1
+  #fi
+  #command_cfg_shapepipe "config_Git_vos.ini" "Retrieve tiles" -1 $n_exclusive
 
   ### Retrieve and save star catalogues for masking
   if [ "$star_cat_for_mask" == "save" ]; then
     #### For tiles
     mkdir $SP_RUN/star_cat_tiles
-    command_sp "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_1/output $SP_RUN/star_cat_tiles" "Save star cats for masking (tile)"
+    command_sp \
+      "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_1/output $SP_RUN/star_cat_tiles" \
+      "Save star cats for masking (tile)"
 
     #### For single-exposures
     mkdir $SP_RUN/star_cat_exp
-    command_sp "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_2/output $SP_RUN/star_cat_exp exp" "Save star cats for masking (exp)"
+    command_sp \
+      "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_2/output $SP_RUN/star_cat_exp exp" \
+      "Save star cats for masking (exp)"
   fi
 
 fi
@@ -364,7 +375,11 @@ if [[ $do_job != 0 ]]; then
   command_cfg_shapepipe "config_tile_Uz.ini" "Run shapepipe (uncompress tile weights)" $n_smp $exclusive
 
   ### Split images into single-HDU files, merge headers for WCS info
-  command_cfg_shapepipe "config_exp_SpMh.ini" "Run shapepipe (split images, merge headers)" $n_smp $exclusive
+  command_cfg_shapepipe \
+    "config_exp_SpMh.ini" \
+    "Run shapepipe (split images, merge headers)" \
+    $n_smp \
+    $exclusive
 
 fi
 
@@ -373,7 +388,11 @@ fi
 if [[ $do_job != 0 ]]; then
 
   ### Mask tiles
-  command_cfg_shapepipe "config_tile_Ma_$star_cat_for_mask.ini" "Run shapepipe (mask tiles)" $n_smp $exclusive
+  command_cfg_shapepipe \
+    "config_tile_Ma_$star_cat_for_mask.ini" \
+    "Run shapepipe (mask tiles)" \
+    $n_smp \
+    $exclusive
 
 fi
 
@@ -382,7 +401,11 @@ fi
 if [[ $do_job != 0 ]]; then
 
   ### Mask exposures
-  command_cfg_shapepipe "config_exp_Ma_$star_cat_for_mask.ini" "Run shapepipe (mask exposures)" $n_smp $exclusive
+  command_cfg_shapepipe \
+    "config_exp_Ma_$star_cat_for_mask.ini" \
+    "Run shapepipe (mask exposures)" \
+    $n_smp \
+    $exclusive
 
 fi
 
@@ -392,7 +415,11 @@ fi
 if [[ $do_job != 0 ]]; then
 
   ### Object detection on tiles
-  command_cfg_shapepipe "config_tile_Sx.ini" "Run shapepipe (tile detection)" $n_smp $exclusive
+  command_cfg_shapepipe \
+    "config_tile_Sx.ini" \
+    "Run shapepipe (tile detection)" \
+    $n_smp \
+    $exclusive
 
 fi
 
@@ -403,7 +430,11 @@ if [[ $do_job != 0 ]]; then
   ### Star detection, selection, PSF model. setools can exit with an error for CCD with insufficient stars,
   ### the script should continue
   STOP=0
-  command_cfg_shapepipe "config_exp_${psf}.ini" "Run shapepipe (exp $psf)" $n_smp $exclusive
+  command_cfg_shapepipe \
+    "config_exp_${psf}.ini" \
+    "Run shapepipe (exp $psf)" \
+    $n_smp \
+    $exclusive
   STOP=1
 
 fi
@@ -415,7 +446,11 @@ if [[ $do_job != 0 ]]; then
   ### PSF model letter: 'P' (psfex) or 'M' (mccd)
   letter=${psf:0:1}
   Letter=${letter^}
-  command_cfg_shapepipe "config_tile_${Letter}iViSmVi_canfar.ini" "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)" $n_smp $exclusive
+  command_cfg_shapepipe \
+    "config_tile_${Letter}iViSmVi_canfar.ini" \
+    "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)" \
+    $n_smp \
+    $exclusive
 
 fi
 
@@ -454,13 +489,19 @@ if [[ $do_job != 0 ]]; then
         ngmix_out="$ngmix_run/output"
         n_out=`ls -rlt $ngmix_out | wc -l`
         if [ "$n_out" -lt 2 ]; then
-          command "rm -rf $OUTPUT/run_sp_tile_ngmix_Ng${k}u" "Re-running existing empty ngmix subrun $k"
-          command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix $k)" &
+          command \
+            "rm -rf $OUTPUT/run_sp_tile_ngmix_Ng${k}u" \
+            "Re-running existing empty ngmix subrun $k"
+          command_sp \
+            "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" \
+            "Run shapepipe (tile: ngmix $k)" &
         else
           echo "Skipping existing non-empty ngmix subrun $k"
         fi
       else
-        command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix $k)" &
+        command_sp \
+          "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" \
+          "Run shapepipe (tile: ngmix $k)" &
       fi
   done
   wait
@@ -478,9 +519,17 @@ if [[ $do_job != 0 ]]; then
       > $SP_CONFIG_MOD/config_merge_sep_cats.ini
  
   ### Merge separated shapes catalogues
-  command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_merge_sep_cats.ini" "Run shapepipe (tile: merge sep cats)" "$VERBOSE" "$ID"
+  command_sp \
+    "shapepipe_run -c $SP_CONFIG_MOD/config_merge_sep_cats.ini" \
+    "Run shapepipe (tile: merge sep cats)" \
+    "$VERBOSE" \
+    "$ID"
 
   ### Merge all relevant information into final catalogue
-  command_sp "shapepipe_run -c $SP_CONFIG/config_make_cat_$psf.ini" "Run shapepipe (tile: create final cat $psf)" "$VERBOSE" "$ID"
+  command_sp \
+    "shapepipe_run -c $SP_CONFIG/config_make_cat_$psf.ini" \
+    "Run shapepipe (tile: create final cat $psf)" \
+    "$VERBOSE" \
+    "$ID"
 
 fi

From c5deb345df7654734f269328442f613e1a94c3d5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 30 Jan 2024 10:38:29 +0100
Subject: [PATCH 105/207] Dockerfile cleand up

---
 Dockerfile | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 4cfd891d8..afde6114c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -28,10 +28,10 @@ RUN apt-get update --allow-releaseinfo-change && \
     apt-get install vim -y && \
     apt-get install locate -y && \
     apt-get install curl -y && \
+    apt-get install acl -y && \
+    apt-get install sssd -y && \
     apt-get clean
 
-RUN apt-get install acl -y && \
-    apt-get install sssd -y
 ADD nsswitch.conf /etc/
 
 RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
@@ -52,9 +52,6 @@ RUN conda env create --file environment.yml
 COPY shapepipe ./shapepipe
 COPY scripts ./scripts
 
-# Activate conda environment using "source"
-#RUN . /opt/conda/etc/profile.d/conda.sh
-#RUN conda init bash
-RUN ./scripts/sh/init_canfar.sh
-RUN source activate shapepipe
+# Make RUN commands use the new environment:
+SHELL ["conda", "run", "-n", "shapepipe", "/bin/bash", "-c"]
 RUN pip install jupyter

From d507780efc0868531576178426092c3b0e954e21 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 1 Feb 2024 15:25:54 +0000
Subject: [PATCH 106/207] summary params minor bug fixed

---
 scripts/python/summary_params_pre_v2.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 204e9a157..953f6190a 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -88,7 +88,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     #        n_mult=[1, 1, 1],
     jobs["2"] = job_data(
         2,
-        ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh_2023-12"],
+        ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh"],
         ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
         ["tile_IDs", 0, "3*n_shdus+n_exposures"],
         path_main=path_main,

From b4e0aa04aa30a7c0b45791dcb9f017f490faf5a1 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 1 Feb 2024 15:26:46 +0000
Subject: [PATCH 107/207] major bugx fixed: N_SMP was n_SMP, not propagated

---
 scripts/sh/curl_canfar_local.sh | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index b02f9205f..3ecacc3cd 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -17,6 +17,7 @@ N_SMP=1
 kind=-1
 version=1.0
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
+batch_max=200
 dry_run=0
 
 # TODO psf
@@ -40,6 +41,8 @@ usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
     \tversion of docker image, default='$version'\n
    -C, --command_remote\n
     \tremote command to run on canfar, default='$cmd_remote'\n
+   -b, --batch_max\n
+    \tmaximum batch size = number of jobs run simultaneously\n
    -n, --dry_run LEVEL\n
     \tdry run, from LEVEL=2 (no processing) to 0 (full run)\n
 "
@@ -70,13 +73,17 @@ while [ $# -gt 0 ]; do
       shift
       ;;
     -N|--N_SMP)
-      n_SMP="$2"
+      N_SMP="$2"
       shift
       ;;
     -k|--kind)
       kind="$2"
       shift
       ;;
+    -b|--batch_max)
+      batch_max="$2"
+      shift
+      ;;
     -n|--dry_run)
       dry_run="$2"
       shift
@@ -151,11 +158,10 @@ function submit_batch() {
 
 }
 
-n_max=200
 batch=20
-sleep=300
+sleep=600
 
-((n_thresh=n_max- batch))
+((n_thresh=batch_max-batch))
 
 
 if [ "$dry_run" == 2 ]; then
@@ -188,7 +194,7 @@ else
 
     # Submit file
     n_jobs=`cat $file_IDs | wc -l`
-    if [ "$n_jobs" -gt "$n_max" ]; then
+    if [ "$n_jobs" -gt "$batch_max" ]; then
 
       # Split into batches 
       prefix="${file_IDs}_split_"

From f8a07d7f4c5fee351c3cafe715ed852a25c34b07 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 1 Feb 2024 15:27:36 +0000
Subject: [PATCH 108/207] major bugx fixed: N_SMP was n_SMP, not propagated

---
 scripts/sh/init_run_exclusive_canfar.sh | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 05ca2a848..65ecfe8c1 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -57,7 +57,7 @@ while [ $# -gt 0 ]; do
       shift                                                                     
       ;;
     -N|--N_SMP)                                                                 
-      n_SMP="$2"                                                                
+      N_SMP="$2"                                                                
       shift                                                                     
       ;;                                                                        
     -k|--kind)                                                                 
@@ -177,7 +177,6 @@ done
 if [[ $do_job != 0 ]]; then
   if [ "$kind" == "tile" ]; then
     cd ../../..
-    #command "rm -rf tile_runs/$ID/output/run_exp_SxSePsf*" $dry_run
     command "link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs" $dry_run
     cd ${kind}_runs/$ID/output
 
@@ -188,6 +187,9 @@ if [[ $do_job != 0 ]]; then
       echo "removing $n_remove duplicate old job-32 runs"
       rm -rf `ls -rt1d run_sp_tile_Sx_* | head -$n_remove`
     fi
+
+    # Remove previous runs of this job
+    rm -rf run_sp_tile_PsViSmVi*
   fi
 fi
 

From 30116b844f5e71859a850f2a7e2f26288a1e0b40 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 1 Feb 2024 15:29:26 +0000
Subject: [PATCH 109/207] summary nb

---
 scripts/jupyter/summary_run.ipynb | 80 ++++++++++++++-----------------
 1 file changed, 37 insertions(+), 43 deletions(-)

diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb
index 8c42e3865..6b4007172 100644
--- a/scripts/jupyter/summary_run.ipynb
+++ b/scripts/jupyter/summary_run.ipynb
@@ -2,21 +2,12 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 1,
    "id": "130112a4-f2ca-4d26-b884-d8b054676f9c",
    "metadata": {
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The autoreload extension is already loaded. To reload it, use:\n",
-      "  %reload_ext autoreload\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "%load_ext autoreload\n",
     "%autoreload 2"
@@ -24,7 +15,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 2,
    "id": "196beca5-10a1-4cf5-9462-be145167cc70",
    "metadata": {
     "tags": []
@@ -37,7 +28,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 3,
    "id": "ca63c72d-212c-463e-a792-71efbac0b908",
    "metadata": {
     "tags": []
@@ -52,7 +43,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 4,
    "id": "dcb5604c-d61f-4705-8295-63875455cadb",
    "metadata": {
     "tags": []
@@ -65,7 +56,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 5,
    "id": "e69b7dab-1fea-4fcc-a8d9-0720e1d628c3",
    "metadata": {
     "tags": []
@@ -92,7 +83,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 6,
    "id": "2c3a9dde-cf88-493f-926e-7ae7e8e10916",
    "metadata": {
     "tags": []
@@ -105,7 +96,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 7,
    "id": "1e9c1487-3cec-4394-9fcf-c12e92a0f984",
    "metadata": {
     "tags": []
@@ -117,7 +108,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 8,
    "id": "b7c63a22-ead1-4d6a-b081-a74ade515439",
    "metadata": {
     "tags": []
@@ -139,7 +130,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 9,
    "id": "4720ae18-0633-4646-b392-b1b24e0294c3",
    "metadata": {
     "tags": []
@@ -152,7 +143,7 @@
       " (Job 1)\n",
       "get_images_runner_run_1             2536      2536         0         0       0.0    100.0%\n",
       "find_exposures_runner               1268      1268         0         0       0.0    100.0%\n",
-      "get_images_runner_run_2             3420      3420         0         0       0.0    100.0%\n"
+      "get_images_runner_run_2             3420         0         0      3420    1140.0      0.0%\n"
      ]
     }
    ],
@@ -170,7 +161,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 10,
    "id": "f149f404-64e7-4d92-8f54-f300ed620130",
    "metadata": {
     "tags": []
@@ -183,7 +174,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 11,
    "id": "607fed1b-005a-4d3a-811c-51b1c5049c19",
    "metadata": {
     "tags": []
@@ -195,7 +186,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 12,
    "id": "78a9065f-8983-41cf-a34c-21892fc52dd2",
    "metadata": {
     "tags": []
@@ -209,7 +200,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 13,
    "id": "79e39954-1155-4ca3-b0b2-64bc5670db53",
    "metadata": {
     "tags": []
@@ -241,14 +232,14 @@
       "spread_model_runner                 1268      1268         0         0       0.0    100.0%\n",
       "vignetmaker_runner_run_2            5072      5072         0         0       0.0    100.0%\n",
       " (Job 128)\n",
-      "ngmix_runner                        1268       189         0      1079    1079.0     14.9%\n",
-      "ngmix_runner                        1268       202         0      1066    1066.0     15.9%\n",
-      "ngmix_runner                        1268       203         0      1065    1065.0     16.0%\n",
-      "ngmix_runner                        1268       183         0      1085    1085.0     14.4%\n",
-      "ngmix_runner                        1268       204         0      1064    1064.0     16.1%\n",
-      "ngmix_runner                        1268       185         0      1083    1083.0     14.6%\n",
-      "ngmix_runner                        1268       199         0      1069    1069.0     15.7%\n",
-      "ngmix_runner                        1268       196         0      1072    1072.0     15.5%\n",
+      "ngmix_runner                        1268       759         0       509     509.0     59.9%\n",
+      "ngmix_runner                        1268       745         0       523     523.0     58.8%\n",
+      "ngmix_runner                        1268       755         0       513     513.0     59.5%\n",
+      "ngmix_runner                        1268       744         0       524     524.0     58.7%\n",
+      "ngmix_runner                        1268       752         0       516     516.0     59.3%\n",
+      "ngmix_runner                        1268       750         0       518     518.0     59.1%\n",
+      "ngmix_runner                        1268       743         0       525     525.0     58.6%\n",
+      "ngmix_runner                        1268       758         0       510     510.0     59.8%\n",
       " (Job 256)\n",
       "merge_sep_cats_runner               1268         0         0      1268    1268.0      0.0%\n",
       "make_cat_runner                     1268         0         0      1268    1268.0      0.0%\n",
@@ -266,26 +257,21 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "8d2243cb-5aa6-4e82-88f6-8689f15e5b61",
-   "metadata": {},
+   "id": "b3d51a05-ecca-420b-b8b3-1fb2b1ec9fe3",
+   "metadata": {
+    "tags": []
+   },
    "outputs": [
     {
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      " (Job 128)\n",
-      "ngmix_runner                        1268       413         0       855     855.0     32.6%\n",
-      "ngmix_runner                        1268       417         0       851     851.0     32.9%\n",
-      "ngmix_runner                        1268       425         0       843     843.0     33.5%\n",
-      "ngmix_runner                        1268       419         0       849     849.0     33.0%\n",
-      "ngmix_runner                        1268       436         0       832     832.0     34.4%\n",
-      "ngmix_runner                        1268       427         0       841     841.0     33.7%\n",
-      "ngmix_runner                        1268       422         0       846     846.0     33.3%\n"
+      " (Job 128)\n"
      ]
     }
    ],
    "source": [
-    "# Update some runs\n",
+    "## Update some runs\n",
     "for key in [\"128\"]:\n",
     "    jobs[key].print_intro()\n",
     "    jobs[key].check_numbers(par_runtime=par_runtime)"
@@ -298,6 +284,14 @@
    "metadata": {},
    "outputs": [],
    "source": []
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4d08ba73-0b84-4660-8e19-2b78cbe80618",
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {

From 9e44fa6646f21563c19481bc13740f64bfb26133 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 11 Feb 2024 10:58:21 +0000
Subject: [PATCH 110/207] sumamry updated

---
 scripts/jupyter/summary_run.ipynb       | 141 ++++++++++++++++++------
 scripts/python/summary_params_pre_v2.py |  27 +++--
 scripts/python/summary_run.py           |  25 ++---
 shapepipe/utilities/summary.py          |  27 ++---
 4 files changed, 141 insertions(+), 79 deletions(-)

diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb
index 6b4007172..451c591d0 100644
--- a/scripts/jupyter/summary_run.ipynb
+++ b/scripts/jupyter/summary_run.ipynb
@@ -10,7 +10,8 @@
    "outputs": [],
    "source": [
     "%load_ext autoreload\n",
-    "%autoreload 2"
+    "%autoreload 3\n",
+    "%reload_ext autoreload"
    ]
   },
   {
@@ -36,7 +37,7 @@
    "outputs": [],
    "source": [
     "# Setting\n",
-    "patch = \"P3\"\n",
+    "patch = \"P7\"\n",
     "\n",
     "verbose = False"
    ]
@@ -51,7 +52,7 @@
    "outputs": [],
    "source": [
     "# Load parameters\n",
-    "%run ~/shapepipe/scripts/python/summary_params_pre_v2 {patch}"
+    "%run ~/shapepipe/scripts/python/summary_params_pre_v2"
    ]
   },
   {
@@ -66,14 +67,14 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P3\n"
+      "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P7\n"
      ]
     },
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Set job info for patch P3\n"
+      "Set job info for patch P7\n"
      ]
     }
    ],
@@ -103,7 +104,8 @@
    },
    "outputs": [],
    "source": [
-    "print_par_runtime(par_runtime, verbose=verbose)"
+    "# No effect in notebook\n",
+    "#print_par_runtime(par_runtime, verbose=verbose)"
    ]
   },
   {
@@ -141,9 +143,9 @@
      "output_type": "stream",
      "text": [
       " (Job 1)\n",
-      "get_images_runner_run_1             2536      2536         0         0       0.0    100.0%\n",
-      "find_exposures_runner               1268      1268         0         0       0.0    100.0%\n",
-      "get_images_runner_run_2             3420         0         0      3420    1140.0      0.0%\n"
+      "get_images_runner_run_1              464       462         0         2       1.0     99.6%\n",
+      "find_exposures_runner                232       231         0         1       1.0     99.6%\n",
+      "get_images_runner_run_2              537         0         0       537     179.0      0.0%\n"
      ]
     }
    ],
@@ -172,18 +174,6 @@
     "par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)"
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": 11,
-   "id": "607fed1b-005a-4d3a-811c-51b1c5049c19",
-   "metadata": {
-    "tags": []
-   },
-   "outputs": [],
-   "source": [
-    "print_par_runtime(par_runtime, verbose=verbose)"
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": 12,
@@ -224,22 +214,20 @@
       "sextractor_runner                  91200     91200         0         0       0.0    100.0%\n",
       "setools_runner                     91200     91032         0       168      84.0     99.8%\n",
       "psfex_runner                       91200     91032         0       168      84.0     99.8%\n",
-      " (Job 33)\n",
-      "psfex_interp_runner                45600     41132         0      4468    4468.0     90.2%\n",
       " (Job 64)\n",
       "psfex_interp_runner                 1268      1268         0         0       0.0    100.0%\n",
       "vignetmaker_runner_run_1            1268      1268         0         0       0.0    100.0%\n",
       "spread_model_runner                 1268      1268         0         0       0.0    100.0%\n",
       "vignetmaker_runner_run_2            5072      5072         0         0       0.0    100.0%\n",
       " (Job 128)\n",
-      "ngmix_runner                        1268       759         0       509     509.0     59.9%\n",
-      "ngmix_runner                        1268       745         0       523     523.0     58.8%\n",
-      "ngmix_runner                        1268       755         0       513     513.0     59.5%\n",
-      "ngmix_runner                        1268       744         0       524     524.0     58.7%\n",
-      "ngmix_runner                        1268       752         0       516     516.0     59.3%\n",
-      "ngmix_runner                        1268       750         0       518     518.0     59.1%\n",
-      "ngmix_runner                        1268       743         0       525     525.0     58.6%\n",
-      "ngmix_runner                        1268       758         0       510     510.0     59.8%\n",
+      "ngmix_runner                        1268      1225         0        43      43.0     96.6%\n",
+      "ngmix_runner                        1268      1216         0        52      52.0     95.9%\n",
+      "ngmix_runner                        1268      1216         0        52      52.0     95.9%\n",
+      "ngmix_runner                        1268      1217         0        51      51.0     96.0%\n",
+      "ngmix_runner                        1268      1228         0        40      40.0     96.8%\n",
+      "ngmix_runner                        1268      1216         0        52      52.0     95.9%\n",
+      "ngmix_runner                        1268      1216         0        52      52.0     95.9%\n",
+      "ngmix_runner                        1268      1216         0        52      52.0     95.9%\n",
       " (Job 256)\n",
       "merge_sep_cats_runner               1268         0         0      1268    1268.0      0.0%\n",
       "make_cat_runner                     1268         0         0      1268    1268.0      0.0%\n",
@@ -256,7 +244,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 65,
    "id": "b3d51a05-ecca-420b-b8b3-1fb2b1ec9fe3",
    "metadata": {
     "tags": []
@@ -266,7 +254,15 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      " (Job 128)\n"
+      " (Job 128)\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1265         0         3       3.0     99.8%\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1266         0         2       2.0     99.8%\n",
+      "ngmix_runner                        1268      1268         0         0       0.0    100.0%\n",
+      "ngmix_runner                        1268      1266         0         2       2.0     99.8%\n"
      ]
     }
    ],
@@ -279,16 +275,89 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 64,
    "id": "67b50a61-e3cc-4559-941d-f39c6a200294",
    "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      " (Job 128)\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1265         0         3       3.0     99.8%\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1267         0         1       1.0     99.9%\n",
+      "ngmix_runner                        1268      1266         0         2       2.0     99.8%\n",
+      "ngmix_runner                        1268      1268         0         0       0.0    100.0%\n",
+      "ngmix_runner                        1268      1266         0         2       2.0     99.8%\n"
+     ]
+    }
+   ],
+   "source": [
+    "for key in [\"128\"]:\n",
+    "    jobs[key].print_intro()\n",
+    "    \n",
+    "    \n",
+    "    jobs[key].check_numbers(par_runtime=par_runtime)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "id": "affa8293-daf9-4d2b-9215-fe19f8e2c1e2",
+   "metadata": {
+    "tags": []
+   },
    "outputs": [],
-   "source": []
+   "source": [
+    "session = Session()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "id": "269496d1-cd89-4d13-a5e4-41b897669e22",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [],
+   "source": [
+    "ids = [session[\"id\"] for session in session.fetch(kind=\"headless\")]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "id": "80af8dff-98c7-4db4-8bcc-06936e1875cf",
+   "metadata": {
+    "tags": []
+   },
+   "outputs": [
+    {
+     "ename": "RuntimeError",
+     "evalue": "This event loop is already running",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_69/559116804.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdestroy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mids\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m~/.local/lib/python3.7/site-packages/skaha/session.py\u001b[0m in \u001b[0;36mdestroy\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m    264\u001b[0m             \u001b[0marguments\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"url\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserver\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"/\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    265\u001b[0m         \u001b[0mloop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_event_loop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 266\u001b[0;31m         \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mloop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_until_complete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscale\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marguments\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    267\u001b[0m         \u001b[0mresponses\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    268\u001b[0m         \u001b[0;32mfor\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midentity\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/opt/conda/lib/python3.7/asyncio/base_events.py\u001b[0m in \u001b[0;36mrun_until_complete\u001b[0;34m(self, future)\u001b[0m\n\u001b[1;32m    561\u001b[0m         \"\"\"\n\u001b[1;32m    562\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_closed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 563\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_runnung\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    564\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    565\u001b[0m         \u001b[0mnew_task\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mfutures\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misfuture\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfuture\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/opt/conda/lib/python3.7/asyncio/base_events.py\u001b[0m in \u001b[0;36m_check_runnung\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    521\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_check_runnung\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    522\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 523\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'This event loop is already running'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    524\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mevents\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_running_loop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    525\u001b[0m             raise RuntimeError(\n",
+      "\u001b[0;31mRuntimeError\u001b[0m: This event loop is already running"
+     ]
+    }
+   ],
+   "source": [
+    "session.destroy(ids[0])"
+   ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "4d08ba73-0b84-4660-8e19-2b78cbe80618",
+   "id": "66a3ed14-8aaf-4028-b933-10ecb7376d68",
    "metadata": {},
    "outputs": [],
    "source": []
diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 953f6190a..5b67ee0ca 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -46,7 +46,10 @@ def set_jobs_v2_pre_v2(patch, verbose):
     if not os.path.isdir(path):
         os.mkdir(path)
     log_file_name = f"{path}/summary_log.txt"
-    handlers = [logging.FileHandler(log_file_name), logging.StreamHandler()]
+    handlers = [
+        logging.FileHandler(log_file_name, mode="w"),
+        logging.StreamHandler()
+    ]
     logging.basicConfig(
         level=logging.INFO, format="%(message)s", handlers=handlers
     )
@@ -159,17 +162,17 @@ def set_jobs_v2_pre_v2(patch, verbose):
     )
 
     # For P3
-    jobs["33"] = job_data(
-        33,
-        "run_sp_exp_Pi",
-        ["psfex_interp_runner"],
-        "shdus",
-        path_main=path_main,
-        path_left="exp_runs",
-        output_subdirs="shdus",
-        path_right="output",
-        verbose=verbose,
-    )
+    #jobs["33"] = job_data(
+    #    33,
+    #    "run_sp_exp_Pi",
+    #    ["psfex_interp_runner"],
+    #    "shdus",
+    #    path_main=path_main,
+    #    path_left="exp_runs",
+    #    output_subdirs="shdus",
+    #    path_right="output",
+    #    verbose=verbose,
+    #)
 
     jobs["64"] = job_data(
         "64",
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index b790300af..331764b24 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -5,47 +5,46 @@
 
 from shapepipe.utilities.summary import *
 
+from summary_params_pre_v2 import *
+
 
 def main(argv=None):
 
     patch = argv[1]
 
     verbose = False
-    
-    import summary_params_pre_v2 as params
 
-    jobs, list_tile_IDs_dot = params.set_jobs_v2_pre_v2(patch, verbose)
+    jobs, list_tile_IDs_dot = set_jobs_v2_pre_v2(patch, verbose)
     
     list_tile_IDs = job_data.replace_dot_dash(list_tile_IDs_dot)
     
     # Numbers updated at runtime
-    par_runtime = params.init_par_runtime(list_tile_IDs)
+    par_runtime = init_par_runtime(list_tile_IDs)
     
     job_data.print_stats_header()
 
     for key in "1":
-        job = jobs[key]
-        job.print_intro()
-        job.check_numbers(par_runtime=par_runtime, indices=[0, 1])
+        jobs[key].print_intro()
+        jobs[key].check_numbers(par_runtime=par_runtime, indices=[0, 1])
 
-        all_exposures = get_all_exposures(job._paths_in_dir[1], verbose=True)
+        all_exposures = get_all_exposures(jobs[key]._paths_in_dir[1], verbose=True)
         par_runtime["n_exposures"] = len(all_exposures)
         par_runtime["list_exposures"] = all_exposures
 
-        job.check_numbers(par_runtime, indices=[2])
+        jobs[key].check_numbers(par_runtime, indices=[2])
 
-    par_runtime = params.update_par_runtime_after_find_exp(par_runtime, all_exposures)
+    par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)
     
     print_par_runtime(par_runtime, verbose=verbose)
 
+
     # Get all keys after "1"
     keys = sorted(jobs.keys(), key=int)
     _ = keys.pop(0)
 
     for key in keys:
-        job = jobs[key]
-        job.print_intro()
-        job.check_numbers(par_runtime=par_runtime)
+        jobs[key].print_intro()
+        jobs[key].check_numbers(par_runtime=par_runtime)
 
     return 0
 
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index cdffc1f23..42b7ebf93 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -15,6 +15,8 @@
 
 from tqdm import tqdm
 
+print("summaary v1.0")
+
 
 def get_IDs_from_file(path):
     """Get IDs From File.
@@ -408,16 +410,20 @@ def output_missing(
         if n_unique > 0:
             if not self._output_path_missing_IDs:
                 output_path = (
-                    f"{self._path_main}/summary/missing_job_{self._bit}_{module}.txt"
+                    f"{self._path_main}/summary/missing_job_{self._bit}"
+                    + f"_{module}.txt"
                 )
             else:
                 output_path = self._output_path_missing_IDs[idx]
+            #print("MKDEBUG", missing_IDs_unique)
             self.write_IDs_to_file(output_path, missing_IDs_unique)
 
         return missing_IDs_unique
 
     def output_missing_job(self):
-        output_path = f"{self._path_main}/summary/missing_job_{self._bit}_all.txt"
+        output_path = (
+            f"{self._path_main}/summary/missing_job_{self._bit}_all.txt"
+        )
 
         missing_IDs_all = set(self._missing_IDs_job)
 
@@ -483,21 +489,6 @@ def get_matches_final(self, directory, idx):
                         os.path.join(directory, entry2.name)
                     )
 
-        #if os.path.exists(directory):
-            #with os.scandir(directory) as entries2:
-                #files = [
-                    #entry2.name
-                    #for entry2 in entries2
-                    #if entry2.name.startswith(self._pattern[idx])
-                #]
-
-                ## Append matching files
-                #self._names_in_dir[idx].extend(files)
-                #self._paths_in_dir[idx].extend(
-                    #[os.path.join(directory, file)
-                    #for file in files]
-                #)
-
     def get_names_in_dir(self, iterable, module, idx):
 
         # Initialise output file names and paths
@@ -687,7 +678,7 @@ def get_par_runtime(par_runtime, key, kind="n"):
 
 def print_par_runtime(par_runtime, verbose=True):
     # Print runtime parameter values
-    if verbose:
+    if True:
         logging.info("")
         logging.info("===========")
         logging.info("par_runtime")

From 3ab923f2bcfae07bbf1e141002aef2fb47ca8a0d Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 11 Feb 2024 10:59:28 +0000
Subject: [PATCH 111/207] terminal title from within curl script

---
 auxdir/CFIS/tiles_202106/tiles_P7.txt   |  1 +
 scripts/sh/curl_canfar_local.sh         |  7 ++++---
 scripts/sh/curl_canfar_monitor_local.sh |  8 ++++++++
 scripts/sh/job_curl_canfar_local.sh     | 17 -----------------
 4 files changed, 13 insertions(+), 20 deletions(-)
 delete mode 100644 scripts/sh/job_curl_canfar_local.sh

diff --git a/auxdir/CFIS/tiles_202106/tiles_P7.txt b/auxdir/CFIS/tiles_202106/tiles_P7.txt
index 535084a2e..93a1dfdb6 100644
--- a/auxdir/CFIS/tiles_202106/tiles_P7.txt
+++ b/auxdir/CFIS/tiles_202106/tiles_P7.txt
@@ -229,3 +229,4 @@
 094.300
 094.301
 095.300
+000.000
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 3ecacc3cd..3e03dcd5a 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -26,7 +26,7 @@ dry_run=0
 usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
 \n\nOptions:\n
    -h\tthis message\n
-   -j, --job JOB\tRUnning JOB, bit-coded\n
+   -j, --job JOB\tRunning JOB, bit-coded\n
    -e, --exclusive ID
     \timage ID\n
    -f, --file_IDs path
@@ -42,7 +42,7 @@ usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
    -C, --command_remote\n
     \tremote command to run on canfar, default='$cmd_remote'\n
    -b, --batch_max\n
-    \tmaximum batch size = number of jobs run simultaneously\n
+    \tmaximum batch size = number of jobs run simultaneously, default=$batch_max\n
    -n, --dry_run LEVEL\n
     \tdry run, from LEVEL=2 (no processing) to 0 (full run)\n
 "
@@ -159,7 +159,7 @@ function submit_batch() {
 }
 
 batch=20
-sleep=600
+sleep=300
 
 ((n_thresh=batch_max-batch))
 
@@ -206,6 +206,7 @@ else
       for batch in $prefix*; do
         echo "Number of running jobs = $n_running"
         echo "Submitting batch $batch ($count/$n_split)"
+        echo -ne "\033]0;curl patch=$patch job=$job $count/$n_split\007"
         submit_batch $batch
         ((count=count+1))
 
diff --git a/scripts/sh/curl_canfar_monitor_local.sh b/scripts/sh/curl_canfar_monitor_local.sh
index 4ba0bf875..793d80262 100755
--- a/scripts/sh/curl_canfar_monitor_local.sh
+++ b/scripts/sh/curl_canfar_monitor_local.sh
@@ -9,6 +9,14 @@ type=$1
 
 echo "type=$type"
 
+for session_ID in `cat session_IDs.txt`; do
+  cmd="curl -E $SSL $SESSION/$session_ID?view=$type"
+  echo $cmd
+  $cmd
+done
+
+exit 0
+
 while [ 1 ]; do
   session_ID=`tail -n 1 session_IDs.txt`
   cmd="curl -E $SSL $SESSION/$session_ID?view=$type"
diff --git a/scripts/sh/job_curl_canfar_local.sh b/scripts/sh/job_curl_canfar_local.sh
deleted file mode 100644
index 665f6ea79..000000000
--- a/scripts/sh/job_curl_canfar_local.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-# Usage:
-# Edit the file "all.txt"
-# screen
-# bash run_curl.sh kind job
-
-rm -f session_IDs.txt session_image_IDs.txt
-
-script_local=~/shapepipe/scripts/sh/curl_canfar_local.sh
-version="1.0"
-cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
-N_SMP=1
-kind="$1"
-job="$2"
-
-echo $kind $job
-cat all.txt | xargs -n 1 -P 1 $script_local -v $version -c $cmd_remote -N $N_SMP -k $kind -j $job -e
-

From ee5b3ad96f6b8633b6a973654864b48674395486 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Sun, 11 Feb 2024 12:03:01 +0100
Subject: [PATCH 112/207] Update tiles_P7.txt

remove 000.000
---
 auxdir/CFIS/tiles_202106/tiles_P7.txt | 1 -
 1 file changed, 1 deletion(-)

diff --git a/auxdir/CFIS/tiles_202106/tiles_P7.txt b/auxdir/CFIS/tiles_202106/tiles_P7.txt
index 93a1dfdb6..535084a2e 100644
--- a/auxdir/CFIS/tiles_202106/tiles_P7.txt
+++ b/auxdir/CFIS/tiles_202106/tiles_P7.txt
@@ -229,4 +229,3 @@
 094.300
 094.301
 095.300
-000.000

From 155f2fe10de7aa22b20ef6f5657403c9d0c32b54 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 23 Feb 2024 09:21:42 +0000
Subject: [PATCH 113/207] added COSMOS tile list

---
 auxdir/CFIS/tiles_202402/tiles_COSMOS.txt | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 auxdir/CFIS/tiles_202402/tiles_COSMOS.txt

diff --git a/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt b/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt
new file mode 100644
index 000000000..671b879d7
--- /dev/null
+++ b/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt
@@ -0,0 +1,10 @@
+299.183
+300.183
+301.183
+299.184
+300.184
+301.184
+299.185
+300.185
+301.185
+

From 1d928d461c56873983e9a4244681488f415c3e88 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 23 Feb 2024 10:44:41 +0000
Subject: [PATCH 114/207] monitoring and job handling scripts; small modifs,
 output; canfar pipeline job description to docs/source

---
 auxdir/CFIS/tiles_202106/tiles_P7.txt         |  1 +
 docs/source/pipeline_canfar.md                | 91 +++++++++++++++++++
 .../cfis/config_merge_sep_cats_template.ini   |  3 -
 scripts/jupyter/summary_run.ipynb             |  4 +-
 scripts/python/stats_headless_canfar.py       |  9 ++
 scripts/python/summary_params_pre_v2.py       | 12 ++-
 scripts/sh/combine_runs.bash                  |  2 +-
 scripts/sh/curl_canfar_local.sh               | 18 ++--
 scripts/sh/missing_unique.sh                  | 27 ++++++
 scripts/sh/stats_jobs_canfar.sh               | 90 ++++++++++++++++++
 10 files changed, 244 insertions(+), 13 deletions(-)
 create mode 100644 docs/source/pipeline_canfar.md
 create mode 100644 scripts/sh/missing_unique.sh
 create mode 100755 scripts/sh/stats_jobs_canfar.sh

diff --git a/auxdir/CFIS/tiles_202106/tiles_P7.txt b/auxdir/CFIS/tiles_202106/tiles_P7.txt
index 535084a2e..cd8b6b5af 100644
--- a/auxdir/CFIS/tiles_202106/tiles_P7.txt
+++ b/auxdir/CFIS/tiles_202106/tiles_P7.txt
@@ -1,3 +1,4 @@
+000.000
 052.332
 053.331
 053.332
diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
new file mode 100644
index 000000000..23213f7cd
--- /dev/null
+++ b/docs/source/pipeline_canfar.md
@@ -0,0 +1,91 @@
+patch="P7"
+psf="psfex"
+N_SMP=16
+
+# Terminal title
+echo -ne "\033]0;$patch\007"
+
+# Run directory
+dir=~/cosmostat/v2/pre_v2/$psf/$patch
+cd $dir
+
+# Get tile number list
+ln -s ~/shapepipe/auxdir/CFIS/tiles_202106/tiles_$patch.txt tile_numbers.txt
+
+
+# Get images
+
+## Download and link separately
+
+### Download
+### Create and link to central image storage directory
+mkdir -p ~/cosmostat/v2/data_tiles/$patch
+ln -s ~/cosmostat/v2/data_tiles/$patch data_tiles
+
+### Download and move tiles 
+ln -s ~/shapepipe/example/cfis
+mkdir -p output
+export SP_RUN=`pwd`
+
+shapepipe_run -c cfis/config_Git_vos.ini
+mv -i output/run_sp_Git_*/get_images_runner/output/CFIS.???.???.*fits* data_tiles
+rm -rf output/run_sp_tiles_Git_*
+update_run_log_file.py
+# repeat the above block
+
+### Find exposures; this run can be stopped after Fe
+shapepipe_run -c cfis/config_GitFe_symlink.ini
+
+### Download and move exposures
+
+shapepipe_run -c cfis/config_Gie_vos.ini
+mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp
+rm -rf  output/run_sp_Gie_*
+update_run_log_file.py
+# repeat the above
+
+### Create links (and re-run Fe, not necessary)
+job_sp_canfar.bash -p $psf `cat tile_numbers.txt` -j 1 -r symlink
+
+# Uncompress weights,  split exposures into single HDUs
+job_sp_canfar.bash -p $psf -n $N_SMP -j 2
+
+# Mask tiles
+job_sp_canfar.bash -p $psf -n $N_SMP -j 4
+
+# Mask exposures
+job_sp_canfar.bash -p $psf -n $N_SMP -j 8
+
+
+# Tile detection
+curl_canfar_local.sh -j 16 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
+
+
+# Exposure detection
+## Get single-HDU single-exposure IDs
+~/shapepipe/scripts/python/summary_run.py
+
+cp summary/missing_job_32_sextractor.txt all.txt
+curl_canfar_local.sh -j 32 -f all.txt -k exp -p $psf -N $N_SMP
+
+# Tile preparation
+curl_canfar_local.sh -j 64 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
+
+# Tile shape measurement
+curl_canfar_local.sh -j 128 -f tile_numbers.txt -k tile -p $psf -N 8
+
+# Merge subcatalogues, and create final cat
+job_sp_canfar.bash -p $psf -n 1 -j 256
+
+# Combine all final cats in common output dir as links
+combine_runs.bash -c final -p psfex
+
+# Merge all final cats
+# (use 192GB RAM)
+merge_final_cat -i output/run_sp_combined_final/make_catalog_runner/output -p cfis/final_cat.param -v
+
+
+# Delete jobs
+SSL=~/.ssl/cadcproxy.pem
+SESSION=https://ws-uv.canfar.net/skaha/v0/session
+for ID in `cat session_IDs.txt`; do echo $ID; curl -X DELETE -E $SSL $SESSION/$ID; done
diff --git a/example/cfis/config_merge_sep_cats_template.ini b/example/cfis/config_merge_sep_cats_template.ini
index e14e5fe74..36b99e8da 100644
--- a/example/cfis/config_merge_sep_cats_template.ini
+++ b/example/cfis/config_merge_sep_cats_template.ini
@@ -35,7 +35,6 @@ RUN_LOG_NAME = log_run_sp
 
 # Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
 INPUT_DIR = ./output/run_sp_tile_ngmix_Ng1u/ngmix_runner/output
-#, ./output/run_sp_tile_ngmix_Ng1u/galsim_shapes_v2_runner/output
 
 # Output directory
 OUTPUT_DIR = ./output
@@ -58,11 +57,9 @@ TIMEOUT = 96:00:00
 # Input file pattern(s), list of strings with length matching number of expected input file types
 # Cannot contain wild cards
 FILE_PATTERN = ngmix
-#, galsim
 
 # FILE_EXT (optional) list of string extensions to identify input files
 FILE_EXT = .fits
-#, .fits
 
 # Numbering convention, string that exemplifies a numbering pattern.
 NUMBERING_SCHEME = -000-000
diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb
index 451c591d0..f527e4159 100644
--- a/scripts/jupyter/summary_run.ipynb
+++ b/scripts/jupyter/summary_run.ipynb
@@ -143,8 +143,8 @@
      "output_type": "stream",
      "text": [
       " (Job 1)\n",
-      "get_images_runner_run_1              464       462         0         2       1.0     99.6%\n",
-      "find_exposures_runner                232       231         0         1       1.0     99.6%\n",
+      "get_images_runner_run_1              462       462         0         0       0.0    100.0%\n",
+      "find_exposures_runner                231       231         0         0       0.0    100.0%\n",
       "get_images_runner_run_2              537         0         0       537     179.0      0.0%\n"
      ]
     }
diff --git a/scripts/python/stats_headless_canfar.py b/scripts/python/stats_headless_canfar.py
index 1ede78eed..1f728949d 100755
--- a/scripts/python/stats_headless_canfar.py
+++ b/scripts/python/stats_headless_canfar.py
@@ -2,11 +2,20 @@
 
 # Name: stats_headless_canfar.py
 
+# Caution: Does not show all running or pending
+# headless jobs, for some reason.
+
 import sys
 from skaha.session import Session
 
 
 def main(argv=None):
+
+    print(
+        "# Depreciated, does not show pending jobs; use stats_jobs_canfar.sh",
+        file=sys.stderr,
+    )
+
     session = Session()
 
     n_headless = session.stats()["instances"]["headless"]
diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 5b67ee0ca..d8d08201f 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -74,7 +74,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     # - remove previous output dirs since only last is searched
     jobs["1"] = job_data(
         1,
-         "run_sp_Git",
+         "run_sp_GitFeGie",
        [
             "get_images_runner_run_1",
             "find_exposures_runner",
@@ -220,6 +220,16 @@ def set_jobs_v2_pre_v2(patch, verbose):
     )
 
     # Post-processing
+    jobs["512"] = job_data(
+        "512",
+        ["run_sp_combined_final"],
+        ["make_cat_runner"],
+        "tile_IDs",
+        path_main=path_main,
+        path_left="output",
+        verbose=verbose,
+    )
+
     jobs["1024"] = job_data(
         "1024",
         "run_sp_combined_psf",
diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index 89e844c63..2226e3e44 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -175,7 +175,7 @@ for dir in $run_in; do
 done
 
 #echo " $n_files target files, $i links created/skipped"
-echo " $i total, "n_skipped skipped, "n_created links created"
+echo " $i total, "$n_skipped skipped, "$n_created links created"
 
 # Update log file
 update_runs_log_file.py
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 3e03dcd5a..a8a095ac1 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -15,7 +15,7 @@ ID=-1
 file_IDs=-1
 N_SMP=1
 kind=-1
-version=1.0
+version="1.1"
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 batch_max=200
 dry_run=0
@@ -92,7 +92,7 @@ while [ $# -gt 0 ]; do
   shift
 done
 
-# Check options                                                                 
+## Check options                                                                 
 if [ "$job" == "-1" ]; then                                                     
   echo "No job indicated, use option -j"                                        
   exit 2                                                                        
@@ -136,11 +136,13 @@ function set_arg() {
 }
 
 
+# MKDEBUG TODO
 function call_curl() {
   my_arg=$1
 
 }
 
+# Add session and image IDs to log files
 function update_session_logs() {
   echo $my_session >> session_IDs.txt
   echo "$my_session $ID" >> session_image_IDs.txt
@@ -152,7 +154,7 @@ function submit_batch() {
 
   for ID in `cat $path`; do
     my_arg=$(set_arg)
-    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg"`
+    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg" &> /dev/null`
     update_session_logs
   done
 
@@ -203,6 +205,8 @@ else
       echo "Split '$file_IDs' into $n_split batches of size $batch"
 
       count=1
+      #n_running=`stats_headless_canfar.py`
+      n_running=`stats_jobs_canfar.sh`
       for batch in $prefix*; do
         echo "Number of running jobs = $n_running"
         echo "Submitting batch $batch ($count/$n_split)"
@@ -210,12 +214,14 @@ else
         submit_batch $batch
         ((count=count+1))
 
-        n_running=`stats_headless_canfar.py`
+        #n_running=`stats_headless_canfar.py`
+        n_running=`stats_jobs_canfar.sh`
 
         while [ "$n_running" -gt "$n_thresh" ]; do
           echo "Wait for #jobs = $n_running jobs to go < $n_thresh ..."
           sleep $sleep
-          n_running=`stats_headless_canfar.py`
+          #n_running=`stats_headless_canfar.py`
+          n_running=`stats_jobs_canfar.sh`
         done
 
       done
@@ -232,7 +238,7 @@ else
 
     # Submit image
     arg=$(set_arg)
-    session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"`
+    session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
     update_session_logs
 
   fi
diff --git a/scripts/sh/missing_unique.sh b/scripts/sh/missing_unique.sh
new file mode 100644
index 000000000..8820d26f5
--- /dev/null
+++ b/scripts/sh/missing_unique.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+FILES=("summary/missing_job_128_ngmix_runner_*.txt")
+temp="temp_temp.tmp"
+temp2="temp_temp2.tmp"
+out="missing_job_128_ngmix_runner_cut.txt"
+
+i=0
+for file in ${FILES[@]}; do
+
+  echo $file $i
+
+  if [ "$i" == "0" ]; then
+    cp $file $temp
+  else
+    comm -12  <(sort $file) <(sort $temp) > $temp2
+    cp $temp2 $temp
+  fi
+
+  wc $file $temp
+
+  ((i=i+1))
+
+done
+
+mv $temp $out
+rm $temp2
diff --git a/scripts/sh/stats_jobs_canfar.sh b/scripts/sh/stats_jobs_canfar.sh
new file mode 100755
index 000000000..3c1332f59
--- /dev/null
+++ b/scripts/sh/stats_jobs_canfar.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/env bash
+
+# Name: stats_jobs_canfar.sh
+# Author: Martin Kilbinger <martin.kilbinger@cea.fr>
+# Description: Handles headless jobs on canfar
+
+
+# Global variables
+
+## Temporary files
+tmpfile_jobs="jobinfo.txt"
+tmpfile_ids="ids.txt"
+
+## curl options
+SSL=~/.ssl/cadcproxy.pem
+SESSION=https://ws-uv.canfar.net/skaha/v0/session
+
+
+# Command line arguments
+
+## Default values
+mode="count"
+
+## Help string
+usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
+\n\nOptions:\n
+   -h\tthis message\n
+   -m, --mode MODE\n
+   \tmode, allowed are 'count' (default), 'delete'\n
+"
+
+## Parse command line
+while [ $# -gt 0 ]; do
+  case "$1" in
+    -h)
+      echo -ne $usage
+      exit 0
+      ;;
+    -m|--mode)
+      mode="$2"
+      shift
+      ;;
+  esac
+  shift
+done
+
+## Check options
+case $mode in
+  "count"|"delete")
+    # valid option
+    ;;
+  *)
+    echo "Invalid mode $mode"
+    exit 1
+    ;;
+esac
+
+
+# Main program
+
+# Get all instances
+curl -E $SSL $SESSION &> /dev/null > $tmpfile_jobs
+
+# Get headless job IDs
+cat $tmpfile_jobs | grep headless -B 4 -A 12 | grep \"id | perl -F\" -ane 'print "$F[3]\n"' > $tmpfile_ids
+
+# Number of jobs
+n_headless=`cat $tmpfile_ids | wc -l`
+
+if [ "$mode" == "count" ]; then
+
+  echo $n_headless
+
+elif [ "$mode" == "delete" ]; then
+
+  echo -n "Delete $n_headless jobs? [y|n] "
+  read answer
+  if [ "$answer" == "y" ]; then
+    for ID in `cat $tmpfile_ids`; do
+      echo $ID
+      # Delete headless jobs
+      #curl -X DELETE -E $SSL $SESSION/$ID
+    done
+  fi
+
+fi
+
+
+# Remove temporary files
+rm -f $tmpfile_jobs $tmpfile_ids

From c56dae0132597036fe12a982ce05cbecf93eeccf Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Fri, 23 Feb 2024 14:19:38 +0100
Subject: [PATCH 115/207] Added (back) from v1 exp mccd ini file

---
 example/cfis/config_exp_mccd.ini | 244 +++++++++++++++++++++++++++++++
 1 file changed, 244 insertions(+)
 create mode 100644 example/cfis/config_exp_mccd.ini

diff --git a/example/cfis/config_exp_mccd.ini b/example/cfis/config_exp_mccd.ini
new file mode 100644
index 000000000..268ad3f91
--- /dev/null
+++ b/example/cfis/config_exp_mccd.ini
@@ -0,0 +1,244 @@
+# ShapePipe configuration file for single-exposures, MCCD PSF model.
+# Process exposures after masking, from star detection to PSF model.
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_exp_SxSePsf
+
+# Add date and time to RUN_NAME, optional, default: True
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = sextractor_runner, setools_runner,
+         mccd_preprocessing_runner, mccd_fit_val_runner,
+         mccd_merge_starcat_runner, mccd_plots_runner
+
+# Run mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 1
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+[SEXTRACTOR_RUNNER]
+
+# Somehow this works but not
+# - omitting
+# - $SP_RUN/output
+#INPUT_DIR = .
+
+# Input from two modules
+INPUT_MODULE = split_exp_runner, mask_runner
+
+# Read pipeline flag files created by mask module
+FILE_PATTERN = image, weight, pipeline_flag
+
+NUMBERING_SCHEME = -0000000-0
+
+# SExtractor executable path
+EXEC_PATH = sex
+
+# SExtractor configuration files
+DOT_SEX_FILE = $SP_CONFIG/default_exp.sex
+DOT_PARAM_FILE = $SP_CONFIG//default.param
+DOT_CONV_FILE = $SP_CONFIG/default.conv
+
+# Use input weight image if True
+WEIGHT_IMAGE = True
+
+# Use input flag image if True
+FLAG_IMAGE = True
+
+# Use input PSF file if True
+PSF_FILE = False
+
+# Use distinct image for detection (SExtractor in
+# dual-image mode) if True.
+DETECTION_IMAGE = False
+
+# Distinct weight image for detection (SExtractor
+# in dual-image mode)
+DETECTION_WEIGHT = False
+
+# True if photometry zero-point is to be read from exposure image header
+ZP_FROM_HEADER = True
+
+# If ZP_FROM_HEADER is True, zero-point key name
+ZP_KEY = PHOTZP
+
+# Background information from image header.
+# If BKG_FROM_HEADER is True, background value will be read from header.
+# In that case, the value of BACK_TYPE will be set atomatically to MANUAL.
+# This is used e.g. for the LSB images.
+BKG_FROM_HEADER = False
+# LSB images:
+# BKG_FROM_HEADER = True
+
+# If BKG_FROM_HEADER is True, background value key name
+# LSB images:
+#BKG_KEY = IMMODE
+
+# Type of image check (optional), default not used, can be a list of
+# BACKGROUND, BACKGROUND_RMS, INIBACKGROUND, MINIBACK_RMS, -BACKGROUND, 
+# FILTERED, OBJECTS, -OBJECTS, SEGMENTATION, APERTURES
+CHECKIMAGE = BACKGROUND
+
+# File name suffix for the output sextractor files (optional) SUFFIX = tile
+SUFFIX = sexcat
+
+## Post-processing
+
+# Not required for single exposures
+MAKE_POST_PROCESS = FALSE
+
+
+[SETOOLS_RUNNER]
+
+INPUT_MODULE = sextractor_runner
+
+# Note: Make sure this doe not match the SExtractor background images
+# (sexcat_background*)
+FILE_PATTERN = sexcat_sexcat
+
+NUMBERING_SCHEME = -0000000-0
+
+# SETools config file
+SETOOLS_CONFIG_PATH = $SP_CONFIG/star_selection.setools
+
+
+[MCCD_PREPROCESSING_RUNNER]
+
+# Path to MCCD config file
+CONFIG_PATH = $SP_CONFIG/config_MCCD.ini
+
+MODE = FIT_VALIDATION
+
+VERBOSE = False
+
+INPUT_DIR = last:setools_runner
+
+# Input are individual CCDs, thus single-exposure single-HDU images
+NUMBERING_SCHEME = -0000000-0
+
+FILE_PATTERN = star_split_ratio_80, star_split_ratio_20
+
+FILE_EXT = .fits, .fits
+
+
+[MCCD_FIT_VAL_RUNNER]
+
+# Path to MCCD config file
+CONFIG_PATH = $SP_CONFIG/config_MCCD.ini
+
+MODE = FIT_VALIDATION
+
+VERBOSE = False
+
+NUMBERING_SCHEME = -0000000
+
+
+[MCCD_MERGE_STARCAT_RUNNER]
+
+# Path to MCCD config file
+CONFIG_PATH = $SP_CONFIG/config_MCCD.ini
+
+MODE = FIT_VALIDATION
+
+VERBOSE = False
+
+NUMBERING_SCHEME = -0000000
+
+
+[MCCD_PLOTS_RUNNER]
+
+# Path to MCCD config file
+CONFIG_PATH = $SP_CONFIG/config_MCCD.ini
+
+MODE = FIT_VALIDATION
+
+VERBOSE = False
+
+# Now MCCD has created a focal-plane PSF model, including all CCDS per images,
+# thus single-exposure files
+NUMBERING_SCHEME = -0000000
+
+PLOT_MEANSHAPES = True
+
+# X_GRID, Y_GRID: correspond to the number of bins in each direction of each
+# CCD from the focal plane. Ex: each CCD will be binned in 5x10 regular grids.
+X_GRID = 5
+Y_GRID = 10
+
+PLOT_HISTOGRAMS = True
+
+# REMOVE_OUTLIERS: Remove validated stars that are outliers in terms of shape
+# before drawing the plots.
+REMOVE_OUTLIERS = False
+
+PLOT_RHO_STATS = True
+
+# RHO_STATS_STYLE: can be 'HSC' or 'DES'
+RHO_STATS_STYLE = HSC
+
+
+[MCCD_INTERP_RUNNER]
+
+# MODE: Define the way the MCCD interpolation will run.
+#  CLASSIC for classical run.
+#  MULTI-EPOCH for multi epoch.
+MODE = CLASSIC
+
+# Position parameter names
+# for multi-epoch XWIN_WORLD,YWIN_WORLD
+# For classical XWIN_IMAGE,YWIN_IMAGE:
+POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE
+
+# Get PSF shapes calculated and saved on the output dict
+GET_SHAPES = True
+
+# Directory with PSF models
+PSF_MODEL_DIR = /Users/tliaudat/Documents/PhD/codes/venv_p3/MCCD_pipeline_integration/test_val_data/fitted_model/
+
+# PSF model patterns
+PSF_MODEL_PATTERN = fitted_model
+
+# PSF model separator
+PSF_MODEL_SEPARATOR = -
+
+# For multi-epoch purposes
+ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite

From a6d8b521cbe3921c7d3015001df194b8f012397f Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 5 Mar 2024 13:11:28 +0000
Subject: [PATCH 116/207] combine run script: flag_tile and flag_exp as diff
 options

---
 scripts/sh/combine_runs.bash | 44 ++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 12 deletions(-)

diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index 2226e3e44..c5a99cde7 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -17,9 +17,10 @@ usage="Usage: $(basename "$0") [OPTIONS]
 \n\nOptions:\n
    -h\tthis message\n
    -p, --psf MODEL\n
-    \tPSF model, one in ['psfex'|'mccd'|'setools'], default='$psf'\n
+    \tPSF model, allowed are 'psfex', 'mccd', 'setools', default='$psf'\n
    -c, --cat TYPE\n
-    \tCatalogue type, one in ['final'|'flag'|'psf'|'image'], default='$cat'\n
+    \tCatalogue type, allowed are 'final', 'flag_tile', 'flag_exp', \n
+    \t'psf', 'image', default='$cat'\n
 "
 
 ## Parse command line
@@ -48,10 +49,11 @@ done
 
 ## Check options
 if [ "$cat" != "final" ] \
-  && [ "$cat" != "flag" ] \
+  && [ "$cat" != "flag_tile" ] \
+  && [ "$cat" != "flag_exp" ] \
   && [ "$cat" != "psf" ] \
   && [ "$cat" != "image" ]; then
-  echo "cat (option -c) needs to be 'final', 'flag', 'psf', or 'image'"
+  echo "cat (option -c) needs to be 'final', 'flag_tile', 'flag_exp', 'psf', or 'image'"
   exit 2
 fi
 
@@ -106,11 +108,27 @@ if [ "$cat" == "final" ]; then
   module="make_catalog_runner"
   pattern="final_cat-*"
 
-elif [ "$cat" == "flag" ]; then
+elif [ "$cat" == "flag_tile" ]; then
 
-  run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1"
-  module="mask_runner_run_1"
-  pattenr="pipeline_flag-*"
+  # v1
+  #run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1"
+  # v2
+  run_in="$pwd/$out_base/run_sp_tile_Ma_*"
+  run_out="run_sp_tile_Ma"
+
+  module="mask_runner"
+  pattern="pipeline_flag-*"
+
+elif [ "$cat" == "flag_exp" ]; then
+
+  # v1
+  #run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_2"
+  # v2
+  run_in="$pwd/$out_base/run_sp_exp_Ma_*"
+  run_out="run_sp_exp_Ma"
+
+  module="mask_runner"
+  pattern="pipeline_flag-*"
 
 elif [ "$cat" == "image" ]; then
 
@@ -162,13 +180,15 @@ i=0
 for dir in $run_in; do
   FILES=(`find $dir -type f -name "$pattern" -print0 | xargs -0 echo`)
 
+  echo "$dir $pattern"
+
   ## Look over source files
   for file in ${FILES[@]}; do
 
-  target=$file
-  link_name=$outdir/`basename $file`
-  link_s $target $link_name
-  ((i=i+1))
+    target=$file
+    link_name=$outdir/`basename $file`
+    link_s $target $link_name
+    ((i=i+1))
 
   done
 

From 1a2d47d6bfc375ba82a96c89ab1791711066b7f8 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 09:02:27 +0000
Subject: [PATCH 117/207] mask runer excluding processed files working

---
 docs/source/pipeline_canfar.md                   |  4 ++++
 example/cfis/config_tile_Sx.ini                  |  2 +-
 scripts/sh/curl_canfar_local.sh                  |  2 --
 shapepipe/modules/mask_package/__init__.py       |  3 +++
 shapepipe/modules/mask_package/mask.py           | 16 ++++++++++++++++
 shapepipe/modules/mask_runner.py                 | 10 ++++++++++
 .../merge_sep_cats_package/merge_sep_cats.py     |  6 ++++++
 shapepipe/utilities/summary.py                   |  7 ++++---
 8 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 23213f7cd..7227cf463 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -53,6 +53,10 @@ job_sp_canfar.bash -p $psf -n $N_SMP -j 2
 # Mask tiles
 job_sp_canfar.bash -p $psf -n $N_SMP -j 4
 
+# If not finshed:
+combine_runs.bash -p psfex -c flag
+mv output/run_sp_combined_flag output/run_sp_exp_Ma
+
 # Mask exposures
 job_sp_canfar.bash -p $psf -n $N_SMP -j 8
 
diff --git a/example/cfis/config_tile_Sx.ini b/example/cfis/config_tile_Sx.ini
index 1c418245d..a079c2488 100644
--- a/example/cfis/config_tile_Sx.ini
+++ b/example/cfis/config_tile_Sx.ini
@@ -55,7 +55,7 @@ TIMEOUT = 96:00:00
 
 [SEXTRACTOR_RUNNER]
 
-INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner, run_sp_tile_Ma:mask_runner
+INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner, run_sp_Ma_tile:mask_runner
 
 FILE_PATTERN = CFIS_image, CFIS_weight, pipeline_flag
 
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index a8a095ac1..e745ebd06 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -214,13 +214,11 @@ else
         submit_batch $batch
         ((count=count+1))
 
-        #n_running=`stats_headless_canfar.py`
         n_running=`stats_jobs_canfar.sh`
 
         while [ "$n_running" -gt "$n_thresh" ]; do
           echo "Wait for #jobs = $n_running jobs to go < $n_thresh ..."
           sleep $sleep
-          #n_running=`stats_headless_canfar.py`
           n_running=`stats_jobs_canfar.sh`
         done
 
diff --git a/shapepipe/modules/mask_package/__init__.py b/shapepipe/modules/mask_package/__init__.py
index af2dc5c5c..ccd55fa9a 100644
--- a/shapepipe/modules/mask_package/__init__.py
+++ b/shapepipe/modules/mask_package/__init__.py
@@ -63,6 +63,9 @@
     Prefix to be appended to output file name ``flag``;
     helps to distinguish the file patterns of newly created and external
     mask files
+CHECK_EXISTING_DIR : str, optional
+    If given, search this directory for existing mask files; the
+    corresponding images will then not be processed
 
 Mask config file
 ================
diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py
index e34eb9583..a81ce18d0 100644
--- a/shapepipe/modules/mask_package/mask.py
+++ b/shapepipe/modules/mask_package/mask.py
@@ -45,6 +45,8 @@ class Mask(object):
         Path to external flag file, default is ``None`` (not used)
     outname_base : str, optional
        Output file name base, default is ``flag``
+    check_existing_dir : str, optional
+        If not ``None`` (default), search path for existing mask files
     star_cat_path : str, optional
         Path to external star catalogue, default is ``None`` (not used;
         instead the star catalogue is produced on the fly at run time)
@@ -64,6 +66,7 @@ def __init__(
         w_log,
         path_external_flag=None,
         outname_base='flag',
+        check_existing_dir=None,
         star_cat_path=None,
         hdu=0,
     ):
@@ -98,6 +101,9 @@ def __init__(
         # Output file base name
         self._outname_base = outname_base
 
+        # Search path for existing mask files
+        self._check_existing_dir= check_existing_dir
+
         # Set external star catalogue path if given
         if star_cat_path is not None:
             self._star_cat_path = star_cat_path
@@ -308,6 +314,16 @@ def make_mask(self):
         Main function to create the mask.
 
         """
+        output_file_name = (
+            f'{self._img_prefix}'
+            + f'{self._outname_base}{self._img_number}.fits'
+        )
+        if (
+            os.path.exists(f"{self._check_existing_dir}//{output_file_name}")
+        ):
+            print("MKDEBUG skipping ", output_file_name)
+            return None, None
+
         if self._config['MD']['make']:
             self.missing_data()
 
diff --git a/shapepipe/modules/mask_runner.py b/shapepipe/modules/mask_runner.py
index 3683076e4..c3215107c 100644
--- a/shapepipe/modules/mask_runner.py
+++ b/shapepipe/modules/mask_runner.py
@@ -91,6 +91,15 @@ def mask_runner(
 
     outname_base = 'flag'
 
+    # Path to check for already created mask files
+    if config.has_option(module_config_sec, 'CHECK_EXISTING_DIR'):
+        check_existing_dir = config.getexpanded(
+            module_config_sec,
+            'CHECK_EXISTING_DIR'
+        )
+    else:
+        check_existing_dir = None
+
     # Create instance of Mask
     mask_inst = Mask(
         *input_file_list[:2],
@@ -101,6 +110,7 @@ def mask_runner(
         path_external_flag=ext_flag_name,
         outname_base=outname_base,
         star_cat_path=ext_star_cat,
+        check_existing_dir=check_existing_dir,
         hdu=hdu,
         w_log=w_log,
     )
diff --git a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
index 85f7e194f..d9200529e 100644
--- a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
+++ b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
@@ -87,6 +87,12 @@ def process(self):
             cat0.open()
             list_ext_name = cat0.get_ext_name()
             list_col_name = cat0.get_col_names()
+            # MKDEBUG: Some input ngmix catalogues have multiple of 5 HDUs
+            # if reprocessed and not deleted but appended
+            if len(list_ext_name) > 6:
+                wmsg = f"Cropping input HDUs from {len(list_ext_name)} to 5"
+                self._w_log.info(wmsg)
+                list_ext_name = list_ext_name[:6]
             cat0.close()
 
             # Create empty dictionary
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 42b7ebf93..0aedb4475 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -430,7 +430,8 @@ def output_missing_job(self):
         if len(missing_IDs_all) > 0:
             self.write_IDs_to_file(output_path, missing_IDs_all)
         else:
-            logging.warning("no missing IDs in output_missing_job")
+            #logging.warning("no missing IDs in output_missing_job")
+            os.unlink(output_path)
 
     @classmethod
     def get_last_full_path(self, base_and_subdir, matches):
@@ -648,8 +649,8 @@ def check_numbers(self, par_runtime=None, indices=None):
                 self._missing_IDs_job.extend(missing_IDs)
 
         # Write missing IDs for entire job to file
-        if n_missing_job > 0:
-            self.output_missing_job()
+        #if n_missing_job > 0:
+        self.output_missing_job()
 
 
 def get_par_runtime(par_runtime, key, kind="n"):

From de82961945be79ec0a0536ec8a9e29f13ce0dc96 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 09:09:16 +0000
Subject: [PATCH 118/207] combine runs for masks: changed output target dir
 name

---
 scripts/sh/combine_runs.bash | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index c5a99cde7..3b8a27824 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -114,7 +114,7 @@ elif [ "$cat" == "flag_tile" ]; then
   #run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1"
   # v2
   run_in="$pwd/$out_base/run_sp_tile_Ma_*"
-  run_out="run_sp_tile_Ma"
+  run_out="run_sp_Ma_tile"
 
   module="mask_runner"
   pattern="pipeline_flag-*"
@@ -125,7 +125,7 @@ elif [ "$cat" == "flag_exp" ]; then
   #run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_2"
   # v2
   run_in="$pwd/$out_base/run_sp_exp_Ma_*"
-  run_out="run_sp_exp_Ma"
+  run_out="run_sp_Ma_exp"
 
   module="mask_runner"
   pattern="pipeline_flag-*"

From 33b5b75f6f7252f01b78fc52c82fa43311b3449e Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 10:16:41 +0100
Subject: [PATCH 119/207] Added COSMOS tile list

---
 auxdir/CFIS/tiles_202402/tiles_COSMOS.txt |     1 -
 auxdir/CFIS/tiles_cuts.txt                | 12055 --------------------
 environment.yml                           |     1 +
 example/cfis/config_exp_mccd.ini          |     4 +-
 scripts/python/get_number_objects.py      |    97 +-
 scripts/sh/job_sp_canfar.bash             |     2 +-
 6 files changed, 13 insertions(+), 12147 deletions(-)
 delete mode 100644 auxdir/CFIS/tiles_cuts.txt

diff --git a/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt b/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt
index 671b879d7..ff9d7e4cf 100644
--- a/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt
+++ b/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt
@@ -7,4 +7,3 @@
 299.185
 300.185
 301.185
-
diff --git a/auxdir/CFIS/tiles_cuts.txt b/auxdir/CFIS/tiles_cuts.txt
deleted file mode 100644
index b1c181630..000000000
--- a/auxdir/CFIS/tiles_cuts.txt
+++ /dev/null
@@ -1,12055 +0,0 @@
-001.238 0.28510217391642745 0.8567792078664276 28.741671418001033 29.24967467376608
-002.238 0.8567792078664276 1.4284562418164275 28.741671418001033 29.24967467376608
-003.238 1.4284562418164275 2.0001332757164274 28.741671418001033 29.24967467376608
-004.238 2.0001332757164274 2.5718103096664278 28.741671418001033 29.24967467376608
-005.238 2.5718103096664278 3.1434873436164277 28.741671418001033 29.24967467376608
-006.238 3.1434873436164277 3.7151643775664276 28.741671418001033 29.24967467376608
-007.238 3.7151643775664276 4.286841411516428 28.741671418001033 29.24967467376608
-008.238 4.286841411516428 4.858518445416429 28.741671418001033 29.24967467376608
-009.238 4.858518445416429 5.430195479366427 28.741671418001033 29.24967467376608
-010.238 5.430195479366427 6.001872513316426 28.741671418001033 29.24967467376608
-011.238 6.001872513316426 6.5735495472164285 28.741671418001033 29.24967467376608
-012.238 6.5735495472164285 7.145226581166426 28.741671418001033 29.24967467376608
-013.238 7.145226581166426 7.716903615116426 28.741671418001033 29.24967467376608
-014.238 7.716903615116426 8.288580649016428 28.741671418001033 29.24967467376608
-015.238 8.288580649016428 8.860257682966427 28.741671418001033 29.24967467376608
-016.238 8.860257682966427 9.431934716916428 28.741671418001033 29.24967467376608
-017.238 9.431934716916428 10.003611750866428 28.741671418001033 29.24967467376608
-018.238 10.003611750866428 10.575288784816426 28.741671418001033 29.24967467376608
-019.238 10.575288784816426 11.146965818716428 28.741671418001033 29.24967467376608
-020.238 11.146965818716428 11.718642852666427 28.741671418001033 29.24967467376608
-021.238 11.718642852666427 12.290319886616427 28.741671418001033 29.24967467376608
-022.238 12.290319886616427 12.861996920516429 28.741671418001033 29.24967467376608
-023.238 12.861996920516429 13.433673954466425 28.741671418001033 29.24967467376608
-024.238 13.433673954466425 14.005350988416428 28.741671418001033 29.24967467376608
-025.238 14.005350988416428 14.577028022366429 28.741671418001033 29.24967467376608
-026.238 14.577028022366429 15.14870505631643 28.741671418001033 29.24967467376608
-027.238 15.14870505631643 15.720382090216429 28.741671418001033 29.24967467376608
-028.238 15.720382090216429 16.29205912416643 28.741671418001033 29.24967467376608
-029.238 16.29205912416643 16.863736158116424 28.741671418001033 29.24967467376608
-030.238 16.863736158116424 17.435413192016426 28.741671418001033 29.24967467376608
-031.238 17.435413192016426 18.007090225966426 28.741671418001033 29.24967467376608
-032.238 18.007090225966426 18.578767259916432 28.741671418001033 29.24967467376608
-033.238 18.578767259916432 19.150444293816427 28.741671418001033 29.24967467376608
-034.238 19.150444293816427 19.722121327766423 28.741671418001033 29.24967467376608
-035.238 19.722121327766423 20.293798361716426 28.741671418001033 29.24967467376608
-036.238 20.293798361716426 20.86547539566643 28.741671418001033 29.24967467376608
-037.238 20.86547539566643 21.437152429616425 28.741671418001033 29.24967467376608
-038.238 21.437152429616425 22.008829463516427 28.741671418001033 29.24967467376608
-039.238 22.008829463516427 22.580506497466427 28.741671418001033 29.24967467376608
-040.238 22.580506497466427 23.152183531416426 28.741671418001033 29.24967467376608
-041.238 23.152183531416426 23.72386056531643 28.741671418001033 29.24967467376608
-042.238 23.72386056531643 24.295537599266424 28.741671418001033 29.24967467376608
-043.238 24.295537599266424 24.867214633216427 28.741671418001033 29.24967467376608
-044.238 24.867214633216427 25.438891667116426 28.741671418001033 29.24967467376608
-045.238 25.438891667116426 26.010568701066425 28.741671418001033 29.24967467376608
-046.238 26.010568701066425 26.58224573501643 28.741671418001033 29.24967467376608
-047.238 26.58224573501643 27.153922768966424 28.741671418001033 29.24967467376608
-048.238 27.153922768966424 27.725599802916424 28.741671418001033 29.24967467376608
-049.238 27.725599802916424 28.29727683681643 28.741671418001033 29.24967467376608
-050.238 28.29727683681643 28.868953870766425 28.741671418001033 29.24967467376608
-051.238 28.868953870766425 29.44063090471643 28.741671418001033 29.24967467376608
-052.238 29.44063090471643 30.01230793861643 28.741671418001033 29.24967467376608
-053.238 30.01230793861643 30.583984972566434 28.741671418001033 29.24967467376608
-054.238 30.583984972566434 31.155662006516433 28.741671418001033 29.24967467376608
-055.238 31.155662006516433 31.727339040466433 28.741671418001033 29.24967467376608
-056.238 31.727339040466433 32.29901607441643 28.741671418001033 29.24967467376608
-057.238 32.29901607441643 32.87069310831643 28.741671418001033 29.24967467376608
-058.238 32.87069310831643 33.44237014226643 28.741671418001033 29.24967467376608
-059.238 33.44237014226643 34.01404717621644 28.741671418001033 29.24967467376608
-060.238 34.01404717621644 34.585724210116425 28.741671418001033 29.24967467376608
-061.238 34.585724210116425 35.15740124406643 28.741671418001033 29.24967467376608
-062.238 35.15740124406643 35.72907827801643 28.741671418001033 29.24967467376608
-063.238 35.72907827801643 36.30075531191642 28.741671418001033 29.24967467376608
-064.238 36.30075531191642 36.88159182408282 28.741671418001033 29.24967467376608
-203.238 115.75470355085004 116.33554006306643 28.741671418001033 29.24967467376608
-204.238 116.33554006306643 116.90721709701643 28.741671418001033 29.24967467376608
-205.238 116.90721709701643 117.47889413096644 28.741671418001033 29.24967467376608
-206.238 117.47889413096644 118.05057116491643 28.741671418001033 29.24967467376608
-207.238 118.05057116491643 118.62224819881644 28.741671418001033 29.24967467376608
-208.238 118.62224819881644 119.19392523276643 28.741671418001033 29.24967467376608
-209.238 119.19392523276643 119.76560226671643 28.741671418001033 29.24967467376608
-210.238 119.76560226671643 120.33727930061644 28.741671418001033 29.24967467376608
-211.238 120.33727930061644 120.90895633456643 28.741671418001033 29.24967467376608
-212.238 120.90895633456643 121.48063336851644 28.741671418001033 29.24967467376608
-213.238 121.48063336851644 122.05231040241642 28.741671418001033 29.24967467376608
-214.238 122.05231040241642 122.62398743636643 28.741671418001033 29.24967467376608
-215.238 122.62398743636643 123.19566447031643 28.741671418001033 29.24967467376608
-216.238 123.19566447031643 123.76734150426643 28.741671418001033 29.24967467376608
-217.238 123.76734150426643 124.33901853821644 28.741671418001033 29.24967467376608
-218.238 124.33901853821644 124.91069557211642 28.741671418001033 29.24967467376608
-219.238 124.91069557211642 125.48237260606643 28.741671418001033 29.24967467376608
-220.238 125.48237260606643 126.05404964001644 28.741671418001033 29.24967467376608
-221.238 126.05404964001644 126.62572667391643 28.741671418001033 29.24967467376608
-222.238 126.62572667391643 127.19740370786644 28.741671418001033 29.24967467376608
-223.238 127.19740370786644 127.76908074181642 28.741671418001033 29.24967467376608
-224.238 127.76908074181642 128.34075777571644 28.741671418001033 29.24967467376608
-225.238 128.34075777571644 128.91243480966642 28.741671418001033 29.24967467376608
-226.238 128.91243480966642 129.48411184361643 28.741671418001033 29.24967467376608
-227.238 129.48411184361643 130.05578887756644 28.741671418001033 29.24967467376608
-228.238 130.05578887756644 130.62746591151642 28.741671418001033 29.24967467376608
-229.238 130.62746591151642 131.19914294541644 28.741671418001033 29.24967467376608
-230.238 131.19914294541644 131.77081997936642 28.741671418001033 29.24967467376608
-231.238 131.77081997936642 132.3424970133164 28.741671418001033 29.24967467376608
-232.238 132.3424970133164 132.91417404721642 28.741671418001033 29.24967467376608
-233.238 132.91417404721642 133.48585108116643 28.741671418001033 29.24967467376608
-234.238 133.48585108116643 134.0575281151164 28.741671418001033 29.24967467376608
-235.238 134.0575281151164 134.62920514906642 28.741671418001033 29.24967467376608
-236.238 134.62920514906642 135.20088218301643 28.741671418001033 29.24967467376608
-237.238 135.20088218301643 135.77255921691642 28.741671418001033 29.24967467376608
-238.238 135.77255921691642 136.3442362508664 28.741671418001033 29.24967467376608
-239.238 136.3442362508664 136.91591328481644 28.741671418001033 29.24967467376608
-240.238 136.91591328481644 137.4875903187164 28.741671418001033 29.24967467376608
-241.238 137.4875903187164 138.05926735266644 28.741671418001033 29.24967467376608
-242.238 138.05926735266644 138.63094438661642 28.741671418001033 29.24967467376608
-243.238 138.63094438661642 139.20262142051644 28.741671418001033 29.24967467376608
-244.238 139.20262142051644 139.77429845446642 28.741671418001033 29.24967467376608
-245.238 139.77429845446642 140.34597548841643 28.741671418001033 29.24967467376608
-246.238 140.34597548841643 140.91765252236644 28.741671418001033 29.24967467376608
-247.238 140.91765252236644 141.48932955631642 28.741671418001033 29.24967467376608
-248.238 141.48932955631642 142.06100659021644 28.741671418001033 29.24967467376608
-249.238 142.06100659021644 142.63268362416642 28.741671418001033 29.24967467376608
-250.238 142.63268362416642 143.20436065811643 28.741671418001033 29.24967467376608
-251.238 143.20436065811643 143.77603769201642 28.741671418001033 29.24967467376608
-252.238 143.77603769201642 144.34771472596643 28.741671418001033 29.24967467376608
-253.238 144.34771472596643 144.91939175991644 28.741671418001033 29.24967467376608
-254.238 144.91939175991644 145.49106879381645 28.741671418001033 29.24967467376608
-255.238 145.49106879381645 146.06274582776643 28.741671418001033 29.24967467376608
-256.238 146.06274582776643 146.63442286171642 28.741671418001033 29.24967467376608
-257.238 146.63442286171642 147.20609989566643 28.741671418001033 29.24967467376608
-258.238 147.20609989566643 147.77777692961644 28.741671418001033 29.24967467376608
-259.238 147.77777692961644 148.34945396351645 28.741671418001033 29.24967467376608
-260.238 148.34945396351645 148.92113099746643 28.741671418001033 29.24967467376608
-261.238 148.92113099746643 149.49280803141642 28.741671418001033 29.24967467376608
-262.238 149.49280803141642 150.06448506531643 28.741671418001033 29.24967467376608
-263.238 150.06448506531643 150.63616209926644 28.741671418001033 29.24967467376608
-264.238 150.63616209926644 151.20783913321642 28.741671418001033 29.24967467376608
-265.238 151.20783913321642 151.77951616716643 28.741671418001033 29.24967467376608
-266.238 151.77951616716643 152.35119320111642 28.741671418001033 29.24967467376608
-267.238 152.35119320111642 152.92287023501643 28.741671418001033 29.24967467376608
-268.238 152.92287023501643 153.49454726896641 28.741671418001033 29.24967467376608
-269.238 153.49454726896641 154.06622430291645 28.741671418001033 29.24967467376608
-270.238 154.06622430291645 154.6379013368164 28.741671418001033 29.24967467376608
-271.238 154.6379013368164 155.20957837076642 28.741671418001033 29.24967467376608
-272.238 155.20957837076642 155.79041488298282 28.741671418001033 29.24967467376608
-280.238 159.77383516405004 160.3546716762164 28.741671418001033 29.24967467376608
-281.238 160.3546716762164 160.92634871011643 28.741671418001033 29.24967467376608
-282.238 160.92634871011643 161.49802574406644 28.741671418001033 29.24967467376608
-283.238 161.49802574406644 162.06970277801645 28.741671418001033 29.24967467376608
-284.238 162.06970277801645 162.64137981191644 28.741671418001033 29.24967467376608
-285.238 162.64137981191644 163.21305684586645 28.741671418001033 29.24967467376608
-286.238 163.21305684586645 163.78473387981643 28.741671418001033 29.24967467376608
-287.238 163.78473387981643 164.35641091376644 28.741671418001033 29.24967467376608
-288.238 164.35641091376644 164.92808794771645 28.741671418001033 29.24967467376608
-289.238 164.92808794771645 165.49976498161644 28.741671418001033 29.24967467376608
-290.238 165.49976498161644 166.07144201556645 28.741671418001033 29.24967467376608
-291.238 166.07144201556645 166.64311904951643 28.741671418001033 29.24967467376608
-292.238 166.64311904951643 167.21479608341645 28.741671418001033 29.24967467376608
-293.238 167.21479608341645 167.78647311736643 28.741671418001033 29.24967467376608
-294.238 167.78647311736643 168.3581501513164 28.741671418001033 29.24967467376608
-295.238 168.3581501513164 168.92982718526645 28.741671418001033 29.24967467376608
-296.238 168.92982718526645 169.50150421921643 28.741671418001033 29.24967467376608
-297.238 169.50150421921643 170.07318125311645 28.741671418001033 29.24967467376608
-298.238 170.07318125311645 170.64485828706643 28.741671418001033 29.24967467376608
-299.238 170.64485828706643 171.21653532101644 28.741671418001033 29.24967467376608
-300.238 171.21653532101644 171.78821235491642 28.741671418001033 29.24967467376608
-301.238 171.78821235491642 172.35988938886643 28.741671418001033 29.24967467376608
-302.238 172.35988938886643 172.93156642281645 28.741671418001033 29.24967467376608
-303.238 172.93156642281645 173.50324345671643 28.741671418001033 29.24967467376608
-304.238 173.50324345671643 174.07492049066644 28.741671418001033 29.24967467376608
-305.238 174.07492049066644 174.64659752461642 28.741671418001033 29.24967467376608
-306.238 174.64659752461642 175.21827455856643 28.741671418001033 29.24967467376608
-307.238 175.21827455856643 175.78995159251645 28.741671418001033 29.24967467376608
-308.238 175.78995159251645 176.36162862641643 28.741671418001033 29.24967467376608
-309.238 176.36162862641643 176.93330566036644 28.741671418001033 29.24967467376608
-310.238 176.93330566036644 177.50498269431642 28.741671418001033 29.24967467376608
-311.238 177.50498269431642 178.07665972821644 28.741671418001033 29.24967467376608
-312.238 178.07665972821644 178.64833676216642 28.741671418001033 29.24967467376608
-313.238 178.64833676216642 179.22001379611643 28.741671418001033 29.24967467376608
-314.238 179.22001379611643 179.79169083001642 28.741671418001033 29.24967467376608
-315.238 179.79169083001642 180.3633678639664 28.741671418001033 29.24967467376608
-316.238 180.3633678639664 180.93504489791638 28.741671418001033 29.24967467376608
-317.238 180.93504489791638 181.5067219318664 28.741671418001033 29.24967467376608
-318.238 181.5067219318664 182.0783989658164 28.741671418001033 29.24967467376608
-319.238 182.0783989658164 182.65007599971642 28.741671418001033 29.24967467376608
-320.238 182.65007599971642 183.2217530336664 28.741671418001033 29.24967467376608
-321.238 183.2217530336664 183.79343006761638 28.741671418001033 29.24967467376608
-322.238 183.79343006761638 184.3651071015164 28.741671418001033 29.24967467376608
-323.238 184.3651071015164 184.9367841354664 28.741671418001033 29.24967467376608
-324.238 184.9367841354664 185.50846116941642 28.741671418001033 29.24967467376608
-325.238 185.50846116941642 186.0801382033664 28.741671418001033 29.24967467376608
-326.238 186.0801382033664 186.65181523731638 28.741671418001033 29.24967467376608
-327.238 186.65181523731638 187.2234922712164 28.741671418001033 29.24967467376608
-328.238 187.2234922712164 187.79516930516644 28.741671418001033 29.24967467376608
-329.238 187.79516930516644 188.36684633911642 28.741671418001033 29.24967467376608
-330.238 188.36684633911642 188.9385233730164 28.741671418001033 29.24967467376608
-331.238 188.9385233730164 189.51020040696642 28.741671418001033 29.24967467376608
-332.238 189.51020040696642 190.0818774409164 28.741671418001033 29.24967467376608
-333.238 190.0818774409164 190.65355447481642 28.741671418001033 29.24967467376608
-334.238 190.65355447481642 191.2252315087664 28.741671418001033 29.24967467376608
-335.238 191.2252315087664 191.79690854271644 28.741671418001033 29.24967467376608
-336.238 191.79690854271644 192.36858557666642 28.741671418001033 29.24967467376608
-337.238 192.36858557666642 192.9402626106164 28.741671418001033 29.24967467376608
-338.238 192.9402626106164 193.51193964451642 28.741671418001033 29.24967467376608
-339.238 193.51193964451642 194.0836166784664 28.741671418001033 29.24967467376608
-340.238 194.0836166784664 194.65529371241644 28.741671418001033 29.24967467376608
-341.238 194.65529371241644 195.2269707463164 28.741671418001033 29.24967467376608
-342.238 195.2269707463164 195.7986477802664 28.741671418001033 29.24967467376608
-343.238 195.7986477802664 196.37032481421642 28.741671418001033 29.24967467376608
-344.238 196.37032481421642 196.9420018481164 28.741671418001033 29.24967467376608
-345.238 196.9420018481164 197.51367888206642 28.741671418001033 29.24967467376608
-346.238 197.51367888206642 198.08535591601643 28.741671418001033 29.24967467376608
-347.238 198.08535591601643 198.6570329499664 28.741671418001033 29.24967467376608
-348.238 198.6570329499664 199.22870998391642 28.741671418001033 29.24967467376608
-349.238 199.22870998391642 199.8095464960828 28.741671418001033 29.24967467376608
-403.238 230.09011033824999 230.67094685041639 28.741671418001033 29.24967467376608
-404.238 230.67094685041639 231.2426238843164 28.741671418001033 29.24967467376608
-405.238 231.2426238843164 231.81430091826644 28.741671418001033 29.24967467376608
-406.238 231.81430091826644 232.3859779522164 28.741671418001033 29.24967467376608
-407.238 232.3859779522164 232.9576549861664 28.741671418001033 29.24967467376608
-408.238 232.9576549861664 233.5293320201164 28.741671418001033 29.24967467376608
-409.238 233.5293320201164 234.1010090540164 28.741671418001033 29.24967467376608
-410.238 234.1010090540164 234.67268608796644 28.741671418001033 29.24967467376608
-411.238 234.67268608796644 235.24436312191642 28.741671418001033 29.24967467376608
-412.238 235.24436312191642 235.81604015581644 28.741671418001033 29.24967467376608
-413.238 235.81604015581644 236.38771718976642 28.741671418001033 29.24967467376608
-414.238 236.38771718976642 236.9593942237164 28.741671418001033 29.24967467376608
-415.238 236.9593942237164 237.53107125761642 28.741671418001033 29.24967467376608
-416.238 237.53107125761642 238.1027482915664 28.741671418001033 29.24967467376608
-417.238 238.1027482915664 238.67442532551644 28.741671418001033 29.24967467376608
-418.238 238.67442532551644 239.24610235946642 28.741671418001033 29.24967467376608
-419.238 239.24610235946642 239.8177793934164 28.741671418001033 29.24967467376608
-420.238 239.8177793934164 240.38945642731642 28.741671418001033 29.24967467376608
-421.238 240.38945642731642 240.9611334612664 28.741671418001033 29.24967467376608
-422.238 240.9611334612664 241.53281049521644 28.741671418001033 29.24967467376608
-423.238 241.53281049521644 242.10448752911643 28.741671418001033 29.24967467376608
-424.238 242.10448752911643 242.67616456306644 28.741671418001033 29.24967467376608
-425.238 242.67616456306644 243.2478415970164 28.741671418001033 29.24967467376608
-426.238 243.2478415970164 243.8195186309664 28.741671418001033 29.24967467376608
-427.238 243.8195186309664 244.3911956649164 28.741671418001033 29.24967467376608
-428.238 244.3911956649164 244.9628726988164 28.741671418001033 29.24967467376608
-429.238 244.9628726988164 245.53454973276644 28.741671418001033 29.24967467376608
-430.238 245.53454973276644 246.10622676671642 28.741671418001033 29.24967467376608
-431.238 246.10622676671642 246.6779038006164 28.741671418001033 29.24967467376608
-432.238 246.6779038006164 247.24958083456642 28.741671418001033 29.24967467376608
-433.238 247.24958083456642 247.82125786851643 28.741671418001033 29.24967467376608
-434.238 247.82125786851643 248.3929349024164 28.741671418001033 29.24967467376608
-435.238 248.3929349024164 248.9646119363664 28.741671418001033 29.24967467376608
-436.238 248.9646119363664 249.5362889703164 28.741671418001033 29.24967467376608
-437.238 249.5362889703164 250.10796600426642 28.741671418001033 29.24967467376608
-438.238 250.10796600426642 250.6796430382164 28.741671418001033 29.24967467376608
-439.238 250.6796430382164 251.2513200721164 28.741671418001033 29.24967467376608
-440.238 251.2513200721164 251.82299710606642 28.741671418001033 29.24967467376608
-441.238 251.82299710606642 252.39467414001643 28.741671418001033 29.24967467376608
-442.238 252.39467414001643 252.96635117391645 28.741671418001033 29.24967467376608
-443.238 252.96635117391645 253.53802820786643 28.741671418001033 29.24967467376608
-444.238 253.53802820786643 254.1097052418164 28.741671418001033 29.24967467376608
-445.238 254.1097052418164 254.68138227571643 28.741671418001033 29.24967467376608
-446.238 254.68138227571643 255.2530593096664 28.741671418001033 29.24967467376608
-447.238 255.2530593096664 255.82473634361642 28.741671418001033 29.24967467376608
-448.238 255.82473634361642 256.39641337756643 28.741671418001033 29.24967467376608
-449.238 256.39641337756643 256.9680904115164 28.741671418001033 29.24967467376608
-450.238 256.9680904115164 257.5397674454164 28.741671418001033 29.24967467376608
-451.238 257.5397674454164 258.1114444793664 28.741671418001033 29.24967467376608
-452.238 258.1114444793664 258.68312151331645 28.741671418001033 29.24967467376608
-453.238 258.68312151331645 259.2547985472164 28.741671418001033 29.24967467376608
-454.238 259.2547985472164 259.8264755811664 28.741671418001033 29.24967467376608
-455.238 259.8264755811664 260.39815261511643 28.741671418001033 29.24967467376608
-456.238 260.39815261511643 260.96982964906636 28.741671418001033 29.24967467376608
-457.238 260.96982964906636 261.54150668301645 28.741671418001033 29.24967467376608
-458.238 261.54150668301645 262.1131837169164 28.741671418001033 29.24967467376608
-459.238 262.1131837169164 262.68486075086645 28.741671418001033 29.24967467376608
-460.238 262.68486075086645 263.2565377848164 28.741671418001033 29.24967467376608
-461.238 263.2565377848164 263.82821481871645 28.741671418001033 29.24967467376608
-462.238 263.82821481871645 264.3998918526664 28.741671418001033 29.24967467376608
-463.238 264.3998918526664 264.9715688866164 28.741671418001033 29.24967467376608
-464.238 264.9715688866164 265.54324592051637 28.741671418001033 29.24967467376608
-465.238 265.54324592051637 266.1149229544664 28.741671418001033 29.24967467376608
-466.238 266.1149229544664 266.6865999884164 28.741671418001033 29.24967467376608
-467.238 266.6865999884164 267.2582770223664 28.741671418001033 29.24967467376608
-468.238 267.2582770223664 267.8391135345828 28.741671418001033 29.24967467376608
-596.238 340.42377788805004 341.0046144002164 28.741671418001033 29.24967467376608
-597.238 341.0046144002164 341.57629143411646 28.741671418001033 29.24967467376608
-598.238 341.57629143411646 342.14796846806644 28.741671418001033 29.24967467376608
-599.238 342.14796846806644 342.7196455020164 28.741671418001033 29.24967467376608
-600.238 342.7196455020164 343.29132253591644 28.741671418001033 29.24967467376608
-601.238 343.29132253591644 343.8629995698664 28.741671418001033 29.24967467376608
-602.238 343.8629995698664 344.43467660381646 28.741671418001033 29.24967467376608
-603.238 344.43467660381646 345.0063536377164 28.741671418001033 29.24967467376608
-604.238 345.0063536377164 345.57803067166645 28.741671418001033 29.24967467376608
-605.238 345.57803067166645 346.14970770561644 28.741671418001033 29.24967467376608
-606.238 346.14970770561644 346.7213847395664 28.741671418001033 29.24967467376608
-607.238 346.7213847395664 347.29306177351646 28.741671418001033 29.24967467376608
-608.238 347.29306177351646 347.8647388074164 28.741671418001033 29.24967467376608
-609.238 347.8647388074164 348.4364158413664 28.741671418001033 29.24967467376608
-610.238 348.4364158413664 349.00809287531644 28.741671418001033 29.24967467376608
-611.238 349.00809287531644 349.5797699092164 28.741671418001033 29.24967467376608
-612.238 349.5797699092164 350.15144694316643 28.741671418001033 29.24967467376608
-613.238 350.15144694316643 350.7231239771164 28.741671418001033 29.24967467376608
-614.238 350.7231239771164 351.29480101101643 28.741671418001033 29.24967467376608
-615.238 351.29480101101643 351.86647804496636 28.741671418001033 29.24967467376608
-616.238 351.86647804496636 352.43815507891645 28.741671418001033 29.24967467376608
-617.238 352.43815507891645 353.00983211286643 28.741671418001033 29.24967467376608
-618.238 353.00983211286643 353.5815091468164 28.741671418001033 29.24967467376608
-619.238 353.5815091468164 354.1531861807164 28.741671418001033 29.24967467376608
-620.238 354.1531861807164 354.72486321466636 28.741671418001033 29.24967467376608
-621.238 354.72486321466636 355.2965402486164 28.741671418001033 29.24967467376608
-622.238 355.2965402486164 355.8682172825164 28.741671418001033 29.24967467376608
-623.238 355.8682172825164 356.43989431646645 28.741671418001033 29.24967467376608
-624.238 356.43989431646645 357.0115713504164 28.741671418001033 29.24967467376608
-625.238 357.0115713504164 357.58324838436636 28.741671418001033 29.24967467376608
-626.238 357.58324838436636 358.1549254183164 28.741671418001033 29.24967467376608
-627.238 358.1549254183164 358.7266024522164 28.741671418001033 29.24967467376608
-628.238 358.7266024522164 359.2982794861664 28.741671418001033 29.24967467376608
-629.238 359.2982794861664 359.7916908300664 28.741671418001033 29.24967467376608
-000.238 359.7916908300664 0.28510217391642745 28.741671418001033 29.24967467376608
-001.239 0.28648363190667003 0.86096140270667 29.24967467376608 29.749667981580195
-002.239 0.86096140270667 1.4354391735066696 29.24967467376608 29.749667981580195
-003.239 1.4354391735066696 2.00991694430667 29.24967467376608 29.749667981580195
-004.239 2.00991694430667 2.5843947151066704 29.24967467376608 29.749667981580195
-005.239 2.5843947151066704 3.15887248590667 29.24967467376608 29.749667981580195
-006.239 3.15887248590667 3.73335025665667 29.24967467376608 29.749667981580195
-007.239 3.73335025665667 4.30782802740667 29.24967467376608 29.749667981580195
-008.239 4.30782802740667 4.882305798206669 29.24967467376608 29.749667981580195
-009.239 4.882305798206669 5.456783569006669 29.24967467376608 29.749667981580195
-010.239 5.456783569006669 6.031261339806669 29.24967467376608 29.749667981580195
-011.239 6.031261339806669 6.605739110606669 29.24967467376608 29.749667981580195
-012.239 6.605739110606669 7.18021688140667 29.24967467376608 29.749667981580195
-013.239 7.18021688140667 7.754694652206669 29.24967467376608 29.749667981580195
-014.239 7.754694652206669 8.32917242300667 29.24967467376608 29.749667981580195
-015.239 8.32917242300667 8.90365019380667 29.24967467376608 29.749667981580195
-016.239 8.90365019380667 9.47812796460667 29.24967467376608 29.749667981580195
-017.239 9.47812796460667 10.052605735406669 29.24967467376608 29.749667981580195
-018.239 10.052605735406669 10.627083506206672 29.24967467376608 29.749667981580195
-019.239 10.627083506206672 11.201561276956669 29.24967467376608 29.749667981580195
-020.239 11.201561276956669 11.776039047706668 29.24967467376608 29.749667981580195
-021.239 11.776039047706668 12.35051681850667 29.24967467376608 29.749667981580195
-022.239 12.35051681850667 12.924994589306667 29.24967467376608 29.749667981580195
-023.239 12.924994589306667 13.499472360106669 29.24967467376608 29.749667981580195
-024.239 13.499472360106669 14.073950130906669 29.24967467376608 29.749667981580195
-025.239 14.073950130906669 14.648427901706668 29.24967467376608 29.749667981580195
-026.239 14.648427901706668 15.22290567250667 29.24967467376608 29.749667981580195
-027.239 15.22290567250667 15.797383443306668 29.24967467376608 29.749667981580195
-028.239 15.797383443306668 16.371861214106673 29.24967467376608 29.749667981580195
-029.239 16.371861214106673 16.94633898490667 29.24967467376608 29.749667981580195
-030.239 16.94633898490667 17.520816755706672 29.24967467376608 29.749667981580195
-031.239 17.520816755706672 18.095294526506674 29.24967467376608 29.749667981580195
-032.239 18.095294526506674 18.66977229725667 29.24967467376608 29.749667981580195
-033.239 18.66977229725667 19.24425006800667 29.24967467376608 29.749667981580195
-034.239 19.24425006800667 19.818727838806673 29.24967467376608 29.749667981580195
-035.239 19.818727838806673 20.393205609606674 29.24967467376608 29.749667981580195
-036.239 20.393205609606674 20.96768338040667 29.24967467376608 29.749667981580195
-037.239 20.96768338040667 21.542161151206663 29.24967467376608 29.749667981580195
-038.239 21.542161151206663 22.116638922006665 29.24967467376608 29.749667981580195
-039.239 22.116638922006665 22.69111669280667 29.24967467376608 29.749667981580195
-040.239 22.69111669280667 23.26559446360667 29.24967467376608 29.749667981580195
-041.239 23.26559446360667 23.840072234406676 29.24967467376608 29.749667981580195
-042.239 23.840072234406676 24.41455000520667 29.24967467376608 29.749667981580195
-043.239 24.41455000520667 24.989027776006672 29.24967467376608 29.749667981580195
-044.239 24.989027776006672 25.56350554680667 29.24967467376608 29.749667981580195
-045.239 25.56350554680667 26.137983317556667 29.24967467376608 29.749667981580195
-046.239 26.137983317556667 26.712461088306668 29.24967467376608 29.749667981580195
-047.239 26.712461088306668 27.286938859106673 29.24967467376608 29.749667981580195
-048.239 27.286938859106673 27.86141662990667 29.24967467376608 29.749667981580195
-049.239 27.86141662990667 28.43589440070667 29.24967467376608 29.749667981580195
-050.239 28.43589440070667 29.010372171506674 29.24967467376608 29.749667981580195
-051.239 29.010372171506674 29.584849942306672 29.24967467376608 29.749667981580195
-052.239 29.584849942306672 30.159327713106677 29.24967467376608 29.749667981580195
-053.239 30.159327713106677 30.73380548390667 29.24967467376608 29.749667981580195
-054.239 30.73380548390667 31.308283254706673 29.24967467376608 29.749667981580195
-055.239 31.308283254706673 31.88276102550667 29.24967467376608 29.749667981580195
-056.239 31.88276102550667 32.45723879630667 29.24967467376608 29.749667981580195
-057.239 32.45723879630667 33.03171656710667 29.24967467376608 29.749667981580195
-058.239 33.03171656710667 33.60619433790667 29.24967467376608 29.749667981580195
-059.239 33.60619433790667 34.180672108656665 29.24967467376608 29.749667981580195
-060.239 34.180672108656665 34.75514987940667 29.24967467376608 29.749667981580195
-061.239 34.75514987940667 35.329627650206675 29.24967467376608 29.749667981580195
-062.239 35.329627650206675 35.90410542100667 29.24967467376608 29.749667981580195
-063.239 35.90410542100667 36.47858319180668 29.24967467376608 29.749667981580195
-064.239 36.47858319180668 37.05306096260667 29.24967467376608 29.749667981580195
-065.239 37.05306096260667 37.63674313684956 29.24967467376608 29.749667981580195
-202.239 115.74731115776379 116.33099333200667 29.24967467376608 29.749667981580195
-203.239 116.33099333200667 116.90547110275665 29.24967467376608 29.749667981580195
-204.239 116.90547110275665 117.47994887350666 29.24967467376608 29.749667981580195
-205.239 117.47994887350666 118.05442664430666 29.24967467376608 29.749667981580195
-206.239 118.05442664430666 118.62890441510669 29.24967467376608 29.749667981580195
-207.239 118.62890441510669 119.20338218590669 29.24967467376608 29.749667981580195
-208.239 119.20338218590669 119.77785995670666 29.24967467376608 29.749667981580195
-209.239 119.77785995670666 120.35233772750667 29.24967467376608 29.749667981580195
-210.239 120.35233772750667 120.92681549830667 29.24967467376608 29.749667981580195
-211.239 120.92681549830667 121.50129326910667 29.24967467376608 29.749667981580195
-212.239 121.50129326910667 122.07577103990667 29.24967467376608 29.749667981580195
-213.239 122.07577103990667 122.65024881070667 29.24967467376608 29.749667981580195
-214.239 122.65024881070667 123.22472658150667 29.24967467376608 29.749667981580195
-215.239 123.22472658150667 123.79920435230667 29.24967467376608 29.749667981580195
-216.239 123.79920435230667 124.37368212305668 29.24967467376608 29.749667981580195
-217.239 124.37368212305668 124.94815989380668 29.24967467376608 29.749667981580195
-218.239 124.94815989380668 125.52263766460669 29.24967467376608 29.749667981580195
-219.239 125.52263766460669 126.09711543540666 29.24967467376608 29.749667981580195
-220.239 126.09711543540666 126.67159320620668 29.24967467376608 29.749667981580195
-221.239 126.67159320620668 127.24607097700667 29.24967467376608 29.749667981580195
-222.239 127.24607097700667 127.82054874780667 29.24967467376608 29.749667981580195
-223.239 127.82054874780667 128.39502651860667 29.24967467376608 29.749667981580195
-224.239 128.39502651860667 128.96950428940664 29.24967467376608 29.749667981580195
-225.239 128.96950428940664 129.5439820602067 29.24967467376608 29.749667981580195
-226.239 129.5439820602067 130.1184598310067 29.24967467376608 29.749667981580195
-227.239 130.1184598310067 130.6929376018067 29.24967467376608 29.749667981580195
-228.239 130.6929376018067 131.26741537260665 29.24967467376608 29.749667981580195
-229.239 131.26741537260665 131.84189314335669 29.24967467376608 29.749667981580195
-230.239 131.84189314335669 132.41637091410666 29.24967467376608 29.749667981580195
-231.239 132.41637091410666 132.99084868490667 29.24967467376608 29.749667981580195
-232.239 132.99084868490667 133.56532645570667 29.24967467376608 29.749667981580195
-233.239 133.56532645570667 134.13980422650667 29.24967467376608 29.749667981580195
-234.239 134.13980422650667 134.71428199730667 29.24967467376608 29.749667981580195
-235.239 134.71428199730667 135.28875976810667 29.24967467376608 29.749667981580195
-236.239 135.28875976810667 135.86323753890667 29.24967467376608 29.749667981580195
-237.239 135.86323753890667 136.43771530970668 29.24967467376608 29.749667981580195
-238.239 136.43771530970668 137.01219308050668 29.24967467376608 29.749667981580195
-239.239 137.01219308050668 137.58667085130668 29.24967467376608 29.749667981580195
-240.239 137.58667085130668 138.16114862210668 29.24967467376608 29.749667981580195
-241.239 138.16114862210668 138.73562639290668 29.24967467376608 29.749667981580195
-242.239 138.73562639290668 139.31010416365666 29.24967467376608 29.749667981580195
-243.239 139.31010416365666 139.8845819344067 29.24967467376608 29.749667981580195
-244.239 139.8845819344067 140.4590597052067 29.24967467376608 29.749667981580195
-245.239 140.4590597052067 141.03353747600667 29.24967467376608 29.749667981580195
-246.239 141.03353747600667 141.60801524680667 29.24967467376608 29.749667981580195
-247.239 141.60801524680667 142.18249301760667 29.24967467376608 29.749667981580195
-248.239 142.18249301760667 142.75697078840668 29.24967467376608 29.749667981580195
-249.239 142.75697078840668 143.33144855920668 29.24967467376608 29.749667981580195
-250.239 143.33144855920668 143.90592633000665 29.24967467376608 29.749667981580195
-251.239 143.90592633000665 144.48040410080665 29.24967467376608 29.749667981580195
-252.239 144.48040410080665 145.05488187160665 29.24967467376608 29.749667981580195
-253.239 145.05488187160665 145.62935964240665 29.24967467376608 29.749667981580195
-254.239 145.62935964240665 146.20383741320668 29.24967467376608 29.749667981580195
-255.239 146.20383741320668 146.7783151839567 29.24967467376608 29.749667981580195
-256.239 146.7783151839567 147.35279295470667 29.24967467376608 29.749667981580195
-257.239 147.35279295470667 147.92727072550667 29.24967467376608 29.749667981580195
-258.239 147.92727072550667 148.5017484963067 29.24967467376608 29.749667981580195
-259.239 148.5017484963067 149.07622626710668 29.24967467376608 29.749667981580195
-260.239 149.07622626710668 149.65070403790665 29.24967467376608 29.749667981580195
-261.239 149.65070403790665 150.22518180870665 29.24967467376608 29.749667981580195
-262.239 150.22518180870665 150.79965957950668 29.24967467376608 29.749667981580195
-263.239 150.79965957950668 151.37413735030668 29.24967467376608 29.749667981580195
-264.239 151.37413735030668 151.94861512110668 29.24967467376608 29.749667981580195
-265.239 151.94861512110668 152.52309289190666 29.24967467376608 29.749667981580195
-266.239 152.52309289190666 153.09757066270666 29.24967467376608 29.749667981580195
-267.239 153.09757066270666 153.67204843350666 29.24967467376608 29.749667981580195
-268.239 153.67204843350666 154.24652620425667 29.24967467376608 29.749667981580195
-269.239 154.24652620425667 154.82100397500665 29.24967467376608 29.749667981580195
-270.239 154.82100397500665 155.39548174580665 29.24967467376608 29.749667981580195
-271.239 155.39548174580665 155.96995951660668 29.24967467376608 29.749667981580195
-272.239 155.96995951660668 156.55364169084956 29.24967467376608 29.749667981580195
-278.239 159.40762173796378 159.9913039122067 29.24967467376608 29.749667981580195
-279.239 159.9913039122067 160.56578168300666 29.24967467376608 29.749667981580195
-280.239 160.56578168300666 161.14025945380666 29.24967467376608 29.749667981580195
-281.239 161.14025945380666 161.71473722455664 29.24967467376608 29.749667981580195
-282.239 161.71473722455664 162.28921499530665 29.24967467376608 29.749667981580195
-283.239 162.28921499530665 162.86369276610665 29.24967467376608 29.749667981580195
-284.239 162.86369276610665 163.43817053690668 29.24967467376608 29.749667981580195
-285.239 163.43817053690668 164.01264830770668 29.24967467376608 29.749667981580195
-286.239 164.01264830770668 164.58712607850669 29.24967467376608 29.749667981580195
-287.239 164.58712607850669 165.1616038493067 29.24967467376608 29.749667981580195
-288.239 165.1616038493067 165.7360816201067 29.24967467376608 29.749667981580195
-289.239 165.7360816201067 166.31055939090666 29.24967467376608 29.749667981580195
-290.239 166.31055939090666 166.8850371617067 29.24967467376608 29.749667981580195
-291.239 166.8850371617067 167.4595149325067 29.24967467376608 29.749667981580195
-292.239 167.4595149325067 168.0339927033067 29.24967467376608 29.749667981580195
-293.239 168.0339927033067 168.6084704741067 29.24967467376608 29.749667981580195
-294.239 168.6084704741067 169.18294824490667 29.24967467376608 29.749667981580195
-295.239 169.18294824490667 169.75742601565668 29.24967467376608 29.749667981580195
-296.239 169.75742601565668 170.33190378640666 29.24967467376608 29.749667981580195
-297.239 170.33190378640666 170.90638155720666 29.24967467376608 29.749667981580195
-298.239 170.90638155720666 171.48085932800666 29.24967467376608 29.749667981580195
-299.239 171.48085932800666 172.05533709880666 29.24967467376608 29.749667981580195
-300.239 172.05533709880666 172.62981486960666 29.24967467376608 29.749667981580195
-301.239 172.62981486960666 173.20429264040666 29.24967467376608 29.749667981580195
-302.239 173.20429264040666 173.77877041120666 29.24967467376608 29.749667981580195
-303.239 173.77877041120666 174.35324818200667 29.24967467376608 29.749667981580195
-304.239 174.35324818200667 174.92772595280667 29.24967467376608 29.749667981580195
-305.239 174.92772595280667 175.50220372360667 29.24967467376608 29.749667981580195
-306.239 175.50220372360667 176.07668149440667 29.24967467376608 29.749667981580195
-307.239 176.07668149440667 176.65115926520667 29.24967467376608 29.749667981580195
-308.239 176.65115926520667 177.22563703595665 29.24967467376608 29.749667981580195
-309.239 177.22563703595665 177.8001148067067 29.24967467376608 29.749667981580195
-310.239 177.8001148067067 178.37459257750666 29.24967467376608 29.749667981580195
-311.239 178.37459257750666 178.94907034830666 29.24967467376608 29.749667981580195
-312.239 178.94907034830666 179.52354811910666 29.24967467376608 29.749667981580195
-313.239 179.52354811910666 180.09802588990667 29.24967467376608 29.749667981580195
-314.239 180.09802588990667 180.67250366070667 29.24967467376608 29.749667981580195
-315.239 180.67250366070667 181.24698143150667 29.24967467376608 29.749667981580195
-316.239 181.24698143150667 181.82145920230664 29.24967467376608 29.749667981580195
-317.239 181.82145920230664 182.39593697310664 29.24967467376608 29.749667981580195
-318.239 182.39593697310664 182.97041474390664 29.24967467376608 29.749667981580195
-319.239 182.97041474390664 183.54489251470667 29.24967467376608 29.749667981580195
-320.239 183.54489251470667 184.11937028550668 29.24967467376608 29.749667981580195
-321.239 184.11937028550668 184.69384805625666 29.24967467376608 29.749667981580195
-322.239 184.69384805625666 185.26832582700666 29.24967467376608 29.749667981580195
-323.239 185.26832582700666 185.84280359780666 29.24967467376608 29.749667981580195
-324.239 185.84280359780666 186.41728136860667 29.24967467376608 29.749667981580195
-325.239 186.41728136860667 186.99175913940667 29.24967467376608 29.749667981580195
-326.239 186.99175913940667 187.56623691020667 29.24967467376608 29.749667981580195
-327.239 187.56623691020667 188.14071468100667 29.24967467376608 29.749667981580195
-328.239 188.14071468100667 188.71519245180667 29.24967467376608 29.749667981580195
-329.239 188.71519245180667 189.28967022260667 29.24967467376608 29.749667981580195
-330.239 189.28967022260667 189.86414799340668 29.24967467376608 29.749667981580195
-331.239 189.86414799340668 190.43862576420665 29.24967467376608 29.749667981580195
-332.239 190.43862576420665 191.01310353500662 29.24967467376608 29.749667981580195
-333.239 191.01310353500662 191.58758130580665 29.24967467376608 29.749667981580195
-334.239 191.58758130580665 192.16205907655666 29.24967467376608 29.749667981580195
-335.239 192.16205907655666 192.73653684730667 29.24967467376608 29.749667981580195
-336.239 192.73653684730667 193.31101461810667 29.24967467376608 29.749667981580195
-337.239 193.31101461810667 193.8854923889067 29.24967467376608 29.749667981580195
-338.239 193.8854923889067 194.45997015970667 29.24967467376608 29.749667981580195
-339.239 194.45997015970667 195.03444793050664 29.24967467376608 29.749667981580195
-340.239 195.03444793050664 195.60892570130665 29.24967467376608 29.749667981580195
-341.239 195.60892570130665 196.18340347210665 29.24967467376608 29.749667981580195
-342.239 196.18340347210665 196.75788124290665 29.24967467376608 29.749667981580195
-343.239 196.75788124290665 197.33235901370665 29.24967467376608 29.749667981580195
-344.239 197.33235901370665 197.90683678450665 29.24967467376608 29.749667981580195
-345.239 197.90683678450665 198.48131455530665 29.24967467376608 29.749667981580195
-346.239 198.48131455530665 199.05579232610665 29.24967467376608 29.749667981580195
-347.239 199.05579232610665 199.63027009685666 29.24967467376608 29.749667981580195
-348.239 199.63027009685666 200.20474786760667 29.24967467376608 29.749667981580195
-349.239 200.20474786760667 200.77922563840667 29.24967467376608 29.749667981580195
-350.239 200.77922563840667 201.35370340920667 29.24967467376608 29.749667981580195
-351.239 201.35370340920667 201.92818118000667 29.24967467376608 29.749667981580195
-352.239 201.92818118000667 202.50265895080668 29.24967467376608 29.749667981580195
-353.239 202.50265895080668 203.07713672160662 29.24967467376608 29.749667981580195
-354.239 203.07713672160662 203.65161449240662 29.24967467376608 29.749667981580195
-355.239 203.65161449240662 204.22609226320665 29.24967467376608 29.749667981580195
-356.239 204.22609226320665 204.80057003400665 29.24967467376608 29.749667981580195
-357.239 204.80057003400665 205.37504780480668 29.24967467376608 29.749667981580195
-358.239 205.37504780480668 205.94952557560666 29.24967467376608 29.749667981580195
-359.239 205.94952557560666 206.52400334640666 29.24967467376608 29.749667981580195
-360.239 206.52400334640666 207.09848111715667 29.24967467376608 29.749667981580195
-361.239 207.09848111715667 207.67295888790665 29.24967467376608 29.749667981580195
-362.239 207.67295888790665 208.25664106214955 29.24967467376608 29.749667981580195
-401.239 230.06838754536375 230.65206971960663 29.24967467376608 29.749667981580195
-402.239 230.65206971960663 231.22654749040663 29.24967467376608 29.749667981580195
-403.239 231.22654749040663 231.80102526120666 29.24967467376608 29.749667981580195
-404.239 231.80102526120666 232.37550303200666 29.24967467376608 29.749667981580195
-405.239 232.37550303200666 232.9499808028067 29.24967467376608 29.749667981580195
-406.239 232.9499808028067 233.52445857360667 29.24967467376608 29.749667981580195
-407.239 233.52445857360667 234.09893634440667 29.24967467376608 29.749667981580195
-408.239 234.09893634440667 234.67341411520664 29.24967467376608 29.749667981580195
-409.239 234.67341411520664 235.24789188600667 29.24967467376608 29.749667981580195
-410.239 235.24789188600667 235.82236965680667 29.24967467376608 29.749667981580195
-411.239 235.82236965680667 236.39684742760667 29.24967467376608 29.749667981580195
-412.239 236.39684742760667 236.9713251984067 29.24967467376608 29.749667981580195
-413.239 236.9713251984067 237.54580296915668 29.24967467376608 29.749667981580195
-414.239 237.54580296915668 238.12028073990666 29.24967467376608 29.749667981580195
-415.239 238.12028073990666 238.69475851070663 29.24967467376608 29.749667981580195
-416.239 238.69475851070663 239.26923628150666 29.24967467376608 29.749667981580195
-417.239 239.26923628150666 239.84371405230667 29.24967467376608 29.749667981580195
-418.239 239.84371405230667 240.41819182310667 29.24967467376608 29.749667981580195
-419.239 240.41819182310667 240.99266959390667 29.24967467376608 29.749667981580195
-420.239 240.99266959390667 241.56714736470667 29.24967467376608 29.749667981580195
-421.239 241.56714736470667 242.1416251355067 29.24967467376608 29.749667981580195
-422.239 242.1416251355067 242.71610290630665 29.24967467376608 29.749667981580195
-423.239 242.71610290630665 243.29058067710668 29.24967467376608 29.749667981580195
-424.239 243.29058067710668 243.86505844790668 29.24967467376608 29.749667981580195
-425.239 243.86505844790668 244.43953621870665 29.24967467376608 29.749667981580195
-426.239 244.43953621870665 245.01401398945666 29.24967467376608 29.749667981580195
-427.239 245.01401398945666 245.58849176020667 29.24967467376608 29.749667981580195
-428.239 245.58849176020667 246.1629695310067 29.24967467376608 29.749667981580195
-429.239 246.1629695310067 246.73744730180667 29.24967467376608 29.749667981580195
-430.239 246.73744730180667 247.31192507260667 29.24967467376608 29.749667981580195
-431.239 247.31192507260667 247.88640284340664 29.24967467376608 29.749667981580195
-432.239 247.88640284340664 248.46088061420667 29.24967467376608 29.749667981580195
-433.239 248.46088061420667 249.0353583850067 29.24967467376608 29.749667981580195
-434.239 249.0353583850067 249.60983615580668 29.24967467376608 29.749667981580195
-435.239 249.60983615580668 250.18431392660665 29.24967467376608 29.749667981580195
-436.239 250.18431392660665 250.75879169740665 29.24967467376608 29.749667981580195
-437.239 250.75879169740665 251.33326946820665 29.24967467376608 29.749667981580195
-438.239 251.33326946820665 251.90774723900665 29.24967467376608 29.749667981580195
-439.239 251.90774723900665 252.48222500975666 29.24967467376608 29.749667981580195
-440.239 252.48222500975666 253.05670278050667 29.24967467376608 29.749667981580195
-441.239 253.05670278050667 253.63118055130667 29.24967467376608 29.749667981580195
-442.239 253.63118055130667 254.2056583221067 29.24967467376608 29.749667981580195
-443.239 254.2056583221067 254.78013609290667 29.24967467376608 29.749667981580195
-444.239 254.78013609290667 255.35461386370667 29.24967467376608 29.749667981580195
-445.239 255.35461386370667 255.92909163450668 29.24967467376608 29.749667981580195
-446.239 255.92909163450668 256.5035694053067 29.24967467376608 29.749667981580195
-447.239 256.5035694053067 257.0780471761067 29.24967467376608 29.749667981580195
-448.239 257.0780471761067 257.6525249469067 29.24967467376608 29.749667981580195
-449.239 257.6525249469067 258.2270027177067 29.24967467376608 29.749667981580195
-450.239 258.2270027177067 258.8014804885067 29.24967467376608 29.749667981580195
-451.239 258.8014804885067 259.3759582593067 29.24967467376608 29.749667981580195
-452.239 259.3759582593067 259.95043603005666 29.24967467376608 29.749667981580195
-453.239 259.95043603005666 260.52491380080664 29.24967467376608 29.749667981580195
-454.239 260.52491380080664 261.09939157160665 29.24967467376608 29.749667981580195
-455.239 261.09939157160665 261.67386934240665 29.24967467376608 29.749667981580195
-456.239 261.67386934240665 262.2483471132067 29.24967467376608 29.749667981580195
-457.239 262.2483471132067 262.82282488400665 29.24967467376608 29.749667981580195
-458.239 262.82282488400665 263.39730265480665 29.24967467376608 29.749667981580195
-459.239 263.39730265480665 263.97178042560665 29.24967467376608 29.749667981580195
-460.239 263.97178042560665 264.54625819640665 29.24967467376608 29.749667981580195
-461.239 264.54625819640665 265.12073596720666 29.24967467376608 29.749667981580195
-462.239 265.12073596720666 265.69521373800666 29.24967467376608 29.749667981580195
-463.239 265.69521373800666 266.26969150880666 29.24967467376608 29.749667981580195
-464.239 266.26969150880666 266.84416927960666 29.24967467376608 29.749667981580195
-465.239 266.84416927960666 267.41864705035664 29.24967467376608 29.749667981580195
-466.239 267.41864705035664 267.9931248211067 29.24967467376608 29.749667981580195
-467.239 267.9931248211067 268.5676025919067 29.24967467376608 29.749667981580195
-468.239 268.5676025919067 269.1420803627067 29.24967467376608 29.749667981580195
-469.239 269.1420803627067 269.72576253694956 29.24967467376608 29.749667981580195
-592.239 339.79364176676376 340.37732394100664 29.24967467376608 29.749667981580195
-593.239 340.37732394100664 340.95180171180664 29.24967467376608 29.749667981580195
-594.239 340.95180171180664 341.5262794826066 29.24967467376608 29.749667981580195
-595.239 341.5262794826066 342.10075725340664 29.24967467376608 29.749667981580195
-596.239 342.10075725340664 342.67523502420664 29.24967467376608 29.749667981580195
-597.239 342.67523502420664 343.2497127949566 29.24967467376608 29.749667981580195
-598.239 343.2497127949566 343.82419056570666 29.24967467376608 29.749667981580195
-599.239 343.82419056570666 344.39866833650666 29.24967467376608 29.749667981580195
-600.239 344.39866833650666 344.97314610730666 29.24967467376608 29.749667981580195
-601.239 344.97314610730666 345.54762387810666 29.24967467376608 29.749667981580195
-602.239 345.54762387810666 346.12210164890666 29.24967467376608 29.749667981580195
-603.239 346.12210164890666 346.6965794197066 29.24967467376608 29.749667981580195
-604.239 346.6965794197066 347.27105719050667 29.24967467376608 29.749667981580195
-605.239 347.27105719050667 347.84553496130667 29.24967467376608 29.749667981580195
-606.239 347.84553496130667 348.42001273210667 29.24967467376608 29.749667981580195
-607.239 348.42001273210667 348.99449050290673 29.24967467376608 29.749667981580195
-608.239 348.99449050290673 349.5689682737067 29.24967467376608 29.749667981580195
-609.239 349.5689682737067 350.14344604450673 29.24967467376608 29.749667981580195
-610.239 350.14344604450673 350.71792381525665 29.24967467376608 29.749667981580195
-611.239 350.71792381525665 351.2924015860067 29.24967467376608 29.749667981580195
-612.239 351.2924015860067 351.86687935680663 29.24967467376608 29.749667981580195
-613.239 351.86687935680663 352.44135712760664 29.24967467376608 29.749667981580195
-614.239 352.44135712760664 353.01583489840664 29.24967467376608 29.749667981580195
-615.239 353.01583489840664 353.59031266920664 29.24967467376608 29.749667981580195
-616.239 353.59031266920664 354.16479044000664 29.24967467376608 29.749667981580195
-617.239 354.16479044000664 354.7392682108066 29.24967467376608 29.749667981580195
-618.239 354.7392682108066 355.31374598160664 29.24967467376608 29.749667981580195
-619.239 355.31374598160664 355.88822375240665 29.24967467376608 29.749667981580195
-620.239 355.88822375240665 356.46270152320665 29.24967467376608 29.749667981580195
-621.239 356.46270152320665 357.0371792940067 29.24967467376608 29.749667981580195
-622.239 357.0371792940067 357.61165706480665 29.24967467376608 29.749667981580195
-623.239 357.61165706480665 358.1861348355567 29.24967467376608 29.749667981580195
-624.239 358.1861348355567 358.76061260630667 29.24967467376608 29.749667981580195
-625.239 358.76061260630667 359.33509037710667 29.24967467376608 29.749667981580195
-626.239 359.33509037710667 359.81078700450666 29.24967467376608 29.749667981580195
-000.239 359.81078700450666 0.28648363190667003 29.24967467376608 29.749667981580195
-001.240 0.2879005725553856 0.8652508417553857 29.749667981580195 30.249661222302226
-002.240 0.8652508417553857 1.4426011109553858 29.749667981580195 30.249661222302226
-003.240 1.4426011109553858 2.0199513801553857 29.749667981580195 30.249661222302226
-004.240 2.0199513801553857 2.5973016493053853 29.749667981580195 30.249661222302226
-005.240 2.5973016493053853 3.1746519184553863 29.749667981580195 30.249661222302226
-006.240 3.1746519184553863 3.7520021876553855 29.749667981580195 30.249661222302226
-007.240 3.7520021876553855 4.329352456855386 29.749667981580195 30.249661222302226
-008.240 4.329352456855386 4.906702726055384 29.749667981580195 30.249661222302226
-009.240 4.906702726055384 5.484052995255386 29.749667981580195 30.249661222302226
-010.240 5.484052995255386 6.061403264455385 29.749667981580195 30.249661222302226
-011.240 6.061403264455385 6.638753533655386 29.749667981580195 30.249661222302226
-012.240 6.638753533655386 7.216103802855384 29.749667981580195 30.249661222302226
-013.240 7.216103802855384 7.793454072055386 29.749667981580195 30.249661222302226
-014.240 7.793454072055386 8.370804341205385 29.749667981580195 30.249661222302226
-015.240 8.370804341205385 8.948154610355386 29.749667981580195 30.249661222302226
-016.240 8.948154610355386 9.525504879555385 29.749667981580195 30.249661222302226
-017.240 9.525504879555385 10.102855148755385 29.749667981580195 30.249661222302226
-018.240 10.102855148755385 10.680205417955385 29.749667981580195 30.249661222302226
-019.240 10.680205417955385 11.257555687155387 29.749667981580195 30.249661222302226
-020.240 11.257555687155387 11.834905956355387 29.749667981580195 30.249661222302226
-021.240 11.834905956355387 12.412256225555385 29.749667981580195 30.249661222302226
-022.240 12.412256225555385 12.989606494755385 29.749667981580195 30.249661222302226
-023.240 12.989606494755385 13.566956763955389 29.749667981580195 30.249661222302226
-024.240 13.566956763955389 14.144307033105388 29.749667981580195 30.249661222302226
-025.240 14.144307033105388 14.721657302255387 29.749667981580195 30.249661222302226
-026.240 14.721657302255387 15.299007571455387 29.749667981580195 30.249661222302226
-027.240 15.299007571455387 15.876357840655388 29.749667981580195 30.249661222302226
-028.240 15.876357840655388 16.453708109855388 29.749667981580195 30.249661222302226
-029.240 16.453708109855388 17.031058379055388 29.749667981580195 30.249661222302226
-030.240 17.031058379055388 17.60840864825539 29.749667981580195 30.249661222302226
-031.240 17.60840864825539 18.185758917455388 29.749667981580195 30.249661222302226
-032.240 18.185758917455388 18.763109186655385 29.749667981580195 30.249661222302226
-033.240 18.763109186655385 19.340459455805387 29.749667981580195 30.249661222302226
-034.240 19.340459455805387 19.917809724955383 29.749667981580195 30.249661222302226
-035.240 19.917809724955383 20.495159994155387 29.749667981580195 30.249661222302226
-036.240 20.495159994155387 21.072510263355383 29.749667981580195 30.249661222302226
-037.240 21.072510263355383 21.649860532555387 29.749667981580195 30.249661222302226
-038.240 21.649860532555387 22.227210801755383 29.749667981580195 30.249661222302226
-039.240 22.227210801755383 22.804561070955387 29.749667981580195 30.249661222302226
-040.240 22.804561070955387 23.381911340155384 29.749667981580195 30.249661222302226
-041.240 23.381911340155384 23.959261609355384 29.749667981580195 30.249661222302226
-042.240 23.959261609355384 24.53661187855539 29.749667981580195 30.249661222302226
-043.240 24.53661187855539 25.113962147705386 29.749667981580195 30.249661222302226
-044.240 25.113962147705386 25.691312416855386 29.749667981580195 30.249661222302226
-045.240 25.691312416855386 26.268662686055386 29.749667981580195 30.249661222302226
-046.240 26.268662686055386 26.846012955255382 29.749667981580195 30.249661222302226
-047.240 26.846012955255382 27.423363224455386 29.749667981580195 30.249661222302226
-048.240 27.423363224455386 28.000713493655383 29.749667981580195 30.249661222302226
-049.240 28.000713493655383 28.578063762855386 29.749667981580195 30.249661222302226
-050.240 28.578063762855386 29.155414032055383 29.749667981580195 30.249661222302226
-051.240 29.155414032055383 29.732764301255386 29.749667981580195 30.249661222302226
-052.240 29.732764301255386 30.310114570455386 29.749667981580195 30.249661222302226
-053.240 30.310114570455386 30.887464839605382 29.749667981580195 30.249661222302226
-054.240 30.887464839605382 31.46481510875538 29.749667981580195 30.249661222302226
-055.240 31.46481510875538 32.042165377955385 29.749667981580195 30.249661222302226
-056.240 32.042165377955385 32.61951564715538 29.749667981580195 30.249661222302226
-057.240 32.61951564715538 33.196865916355385 29.749667981580195 30.249661222302226
-058.240 33.196865916355385 33.77421618555539 29.749667981580195 30.249661222302226
-059.240 33.77421618555539 34.35156645475539 29.749667981580195 30.249661222302226
-060.240 34.35156645475539 34.92891672395539 29.749667981580195 30.249661222302226
-061.240 34.92891672395539 35.506266993155386 29.749667981580195 30.249661222302226
-062.240 35.506266993155386 36.08361726230539 29.749667981580195 30.249661222302226
-063.240 36.08361726230539 36.660967531455384 29.749667981580195 30.249661222302226
-064.240 36.660967531455384 37.23831780065538 29.749667981580195 30.249661222302226
-065.240 37.23831780065538 37.82491855036968 29.749667981580195 30.249661222302226
-201.240 115.74870392994107 116.33530467965538 29.749667981580195 30.249661222302226
-202.240 116.33530467965538 116.91265494885539 29.749667981580195 30.249661222302226
-203.240 116.91265494885539 117.49000521805539 29.749667981580195 30.249661222302226
-204.240 117.49000521805539 118.06735548725538 29.749667981580195 30.249661222302226
-205.240 118.06735548725538 118.6447057564554 29.749667981580195 30.249661222302226
-206.240 118.6447057564554 119.22205602565538 29.749667981580195 30.249661222302226
-207.240 119.22205602565538 119.79940629480538 29.749667981580195 30.249661222302226
-208.240 119.79940629480538 120.37675656395538 29.749667981580195 30.249661222302226
-209.240 120.37675656395538 120.9541068331554 29.749667981580195 30.249661222302226
-210.240 120.9541068331554 121.53145710235538 29.749667981580195 30.249661222302226
-211.240 121.53145710235538 122.10880737155537 29.749667981580195 30.249661222302226
-212.240 122.10880737155537 122.68615764075538 29.749667981580195 30.249661222302226
-213.240 122.68615764075538 123.2635079099554 29.749667981580195 30.249661222302226
-214.240 123.2635079099554 123.84085817915539 29.749667981580195 30.249661222302226
-215.240 123.84085817915539 124.41820844835539 29.749667981580195 30.249661222302226
-216.240 124.41820844835539 124.99555871750538 29.749667981580195 30.249661222302226
-217.240 124.99555871750538 125.57290898665539 29.749667981580195 30.249661222302226
-218.240 125.57290898665539 126.15025925585539 29.749667981580195 30.249661222302226
-219.240 126.15025925585539 126.72760952505539 29.749667981580195 30.249661222302226
-220.240 126.72760952505539 127.30495979425538 29.749667981580195 30.249661222302226
-221.240 127.30495979425538 127.88231006345538 29.749667981580195 30.249661222302226
-222.240 127.88231006345538 128.4596603326554 29.749667981580195 30.249661222302226
-223.240 128.4596603326554 129.03701060185537 29.749667981580195 30.249661222302226
-224.240 129.03701060185537 129.6143608710554 29.749667981580195 30.249661222302226
-225.240 129.6143608710554 130.1917111402554 29.749667981580195 30.249661222302226
-226.240 130.1917111402554 130.76906140940537 29.749667981580195 30.249661222302226
-227.240 130.76906140940537 131.34641167855537 29.749667981580195 30.249661222302226
-228.240 131.34641167855537 131.9237619477554 29.749667981580195 30.249661222302226
-229.240 131.9237619477554 132.5011122169554 29.749667981580195 30.249661222302226
-230.240 132.5011122169554 133.0784624861554 29.749667981580195 30.249661222302226
-231.240 133.0784624861554 133.65581275535538 29.749667981580195 30.249661222302226
-232.240 133.65581275535538 134.23316302455538 29.749667981580195 30.249661222302226
-233.240 134.23316302455538 134.81051329375538 29.749667981580195 30.249661222302226
-234.240 134.81051329375538 135.38786356295537 29.749667981580195 30.249661222302226
-235.240 135.38786356295537 135.96521383215537 29.749667981580195 30.249661222302226
-236.240 135.96521383215537 136.5425641013054 29.749667981580195 30.249661222302226
-237.240 136.5425641013054 137.11991437045538 29.749667981580195 30.249661222302226
-238.240 137.11991437045538 137.69726463965537 29.749667981580195 30.249661222302226
-239.240 137.69726463965537 138.27461490885537 29.749667981580195 30.249661222302226
-240.240 138.27461490885537 138.85196517805537 29.749667981580195 30.249661222302226
-241.240 138.85196517805537 139.42931544725536 29.749667981580195 30.249661222302226
-242.240 139.42931544725536 140.0066657164554 29.749667981580195 30.249661222302226
-243.240 140.0066657164554 140.5840159856554 29.749667981580195 30.249661222302226
-244.240 140.5840159856554 141.1613662548554 29.749667981580195 30.249661222302226
-245.240 141.1613662548554 141.73871652400538 29.749667981580195 30.249661222302226
-246.240 141.73871652400538 142.31606679315541 29.749667981580195 30.249661222302226
-247.240 142.31606679315541 142.8934170623554 29.749667981580195 30.249661222302226
-248.240 142.8934170623554 143.4707673315554 29.749667981580195 30.249661222302226
-249.240 143.4707673315554 144.0481176007554 29.749667981580195 30.249661222302226
-250.240 144.0481176007554 144.6254678699554 29.749667981580195 30.249661222302226
-251.240 144.6254678699554 145.2028181391554 29.749667981580195 30.249661222302226
-252.240 145.2028181391554 145.7801684083554 29.749667981580195 30.249661222302226
-253.240 145.7801684083554 146.35751867755536 29.749667981580195 30.249661222302226
-254.240 146.35751867755536 146.9348689467554 29.749667981580195 30.249661222302226
-255.240 146.9348689467554 147.5122192159054 29.749667981580195 30.249661222302226
-256.240 147.5122192159054 148.0895694850554 29.749667981580195 30.249661222302226
-257.240 148.0895694850554 148.6669197542554 29.749667981580195 30.249661222302226
-258.240 148.6669197542554 149.24427002345539 29.749667981580195 30.249661222302226
-259.240 149.24427002345539 149.82162029265538 29.749667981580195 30.249661222302226
-260.240 149.82162029265538 150.39897056185538 29.749667981580195 30.249661222302226
-261.240 150.39897056185538 150.97632083105538 29.749667981580195 30.249661222302226
-262.240 150.97632083105538 151.55367110025537 29.749667981580195 30.249661222302226
-263.240 151.55367110025537 152.13102136945537 29.749667981580195 30.249661222302226
-264.240 152.13102136945537 152.70837163865536 29.749667981580195 30.249661222302226
-265.240 152.70837163865536 153.2857219078054 29.749667981580195 30.249661222302226
-266.240 153.2857219078054 153.86307217695537 29.749667981580195 30.249661222302226
-267.240 153.86307217695537 154.44042244615537 29.749667981580195 30.249661222302226
-268.240 154.44042244615537 155.01777271535536 29.749667981580195 30.249661222302226
-269.240 155.01777271535536 155.5951229845554 29.749667981580195 30.249661222302226
-270.240 155.5951229845554 156.1724732537554 29.749667981580195 30.249661222302226
-271.240 156.1724732537554 156.7590740034697 29.749667981580195 30.249661222302226
-276.240 159.0499741191411 159.6365748688554 29.749667981580195 30.249661222302226
-277.240 159.6365748688554 160.2139251380554 29.749667981580195 30.249661222302226
-278.240 160.2139251380554 160.7912754072554 29.749667981580195 30.249661222302226
-279.240 160.7912754072554 161.3686256764554 29.749667981580195 30.249661222302226
-280.240 161.3686256764554 161.9459759456554 29.749667981580195 30.249661222302226
-281.240 161.9459759456554 162.5233262148554 29.749667981580195 30.249661222302226
-282.240 162.5233262148554 163.10067648405538 29.749667981580195 30.249661222302226
-283.240 163.10067648405538 163.67802675325538 29.749667981580195 30.249661222302226
-284.240 163.67802675325538 164.2553770224054 29.749667981580195 30.249661222302226
-285.240 164.2553770224054 164.8327272915554 29.749667981580195 30.249661222302226
-286.240 164.8327272915554 165.41007756075538 29.749667981580195 30.249661222302226
-287.240 165.41007756075538 165.98742782995538 29.749667981580195 30.249661222302226
-288.240 165.98742782995538 166.56477809915538 29.749667981580195 30.249661222302226
-289.240 166.56477809915538 167.14212836835537 29.749667981580195 30.249661222302226
-290.240 167.14212836835537 167.71947863755537 29.749667981580195 30.249661222302226
-291.240 167.71947863755537 168.29682890675537 29.749667981580195 30.249661222302226
-292.240 168.29682890675537 168.87417917595536 29.749667981580195 30.249661222302226
-293.240 168.87417917595536 169.4515294451054 29.749667981580195 30.249661222302226
-294.240 169.4515294451054 170.02887971425537 29.749667981580195 30.249661222302226
-295.240 170.02887971425537 170.60622998345536 29.749667981580195 30.249661222302226
-296.240 170.60622998345536 171.1835802526554 29.749667981580195 30.249661222302226
-297.240 171.1835802526554 171.7609305218554 29.749667981580195 30.249661222302226
-298.240 171.7609305218554 172.3382807910554 29.749667981580195 30.249661222302226
-299.240 172.3382807910554 172.9156310602554 29.749667981580195 30.249661222302226
-300.240 172.9156310602554 173.4929813294554 29.749667981580195 30.249661222302226
-301.240 173.4929813294554 174.0703315986554 29.749667981580195 30.249661222302226
-302.240 174.0703315986554 174.6476818678554 29.749667981580195 30.249661222302226
-303.240 174.6476818678554 175.22503213700537 29.749667981580195 30.249661222302226
-304.240 175.22503213700537 175.8023824061554 29.749667981580195 30.249661222302226
-305.240 175.8023824061554 176.3797326753554 29.749667981580195 30.249661222302226
-306.240 176.3797326753554 176.9570829445554 29.749667981580195 30.249661222302226
-307.240 176.9570829445554 177.5344332137554 29.749667981580195 30.249661222302226
-308.240 177.5344332137554 178.1117834829554 29.749667981580195 30.249661222302226
-309.240 178.1117834829554 178.68913375215539 29.749667981580195 30.249661222302226
-310.240 178.68913375215539 179.26648402135538 29.749667981580195 30.249661222302226
-311.240 179.26648402135538 179.84383429055538 29.749667981580195 30.249661222302226
-312.240 179.84383429055538 180.42118455975537 29.749667981580195 30.249661222302226
-313.240 180.42118455975537 180.9985348289054 29.749667981580195 30.249661222302226
-314.240 180.9985348289054 181.57588509805538 29.749667981580195 30.249661222302226
-315.240 181.57588509805538 182.15323536725538 29.749667981580195 30.249661222302226
-316.240 182.15323536725538 182.73058563645537 29.749667981580195 30.249661222302226
-317.240 182.73058563645537 183.30793590565537 29.749667981580195 30.249661222302226
-318.240 183.30793590565537 183.88528617485537 29.749667981580195 30.249661222302226
-319.240 183.88528617485537 184.46263644405536 29.749667981580195 30.249661222302226
-320.240 184.46263644405536 185.03998671325536 29.749667981580195 30.249661222302226
-321.240 185.03998671325536 185.61733698245538 29.749667981580195 30.249661222302226
-322.240 185.61733698245538 186.1946872516054 29.749667981580195 30.249661222302226
-323.240 186.1946872516054 186.77203752075536 29.749667981580195 30.249661222302226
-324.240 186.77203752075536 187.3493877899554 29.749667981580195 30.249661222302226
-325.240 187.3493877899554 187.9267380591554 29.749667981580195 30.249661222302226
-326.240 187.9267380591554 188.5040883283554 29.749667981580195 30.249661222302226
-327.240 188.5040883283554 189.08143859755535 29.749667981580195 30.249661222302226
-328.240 189.08143859755535 189.65878886675537 29.749667981580195 30.249661222302226
-329.240 189.65878886675537 190.23613913595534 29.749667981580195 30.249661222302226
-330.240 190.23613913595534 190.81348940515537 29.749667981580195 30.249661222302226
-331.240 190.81348940515537 191.39083967435536 29.749667981580195 30.249661222302226
-332.240 191.39083967435536 191.96818994350537 29.749667981580195 30.249661222302226
-333.240 191.96818994350537 192.54554021265537 29.749667981580195 30.249661222302226
-334.240 192.54554021265537 193.1228904818554 29.749667981580195 30.249661222302226
-335.240 193.1228904818554 193.7002407510554 29.749667981580195 30.249661222302226
-336.240 193.7002407510554 194.2775910202554 29.749667981580195 30.249661222302226
-337.240 194.2775910202554 194.85494128945538 29.749667981580195 30.249661222302226
-338.240 194.85494128945538 195.43229155865538 29.749667981580195 30.249661222302226
-339.240 195.43229155865538 196.00964182785538 29.749667981580195 30.249661222302226
-340.240 196.00964182785538 196.58699209705537 29.749667981580195 30.249661222302226
-341.240 196.58699209705537 197.16434236625537 29.749667981580195 30.249661222302226
-342.240 197.16434236625537 197.74169263540534 29.749667981580195 30.249661222302226
-343.240 197.74169263540534 198.31904290455537 29.749667981580195 30.249661222302226
-344.240 198.31904290455537 198.89639317375537 29.749667981580195 30.249661222302226
-345.240 198.89639317375537 199.47374344295537 29.749667981580195 30.249661222302226
-346.240 199.47374344295537 200.05109371215536 29.749667981580195 30.249661222302226
-347.240 200.05109371215536 200.6284439813554 29.749667981580195 30.249661222302226
-348.240 200.6284439813554 201.20579425055536 29.749667981580195 30.249661222302226
-349.240 201.20579425055536 201.78314451975538 29.749667981580195 30.249661222302226
-350.240 201.78314451975538 202.36049478895538 29.749667981580195 30.249661222302226
-351.240 202.36049478895538 202.93784505810538 29.749667981580195 30.249661222302226
-352.240 202.93784505810538 203.51519532725538 29.749667981580195 30.249661222302226
-353.240 203.51519532725538 204.0925455964554 29.749667981580195 30.249661222302226
-354.240 204.0925455964554 204.66989586565538 29.749667981580195 30.249661222302226
-355.240 204.66989586565538 205.24724613485537 29.749667981580195 30.249661222302226
-356.240 205.24724613485537 205.82459640405537 29.749667981580195 30.249661222302226
-357.240 205.82459640405537 206.4019466732554 29.749667981580195 30.249661222302226
-358.240 206.4019466732554 206.97929694245536 29.749667981580195 30.249661222302226
-359.240 206.97929694245536 207.5566472116554 29.749667981580195 30.249661222302226
-360.240 207.5566472116554 208.1432479613697 29.749667981580195 30.249661222302226
-399.240 230.06405722954108 230.6506579792054 29.749667981580195 30.249661222302226
-400.240 230.6506579792054 231.22800824835537 29.749667981580195 30.249661222302226
-401.240 231.22800824835537 231.80535851755536 29.749667981580195 30.249661222302226
-402.240 231.80535851755536 232.38270878675536 29.749667981580195 30.249661222302226
-403.240 232.38270878675536 232.96005905595538 29.749667981580195 30.249661222302226
-404.240 232.96005905595538 233.53740932515538 29.749667981580195 30.249661222302226
-405.240 233.53740932515538 234.11475959435535 29.749667981580195 30.249661222302226
-406.240 234.11475959435535 234.69210986355537 29.749667981580195 30.249661222302226
-407.240 234.69210986355537 235.2694601327554 29.749667981580195 30.249661222302226
-408.240 235.2694601327554 235.84681040195537 29.749667981580195 30.249661222302226
-409.240 235.84681040195537 236.42416067110537 29.749667981580195 30.249661222302226
-410.240 236.42416067110537 237.0015109402554 29.749667981580195 30.249661222302226
-411.240 237.0015109402554 237.57886120945537 29.749667981580195 30.249661222302226
-412.240 237.57886120945537 238.15621147865536 29.749667981580195 30.249661222302226
-413.240 238.15621147865536 238.7335617478554 29.749667981580195 30.249661222302226
-414.240 238.7335617478554 239.3109120170554 29.749667981580195 30.249661222302226
-415.240 239.3109120170554 239.88826228625538 29.749667981580195 30.249661222302226
-416.240 239.88826228625538 240.46561255545538 29.749667981580195 30.249661222302226
-417.240 240.46561255545538 241.04296282465538 29.749667981580195 30.249661222302226
-418.240 241.04296282465538 241.62031309385537 29.749667981580195 30.249661222302226
-419.240 241.62031309385537 242.19766336300535 29.749667981580195 30.249661222302226
-420.240 242.19766336300535 242.77501363215538 29.749667981580195 30.249661222302226
-421.240 242.77501363215538 243.35236390135537 29.749667981580195 30.249661222302226
-422.240 243.35236390135537 243.92971417055534 29.749667981580195 30.249661222302226
-423.240 243.92971417055534 244.50706443975537 29.749667981580195 30.249661222302226
-424.240 244.50706443975537 245.08441470895536 29.749667981580195 30.249661222302226
-425.240 245.08441470895536 245.66176497815536 29.749667981580195 30.249661222302226
-426.240 245.66176497815536 246.2391152473554 29.749667981580195 30.249661222302226
-427.240 246.2391152473554 246.8164655165554 29.749667981580195 30.249661222302226
-428.240 246.8164655165554 247.39381578570536 29.749667981580195 30.249661222302226
-429.240 247.39381578570536 247.9711660548554 29.749667981580195 30.249661222302226
-430.240 247.9711660548554 248.5485163240554 29.749667981580195 30.249661222302226
-431.240 248.5485163240554 249.12586659325535 29.749667981580195 30.249661222302226
-432.240 249.12586659325535 249.70321686245538 29.749667981580195 30.249661222302226
-433.240 249.70321686245538 250.2805671316554 29.749667981580195 30.249661222302226
-434.240 250.2805671316554 250.85791740085534 29.749667981580195 30.249661222302226
-435.240 250.85791740085534 251.43526767005537 29.749667981580195 30.249661222302226
-436.240 251.43526767005537 252.0126179392554 29.749667981580195 30.249661222302226
-437.240 252.0126179392554 252.58996820845536 29.749667981580195 30.249661222302226
-438.240 252.58996820845536 253.1673184776054 29.749667981580195 30.249661222302226
-439.240 253.1673184776054 253.74466874675537 29.749667981580195 30.249661222302226
-440.240 253.74466874675537 254.32201901595536 29.749667981580195 30.249661222302226
-441.240 254.32201901595536 254.8993692851554 29.749667981580195 30.249661222302226
-442.240 254.8993692851554 255.47671955435538 29.749667981580195 30.249661222302226
-443.240 255.47671955435538 256.0540698235554 29.749667981580195 30.249661222302226
-444.240 256.0540698235554 256.6314200927554 29.749667981580195 30.249661222302226
-445.240 256.6314200927554 257.2087703619554 29.749667981580195 30.249661222302226
-446.240 257.2087703619554 257.78612063115537 29.749667981580195 30.249661222302226
-447.240 257.78612063115537 258.36347090035537 29.749667981580195 30.249661222302226
-448.240 258.36347090035537 258.94082116950534 29.749667981580195 30.249661222302226
-449.240 258.94082116950534 259.5181714386554 29.749667981580195 30.249661222302226
-450.240 259.5181714386554 260.09552170785537 29.749667981580195 30.249661222302226
-451.240 260.09552170785537 260.67287197705537 29.749667981580195 30.249661222302226
-452.240 260.67287197705537 261.25022224625536 29.749667981580195 30.249661222302226
-453.240 261.25022224625536 261.82757251545536 29.749667981580195 30.249661222302226
-454.240 261.82757251545536 262.40492278465535 29.749667981580195 30.249661222302226
-455.240 262.40492278465535 262.98227305385535 29.749667981580195 30.249661222302226
-456.240 262.98227305385535 263.55962332305535 29.749667981580195 30.249661222302226
-457.240 263.55962332305535 264.1369735922053 29.749667981580195 30.249661222302226
-458.240 264.1369735922053 264.71432386135535 29.749667981580195 30.249661222302226
-459.240 264.71432386135535 265.29167413055535 29.749667981580195 30.249661222302226
-460.240 265.29167413055535 265.8690243997554 29.749667981580195 30.249661222302226
-461.240 265.8690243997554 266.4463746689554 29.749667981580195 30.249661222302226
-462.240 266.4463746689554 267.0237249381554 29.749667981580195 30.249661222302226
-463.240 267.0237249381554 267.6010752073554 29.749667981580195 30.249661222302226
-464.240 267.6010752073554 268.1784254765554 29.749667981580195 30.249661222302226
-465.240 268.1784254765554 268.7557757457554 29.749667981580195 30.249661222302226
-466.240 268.7557757457554 269.3331260149554 29.749667981580195 30.249661222302226
-467.240 269.3331260149554 269.9197267646697 29.749667981580195 30.249661222302226
-589.240 339.76060837554104 340.3472091252554 29.749667981580195 30.249661222302226
-590.240 340.3472091252554 340.9245593944554 29.749667981580195 30.249661222302226
-591.240 340.9245593944554 341.5019096636554 29.749667981580195 30.249661222302226
-592.240 341.5019096636554 342.0792599328554 29.749667981580195 30.249661222302226
-593.240 342.0792599328554 342.65661020200537 29.749667981580195 30.249661222302226
-594.240 342.65661020200537 343.2339604711554 29.749667981580195 30.249661222302226
-595.240 343.2339604711554 343.81131074035545 29.749667981580195 30.249661222302226
-596.240 343.81131074035545 344.3886610095554 29.749667981580195 30.249661222302226
-597.240 344.3886610095554 344.9660112787554 29.749667981580195 30.249661222302226
-598.240 344.9660112787554 345.54336154795544 29.749667981580195 30.249661222302226
-599.240 345.54336154795544 346.1207118171554 29.749667981580195 30.249661222302226
-600.240 346.1207118171554 346.6980620863554 29.749667981580195 30.249661222302226
-601.240 346.6980620863554 347.27541235555543 29.749667981580195 30.249661222302226
-602.240 347.27541235555543 347.8527626247054 29.749667981580195 30.249661222302226
-603.240 347.8527626247054 348.4301128938554 29.749667981580195 30.249661222302226
-604.240 348.4301128938554 349.0074631630554 29.749667981580195 30.249661222302226
-605.240 349.0074631630554 349.5848134322554 29.749667981580195 30.249661222302226
-606.240 349.5848134322554 350.16216370145537 29.749667981580195 30.249661222302226
-607.240 350.16216370145537 350.73951397065537 29.749667981580195 30.249661222302226
-608.240 350.73951397065537 351.31686423985536 29.749667981580195 30.249661222302226
-609.240 351.31686423985536 351.89421450905536 29.749667981580195 30.249661222302226
-610.240 351.89421450905536 352.47156477825536 29.749667981580195 30.249661222302226
-611.240 352.47156477825536 353.04891504745535 29.749667981580195 30.249661222302226
-612.240 353.04891504745535 353.6262653166054 29.749667981580195 30.249661222302226
-613.240 353.6262653166054 354.20361558575536 29.749667981580195 30.249661222302226
-614.240 354.20361558575536 354.78096585495535 29.749667981580195 30.249661222302226
-615.240 354.78096585495535 355.3583161241554 29.749667981580195 30.249661222302226
-616.240 355.3583161241554 355.93566639335535 29.749667981580195 30.249661222302226
-617.240 355.93566639335535 356.5130166625554 29.749667981580195 30.249661222302226
-618.240 356.5130166625554 357.0903669317554 29.749667981580195 30.249661222302226
-619.240 357.0903669317554 357.6677172009554 29.749667981580195 30.249661222302226
-620.240 357.6677172009554 358.2450674701554 29.749667981580195 30.249661222302226
-621.240 358.2450674701554 358.8224177393554 29.749667981580195 30.249661222302226
-622.240 358.8224177393554 359.39976800850536 29.749667981580195 30.249661222302226
-623.240 359.39976800850536 359.84383429050536 29.749667981580195 30.249661222302226
-000.240 359.84383429050536 0.2879005725553856 29.749667981580195 30.249661222302226
-001.241 0.28935374239990097 0.869649794299901 30.249661222302226 30.74965439387295
-002.241 0.869649794299901 1.4499458461999009 30.249661222302226 30.74965439387295
-003.241 1.4499458461999009 2.0302418980999013 30.249661222302226 30.74965439387295
-004.241 2.0302418980999013 2.6105379499999013 30.249661222302226 30.74965439387295
-005.241 2.6105379499999013 3.1908340018999013 30.249661222302226 30.74965439387295
-006.241 3.1908340018999013 3.7711300537999017 30.249661222302226 30.74965439387295
-007.241 3.7711300537999017 4.351426105649901 30.249661222302226 30.74965439387295
-008.241 4.351426105649901 4.931722157499902 30.249661222302226 30.74965439387295
-009.241 4.931722157499902 5.5120182093999 30.249661222302226 30.74965439387295
-010.241 5.5120182093999 6.092314261299901 30.249661222302226 30.74965439387295
-011.241 6.092314261299901 6.672610313199902 30.249661222302226 30.74965439387295
-012.241 6.672610313199902 7.252906365099902 30.249661222302226 30.74965439387295
-013.241 7.252906365099902 7.833202416999901 30.249661222302226 30.74965439387295
-014.241 7.833202416999901 8.413498468899903 30.249661222302226 30.74965439387295
-015.241 8.413498468899903 8.993794520799902 30.249661222302226 30.74965439387295
-016.241 8.993794520799902 9.5740905726999 30.249661222302226 30.74965439387295
-017.241 9.5740905726999 10.154386624599901 30.249661222302226 30.74965439387295
-018.241 10.154386624599901 10.7346826764999 30.249661222302226 30.74965439387295
-019.241 10.7346826764999 11.3149787283999 30.249661222302226 30.74965439387295
-020.241 11.3149787283999 11.8952747802999 30.249661222302226 30.74965439387295
-021.241 11.8952747802999 12.475570832149902 30.249661222302226 30.74965439387295
-022.241 12.475570832149902 13.0558668839999 30.249661222302226 30.74965439387295
-023.241 13.0558668839999 13.6361629358999 30.249661222302226 30.74965439387295
-024.241 13.6361629358999 14.216458987799902 30.249661222302226 30.74965439387295
-025.241 14.216458987799902 14.7967550396999 30.249661222302226 30.74965439387295
-026.241 14.7967550396999 15.377051091599899 30.249661222302226 30.74965439387295
-027.241 15.377051091599899 15.957347143499902 30.249661222302226 30.74965439387295
-028.241 15.957347143499902 16.5376431953999 30.249661222302226 30.74965439387295
-029.241 16.5376431953999 17.117939247299905 30.249661222302226 30.74965439387295
-030.241 17.117939247299905 17.6982352991999 30.249661222302226 30.74965439387295
-031.241 17.6982352991999 18.2785313510999 30.249661222302226 30.74965439387295
-032.241 18.2785313510999 18.8588274029999 30.249661222302226 30.74965439387295
-033.241 18.8588274029999 19.4391234548999 30.249661222302226 30.74965439387295
-034.241 19.4391234548999 20.019419506799903 30.249661222302226 30.74965439387295
-035.241 20.019419506799903 20.599715558649905 30.249661222302226 30.74965439387295
-036.241 20.599715558649905 21.180011610499903 30.249661222302226 30.74965439387295
-037.241 21.180011610499903 21.760307662399903 30.249661222302226 30.74965439387295
-038.241 21.760307662399903 22.3406037142999 30.249661222302226 30.74965439387295
-039.241 22.3406037142999 22.920899766199902 30.249661222302226 30.74965439387295
-040.241 22.920899766199902 23.501195818099905 30.249661222302226 30.74965439387295
-041.241 23.501195818099905 24.0814918699999 30.249661222302226 30.74965439387295
-042.241 24.0814918699999 24.6617879218999 30.249661222302226 30.74965439387295
-043.241 24.6617879218999 25.2420839737999 30.249661222302226 30.74965439387295
-044.241 25.2420839737999 25.8223800256999 30.249661222302226 30.74965439387295
-045.241 25.8223800256999 26.402676077599907 30.249661222302226 30.74965439387295
-046.241 26.402676077599907 26.9829721294999 30.249661222302226 30.74965439387295
-047.241 26.9829721294999 27.5632681813999 30.249661222302226 30.74965439387295
-048.241 27.5632681813999 28.143564233299905 30.249661222302226 30.74965439387295
-049.241 28.143564233299905 28.723860285149897 30.249661222302226 30.74965439387295
-050.241 28.723860285149897 29.304156336999903 30.249661222302226 30.74965439387295
-051.241 29.304156336999903 29.884452388899902 30.249661222302226 30.74965439387295
-052.241 29.884452388899902 30.4647484407999 30.249661222302226 30.74965439387295
-053.241 30.4647484407999 31.0450444926999 30.249661222302226 30.74965439387295
-054.241 31.0450444926999 31.6253405445999 30.249661222302226 30.74965439387295
-055.241 31.6253405445999 32.2056365964999 30.249661222302226 30.74965439387295
-056.241 32.2056365964999 32.78593264839991 30.249661222302226 30.74965439387295
-057.241 32.78593264839991 33.36622870029991 30.249661222302226 30.74965439387295
-058.241 33.36622870029991 33.946524752199906 30.249661222302226 30.74965439387295
-059.241 33.946524752199906 34.52682080409991 30.249661222302226 30.74965439387295
-060.241 34.52682080409991 35.107116855999905 30.249661222302226 30.74965439387295
-061.241 35.107116855999905 35.6874129078999 30.249661222302226 30.74965439387295
-062.241 35.6874129078999 36.267708959799904 30.249661222302226 30.74965439387295
-063.241 36.267708959799904 36.8480050116499 30.249661222302226 30.74965439387295
-064.241 36.8480050116499 37.4283010634999 30.249661222302226 30.74965439387295
-065.241 37.4283010634999 38.01789484935328 30.249661222302226 30.74965439387295
-200.241 115.75897033514651 116.34856412099991 30.249661222302226 30.74965439387295
-201.241 116.34856412099991 116.92886017289992 30.249661222302226 30.74965439387295
-202.241 116.92886017289992 117.50915622479991 30.249661222302226 30.74965439387295
-203.241 117.50915622479991 118.0894522766499 30.249661222302226 30.74965439387295
-204.241 118.0894522766499 118.66974832849989 30.249661222302226 30.74965439387295
-205.241 118.66974832849989 119.25004438039988 30.249661222302226 30.74965439387295
-206.241 119.25004438039988 119.83034043229989 30.249661222302226 30.74965439387295
-207.241 119.83034043229989 120.4106364841999 30.249661222302226 30.74965439387295
-208.241 120.4106364841999 120.99093253609988 30.249661222302226 30.74965439387295
-209.241 120.99093253609988 121.5712285879999 30.249661222302226 30.74965439387295
-210.241 121.5712285879999 122.15152463989989 30.249661222302226 30.74965439387295
-211.241 122.15152463989989 122.73182069179991 30.249661222302226 30.74965439387295
-212.241 122.73182069179991 123.3121167436999 30.249661222302226 30.74965439387295
-213.241 123.3121167436999 123.89241279559991 30.249661222302226 30.74965439387295
-214.241 123.89241279559991 124.4727088474999 30.249661222302226 30.74965439387295
-215.241 124.4727088474999 125.0530048993999 30.249661222302226 30.74965439387295
-216.241 125.0530048993999 125.6333009512999 30.249661222302226 30.74965439387295
-217.241 125.6333009512999 126.21359700314989 30.249661222302226 30.74965439387295
-218.241 126.21359700314989 126.7938930549999 30.249661222302226 30.74965439387295
-219.241 126.7938930549999 127.3741891068999 30.249661222302226 30.74965439387295
-220.241 127.3741891068999 127.95448515879991 30.249661222302226 30.74965439387295
-221.241 127.95448515879991 128.53478121069992 30.249661222302226 30.74965439387295
-222.241 128.53478121069992 129.11507726259993 30.249661222302226 30.74965439387295
-223.241 129.11507726259993 129.69537331449988 30.249661222302226 30.74965439387295
-224.241 129.69537331449988 130.27566936639988 30.249661222302226 30.74965439387295
-225.241 130.27566936639988 130.8559654182999 30.249661222302226 30.74965439387295
-226.241 130.8559654182999 131.43626147019992 30.249661222302226 30.74965439387295
-227.241 131.43626147019992 132.0165575220999 30.249661222302226 30.74965439387295
-228.241 132.0165575220999 132.5968535739999 30.249661222302226 30.74965439387295
-229.241 132.5968535739999 133.1771496258999 30.249661222302226 30.74965439387295
-230.241 133.1771496258999 133.75744567779992 30.249661222302226 30.74965439387295
-231.241 133.75744567779992 134.3377417296499 30.249661222302226 30.74965439387295
-232.241 134.3377417296499 134.9180377814999 30.249661222302226 30.74965439387295
-233.241 134.9180377814999 135.4983338333999 30.249661222302226 30.74965439387295
-234.241 135.4983338333999 136.07862988529993 30.249661222302226 30.74965439387295
-235.241 136.07862988529993 136.6589259371999 30.249661222302226 30.74965439387295
-236.241 136.6589259371999 137.2392219890999 30.249661222302226 30.74965439387295
-237.241 137.2392219890999 137.81951804099992 30.249661222302226 30.74965439387295
-238.241 137.81951804099992 138.39981409289993 30.249661222302226 30.74965439387295
-239.241 138.39981409289993 138.98011014479994 30.249661222302226 30.74965439387295
-240.241 138.98011014479994 139.5604061966999 30.249661222302226 30.74965439387295
-241.241 139.5604061966999 140.1407022485999 30.249661222302226 30.74965439387295
-242.241 140.1407022485999 140.7209983004999 30.249661222302226 30.74965439387295
-243.241 140.7209983004999 141.3012943523999 30.249661222302226 30.74965439387295
-244.241 141.3012943523999 141.8815904042999 30.249661222302226 30.74965439387295
-245.241 141.8815904042999 142.4618864561499 30.249661222302226 30.74965439387295
-246.241 142.4618864561499 143.04218250799988 30.249661222302226 30.74965439387295
-247.241 143.04218250799988 143.6224785598999 30.249661222302226 30.74965439387295
-248.241 143.6224785598999 144.2027746117999 30.249661222302226 30.74965439387295
-249.241 144.2027746117999 144.7830706636999 30.249661222302226 30.74965439387295
-250.241 144.7830706636999 145.3633667155999 30.249661222302226 30.74965439387295
-251.241 145.3633667155999 145.94366276749992 30.249661222302226 30.74965439387295
-252.241 145.94366276749992 146.52395881939992 30.249661222302226 30.74965439387295
-253.241 146.52395881939992 147.10425487129993 30.249661222302226 30.74965439387295
-254.241 147.10425487129993 147.68455092319988 30.249661222302226 30.74965439387295
-255.241 147.68455092319988 148.26484697509989 30.249661222302226 30.74965439387295
-256.241 148.26484697509989 148.8451430269999 30.249661222302226 30.74965439387295
-257.241 148.8451430269999 149.42543907889993 30.249661222302226 30.74965439387295
-258.241 149.42543907889993 150.0057351307999 30.249661222302226 30.74965439387295
-259.241 150.0057351307999 150.58603118269988 30.249661222302226 30.74965439387295
-260.241 150.58603118269988 151.1663272345499 30.249661222302226 30.74965439387295
-261.241 151.1663272345499 151.7466232863999 30.249661222302226 30.74965439387295
-262.241 151.7466232863999 152.3269193382999 30.249661222302226 30.74965439387295
-263.241 152.3269193382999 152.9072153901999 30.249661222302226 30.74965439387295
-264.241 152.9072153901999 153.48751144209993 30.249661222302226 30.74965439387295
-265.241 153.48751144209993 154.06780749399994 30.249661222302226 30.74965439387295
-266.241 154.06780749399994 154.64810354589991 30.249661222302226 30.74965439387295
-267.241 154.64810354589991 155.2283995977999 30.249661222302226 30.74965439387295
-268.241 155.2283995977999 155.8086956496999 30.249661222302226 30.74965439387295
-269.241 155.8086956496999 156.3889917015999 30.249661222302226 30.74965439387295
-270.241 156.3889917015999 156.97858548745327 30.249661222302226 30.74965439387295
-274.241 158.7008781752465 159.2904719610499 30.249661222302226 30.74965439387295
-275.241 159.2904719610499 159.8707680128999 30.249661222302226 30.74965439387295
-276.241 159.8707680128999 160.45106406479988 30.249661222302226 30.74965439387295
-277.241 160.45106406479988 161.0313601166999 30.249661222302226 30.74965439387295
-278.241 161.0313601166999 161.6116561685999 30.249661222302226 30.74965439387295
-279.241 161.6116561685999 162.19195222049993 30.249661222302226 30.74965439387295
-280.241 162.19195222049993 162.7722482723999 30.249661222302226 30.74965439387295
-281.241 162.7722482723999 163.35254432429988 30.249661222302226 30.74965439387295
-282.241 163.35254432429988 163.9328403761999 30.249661222302226 30.74965439387295
-283.241 163.9328403761999 164.51313642809993 30.249661222302226 30.74965439387295
-284.241 164.51313642809993 165.09343247999988 30.249661222302226 30.74965439387295
-285.241 165.09343247999988 165.67372853189988 30.249661222302226 30.74965439387295
-286.241 165.67372853189988 166.2540245837999 30.249661222302226 30.74965439387295
-287.241 166.2540245837999 166.8343206356999 30.249661222302226 30.74965439387295
-288.241 166.8343206356999 167.4146166875499 30.249661222302226 30.74965439387295
-289.241 167.4146166875499 167.99491273939987 30.249661222302226 30.74965439387295
-290.241 167.99491273939987 168.57520879129993 30.249661222302226 30.74965439387295
-291.241 168.57520879129993 169.15550484319994 30.249661222302226 30.74965439387295
-292.241 169.15550484319994 169.73580089509989 30.249661222302226 30.74965439387295
-293.241 169.73580089509989 170.3160969469999 30.249661222302226 30.74965439387295
-294.241 170.3160969469999 170.8963929988999 30.249661222302226 30.74965439387295
-295.241 170.8963929988999 171.4766890507999 30.249661222302226 30.74965439387295
-296.241 171.4766890507999 172.0569851026999 30.249661222302226 30.74965439387295
-297.241 172.0569851026999 172.63728115459992 30.249661222302226 30.74965439387295
-298.241 172.63728115459992 173.2175772064999 30.249661222302226 30.74965439387295
-299.241 173.2175772064999 173.7978732583999 30.249661222302226 30.74965439387295
-300.241 173.7978732583999 174.3781693102999 30.249661222302226 30.74965439387295
-301.241 174.3781693102999 174.95846536219992 30.249661222302226 30.74965439387295
-302.241 174.95846536219992 175.5387614140499 30.249661222302226 30.74965439387295
-303.241 175.5387614140499 176.1190574658999 30.249661222302226 30.74965439387295
-304.241 176.1190574658999 176.69935351779992 30.249661222302226 30.74965439387295
-305.241 176.69935351779992 177.27964956969993 30.249661222302226 30.74965439387295
-306.241 177.27964956969993 177.85994562159988 30.249661222302226 30.74965439387295
-307.241 177.85994562159988 178.44024167349988 30.249661222302226 30.74965439387295
-308.241 178.44024167349988 179.0205377253999 30.249661222302226 30.74965439387295
-309.241 179.0205377253999 179.60083377729993 30.249661222302226 30.74965439387295
-310.241 179.60083377729993 180.1811298291999 30.249661222302226 30.74965439387295
-311.241 180.1811298291999 180.7614258810999 30.249661222302226 30.74965439387295
-312.241 180.7614258810999 181.34172193299986 30.249661222302226 30.74965439387295
-313.241 181.34172193299986 181.9220179848999 30.249661222302226 30.74965439387295
-314.241 181.9220179848999 182.50231403679993 30.249661222302226 30.74965439387295
-315.241 182.50231403679993 183.08261008869988 30.249661222302226 30.74965439387295
-316.241 183.08261008869988 183.66290614054992 30.249661222302226 30.74965439387295
-317.241 183.66290614054992 184.2432021923999 30.249661222302226 30.74965439387295
-318.241 184.2432021923999 184.8234982442999 30.249661222302226 30.74965439387295
-319.241 184.8234982442999 185.4037942961999 30.249661222302226 30.74965439387295
-320.241 185.4037942961999 185.98409034809987 30.249661222302226 30.74965439387295
-321.241 185.98409034809987 186.56438639999988 30.249661222302226 30.74965439387295
-322.241 186.56438639999988 187.14468245189988 30.249661222302226 30.74965439387295
-323.241 187.14468245189988 187.7249785037999 30.249661222302226 30.74965439387295
-324.241 187.7249785037999 188.3052745556999 30.249661222302226 30.74965439387295
-325.241 188.3052745556999 188.8855706075999 30.249661222302226 30.74965439387295
-326.241 188.8855706075999 189.4658666594999 30.249661222302226 30.74965439387295
-327.241 189.4658666594999 190.04616271139992 30.249661222302226 30.74965439387295
-328.241 190.04616271139992 190.6264587632999 30.249661222302226 30.74965439387295
-329.241 190.6264587632999 191.2067548151999 30.249661222302226 30.74965439387295
-330.241 191.2067548151999 191.7870508670499 30.249661222302226 30.74965439387295
-331.241 191.7870508670499 192.3673469188999 30.249661222302226 30.74965439387295
-332.241 192.3673469188999 192.9476429707999 30.249661222302226 30.74965439387295
-333.241 192.9476429707999 193.52793902269985 30.249661222302226 30.74965439387295
-334.241 193.52793902269985 194.1082350745999 30.249661222302226 30.74965439387295
-335.241 194.1082350745999 194.68853112649992 30.249661222302226 30.74965439387295
-336.241 194.68853112649992 195.2688271783999 30.249661222302226 30.74965439387295
-337.241 195.2688271783999 195.84912323029988 30.249661222302226 30.74965439387295
-338.241 195.84912323029988 196.4294192821999 30.249661222302226 30.74965439387295
-339.241 196.4294192821999 197.0097153340999 30.249661222302226 30.74965439387295
-340.241 197.0097153340999 197.5900113859999 30.249661222302226 30.74965439387295
-341.241 197.5900113859999 198.1703074378999 30.249661222302226 30.74965439387295
-342.241 198.1703074378999 198.7506034897999 30.249661222302226 30.74965439387295
-343.241 198.7506034897999 199.33089954169986 30.249661222302226 30.74965439387295
-344.241 199.33089954169986 199.9111955935499 30.249661222302226 30.74965439387295
-345.241 199.9111955935499 200.4914916453999 30.249661222302226 30.74965439387295
-346.241 200.4914916453999 201.0717876972999 30.249661222302226 30.74965439387295
-347.241 201.0717876972999 201.6520837491999 30.249661222302226 30.74965439387295
-348.241 201.6520837491999 202.2323798010999 30.249661222302226 30.74965439387295
-349.241 202.2323798010999 202.81267585299992 30.249661222302226 30.74965439387295
-350.241 202.81267585299992 203.3929719048999 30.249661222302226 30.74965439387295
-351.241 203.3929719048999 203.97326795679987 30.249661222302226 30.74965439387295
-352.241 203.97326795679987 204.55356400869988 30.249661222302226 30.74965439387295
-353.241 204.55356400869988 205.1338600605999 30.249661222302226 30.74965439387295
-354.241 205.1338600605999 205.7141561124999 30.249661222302226 30.74965439387295
-355.241 205.7141561124999 206.2944521643999 30.249661222302226 30.74965439387295
-356.241 206.2944521643999 206.87474821629988 30.249661222302226 30.74965439387295
-357.241 206.87474821629988 207.45504426819988 30.249661222302226 30.74965439387295
-358.241 207.45504426819988 208.04463805405328 30.249661222302226 30.74965439387295
-397.241 230.07729255804654 230.66688634389988 30.249661222302226 30.74965439387295
-398.241 230.66688634389988 231.24718239579988 30.249661222302226 30.74965439387295
-399.241 231.24718239579988 231.8274784476999 30.249661222302226 30.74965439387295
-400.241 231.8274784476999 232.4077744995499 30.249661222302226 30.74965439387295
-401.241 232.4077744995499 232.98807055139986 30.249661222302226 30.74965439387295
-402.241 232.98807055139986 233.5683666032999 30.249661222302226 30.74965439387295
-403.241 233.5683666032999 234.14866265519993 30.249661222302226 30.74965439387295
-404.241 234.14866265519993 234.72895870709988 30.249661222302226 30.74965439387295
-405.241 234.72895870709988 235.30925475899988 30.249661222302226 30.74965439387295
-406.241 235.30925475899988 235.8895508108999 30.249661222302226 30.74965439387295
-407.241 235.8895508108999 236.46984686279993 30.249661222302226 30.74965439387295
-408.241 236.46984686279993 237.0501429146999 30.249661222302226 30.74965439387295
-409.241 237.0501429146999 237.63043896659988 30.249661222302226 30.74965439387295
-410.241 237.63043896659988 238.21073501849986 30.249661222302226 30.74965439387295
-411.241 238.21073501849986 238.79103107039992 30.249661222302226 30.74965439387295
-412.241 238.79103107039992 239.37132712229993 30.249661222302226 30.74965439387295
-413.241 239.37132712229993 239.95162317419988 30.249661222302226 30.74965439387295
-414.241 239.95162317419988 240.5319192260499 30.249661222302226 30.74965439387295
-415.241 240.5319192260499 241.1122152778999 30.249661222302226 30.74965439387295
-416.241 241.1122152778999 241.69251132979988 30.249661222302226 30.74965439387295
-417.241 241.69251132979988 242.2728073816999 30.249661222302226 30.74965439387295
-418.241 242.2728073816999 242.85310343359987 30.249661222302226 30.74965439387295
-419.241 242.85310343359987 243.43339948549988 30.249661222302226 30.74965439387295
-420.241 243.43339948549988 244.01369553739988 30.249661222302226 30.74965439387295
-421.241 244.01369553739988 244.5939915892999 30.249661222302226 30.74965439387295
-422.241 244.5939915892999 245.1742876411999 30.249661222302226 30.74965439387295
-423.241 245.1742876411999 245.75458369309987 30.249661222302226 30.74965439387295
-424.241 245.75458369309987 246.33487974499988 30.249661222302226 30.74965439387295
-425.241 246.33487974499988 246.9151757968999 30.249661222302226 30.74965439387295
-426.241 246.9151757968999 247.4954718487999 30.249661222302226 30.74965439387295
-427.241 247.4954718487999 248.07576790069987 30.249661222302226 30.74965439387295
-428.241 248.07576790069987 248.6560639525499 30.249661222302226 30.74965439387295
-429.241 248.6560639525499 249.2363600043999 30.249661222302226 30.74965439387295
-430.241 249.2363600043999 249.8166560562999 30.249661222302226 30.74965439387295
-431.241 249.8166560562999 250.39695210819988 30.249661222302226 30.74965439387295
-432.241 250.39695210819988 250.9772481600999 30.249661222302226 30.74965439387295
-433.241 250.9772481600999 251.5575442119999 30.249661222302226 30.74965439387295
-434.241 251.5575442119999 252.1378402638999 30.249661222302226 30.74965439387295
-435.241 252.1378402638999 252.71813631579988 30.249661222302226 30.74965439387295
-436.241 252.71813631579988 253.2984323676999 30.249661222302226 30.74965439387295
-437.241 253.2984323676999 253.8787284195999 30.249661222302226 30.74965439387295
-438.241 253.8787284195999 254.4590244714999 30.249661222302226 30.74965439387295
-439.241 254.4590244714999 255.0393205233999 30.249661222302226 30.74965439387295
-440.241 255.0393205233999 255.61961657529991 30.249661222302226 30.74965439387295
-441.241 255.61961657529991 256.19991262719986 30.249661222302226 30.74965439387295
-442.241 256.19991262719986 256.7802086790499 30.249661222302226 30.74965439387295
-443.241 256.7802086790499 257.3605047308999 30.249661222302226 30.74965439387295
-444.241 257.3605047308999 257.9408007827999 30.249661222302226 30.74965439387295
-445.241 257.9408007827999 258.5210968346999 30.249661222302226 30.74965439387295
-446.241 258.5210968346999 259.1013928865999 30.249661222302226 30.74965439387295
-447.241 259.1013928865999 259.6816889384999 30.249661222302226 30.74965439387295
-448.241 259.6816889384999 260.2619849903999 30.249661222302226 30.74965439387295
-449.241 260.2619849903999 260.8422810422999 30.249661222302226 30.74965439387295
-450.241 260.8422810422999 261.4225770941998 30.249661222302226 30.74965439387295
-451.241 261.4225770941998 262.0028731460999 30.249661222302226 30.74965439387295
-452.241 262.0028731460999 262.58316919799995 30.249661222302226 30.74965439387295
-453.241 262.58316919799995 263.1634652498999 30.249661222302226 30.74965439387295
-454.241 263.1634652498999 263.7437613017999 30.249661222302226 30.74965439387295
-455.241 263.7437613017999 264.3240573536999 30.249661222302226 30.74965439387295
-456.241 264.3240573536999 264.9043534055499 30.249661222302226 30.74965439387295
-457.241 264.9043534055499 265.4846494573999 30.249661222302226 30.74965439387295
-458.241 265.4846494573999 266.06494550929983 30.249661222302226 30.74965439387295
-459.241 266.06494550929983 266.6452415611999 30.249661222302226 30.74965439387295
-460.241 266.6452415611999 267.22553761309996 30.249661222302226 30.74965439387295
-461.241 267.22553761309996 267.8058336649999 30.249661222302226 30.74965439387295
-462.241 267.8058336649999 268.3861297168999 30.249661222302226 30.74965439387295
-463.241 268.3861297168999 268.9664257687999 30.249661222302226 30.74965439387295
-464.241 268.9664257687999 269.5467218206999 30.249661222302226 30.74965439387295
-465.241 269.5467218206999 270.13631560655324 30.249661222302226 30.74965439387295
-587.241 340.3335424176465 340.9231362034999 30.249661222302226 30.74965439387295
-588.241 340.9231362034999 341.50343225539984 30.249661222302226 30.74965439387295
-589.241 341.50343225539984 342.0837283072999 30.249661222302226 30.74965439387295
-590.241 342.0837283072999 342.6640243591999 30.249661222302226 30.74965439387295
-591.241 342.6640243591999 343.2443204110999 30.249661222302226 30.74965439387295
-592.241 343.2443204110999 343.82461646299987 30.249661222302226 30.74965439387295
-593.241 343.82461646299987 344.40491251489993 30.249661222302226 30.74965439387295
-594.241 344.40491251489993 344.9852085667999 30.249661222302226 30.74965439387295
-595.241 344.9852085667999 345.5655046186999 30.249661222302226 30.74965439387295
-596.241 345.5655046186999 346.1458006705999 30.249661222302226 30.74965439387295
-597.241 346.1458006705999 346.7260967224499 30.249661222302226 30.74965439387295
-598.241 346.7260967224499 347.30639277429987 30.249661222302226 30.74965439387295
-599.241 347.30639277429987 347.8866888261999 30.249661222302226 30.74965439387295
-600.241 347.8866888261999 348.4669848780999 30.249661222302226 30.74965439387295
-601.241 348.4669848780999 349.04728092999994 30.249661222302226 30.74965439387295
-602.241 349.04728092999994 349.6275769818999 30.249661222302226 30.74965439387295
-603.241 349.6275769818999 350.2078730337999 30.249661222302226 30.74965439387295
-604.241 350.2078730337999 350.7881690856999 30.249661222302226 30.74965439387295
-605.241 350.7881690856999 351.36846513759986 30.249661222302226 30.74965439387295
-606.241 351.36846513759986 351.9487611894999 30.249661222302226 30.74965439387295
-607.241 351.9487611894999 352.52905724139987 30.249661222302226 30.74965439387295
-608.241 352.52905724139987 353.1093532932998 30.249661222302226 30.74965439387295
-609.241 353.1093532932998 353.6896493451999 30.249661222302226 30.74965439387295
-610.241 353.6896493451999 354.26994539709995 30.249661222302226 30.74965439387295
-611.241 354.26994539709995 354.85024144894993 30.249661222302226 30.74965439387295
-612.241 354.85024144894993 355.4305375007999 30.249661222302226 30.74965439387295
-613.241 355.4305375007999 356.01083355269986 30.249661222302226 30.74965439387295
-614.241 356.01083355269986 356.59112960459987 30.249661222302226 30.74965439387295
-615.241 356.59112960459987 357.1714256564999 30.249661222302226 30.74965439387295
-616.241 357.1714256564999 357.7517217083998 30.249661222302226 30.74965439387295
-617.241 357.7517217083998 358.3320177602999 30.249661222302226 30.74965439387295
-618.241 358.3320177602999 358.91231381219995 30.249661222302226 30.74965439387295
-619.241 358.91231381219995 359.5019075980533 30.249661222302226 30.74965439387295
-000.241 359.69975995654653 0.28935374239990097 30.249661222302226 30.74965439387295
-001.242 0.2908439158238121 0.8741606144238121 30.74965439387295 31.249647494169494
-002.242 0.8741606144238121 1.4574773130238121 30.74965439387295 31.249647494169494
-003.242 1.4574773130238121 2.040794011623812 30.74965439387295 31.249647494169494
-004.242 2.040794011623812 2.624110710223812 30.74965439387295 31.249647494169494
-005.242 2.624110710223812 3.207427408823812 30.74965439387295 31.249647494169494
-006.242 3.207427408823812 3.790744107473812 30.74965439387295 31.249647494169494
-007.242 3.790744107473812 4.374060806123811 30.74965439387295 31.249647494169494
-008.242 4.374060806123811 4.957377504723812 30.74965439387295 31.249647494169494
-009.242 4.957377504723812 5.540694203323811 30.74965439387295 31.249647494169494
-010.242 5.540694203323811 6.124010901923812 30.74965439387295 31.249647494169494
-011.242 6.124010901923812 6.707327600523812 30.74965439387295 31.249647494169494
-012.242 6.707327600523812 7.290644299123814 30.74965439387295 31.249647494169494
-013.242 7.290644299123814 7.873960997723813 30.74965439387295 31.249647494169494
-014.242 7.873960997723813 8.457277696323814 30.74965439387295 31.249647494169494
-015.242 8.457277696323814 9.040594394923811 30.74965439387295 31.249647494169494
-016.242 9.040594394923811 9.623911093523812 30.74965439387295 31.249647494169494
-017.242 9.623911093523812 10.207227792123813 30.74965439387295 31.249647494169494
-018.242 10.207227792123813 10.790544490723814 30.74965439387295 31.249647494169494
-019.242 10.790544490723814 11.373861189373812 30.74965439387295 31.249647494169494
-020.242 11.373861189373812 11.957177888023814 30.74965439387295 31.249647494169494
-021.242 11.957177888023814 12.540494586623815 30.74965439387295 31.249647494169494
-022.242 12.540494586623815 13.123811285223814 30.74965439387295 31.249647494169494
-023.242 13.123811285223814 13.707127983823813 30.74965439387295 31.249647494169494
-024.242 13.707127983823813 14.29044468242381 30.74965439387295 31.249647494169494
-025.242 14.29044468242381 14.873761381023812 30.74965439387295 31.249647494169494
-026.242 14.873761381023812 15.457078079623813 30.74965439387295 31.249647494169494
-027.242 15.457078079623813 16.040394778223813 30.74965439387295 31.249647494169494
-028.242 16.040394778223813 16.623711476823814 30.74965439387295 31.249647494169494
-029.242 16.623711476823814 17.207028175423815 30.74965439387295 31.249647494169494
-030.242 17.207028175423815 17.790344874023813 30.74965439387295 31.249647494169494
-031.242 17.790344874023813 18.373661572623817 30.74965439387295 31.249647494169494
-032.242 18.373661572623817 18.956978271273815 30.74965439387295 31.249647494169494
-033.242 18.956978271273815 19.540294969923817 30.74965439387295 31.249647494169494
-034.242 19.540294969923817 20.123611668523814 30.74965439387295 31.249647494169494
-035.242 20.123611668523814 20.70692836712381 30.74965439387295 31.249647494169494
-036.242 20.70692836712381 21.29024506572381 30.74965439387295 31.249647494169494
-037.242 21.29024506572381 21.87356176432381 30.74965439387295 31.249647494169494
-038.242 21.87356176432381 22.45687846292381 30.74965439387295 31.249647494169494
-039.242 22.45687846292381 23.040195161523812 30.74965439387295 31.249647494169494
-040.242 23.040195161523812 23.623511860123813 30.74965439387295 31.249647494169494
-041.242 23.623511860123813 24.206828558723814 30.74965439387295 31.249647494169494
-042.242 24.206828558723814 24.790145257323815 30.74965439387295 31.249647494169494
-043.242 24.790145257323815 25.373461955923812 30.74965439387295 31.249647494169494
-044.242 25.373461955923812 25.95677865452381 30.74965439387295 31.249647494169494
-045.242 25.95677865452381 26.54009535317381 30.74965439387295 31.249647494169494
-046.242 26.54009535317381 27.123412051823813 30.74965439387295 31.249647494169494
-047.242 27.123412051823813 27.706728750423814 30.74965439387295 31.249647494169494
-048.242 27.706728750423814 28.290045449023815 30.74965439387295 31.249647494169494
-049.242 28.290045449023815 28.87336214762381 30.74965439387295 31.249647494169494
-050.242 28.87336214762381 29.45667884622381 30.74965439387295 31.249647494169494
-051.242 29.45667884622381 30.039995544823817 30.74965439387295 31.249647494169494
-052.242 30.039995544823817 30.623312243423815 30.74965439387295 31.249647494169494
-053.242 30.623312243423815 31.206628942023816 30.74965439387295 31.249647494169494
-054.242 31.206628942023816 31.78994564062381 30.74965439387295 31.249647494169494
-055.242 31.78994564062381 32.373262339223814 30.74965439387295 31.249647494169494
-056.242 32.373262339223814 32.956579037823815 30.74965439387295 31.249647494169494
-057.242 32.956579037823815 33.539895736423816 30.74965439387295 31.249647494169494
-058.242 33.539895736423816 34.12321243507382 30.74965439387295 31.249647494169494
-059.242 34.12321243507382 34.70652913372381 30.74965439387295 31.249647494169494
-060.242 34.70652913372381 35.28984583232382 30.74965439387295 31.249647494169494
-061.242 35.28984583232382 35.873162530923814 30.74965439387295 31.249647494169494
-062.242 35.873162530923814 36.45647922952382 30.74965439387295 31.249647494169494
-063.242 36.45647922952382 37.03979592812382 30.74965439387295 31.249647494169494
-064.242 37.03979592812382 37.63245881589457 30.74965439387295 31.249647494169494
-198.242 115.19488735235306 115.7875502401238 30.74965439387295 31.249647494169494
-199.242 115.7875502401238 116.37086693872382 30.74965439387295 31.249647494169494
-200.242 116.37086693872382 116.95418363732381 30.74965439387295 31.249647494169494
-201.242 116.95418363732381 117.53750033592382 30.74965439387295 31.249647494169494
-202.242 117.53750033592382 118.12081703457382 30.74965439387295 31.249647494169494
-203.242 118.12081703457382 118.70413373322381 30.74965439387295 31.249647494169494
-204.242 118.70413373322381 119.28745043182383 30.74965439387295 31.249647494169494
-205.242 119.28745043182383 119.87076713042381 30.74965439387295 31.249647494169494
-206.242 119.87076713042381 120.45408382902383 30.74965439387295 31.249647494169494
-207.242 120.45408382902383 121.03740052762384 30.74965439387295 31.249647494169494
-208.242 121.03740052762384 121.62071722622383 30.74965439387295 31.249647494169494
-209.242 121.62071722622383 122.20403392482382 30.74965439387295 31.249647494169494
-210.242 122.20403392482382 122.78735062342382 30.74965439387295 31.249647494169494
-211.242 122.78735062342382 123.37066732202382 30.74965439387295 31.249647494169494
-212.242 123.37066732202382 123.9539840206238 30.74965439387295 31.249647494169494
-213.242 123.9539840206238 124.5373007192238 30.74965439387295 31.249647494169494
-214.242 124.5373007192238 125.12061741782381 30.74965439387295 31.249647494169494
-215.242 125.12061741782381 125.70393411647382 30.74965439387295 31.249647494169494
-216.242 125.70393411647382 126.2872508151238 30.74965439387295 31.249647494169494
-217.242 126.2872508151238 126.87056751372381 30.74965439387295 31.249647494169494
-218.242 126.87056751372381 127.45388421232383 30.74965439387295 31.249647494169494
-219.242 127.45388421232383 128.03720091092381 30.74965439387295 31.249647494169494
-220.242 128.03720091092381 128.6205176095238 30.74965439387295 31.249647494169494
-221.242 128.6205176095238 129.20383430812382 30.74965439387295 31.249647494169494
-222.242 129.20383430812382 129.78715100672383 30.74965439387295 31.249647494169494
-223.242 129.78715100672383 130.3704677053238 30.74965439387295 31.249647494169494
-224.242 130.3704677053238 130.9537844039238 30.74965439387295 31.249647494169494
-225.242 130.9537844039238 131.53710110252382 30.74965439387295 31.249647494169494
-226.242 131.53710110252382 132.12041780112384 30.74965439387295 31.249647494169494
-227.242 132.12041780112384 132.7037344997238 30.74965439387295 31.249647494169494
-228.242 132.7037344997238 133.28705119837383 30.74965439387295 31.249647494169494
-229.242 133.28705119837383 133.8703678970238 30.74965439387295 31.249647494169494
-230.242 133.8703678970238 134.45368459562383 30.74965439387295 31.249647494169494
-231.242 134.45368459562383 135.0370012942238 30.74965439387295 31.249647494169494
-232.242 135.0370012942238 135.6203179928238 30.74965439387295 31.249647494169494
-233.242 135.6203179928238 136.20363469142382 30.74965439387295 31.249647494169494
-234.242 136.20363469142382 136.78695139002383 30.74965439387295 31.249647494169494
-235.242 136.78695139002383 137.37026808862382 30.74965439387295 31.249647494169494
-236.242 137.37026808862382 137.9535847872238 30.74965439387295 31.249647494169494
-237.242 137.9535847872238 138.53690148582382 30.74965439387295 31.249647494169494
-238.242 138.53690148582382 139.12021818442383 30.74965439387295 31.249647494169494
-239.242 139.12021818442383 139.70353488302382 30.74965439387295 31.249647494169494
-240.242 139.70353488302382 140.2868515816238 30.74965439387295 31.249647494169494
-241.242 140.2868515816238 140.87016828027384 30.74965439387295 31.249647494169494
-242.242 140.87016828027384 141.45348497892383 30.74965439387295 31.249647494169494
-243.242 141.45348497892383 142.03680167752384 30.74965439387295 31.249647494169494
-244.242 142.03680167752384 142.6201183761238 30.74965439387295 31.249647494169494
-245.242 142.6201183761238 143.2034350747238 30.74965439387295 31.249647494169494
-246.242 143.2034350747238 143.7867517733238 30.74965439387295 31.249647494169494
-247.242 143.7867517733238 144.37006847192382 30.74965439387295 31.249647494169494
-248.242 144.37006847192382 144.9533851705238 30.74965439387295 31.249647494169494
-249.242 144.9533851705238 145.53670186912382 30.74965439387295 31.249647494169494
-250.242 145.53670186912382 146.12001856772383 30.74965439387295 31.249647494169494
-251.242 146.12001856772383 146.70333526632382 30.74965439387295 31.249647494169494
-252.242 146.70333526632382 147.2866519649238 30.74965439387295 31.249647494169494
-253.242 147.2866519649238 147.86996866352382 30.74965439387295 31.249647494169494
-254.242 147.86996866352382 148.4532853621738 30.74965439387295 31.249647494169494
-255.242 148.4532853621738 149.03660206082384 30.74965439387295 31.249647494169494
-256.242 149.03660206082384 149.61991875942383 30.74965439387295 31.249647494169494
-257.242 149.61991875942383 150.2032354580238 30.74965439387295 31.249647494169494
-258.242 150.2032354580238 150.78655215662383 30.74965439387295 31.249647494169494
-259.242 150.78655215662383 151.3698688552238 30.74965439387295 31.249647494169494
-260.242 151.3698688552238 151.9531855538238 30.74965439387295 31.249647494169494
-261.242 151.9531855538238 152.53650225242382 30.74965439387295 31.249647494169494
-262.242 152.53650225242382 153.11981895102383 30.74965439387295 31.249647494169494
-263.242 153.11981895102383 153.70313564962382 30.74965439387295 31.249647494169494
-264.242 153.70313564962382 154.2864523482238 30.74965439387295 31.249647494169494
-265.242 154.2864523482238 154.86976904682382 30.74965439387295 31.249647494169494
-266.242 154.86976904682382 155.45308574542383 30.74965439387295 31.249647494169494
-267.242 155.45308574542383 156.03640244407381 30.74965439387295 31.249647494169494
-268.242 156.03640244407381 156.6197191427238 30.74965439387295 31.249647494169494
-269.242 156.6197191427238 157.21238203049458 30.74965439387295 31.249647494169494
-273.242 158.94363974795306 159.5363026357238 30.74965439387295 31.249647494169494
-274.242 159.5363026357238 160.11961933432383 30.74965439387295 31.249647494169494
-275.242 160.11961933432383 160.70293603292382 30.74965439387295 31.249647494169494
-276.242 160.70293603292382 161.2862527315238 30.74965439387295 31.249647494169494
-277.242 161.2862527315238 161.86956943012382 30.74965439387295 31.249647494169494
-278.242 161.86956943012382 162.45288612872383 30.74965439387295 31.249647494169494
-279.242 162.45288612872383 163.03620282732382 30.74965439387295 31.249647494169494
-280.242 163.03620282732382 163.61951952597383 30.74965439387295 31.249647494169494
-281.242 163.61951952597383 164.2028362246238 30.74965439387295 31.249647494169494
-282.242 164.2028362246238 164.78615292322382 30.74965439387295 31.249647494169494
-283.242 164.78615292322382 165.36946962182384 30.74965439387295 31.249647494169494
-284.242 165.36946962182384 165.95278632042383 30.74965439387295 31.249647494169494
-285.242 165.95278632042383 166.5361030190238 30.74965439387295 31.249647494169494
-286.242 166.5361030190238 167.11941971762383 30.74965439387295 31.249647494169494
-287.242 167.11941971762383 167.70273641622381 30.74965439387295 31.249647494169494
-288.242 167.70273641622381 168.2860531148238 30.74965439387295 31.249647494169494
-289.242 168.2860531148238 168.86936981342382 30.74965439387295 31.249647494169494
-290.242 168.86936981342382 169.45268651202383 30.74965439387295 31.249647494169494
-291.242 169.45268651202383 170.03600321062382 30.74965439387295 31.249647494169494
-292.242 170.03600321062382 170.6193199092238 30.74965439387295 31.249647494169494
-293.242 170.6193199092238 171.20263660787384 30.74965439387295 31.249647494169494
-294.242 171.20263660787384 171.78595330652382 30.74965439387295 31.249647494169494
-295.242 171.78595330652382 172.36927000512384 30.74965439387295 31.249647494169494
-296.242 172.36927000512384 172.95258670372382 30.74965439387295 31.249647494169494
-297.242 172.95258670372382 173.5359034023238 30.74965439387295 31.249647494169494
-298.242 173.5359034023238 174.11922010092383 30.74965439387295 31.249647494169494
-299.242 174.11922010092383 174.70253679952384 30.74965439387295 31.249647494169494
-300.242 174.70253679952384 175.28585349812383 30.74965439387295 31.249647494169494
-301.242 175.28585349812383 175.86917019672381 30.74965439387295 31.249647494169494
-302.242 175.86917019672381 176.45248689532383 30.74965439387295 31.249647494169494
-303.242 176.45248689532383 177.03580359392382 30.74965439387295 31.249647494169494
-304.242 177.03580359392382 177.6191202925238 30.74965439387295 31.249647494169494
-305.242 177.6191202925238 178.20243699112382 30.74965439387295 31.249647494169494
-306.242 178.20243699112382 178.7857536897738 30.74965439387295 31.249647494169494
-307.242 178.7857536897738 179.36907038842384 30.74965439387295 31.249647494169494
-308.242 179.36907038842384 179.95238708702382 30.74965439387295 31.249647494169494
-309.242 179.95238708702382 180.5357037856238 30.74965439387295 31.249647494169494
-310.242 180.5357037856238 181.1190204842238 30.74965439387295 31.249647494169494
-311.242 181.1190204842238 181.7023371828238 30.74965439387295 31.249647494169494
-312.242 181.7023371828238 182.2856538814238 30.74965439387295 31.249647494169494
-313.242 182.2856538814238 182.86897058002378 30.74965439387295 31.249647494169494
-314.242 182.86897058002378 183.45228727862377 30.74965439387295 31.249647494169494
-315.242 183.45228727862377 184.0356039772238 30.74965439387295 31.249647494169494
-316.242 184.0356039772238 184.6189206758238 30.74965439387295 31.249647494169494
-317.242 184.6189206758238 185.20223737442382 30.74965439387295 31.249647494169494
-318.242 185.20223737442382 185.78555407302377 30.74965439387295 31.249647494169494
-319.242 185.78555407302377 186.3688707716738 30.74965439387295 31.249647494169494
-320.242 186.3688707716738 186.9521874703238 30.74965439387295 31.249647494169494
-321.242 186.9521874703238 187.5355041689238 30.74965439387295 31.249647494169494
-322.242 187.5355041689238 188.11882086752382 30.74965439387295 31.249647494169494
-323.242 188.11882086752382 188.7021375661238 30.74965439387295 31.249647494169494
-324.242 188.7021375661238 189.2854542647238 30.74965439387295 31.249647494169494
-325.242 189.2854542647238 189.8687709633238 30.74965439387295 31.249647494169494
-326.242 189.8687709633238 190.4520876619238 30.74965439387295 31.249647494169494
-327.242 190.4520876619238 191.03540436052378 30.74965439387295 31.249647494169494
-328.242 191.03540436052378 191.6187210591238 30.74965439387295 31.249647494169494
-329.242 191.6187210591238 192.2020377577238 30.74965439387295 31.249647494169494
-330.242 192.2020377577238 192.78535445632377 30.74965439387295 31.249647494169494
-331.242 192.78535445632377 193.3686711549238 30.74965439387295 31.249647494169494
-332.242 193.3686711549238 193.95198785357377 30.74965439387295 31.249647494169494
-333.242 193.95198785357377 194.5353045522238 30.74965439387295 31.249647494169494
-334.242 194.5353045522238 195.11862125082382 30.74965439387295 31.249647494169494
-335.242 195.11862125082382 195.70193794942378 30.74965439387295 31.249647494169494
-336.242 195.70193794942378 196.2852546480238 30.74965439387295 31.249647494169494
-337.242 196.2852546480238 196.8685713466238 30.74965439387295 31.249647494169494
-338.242 196.8685713466238 197.45188804522382 30.74965439387295 31.249647494169494
-339.242 197.45188804522382 198.0352047438238 30.74965439387295 31.249647494169494
-340.242 198.0352047438238 198.6185214424238 30.74965439387295 31.249647494169494
-341.242 198.6185214424238 199.20183814102379 30.74965439387295 31.249647494169494
-342.242 199.20183814102379 199.78515483962377 30.74965439387295 31.249647494169494
-343.242 199.78515483962377 200.3684715382238 30.74965439387295 31.249647494169494
-344.242 200.3684715382238 200.9517882368238 30.74965439387295 31.249647494169494
-345.242 200.9517882368238 201.53510493547378 30.74965439387295 31.249647494169494
-346.242 201.53510493547378 202.1184216341238 30.74965439387295 31.249647494169494
-347.242 202.1184216341238 202.70173833272378 30.74965439387295 31.249647494169494
-348.242 202.70173833272378 203.2850550313238 30.74965439387295 31.249647494169494
-349.242 203.2850550313238 203.8683717299238 30.74965439387295 31.249647494169494
-350.242 203.8683717299238 204.45168842852382 30.74965439387295 31.249647494169494
-351.242 204.45168842852382 205.03500512712378 30.74965439387295 31.249647494169494
-352.242 205.03500512712378 205.6183218257238 30.74965439387295 31.249647494169494
-353.242 205.6183218257238 206.2016385243238 30.74965439387295 31.249647494169494
-354.242 206.2016385243238 206.78495522292383 30.74965439387295 31.249647494169494
-355.242 206.78495522292383 207.36827192152379 30.74965439387295 31.249647494169494
-356.242 207.36827192152379 207.96093480929454 30.74965439387295 31.249647494169494
-395.242 230.10827697805303 230.70093986582378 30.74965439387295 31.249647494169494
-396.242 230.70093986582378 231.2842565644238 30.74965439387295 31.249647494169494
-397.242 231.2842565644238 231.8675732630238 30.74965439387295 31.249647494169494
-398.242 231.8675732630238 232.4508899616738 30.74965439387295 31.249647494169494
-399.242 232.4508899616738 233.03420666032383 30.74965439387295 31.249647494169494
-400.242 233.03420666032383 233.61752335892382 30.74965439387295 31.249647494169494
-401.242 233.61752335892382 234.2008400575238 30.74965439387295 31.249647494169494
-402.242 234.2008400575238 234.78415675612382 30.74965439387295 31.249647494169494
-403.242 234.78415675612382 235.3674734547238 30.74965439387295 31.249647494169494
-404.242 235.3674734547238 235.9507901533238 30.74965439387295 31.249647494169494
-405.242 235.9507901533238 236.5341068519238 30.74965439387295 31.249647494169494
-406.242 236.5341068519238 237.1174235505238 30.74965439387295 31.249647494169494
-407.242 237.1174235505238 237.70074024912378 30.74965439387295 31.249647494169494
-408.242 237.70074024912378 238.2840569477238 30.74965439387295 31.249647494169494
-409.242 238.2840569477238 238.8673736463238 30.74965439387295 31.249647494169494
-410.242 238.8673736463238 239.4506903449238 30.74965439387295 31.249647494169494
-411.242 239.4506903449238 240.0340070435738 30.74965439387295 31.249647494169494
-412.242 240.0340070435738 240.61732374222382 30.74965439387295 31.249647494169494
-413.242 240.61732374222382 241.2006404408238 30.74965439387295 31.249647494169494
-414.242 241.2006404408238 241.78395713942382 30.74965439387295 31.249647494169494
-415.242 241.78395713942382 242.36727383802383 30.74965439387295 31.249647494169494
-416.242 242.36727383802383 242.95059053662382 30.74965439387295 31.249647494169494
-417.242 242.95059053662382 243.5339072352238 30.74965439387295 31.249647494169494
-418.242 243.5339072352238 244.11722393382382 30.74965439387295 31.249647494169494
-419.242 244.11722393382382 244.7005406324238 30.74965439387295 31.249647494169494
-420.242 244.7005406324238 245.2838573310238 30.74965439387295 31.249647494169494
-421.242 245.2838573310238 245.8671740296238 30.74965439387295 31.249647494169494
-422.242 245.8671740296238 246.4504907282238 30.74965439387295 31.249647494169494
-423.242 246.4504907282238 247.03380742682378 30.74965439387295 31.249647494169494
-424.242 247.03380742682378 247.6171241254738 30.74965439387295 31.249647494169494
-425.242 247.6171241254738 248.2004408241238 30.74965439387295 31.249647494169494
-426.242 248.2004408241238 248.78375752272382 30.74965439387295 31.249647494169494
-427.242 248.78375752272382 249.3670742213238 30.74965439387295 31.249647494169494
-428.242 249.3670742213238 249.95039091992382 30.74965439387295 31.249647494169494
-429.242 249.95039091992382 250.5337076185238 30.74965439387295 31.249647494169494
-430.242 250.5337076185238 251.11702431712382 30.74965439387295 31.249647494169494
-431.242 251.11702431712382 251.70034101572384 30.74965439387295 31.249647494169494
-432.242 251.70034101572384 252.28365771432382 30.74965439387295 31.249647494169494
-433.242 252.28365771432382 252.8669744129238 30.74965439387295 31.249647494169494
-434.242 252.8669744129238 253.45029111152382 30.74965439387295 31.249647494169494
-435.242 253.45029111152382 254.0336078101238 30.74965439387295 31.249647494169494
-436.242 254.0336078101238 254.6169245087238 30.74965439387295 31.249647494169494
-437.242 254.6169245087238 255.20024120737384 30.74965439387295 31.249647494169494
-438.242 255.20024120737384 255.78355790602382 30.74965439387295 31.249647494169494
-439.242 255.78355790602382 256.3668746046238 30.74965439387295 31.249647494169494
-440.242 256.3668746046238 256.9501913032238 30.74965439387295 31.249647494169494
-441.242 256.9501913032238 257.5335080018238 30.74965439387295 31.249647494169494
-442.242 257.5335080018238 258.1168247004238 30.74965439387295 31.249647494169494
-443.242 258.1168247004238 258.70014139902383 30.74965439387295 31.249647494169494
-444.242 258.70014139902383 259.2834580976238 30.74965439387295 31.249647494169494
-445.242 259.2834580976238 259.8667747962238 30.74965439387295 31.249647494169494
-446.242 259.8667747962238 260.4500914948238 30.74965439387295 31.249647494169494
-447.242 260.4500914948238 261.0334081934238 30.74965439387295 31.249647494169494
-448.242 261.0334081934238 261.6167248920238 30.74965439387295 31.249647494169494
-449.242 261.6167248920238 262.2000415906238 30.74965439387295 31.249647494169494
-450.242 262.2000415906238 262.7833582892738 30.74965439387295 31.249647494169494
-451.242 262.7833582892738 263.36667498792383 30.74965439387295 31.249647494169494
-452.242 263.36667498792383 263.9499916865238 30.74965439387295 31.249647494169494
-453.242 263.9499916865238 264.5333083851238 30.74965439387295 31.249647494169494
-454.242 264.5333083851238 265.1166250837238 30.74965439387295 31.249647494169494
-455.242 265.1166250837238 265.6999417823238 30.74965439387295 31.249647494169494
-456.242 265.6999417823238 266.2832584809238 30.74965439387295 31.249647494169494
-457.242 266.2832584809238 266.8665751795238 30.74965439387295 31.249647494169494
-458.242 266.8665751795238 267.4498918781238 30.74965439387295 31.249647494169494
-459.242 267.4498918781238 268.03320857672384 30.74965439387295 31.249647494169494
-460.242 268.03320857672384 268.6165252753238 30.74965439387295 31.249647494169494
-461.242 268.6165252753238 269.1998419739238 30.74965439387295 31.249647494169494
-462.242 269.1998419739238 269.7831586725238 30.74965439387295 31.249647494169494
-463.242 269.7831586725238 270.3758215602946 30.74965439387295 31.249647494169494
-584.242 340.3551330149531 340.9477959027238 30.74965439387295 31.249647494169494
-585.242 340.9477959027238 341.5311126013238 30.74965439387295 31.249647494169494
-586.242 341.5311126013238 342.1144292999238 30.74965439387295 31.249647494169494
-587.242 342.1144292999238 342.6977459985238 30.74965439387295 31.249647494169494
-588.242 342.6977459985238 343.2810626971238 30.74965439387295 31.249647494169494
-589.242 343.2810626971238 343.8643793957238 30.74965439387295 31.249647494169494
-590.242 343.8643793957238 344.4476960943238 30.74965439387295 31.249647494169494
-591.242 344.4476960943238 345.0310127929238 30.74965439387295 31.249647494169494
-592.242 345.0310127929238 345.6143294915238 30.74965439387295 31.249647494169494
-593.242 345.6143294915238 346.1976461901738 30.74965439387295 31.249647494169494
-594.242 346.1976461901738 346.7809628888238 30.74965439387295 31.249647494169494
-595.242 346.7809628888238 347.3642795874238 30.74965439387295 31.249647494169494
-596.242 347.3642795874238 347.9475962860238 30.74965439387295 31.249647494169494
-597.242 347.9475962860238 348.5309129846238 30.74965439387295 31.249647494169494
-598.242 348.5309129846238 349.1142296832238 30.74965439387295 31.249647494169494
-599.242 349.1142296832238 349.6975463818238 30.74965439387295 31.249647494169494
-600.242 349.6975463818238 350.28086308042384 30.74965439387295 31.249647494169494
-601.242 350.28086308042384 350.8641797790238 30.74965439387295 31.249647494169494
-602.242 350.8641797790238 351.4474964776238 30.74965439387295 31.249647494169494
-603.242 351.4474964776238 352.0308131762238 30.74965439387295 31.249647494169494
-604.242 352.0308131762238 352.6141298748238 30.74965439387295 31.249647494169494
-605.242 352.6141298748238 353.1974465734238 30.74965439387295 31.249647494169494
-606.242 353.1974465734238 353.78076327207384 30.74965439387295 31.249647494169494
-607.242 353.78076327207384 354.3640799707238 30.74965439387295 31.249647494169494
-608.242 354.3640799707238 354.94739666932384 30.74965439387295 31.249647494169494
-609.242 354.94739666932384 355.5307133679238 30.74965439387295 31.249647494169494
-610.242 355.5307133679238 356.1140300665238 30.74965439387295 31.249647494169494
-611.242 356.1140300665238 356.6973467651238 30.74965439387295 31.249647494169494
-612.242 356.6973467651238 357.28066346372384 30.74965439387295 31.249647494169494
-613.242 357.28066346372384 357.8639801623238 30.74965439387295 31.249647494169494
-614.242 357.8639801623238 358.44729686092376 30.74965439387295 31.249647494169494
-615.242 358.44729686092376 359.0306135595238 30.74965439387295 31.249647494169494
-616.242 359.0306135595238 359.62327644729453 30.74965439387295 31.249647494169494
-000.242 359.69818102805306 0.2908439158238121 30.74965439387295 31.249647494169494
-001.243 0.29237189622515947 0.8787857445251595 31.249647494169494 31.74964052100247
-002.243 0.8787857445251595 1.4651995928251598 31.249647494169494 31.74964052100247
-003.243 1.4651995928251598 2.051613441125159 31.249647494169494 31.74964052100247
-004.243 2.051613441125159 2.638027289425159 31.249647494169494 31.74964052100247
-005.243 2.638027289425159 3.224441137725159 31.249647494169494 31.74964052100247
-006.243 3.224441137725159 3.8108549860251597 31.249647494169494 31.74964052100247
-007.243 3.8108549860251597 4.39726883437516 31.249647494169494 31.74964052100247
-008.243 4.39726883437516 4.98368268272516 31.249647494169494 31.74964052100247
-009.243 4.98368268272516 5.570096531025159 31.249647494169494 31.74964052100247
-010.243 5.570096531025159 6.15651037932516 31.249647494169494 31.74964052100247
-011.243 6.15651037932516 6.74292422762516 31.249647494169494 31.74964052100247
-012.243 6.74292422762516 7.329338075925159 31.249647494169494 31.74964052100247
-013.243 7.329338075925159 7.91575192422516 31.249647494169494 31.74964052100247
-014.243 7.91575192422516 8.50216577252516 31.249647494169494 31.74964052100247
-015.243 8.50216577252516 9.088579620825161 31.249647494169494 31.74964052100247
-016.243 9.088579620825161 9.674993469125159 31.249647494169494 31.74964052100247
-017.243 9.674993469125159 10.26140731742516 31.249647494169494 31.74964052100247
-018.243 10.26140731742516 10.847821165725158 31.249647494169494 31.74964052100247
-019.243 10.847821165725158 11.434235014025159 31.249647494169494 31.74964052100247
-020.243 11.434235014025159 12.020648862325158 31.249647494169494 31.74964052100247
-021.243 12.020648862325158 12.607062710675159 31.249647494169494 31.74964052100247
-022.243 12.607062710675159 13.19347655902516 31.249647494169494 31.74964052100247
-023.243 13.19347655902516 13.77989040732516 31.249647494169494 31.74964052100247
-024.243 13.77989040732516 14.36630425562516 31.249647494169494 31.74964052100247
-025.243 14.36630425562516 14.952718103925157 31.249647494169494 31.74964052100247
-026.243 14.952718103925157 15.53913195222516 31.249647494169494 31.74964052100247
-027.243 15.53913195222516 16.12554580052516 31.249647494169494 31.74964052100247
-028.243 16.12554580052516 16.71195964882516 31.249647494169494 31.74964052100247
-029.243 16.71195964882516 17.298373497125162 31.249647494169494 31.74964052100247
-030.243 17.298373497125162 17.88478734542516 31.249647494169494 31.74964052100247
-031.243 17.88478734542516 18.471201193725154 31.249647494169494 31.74964052100247
-032.243 18.471201193725154 19.057615042025155 31.249647494169494 31.74964052100247
-033.243 19.057615042025155 19.644028890325156 31.249647494169494 31.74964052100247
-034.243 19.644028890325156 20.230442738625158 31.249647494169494 31.74964052100247
-035.243 20.230442738625158 20.816856586975156 31.249647494169494 31.74964052100247
-036.243 20.816856586975156 21.40327043532516 31.249647494169494 31.74964052100247
-037.243 21.40327043532516 21.98968428362516 31.249647494169494 31.74964052100247
-038.243 21.98968428362516 22.57609813192516 31.249647494169494 31.74964052100247
-039.243 22.57609813192516 23.162511980225162 31.249647494169494 31.74964052100247
-040.243 23.162511980225162 23.74892582852516 31.249647494169494 31.74964052100247
-041.243 23.74892582852516 24.33533967682516 31.249647494169494 31.74964052100247
-042.243 24.33533967682516 24.921753525125162 31.249647494169494 31.74964052100247
-043.243 24.921753525125162 25.508167373425167 31.249647494169494 31.74964052100247
-044.243 25.508167373425167 26.094581221725164 31.249647494169494 31.74964052100247
-045.243 26.094581221725164 26.680995070025162 31.249647494169494 31.74964052100247
-046.243 26.680995070025162 27.26740891832516 31.249647494169494 31.74964052100247
-047.243 27.26740891832516 27.853822766625157 31.249647494169494 31.74964052100247
-048.243 27.853822766625157 28.440236614925162 31.249647494169494 31.74964052100247
-049.243 28.440236614925162 29.02665046327516 31.249647494169494 31.74964052100247
-050.243 29.02665046327516 29.61306431162516 31.249647494169494 31.74964052100247
-051.243 29.61306431162516 30.199478159925164 31.249647494169494 31.74964052100247
-052.243 30.199478159925164 30.78589200822516 31.249647494169494 31.74964052100247
-053.243 30.78589200822516 31.37230585652516 31.249647494169494 31.74964052100247
-054.243 31.37230585652516 31.958719704825164 31.249647494169494 31.74964052100247
-055.243 31.958719704825164 32.545133553125154 31.249647494169494 31.74964052100247
-056.243 32.545133553125154 33.13154740142516 31.249647494169494 31.74964052100247
-057.243 33.13154740142516 33.717961249725164 31.249647494169494 31.74964052100247
-058.243 33.717961249725164 34.30437509802516 31.249647494169494 31.74964052100247
-059.243 34.30437509802516 34.89078894632516 31.249647494169494 31.74964052100247
-060.243 34.89078894632516 35.477202794625164 31.249647494169494 31.74964052100247
-061.243 35.477202794625164 36.063616642925155 31.249647494169494 31.74964052100247
-062.243 36.063616642925155 36.65003049122515 31.249647494169494 31.74964052100247
-063.243 36.65003049122515 37.24584021204088 31.249647494169494 31.74964052100247
-196.243 114.63367644360945 115.22948616442517 31.249647494169494 31.74964052100247
-197.243 115.22948616442517 115.81590001272515 31.249647494169494 31.74964052100247
-198.243 115.81590001272515 116.40231386102516 31.249647494169494 31.74964052100247
-199.243 116.40231386102516 116.98872770932516 31.249647494169494 31.74964052100247
-200.243 116.98872770932516 117.57514155762516 31.249647494169494 31.74964052100247
-201.243 117.57514155762516 118.16155540592516 31.249647494169494 31.74964052100247
-202.243 118.16155540592516 118.74796925422517 31.249647494169494 31.74964052100247
-203.243 118.74796925422517 119.33438310252515 31.249647494169494 31.74964052100247
-204.243 119.33438310252515 119.92079695082515 31.249647494169494 31.74964052100247
-205.243 119.92079695082515 120.50721079912518 31.249647494169494 31.74964052100247
-206.243 120.50721079912518 121.09362464742516 31.249647494169494 31.74964052100247
-207.243 121.09362464742516 121.68003849577516 31.249647494169494 31.74964052100247
-208.243 121.68003849577516 122.26645234412517 31.249647494169494 31.74964052100247
-209.243 122.26645234412517 122.85286619242518 31.249647494169494 31.74964052100247
-210.243 122.85286619242518 123.43928004072517 31.249647494169494 31.74964052100247
-211.243 123.43928004072517 124.02569388902516 31.249647494169494 31.74964052100247
-212.243 124.02569388902516 124.61210773732515 31.249647494169494 31.74964052100247
-213.243 124.61210773732515 125.19852158562516 31.249647494169494 31.74964052100247
-214.243 125.19852158562516 125.78493543392516 31.249647494169494 31.74964052100247
-215.243 125.78493543392516 126.37134928222517 31.249647494169494 31.74964052100247
-216.243 126.37134928222517 126.95776313052517 31.249647494169494 31.74964052100247
-217.243 126.95776313052517 127.54417697882515 31.249647494169494 31.74964052100247
-218.243 127.54417697882515 128.13059082712516 31.249647494169494 31.74964052100247
-219.243 128.13059082712516 128.7170046754252 31.249647494169494 31.74964052100247
-220.243 128.7170046754252 129.30341852372518 31.249647494169494 31.74964052100247
-221.243 129.30341852372518 129.88983237207515 31.249647494169494 31.74964052100247
-222.243 129.88983237207515 130.47624622042514 31.249647494169494 31.74964052100247
-223.243 130.47624622042514 131.06266006872517 31.249647494169494 31.74964052100247
-224.243 131.06266006872517 131.64907391702516 31.249647494169494 31.74964052100247
-225.243 131.64907391702516 132.2354877653252 31.249647494169494 31.74964052100247
-226.243 132.2354877653252 132.8219016136252 31.249647494169494 31.74964052100247
-227.243 132.8219016136252 133.40831546192516 31.249647494169494 31.74964052100247
-228.243 133.40831546192516 133.99472931022518 31.249647494169494 31.74964052100247
-229.243 133.99472931022518 134.58114315852518 31.249647494169494 31.74964052100247
-230.243 134.58114315852518 135.16755700682518 31.249647494169494 31.74964052100247
-231.243 135.16755700682518 135.75397085512515 31.249647494169494 31.74964052100247
-232.243 135.75397085512515 136.34038470342514 31.249647494169494 31.74964052100247
-233.243 136.34038470342514 136.92679855172514 31.249647494169494 31.74964052100247
-234.243 136.92679855172514 137.51321240002517 31.249647494169494 31.74964052100247
-235.243 137.51321240002517 138.09962624837516 31.249647494169494 31.74964052100247
-236.243 138.09962624837516 138.68604009672515 31.249647494169494 31.74964052100247
-237.243 138.68604009672515 139.27245394502518 31.249647494169494 31.74964052100247
-238.243 139.27245394502518 139.85886779332517 31.249647494169494 31.74964052100247
-239.243 139.85886779332517 140.44528164162517 31.249647494169494 31.74964052100247
-240.243 140.44528164162517 141.03169548992514 31.249647494169494 31.74964052100247
-241.243 141.03169548992514 141.61810933822517 31.249647494169494 31.74964052100247
-242.243 141.61810933822517 142.20452318652517 31.249647494169494 31.74964052100247
-243.243 142.20452318652517 142.79093703482516 31.249647494169494 31.74964052100247
-244.243 142.79093703482516 143.3773508831252 31.249647494169494 31.74964052100247
-245.243 143.3773508831252 143.9637647314252 31.249647494169494 31.74964052100247
-246.243 143.9637647314252 144.55017857972518 31.249647494169494 31.74964052100247
-247.243 144.55017857972518 145.13659242802515 31.249647494169494 31.74964052100247
-248.243 145.13659242802515 145.72300627632515 31.249647494169494 31.74964052100247
-249.243 145.72300627632515 146.30942012467514 31.249647494169494 31.74964052100247
-250.243 146.30942012467514 146.89583397302516 31.249647494169494 31.74964052100247
-251.243 146.89583397302516 147.4822478213252 31.249647494169494 31.74964052100247
-252.243 147.4822478213252 148.0686616696252 31.249647494169494 31.74964052100247
-253.243 148.0686616696252 148.65507551792518 31.249647494169494 31.74964052100247
-254.243 148.65507551792518 149.24148936622515 31.249647494169494 31.74964052100247
-255.243 149.24148936622515 149.82790321452518 31.249647494169494 31.74964052100247
-256.243 149.82790321452518 150.41431706282515 31.249647494169494 31.74964052100247
-257.243 150.41431706282515 151.00073091112517 31.249647494169494 31.74964052100247
-258.243 151.00073091112517 151.58714475942514 31.249647494169494 31.74964052100247
-259.243 151.58714475942514 152.17355860772517 31.249647494169494 31.74964052100247
-260.243 152.17355860772517 152.75997245602517 31.249647494169494 31.74964052100247
-261.243 152.75997245602517 153.34638630432516 31.249647494169494 31.74964052100247
-262.243 153.34638630432516 153.93280015262516 31.249647494169494 31.74964052100247
-263.243 153.93280015262516 154.5192140009252 31.249647494169494 31.74964052100247
-264.243 154.5192140009252 155.10562784927515 31.249647494169494 31.74964052100247
-265.243 155.10562784927515 155.69204169762517 31.249647494169494 31.74964052100247
-266.243 155.69204169762517 156.27845554592517 31.249647494169494 31.74964052100247
-267.243 156.27845554592517 156.86486939422514 31.249647494169494 31.74964052100247
-268.243 156.86486939422514 157.46067911504085 31.249647494169494 31.74964052100247
-272.243 159.20112891490948 159.79693863572516 31.249647494169494 31.74964052100247
-273.243 159.79693863572516 160.38335248402518 31.249647494169494 31.74964052100247
-274.243 160.38335248402518 160.96976633232518 31.249647494169494 31.74964052100247
-275.243 160.96976633232518 161.55618018062518 31.249647494169494 31.74964052100247
-276.243 161.55618018062518 162.14259402892515 31.249647494169494 31.74964052100247
-277.243 162.14259402892515 162.72900787722517 31.249647494169494 31.74964052100247
-278.243 162.72900787722517 163.31542172557516 31.249647494169494 31.74964052100247
-279.243 163.31542172557516 163.90183557392518 31.249647494169494 31.74964052100247
-280.243 163.90183557392518 164.48824942222518 31.249647494169494 31.74964052100247
-281.243 164.48824942222518 165.07466327052515 31.249647494169494 31.74964052100247
-282.243 165.07466327052515 165.66107711882518 31.249647494169494 31.74964052100247
-283.243 165.66107711882518 166.24749096712517 31.249647494169494 31.74964052100247
-284.243 166.24749096712517 166.83390481542517 31.249647494169494 31.74964052100247
-285.243 166.83390481542517 167.42031866372514 31.249647494169494 31.74964052100247
-286.243 167.42031866372514 168.00673251202517 31.249647494169494 31.74964052100247
-287.243 168.00673251202517 168.5931463603252 31.249647494169494 31.74964052100247
-288.243 168.5931463603252 169.17956020862516 31.249647494169494 31.74964052100247
-289.243 169.17956020862516 169.7659740569252 31.249647494169494 31.74964052100247
-290.243 169.7659740569252 170.35238790522519 31.249647494169494 31.74964052100247
-291.243 170.35238790522519 170.93880175352518 31.249647494169494 31.74964052100247
-292.243 170.93880175352518 171.52521560187517 31.249647494169494 31.74964052100247
-293.243 171.52521560187517 172.11162945022517 31.249647494169494 31.74964052100247
-294.243 172.11162945022517 172.6980432985252 31.249647494169494 31.74964052100247
-295.243 172.6980432985252 173.2844571468252 31.249647494169494 31.74964052100247
-296.243 173.2844571468252 173.8708709951252 31.249647494169494 31.74964052100247
-297.243 173.8708709951252 174.45728484342519 31.249647494169494 31.74964052100247
-298.243 174.45728484342519 175.04369869172518 31.249647494169494 31.74964052100247
-299.243 175.04369869172518 175.63011254002515 31.249647494169494 31.74964052100247
-300.243 175.63011254002515 176.21652638832518 31.249647494169494 31.74964052100247
-301.243 176.21652638832518 176.80294023662518 31.249647494169494 31.74964052100247
-302.243 176.80294023662518 177.38935408492517 31.249647494169494 31.74964052100247
-303.243 177.38935408492517 177.97576793322514 31.249647494169494 31.74964052100247
-304.243 177.97576793322514 178.56218178152517 31.249647494169494 31.74964052100247
-305.243 178.56218178152517 179.14859562982517 31.249647494169494 31.74964052100247
-306.243 179.14859562982517 179.7350094781752 31.249647494169494 31.74964052100247
-307.243 179.7350094781752 180.32142332652515 31.249647494169494 31.74964052100247
-308.243 180.32142332652515 180.90783717482515 31.249647494169494 31.74964052100247
-309.243 180.90783717482515 181.49425102312514 31.249647494169494 31.74964052100247
-310.243 181.49425102312514 182.08066487142514 31.249647494169494 31.74964052100247
-311.243 182.08066487142514 182.66707871972514 31.249647494169494 31.74964052100247
-312.243 182.66707871972514 183.25349256802514 31.249647494169494 31.74964052100247
-313.243 183.25349256802514 183.83990641632516 31.249647494169494 31.74964052100247
-314.243 183.83990641632516 184.42632026462516 31.249647494169494 31.74964052100247
-315.243 184.42632026462516 185.01273411292516 31.249647494169494 31.74964052100247
-316.243 185.01273411292516 185.59914796122516 31.249647494169494 31.74964052100247
-317.243 185.59914796122516 186.18556180952515 31.249647494169494 31.74964052100247
-318.243 186.18556180952515 186.77197565782515 31.249647494169494 31.74964052100247
-319.243 186.77197565782515 187.35838950612515 31.249647494169494 31.74964052100247
-320.243 187.35838950612515 187.94480335442515 31.249647494169494 31.74964052100247
-321.243 187.94480335442515 188.53121720277514 31.249647494169494 31.74964052100247
-322.243 188.53121720277514 189.11763105112516 31.249647494169494 31.74964052100247
-323.243 189.11763105112516 189.70404489942516 31.249647494169494 31.74964052100247
-324.243 189.70404489942516 190.29045874772515 31.249647494169494 31.74964052100247
-325.243 190.29045874772515 190.87687259602515 31.249647494169494 31.74964052100247
-326.243 190.87687259602515 191.46328644432515 31.249647494169494 31.74964052100247
-327.243 191.46328644432515 192.04970029262515 31.249647494169494 31.74964052100247
-328.243 192.04970029262515 192.63611414092514 31.249647494169494 31.74964052100247
-329.243 192.63611414092514 193.22252798922514 31.249647494169494 31.74964052100247
-330.243 193.22252798922514 193.80894183752514 31.249647494169494 31.74964052100247
-331.243 193.80894183752514 194.39535568582514 31.249647494169494 31.74964052100247
-332.243 194.39535568582514 194.98176953412514 31.249647494169494 31.74964052100247
-333.243 194.98176953412514 195.56818338242516 31.249647494169494 31.74964052100247
-334.243 195.56818338242516 196.15459723072516 31.249647494169494 31.74964052100247
-335.243 196.15459723072516 196.74101107907515 31.249647494169494 31.74964052100247
-336.243 196.74101107907515 197.32742492742514 31.249647494169494 31.74964052100247
-337.243 197.32742492742514 197.91383877572514 31.249647494169494 31.74964052100247
-338.243 197.91383877572514 198.50025262402514 31.249647494169494 31.74964052100247
-339.243 198.50025262402514 199.08666647232513 31.249647494169494 31.74964052100247
-340.243 199.08666647232513 199.67308032062516 31.249647494169494 31.74964052100247
-341.243 199.67308032062516 200.25949416892516 31.249647494169494 31.74964052100247
-342.243 200.25949416892516 200.84590801722516 31.249647494169494 31.74964052100247
-343.243 200.84590801722516 201.43232186552515 31.249647494169494 31.74964052100247
-344.243 201.43232186552515 202.01873571382515 31.249647494169494 31.74964052100247
-345.243 202.01873571382515 202.60514956212515 31.249647494169494 31.74964052100247
-346.243 202.60514956212515 203.19156341042515 31.249647494169494 31.74964052100247
-347.243 203.19156341042515 203.77797725872514 31.249647494169494 31.74964052100247
-348.243 203.77797725872514 204.36439110702514 31.249647494169494 31.74964052100247
-349.243 204.36439110702514 204.95080495537513 31.249647494169494 31.74964052100247
-350.243 204.95080495537513 205.53721880372515 31.249647494169494 31.74964052100247
-351.243 205.53721880372515 206.12363265202515 31.249647494169494 31.74964052100247
-352.243 206.12363265202515 206.71004650032515 31.249647494169494 31.74964052100247
-353.243 206.71004650032515 207.29646034862515 31.249647494169494 31.74964052100247
-354.243 207.29646034862515 207.88287419692514 31.249647494169494 31.74964052100247
-355.243 207.88287419692514 208.47868391774085 31.249647494169494 31.74964052100247
-393.243 230.15720456010945 230.75301428092516 31.249647494169494 31.74964052100247
-394.243 230.75301428092516 231.33942812922513 31.249647494169494 31.74964052100247
-395.243 231.33942812922513 231.92584197752512 31.249647494169494 31.74964052100247
-396.243 231.92584197752512 232.51225582582515 31.249647494169494 31.74964052100247
-397.243 232.51225582582515 233.09866967412518 31.249647494169494 31.74964052100247
-398.243 233.09866967412518 233.68508352242515 31.249647494169494 31.74964052100247
-399.243 233.68508352242515 234.27149737072514 31.249647494169494 31.74964052100247
-400.243 234.27149737072514 234.85791121902514 31.249647494169494 31.74964052100247
-401.243 234.85791121902514 235.4443250673251 31.249647494169494 31.74964052100247
-402.243 235.4443250673251 236.03073891562516 31.249647494169494 31.74964052100247
-403.243 236.03073891562516 236.61715276392516 31.249647494169494 31.74964052100247
-404.243 236.61715276392516 237.20356661222516 31.249647494169494 31.74964052100247
-405.243 237.20356661222516 237.78998046052516 31.249647494169494 31.74964052100247
-406.243 237.78998046052516 238.37639430887515 31.249647494169494 31.74964052100247
-407.243 238.37639430887515 238.96280815722514 31.249647494169494 31.74964052100247
-408.243 238.96280815722514 239.5492220055251 31.249647494169494 31.74964052100247
-409.243 239.5492220055251 240.13563585382514 31.249647494169494 31.74964052100247
-410.243 240.13563585382514 240.72204970212516 31.249647494169494 31.74964052100247
-411.243 240.72204970212516 241.30846355042513 31.249647494169494 31.74964052100247
-412.243 241.30846355042513 241.89487739872516 31.249647494169494 31.74964052100247
-413.243 241.89487739872516 242.48129124702515 31.249647494169494 31.74964052100247
-414.243 242.48129124702515 243.06770509532515 31.249647494169494 31.74964052100247
-415.243 243.06770509532515 243.65411894362518 31.249647494169494 31.74964052100247
-416.243 243.65411894362518 244.24053279192515 31.249647494169494 31.74964052100247
-417.243 244.24053279192515 244.82694664022515 31.249647494169494 31.74964052100247
-418.243 244.82694664022515 245.41336048852514 31.249647494169494 31.74964052100247
-419.243 245.41336048852514 245.9997743368251 31.249647494169494 31.74964052100247
-420.243 245.9997743368251 246.58618818517516 31.249647494169494 31.74964052100247
-421.243 246.58618818517516 247.17260203352515 31.249647494169494 31.74964052100247
-422.243 247.17260203352515 247.75901588182512 31.249647494169494 31.74964052100247
-423.243 247.75901588182512 248.34542973012515 31.249647494169494 31.74964052100247
-424.243 248.34542973012515 248.93184357842514 31.249647494169494 31.74964052100247
-425.243 248.93184357842514 249.51825742672514 31.249647494169494 31.74964052100247
-426.243 249.51825742672514 250.1046712750251 31.249647494169494 31.74964052100247
-427.243 250.1046712750251 250.69108512332514 31.249647494169494 31.74964052100247
-428.243 250.69108512332514 251.27749897162516 31.249647494169494 31.74964052100247
-429.243 251.27749897162516 251.86391281992513 31.249647494169494 31.74964052100247
-430.243 251.86391281992513 252.45032666822516 31.249647494169494 31.74964052100247
-431.243 252.45032666822516 253.03674051652516 31.249647494169494 31.74964052100247
-432.243 253.03674051652516 253.62315436482515 31.249647494169494 31.74964052100247
-433.243 253.62315436482515 254.20956821312518 31.249647494169494 31.74964052100247
-434.243 254.20956821312518 254.79598206142515 31.249647494169494 31.74964052100247
-435.243 254.79598206142515 255.38239590977514 31.249647494169494 31.74964052100247
-436.243 255.38239590977514 255.96880975812513 31.249647494169494 31.74964052100247
-437.243 255.96880975812513 256.5552236064251 31.249647494169494 31.74964052100247
-438.243 256.5552236064251 257.1416374547251 31.249647494169494 31.74964052100247
-439.243 257.1416374547251 257.72805130302515 31.249647494169494 31.74964052100247
-440.243 257.72805130302515 258.3144651513251 31.249647494169494 31.74964052100247
-441.243 258.3144651513251 258.9008789996251 31.249647494169494 31.74964052100247
-442.243 258.9008789996251 259.4872928479251 31.249647494169494 31.74964052100247
-443.243 259.4872928479251 260.07370669622514 31.249647494169494 31.74964052100247
-444.243 260.07370669622514 260.66012054452517 31.249647494169494 31.74964052100247
-445.243 260.66012054452517 261.2465343928252 31.249647494169494 31.74964052100247
-446.243 261.2465343928252 261.83294824112517 31.249647494169494 31.74964052100247
-447.243 261.83294824112517 262.41936208942514 31.249647494169494 31.74964052100247
-448.243 262.41936208942514 263.00577593772516 31.249647494169494 31.74964052100247
-449.243 263.00577593772516 263.59218978607515 31.249647494169494 31.74964052100247
-450.243 263.59218978607515 264.17860363442514 31.249647494169494 31.74964052100247
-451.243 264.17860363442514 264.76501748272517 31.249647494169494 31.74964052100247
-452.243 264.76501748272517 265.35143133102514 31.249647494169494 31.74964052100247
-453.243 265.35143133102514 265.9378451793251 31.249647494169494 31.74964052100247
-454.243 265.9378451793251 266.52425902762513 31.249647494169494 31.74964052100247
-455.243 266.52425902762513 267.11067287592516 31.249647494169494 31.74964052100247
-456.243 267.11067287592516 267.6970867242252 31.249647494169494 31.74964052100247
-457.243 267.6970867242252 268.2835005725251 31.249647494169494 31.74964052100247
-458.243 268.2835005725251 268.8699144208251 31.249647494169494 31.74964052100247
-459.243 268.8699144208251 269.45632826912515 31.249647494169494 31.74964052100247
-460.243 269.45632826912515 270.0427421174252 31.249647494169494 31.74964052100247
-461.243 270.0427421174252 270.6385518382409 31.249647494169494 31.74964052100247
-581.243 340.4030080418094 340.99881776262515 31.249647494169494 31.74964052100247
-582.243 340.99881776262515 341.5852316109252 31.249647494169494 31.74964052100247
-583.243 341.5852316109252 342.17164545922515 31.249647494169494 31.74964052100247
-584.243 342.17164545922515 342.7580593075252 31.249647494169494 31.74964052100247
-585.243 342.7580593075252 343.3444731558252 31.249647494169494 31.74964052100247
-586.243 343.3444731558252 343.9308870041251 31.249647494169494 31.74964052100247
-587.243 343.9308870041251 344.51730085242514 31.249647494169494 31.74964052100247
-588.243 344.51730085242514 345.10371470072516 31.249647494169494 31.74964052100247
-589.243 345.10371470072516 345.6901285490252 31.249647494169494 31.74964052100247
-590.243 345.6901285490252 346.27654239732516 31.249647494169494 31.74964052100247
-591.243 346.27654239732516 346.86295624567515 31.249647494169494 31.74964052100247
-592.243 346.86295624567515 347.4493700940252 31.249647494169494 31.74964052100247
-593.243 347.4493700940252 348.0357839423251 31.249647494169494 31.74964052100247
-594.243 348.0357839423251 348.62219779062514 31.249647494169494 31.74964052100247
-595.243 348.62219779062514 349.20861163892516 31.249647494169494 31.74964052100247
-596.243 349.20861163892516 349.79502548722513 31.249647494169494 31.74964052100247
-597.243 349.79502548722513 350.38143933552516 31.249647494169494 31.74964052100247
-598.243 350.38143933552516 350.9678531838251 31.249647494169494 31.74964052100247
-599.243 350.9678531838251 351.55426703212515 31.249647494169494 31.74964052100247
-600.243 351.55426703212515 352.1406808804252 31.249647494169494 31.74964052100247
-601.243 352.1406808804252 352.7270947287251 31.249647494169494 31.74964052100247
-602.243 352.7270947287251 353.3135085770252 31.249647494169494 31.74964052100247
-603.243 353.3135085770252 353.89992242532514 31.249647494169494 31.74964052100247
-604.243 353.89992242532514 354.48633627362517 31.249647494169494 31.74964052100247
-605.243 354.48633627362517 355.0727501219252 31.249647494169494 31.74964052100247
-606.243 355.0727501219252 355.65916397027513 31.249647494169494 31.74964052100247
-607.243 355.65916397027513 356.2455778186252 31.249647494169494 31.74964052100247
-608.243 356.2455778186252 356.8319916669252 31.249647494169494 31.74964052100247
-609.243 356.8319916669252 357.4184055152251 31.249647494169494 31.74964052100247
-610.243 357.4184055152251 358.00481936352514 31.249647494169494 31.74964052100247
-611.243 358.00481936352514 358.59123321182517 31.249647494169494 31.74964052100247
-612.243 358.59123321182517 359.1776470601252 31.249647494169494 31.74964052100247
-613.243 359.1776470601252 359.73500947817513 31.249647494169494 31.74964052100247
-000.243 359.73500947817513 0.29237189622515947 31.249647494169494 31.74964052100247
-001.244 0.29393851718269515 0.8835277188826951 31.74964052100247 32.24963347211302
-002.244 0.8835277188826951 1.473116920532695 31.74964052100247 32.24963347211302
-003.244 1.473116920532695 2.062706122182695 31.74964052100247 32.24963347211302
-004.244 2.062706122182695 2.652295323882695 31.74964052100247 32.24963347211302
-005.244 2.652295323882695 3.241884525582695 31.74964052100247 32.24963347211302
-006.244 3.241884525582695 3.8314737272826953 31.74964052100247 32.24963347211302
-007.244 3.8314737272826953 4.421062928932695 31.74964052100247 32.24963347211302
-008.244 4.421062928932695 5.010652130582695 31.74964052100247 32.24963347211302
-009.244 5.010652130582695 5.600241332282696 31.74964052100247 32.24963347211302
-010.244 5.600241332282696 6.189830533982695 31.74964052100247 32.24963347211302
-011.244 6.189830533982695 6.779419735682695 31.74964052100247 32.24963347211302
-012.244 6.779419735682695 7.369008937382695 31.74964052100247 32.24963347211302
-013.244 7.369008937382695 7.958598139032695 31.74964052100247 32.24963347211302
-014.244 7.958598139032695 8.548187340682695 31.74964052100247 32.24963347211302
-015.244 8.548187340682695 9.137776542382696 31.74964052100247 32.24963347211302
-016.244 9.137776542382696 9.727365744082695 31.74964052100247 32.24963347211302
-017.244 9.727365744082695 10.316954945782694 31.74964052100247 32.24963347211302
-018.244 10.316954945782694 10.906544147432694 31.74964052100247 32.24963347211302
-019.244 10.906544147432694 11.496133349082694 31.74964052100247 32.24963347211302
-020.244 11.496133349082694 12.085722550782696 31.74964052100247 32.24963347211302
-021.244 12.085722550782696 12.675311752482694 31.74964052100247 32.24963347211302
-022.244 12.675311752482694 13.264900954182696 31.74964052100247 32.24963347211302
-023.244 13.264900954182696 13.854490155832694 31.74964052100247 32.24963347211302
-024.244 13.854490155832694 14.444079357482696 31.74964052100247 32.24963347211302
-025.244 14.444079357482696 15.033668559182697 31.74964052100247 32.24963347211302
-026.244 15.033668559182697 15.623257760882694 31.74964052100247 32.24963347211302
-027.244 15.623257760882694 16.212846962582695 31.74964052100247 32.24963347211302
-028.244 16.212846962582695 16.802436164282696 31.74964052100247 32.24963347211302
-029.244 16.802436164282696 17.392025365932696 31.74964052100247 32.24963347211302
-030.244 17.392025365932696 17.981614567582696 31.74964052100247 32.24963347211302
-031.244 17.981614567582696 18.571203769282693 31.74964052100247 32.24963347211302
-032.244 18.571203769282693 19.160792970982694 31.74964052100247 32.24963347211302
-033.244 19.160792970982694 19.7503821726827 31.74964052100247 32.24963347211302
-034.244 19.7503821726827 20.339971374332695 31.74964052100247 32.24963347211302
-035.244 20.339971374332695 20.9295605759827 31.74964052100247 32.24963347211302
-036.244 20.9295605759827 21.519149777682692 31.74964052100247 32.24963347211302
-037.244 21.519149777682692 22.108738979382696 31.74964052100247 32.24963347211302
-038.244 22.108738979382696 22.6983281810827 31.74964052100247 32.24963347211302
-039.244 22.6983281810827 23.287917382732694 31.74964052100247 32.24963347211302
-040.244 23.287917382732694 23.877506584382694 31.74964052100247 32.24963347211302
-041.244 23.877506584382694 24.467095786082687 31.74964052100247 32.24963347211302
-042.244 24.467095786082687 25.056684987782695 31.74964052100247 32.24963347211302
-043.244 25.056684987782695 25.646274189482696 31.74964052100247 32.24963347211302
-044.244 25.646274189482696 26.235863391132696 31.74964052100247 32.24963347211302
-045.244 26.235863391132696 26.825452592782696 31.74964052100247 32.24963347211302
-046.244 26.825452592782696 27.415041794482697 31.74964052100247 32.24963347211302
-047.244 27.415041794482697 28.00463099618269 31.74964052100247 32.24963347211302
-048.244 28.00463099618269 28.594220197882695 31.74964052100247 32.24963347211302
-049.244 28.594220197882695 29.183809399582692 31.74964052100247 32.24963347211302
-050.244 29.183809399582692 29.7733986012327 31.74964052100247 32.24963347211302
-051.244 29.7733986012327 30.3629878028827 31.74964052100247 32.24963347211302
-052.244 30.3629878028827 30.952577004582693 31.74964052100247 32.24963347211302
-053.244 30.952577004582693 31.542166206282687 31.74964052100247 32.24963347211302
-054.244 31.542166206282687 32.131755407982695 31.74964052100247 32.24963347211302
-055.244 32.131755407982695 32.721344609632695 31.74964052100247 32.24963347211302
-056.244 32.721344609632695 33.310933811282695 31.74964052100247 32.24963347211302
-057.244 33.310933811282695 33.9005230129827 31.74964052100247 32.24963347211302
-058.244 33.9005230129827 34.490112214682696 31.74964052100247 32.24963347211302
-059.244 34.490112214682696 35.0797014163827 31.74964052100247 32.24963347211302
-060.244 35.0797014163827 35.669290618032704 31.74964052100247 32.24963347211302
-061.244 35.669290618032704 36.2588798196827 31.74964052100247 32.24963347211302
-062.244 36.2588798196827 36.8484690213827 31.74964052100247 32.24963347211302
-063.244 36.8484690213827 37.4380582230827 31.74964052100247 32.24963347211302
-064.244 37.4380582230827 38.03709423612321 31.74964052100247 32.24963347211302
-195.244 114.6647968319422 115.2638328449827 31.74964052100247 32.24963347211302
-196.244 115.2638328449827 115.8534220466827 31.74964052100247 32.24963347211302
-197.244 115.8534220466827 116.44301124833271 31.74964052100247 32.24963347211302
-198.244 116.44301124833271 117.03260044998271 31.74964052100247 32.24963347211302
-199.244 117.03260044998271 117.6221896516827 31.74964052100247 32.24963347211302
-200.244 117.6221896516827 118.2117788533827 31.74964052100247 32.24963347211302
-201.244 118.2117788533827 118.80136805508272 31.74964052100247 32.24963347211302
-202.244 118.80136805508272 119.3909572567827 31.74964052100247 32.24963347211302
-203.244 119.3909572567827 119.9805464584327 31.74964052100247 32.24963347211302
-204.244 119.9805464584327 120.57013566008268 31.74964052100247 32.24963347211302
-205.244 120.57013566008268 121.15972486178268 31.74964052100247 32.24963347211302
-206.244 121.15972486178268 121.7493140634827 31.74964052100247 32.24963347211302
-207.244 121.7493140634827 122.3389032651827 31.74964052100247 32.24963347211302
-208.244 122.3389032651827 122.9284924668327 31.74964052100247 32.24963347211302
-209.244 122.9284924668327 123.5180816684827 31.74964052100247 32.24963347211302
-210.244 123.5180816684827 124.1076708701827 31.74964052100247 32.24963347211302
-211.244 124.1076708701827 124.6972600718827 31.74964052100247 32.24963347211302
-212.244 124.6972600718827 125.28684927358269 31.74964052100247 32.24963347211302
-213.244 125.28684927358269 125.8764384752327 31.74964052100247 32.24963347211302
-214.244 125.8764384752327 126.4660276768827 31.74964052100247 32.24963347211302
-215.244 126.4660276768827 127.0556168785827 31.74964052100247 32.24963347211302
-216.244 127.0556168785827 127.64520608028269 31.74964052100247 32.24963347211302
-217.244 127.64520608028269 128.2347952819827 31.74964052100247 32.24963347211302
-218.244 128.2347952819827 128.82438448363268 31.74964052100247 32.24963347211302
-219.244 128.82438448363268 129.4139736852827 31.74964052100247 32.24963347211302
-220.244 129.4139736852827 130.00356288698268 31.74964052100247 32.24963347211302
-221.244 130.00356288698268 130.5931520886827 31.74964052100247 32.24963347211302
-222.244 130.5931520886827 131.1827412903827 31.74964052100247 32.24963347211302
-223.244 131.1827412903827 131.7723304920827 31.74964052100247 32.24963347211302
-224.244 131.7723304920827 132.36191969373272 31.74964052100247 32.24963347211302
-225.244 132.36191969373272 132.9515088953827 31.74964052100247 32.24963347211302
-226.244 132.9515088953827 133.54109809708268 31.74964052100247 32.24963347211302
-227.244 133.54109809708268 134.13068729878268 31.74964052100247 32.24963347211302
-228.244 134.13068729878268 134.7202765004827 31.74964052100247 32.24963347211302
-229.244 134.7202765004827 135.3098657021327 31.74964052100247 32.24963347211302
-230.244 135.3098657021327 135.8994549037827 31.74964052100247 32.24963347211302
-231.244 135.8994549037827 136.48904410548272 31.74964052100247 32.24963347211302
-232.244 136.48904410548272 137.0786333071827 31.74964052100247 32.24963347211302
-233.244 137.0786333071827 137.6682225088827 31.74964052100247 32.24963347211302
-234.244 137.6682225088827 138.25781171053268 31.74964052100247 32.24963347211302
-235.244 138.25781171053268 138.8474009121827 31.74964052100247 32.24963347211302
-236.244 138.8474009121827 139.4369901138827 31.74964052100247 32.24963347211302
-237.244 139.4369901138827 140.0265793155827 31.74964052100247 32.24963347211302
-238.244 140.0265793155827 140.6161685172827 31.74964052100247 32.24963347211302
-239.244 140.6161685172827 141.20575771898268 31.74964052100247 32.24963347211302
-240.244 141.20575771898268 141.7953469206327 31.74964052100247 32.24963347211302
-241.244 141.7953469206327 142.38493612228268 31.74964052100247 32.24963347211302
-242.244 142.38493612228268 142.97452532398268 31.74964052100247 32.24963347211302
-243.244 142.97452532398268 143.5641145256827 31.74964052100247 32.24963347211302
-244.244 143.5641145256827 144.15370372738272 31.74964052100247 32.24963347211302
-245.244 144.15370372738272 144.74329292903272 31.74964052100247 32.24963347211302
-246.244 144.74329292903272 145.33288213068272 31.74964052100247 32.24963347211302
-247.244 145.33288213068272 145.9224713323827 31.74964052100247 32.24963347211302
-248.244 145.9224713323827 146.5120605340827 31.74964052100247 32.24963347211302
-249.244 146.5120605340827 147.1016497357827 31.74964052100247 32.24963347211302
-250.244 147.1016497357827 147.6912389374327 31.74964052100247 32.24963347211302
-251.244 147.6912389374327 148.2808281390827 31.74964052100247 32.24963347211302
-252.244 148.2808281390827 148.8704173407827 31.74964052100247 32.24963347211302
-253.244 148.8704173407827 149.4600065424827 31.74964052100247 32.24963347211302
-254.244 149.4600065424827 150.04959574418268 31.74964052100247 32.24963347211302
-255.244 150.04959574418268 150.63918494583265 31.74964052100247 32.24963347211302
-256.244 150.63918494583265 151.22877414748268 31.74964052100247 32.24963347211302
-257.244 151.22877414748268 151.81836334918268 31.74964052100247 32.24963347211302
-258.244 151.81836334918268 152.4079525508827 31.74964052100247 32.24963347211302
-259.244 152.4079525508827 152.99754175258272 31.74964052100247 32.24963347211302
-260.244 152.99754175258272 153.5871309542827 31.74964052100247 32.24963347211302
-261.244 153.5871309542827 154.1767201559327 31.74964052100247 32.24963347211302
-262.244 154.1767201559327 154.7663093575827 31.74964052100247 32.24963347211302
-263.244 154.7663093575827 155.3558985592827 31.74964052100247 32.24963347211302
-264.244 155.3558985592827 155.9454877609827 31.74964052100247 32.24963347211302
-265.244 155.9454877609827 156.5350769626827 31.74964052100247 32.24963347211302
-266.244 156.5350769626827 157.13411297572324 31.74964052100247 32.24963347211302
-270.244 158.8839869580422 159.48302297108268 31.74964052100247 32.24963347211302
-271.244 159.48302297108268 160.07261217273268 31.74964052100247 32.24963347211302
-272.244 160.07261217273268 160.66220137438268 31.74964052100247 32.24963347211302
-273.244 160.66220137438268 161.2517905760827 31.74964052100247 32.24963347211302
-274.244 161.2517905760827 161.84137977778272 31.74964052100247 32.24963347211302
-275.244 161.84137977778272 162.4309689794827 31.74964052100247 32.24963347211302
-276.244 162.4309689794827 163.0205581811827 31.74964052100247 32.24963347211302
-277.244 163.0205581811827 163.6101473828327 31.74964052100247 32.24963347211302
-278.244 163.6101473828327 164.1997365844827 31.74964052100247 32.24963347211302
-279.244 164.1997365844827 164.7893257861827 31.74964052100247 32.24963347211302
-280.244 164.7893257861827 165.37891498788272 31.74964052100247 32.24963347211302
-281.244 165.37891498788272 165.9685041895827 31.74964052100247 32.24963347211302
-282.244 165.9685041895827 166.55809339123272 31.74964052100247 32.24963347211302
-283.244 166.55809339123272 167.1476825928827 31.74964052100247 32.24963347211302
-284.244 167.1476825928827 167.73727179458268 31.74964052100247 32.24963347211302
-285.244 167.73727179458268 168.32686099628268 31.74964052100247 32.24963347211302
-286.244 168.32686099628268 168.9164501979827 31.74964052100247 32.24963347211302
-287.244 168.9164501979827 169.5060393996327 31.74964052100247 32.24963347211302
-288.244 169.5060393996327 170.0956286012827 31.74964052100247 32.24963347211302
-289.244 170.0956286012827 170.68521780298272 31.74964052100247 32.24963347211302
-290.244 170.68521780298272 171.2748070046827 31.74964052100247 32.24963347211302
-291.244 171.2748070046827 171.8643962063827 31.74964052100247 32.24963347211302
-292.244 171.8643962063827 172.45398540803268 31.74964052100247 32.24963347211302
-293.244 172.45398540803268 173.0435746096827 31.74964052100247 32.24963347211302
-294.244 173.0435746096827 173.6331638113827 31.74964052100247 32.24963347211302
-295.244 173.6331638113827 174.2227530130827 31.74964052100247 32.24963347211302
-296.244 174.2227530130827 174.81234221478272 31.74964052100247 32.24963347211302
-297.244 174.81234221478272 175.40193141648268 31.74964052100247 32.24963347211302
-298.244 175.40193141648268 175.9915206181327 31.74964052100247 32.24963347211302
-299.244 175.9915206181327 176.58110981978268 31.74964052100247 32.24963347211302
-300.244 176.58110981978268 177.17069902148268 31.74964052100247 32.24963347211302
-301.244 177.17069902148268 177.7602882231827 31.74964052100247 32.24963347211302
-302.244 177.7602882231827 178.3498774248827 31.74964052100247 32.24963347211302
-303.244 178.3498774248827 178.9394666265327 31.74964052100247 32.24963347211302
-304.244 178.9394666265327 179.52905582818272 31.74964052100247 32.24963347211302
-305.244 179.52905582818272 180.11864502988269 31.74964052100247 32.24963347211302
-306.244 180.11864502988269 180.70823423158268 31.74964052100247 32.24963347211302
-307.244 180.70823423158268 181.2978234332827 31.74964052100247 32.24963347211302
-308.244 181.2978234332827 181.88741263493267 31.74964052100247 32.24963347211302
-309.244 181.88741263493267 182.4770018365827 31.74964052100247 32.24963347211302
-310.244 182.4770018365827 183.0665910382827 31.74964052100247 32.24963347211302
-311.244 183.0665910382827 183.6561802399827 31.74964052100247 32.24963347211302
-312.244 183.6561802399827 184.24576944168268 31.74964052100247 32.24963347211302
-313.244 184.24576944168268 184.8353586433327 31.74964052100247 32.24963347211302
-314.244 184.8353586433327 185.42494784498268 31.74964052100247 32.24963347211302
-315.244 185.42494784498268 186.01453704668268 31.74964052100247 32.24963347211302
-316.244 186.01453704668268 186.60412624838267 31.74964052100247 32.24963347211302
-317.244 186.60412624838267 187.1937154500827 31.74964052100247 32.24963347211302
-318.244 187.1937154500827 187.7833046517827 31.74964052100247 32.24963347211302
-319.244 187.7833046517827 188.37289385343269 31.74964052100247 32.24963347211302
-320.244 188.37289385343269 188.96248305508269 31.74964052100247 32.24963347211302
-321.244 188.96248305508269 189.5520722567827 31.74964052100247 32.24963347211302
-322.244 189.5520722567827 190.1416614584827 31.74964052100247 32.24963347211302
-323.244 190.1416614584827 190.7312506601827 31.74964052100247 32.24963347211302
-324.244 190.7312506601827 191.3208398618327 31.74964052100247 32.24963347211302
-325.244 191.3208398618327 191.9104290634827 31.74964052100247 32.24963347211302
-326.244 191.9104290634827 192.5000182651827 31.74964052100247 32.24963347211302
-327.244 192.5000182651827 193.08960746688268 31.74964052100247 32.24963347211302
-328.244 193.08960746688268 193.67919666858268 31.74964052100247 32.24963347211302
-329.244 193.67919666858268 194.2687858702327 31.74964052100247 32.24963347211302
-330.244 194.2687858702327 194.85837507188268 31.74964052100247 32.24963347211302
-331.244 194.85837507188268 195.44796427358267 31.74964052100247 32.24963347211302
-332.244 195.44796427358267 196.03755347528266 31.74964052100247 32.24963347211302
-333.244 196.03755347528266 196.6271426769827 31.74964052100247 32.24963347211302
-334.244 196.6271426769827 197.21673187868265 31.74964052100247 32.24963347211302
-335.244 197.21673187868265 197.80632108033268 31.74964052100247 32.24963347211302
-336.244 197.80632108033268 198.39591028198268 31.74964052100247 32.24963347211302
-337.244 198.39591028198268 198.9854994836827 31.74964052100247 32.24963347211302
-338.244 198.9854994836827 199.5750886853827 31.74964052100247 32.24963347211302
-339.244 199.5750886853827 200.1646778870827 31.74964052100247 32.24963347211302
-340.244 200.1646778870827 200.7542670887327 31.74964052100247 32.24963347211302
-341.244 200.7542670887327 201.3438562903827 31.74964052100247 32.24963347211302
-342.244 201.3438562903827 201.93344549208268 31.74964052100247 32.24963347211302
-343.244 201.93344549208268 202.52303469378268 31.74964052100247 32.24963347211302
-344.244 202.52303469378268 203.11262389548267 31.74964052100247 32.24963347211302
-345.244 203.11262389548267 203.70221309713267 31.74964052100247 32.24963347211302
-346.244 203.70221309713267 204.29180229878267 31.74964052100247 32.24963347211302
-347.244 204.29180229878267 204.8813915004827 31.74964052100247 32.24963347211302
-348.244 204.8813915004827 205.4709807021827 31.74964052100247 32.24963347211302
-349.244 205.4709807021827 206.06056990388268 31.74964052100247 32.24963347211302
-350.244 206.06056990388268 206.65015910553268 31.74964052100247 32.24963347211302
-351.244 206.65015910553268 207.23974830718268 31.74964052100247 32.24963347211302
-352.244 207.23974830718268 207.82933750888267 31.74964052100247 32.24963347211302
-353.244 207.82933750888267 208.4189267105827 31.74964052100247 32.24963347211302
-354.244 208.4189267105827 209.01796272362319 31.74964052100247 32.24963347211302
-392.244 230.81386956314216 231.4129055761827 31.74964052100247 32.24963347211302
-393.244 231.4129055761827 232.0024947778327 31.74964052100247 32.24963347211302
-394.244 232.0024947778327 232.59208397948268 31.74964052100247 32.24963347211302
-395.244 232.59208397948268 233.18167318118265 31.74964052100247 32.24963347211302
-396.244 233.18167318118265 233.77126238288267 31.74964052100247 32.24963347211302
-397.244 233.77126238288267 234.36085158458266 31.74964052100247 32.24963347211302
-398.244 234.36085158458266 234.9504407862327 31.74964052100247 32.24963347211302
-399.244 234.9504407862327 235.5400299878827 31.74964052100247 32.24963347211302
-400.244 235.5400299878827 236.12961918958268 31.74964052100247 32.24963347211302
-401.244 236.12961918958268 236.71920839128268 31.74964052100247 32.24963347211302
-402.244 236.71920839128268 237.30879759298267 31.74964052100247 32.24963347211302
-403.244 237.30879759298267 237.89838679463267 31.74964052100247 32.24963347211302
-404.244 237.89838679463267 238.48797599628267 31.74964052100247 32.24963347211302
-405.244 238.48797599628267 239.07756519798266 31.74964052100247 32.24963347211302
-406.244 239.07756519798266 239.6671543996827 31.74964052100247 32.24963347211302
-407.244 239.6671543996827 240.2567436013827 31.74964052100247 32.24963347211302
-408.244 240.2567436013827 240.84633280303268 31.74964052100247 32.24963347211302
-409.244 240.84633280303268 241.43592200468265 31.74964052100247 32.24963347211302
-410.244 241.43592200468265 242.02551120638267 31.74964052100247 32.24963347211302
-411.244 242.02551120638267 242.61510040808267 31.74964052100247 32.24963347211302
-412.244 242.61510040808267 243.2046896097827 31.74964052100247 32.24963347211302
-413.244 243.2046896097827 243.79427881148268 31.74964052100247 32.24963347211302
-414.244 243.79427881148268 244.38386801313268 31.74964052100247 32.24963347211302
-415.244 244.38386801313268 244.97345721478268 31.74964052100247 32.24963347211302
-416.244 244.97345721478268 245.56304641648268 31.74964052100247 32.24963347211302
-417.244 245.56304641648268 246.1526356181827 31.74964052100247 32.24963347211302
-418.244 246.1526356181827 246.74222481988272 31.74964052100247 32.24963347211302
-419.244 246.74222481988272 247.3318140215327 31.74964052100247 32.24963347211302
-420.244 247.3318140215327 247.9214032231827 31.74964052100247 32.24963347211302
-421.244 247.9214032231827 248.51099242488272 31.74964052100247 32.24963347211302
-422.244 248.51099242488272 249.1005816265827 31.74964052100247 32.24963347211302
-423.244 249.1005816265827 249.69017082828265 31.74964052100247 32.24963347211302
-424.244 249.69017082828265 250.27976002993267 31.74964052100247 32.24963347211302
-425.244 250.27976002993267 250.8693492315827 31.74964052100247 32.24963347211302
-426.244 250.8693492315827 251.4589384332827 31.74964052100247 32.24963347211302
-427.244 251.4589384332827 252.0485276349827 31.74964052100247 32.24963347211302
-428.244 252.0485276349827 252.63811683668268 31.74964052100247 32.24963347211302
-429.244 252.63811683668268 253.2277060383327 31.74964052100247 32.24963347211302
-430.244 253.2277060383327 253.81729523998268 31.74964052100247 32.24963347211302
-431.244 253.81729523998268 254.40688444168268 31.74964052100247 32.24963347211302
-432.244 254.40688444168268 254.9964736433827 31.74964052100247 32.24963347211302
-433.244 254.9964736433827 255.5860628450827 31.74964052100247 32.24963347211302
-434.244 255.5860628450827 256.17565204678266 31.74964052100247 32.24963347211302
-435.244 256.17565204678266 256.7652412484327 31.74964052100247 32.24963347211302
-436.244 256.7652412484327 257.3548304500827 31.74964052100247 32.24963347211302
-437.244 257.3548304500827 257.94441965178265 31.74964052100247 32.24963347211302
-438.244 257.94441965178265 258.53400885348265 31.74964052100247 32.24963347211302
-439.244 258.53400885348265 259.1235980551827 31.74964052100247 32.24963347211302
-440.244 259.1235980551827 259.71318725683267 31.74964052100247 32.24963347211302
-441.244 259.71318725683267 260.30277645848264 31.74964052100247 32.24963347211302
-442.244 260.30277645848264 260.8923656601827 31.74964052100247 32.24963347211302
-443.244 260.8923656601827 261.48195486188274 31.74964052100247 32.24963347211302
-444.244 261.48195486188274 262.0715440635827 31.74964052100247 32.24963347211302
-445.244 262.0715440635827 262.6611332652327 31.74964052100247 32.24963347211302
-446.244 262.6611332652327 263.25072246688273 31.74964052100247 32.24963347211302
-447.244 263.25072246688273 263.84031166858273 31.74964052100247 32.24963347211302
-448.244 263.84031166858273 264.42990087028267 31.74964052100247 32.24963347211302
-449.244 264.42990087028267 265.01949007198266 31.74964052100247 32.24963347211302
-450.244 265.01949007198266 265.6090792736827 31.74964052100247 32.24963347211302
-451.244 265.6090792736827 266.1986684753327 31.74964052100247 32.24963347211302
-452.244 266.1986684753327 266.78825767698265 31.74964052100247 32.24963347211302
-453.244 266.78825767698265 267.3778468786827 31.74964052100247 32.24963347211302
-454.244 267.3778468786827 267.9674360803827 31.74964052100247 32.24963347211302
-455.244 267.9674360803827 268.55702528208263 31.74964052100247 32.24963347211302
-456.244 268.55702528208263 269.14661448373266 31.74964052100247 32.24963347211302
-457.244 269.14661448373266 269.7362036853827 31.74964052100247 32.24963347211302
-458.244 269.7362036853827 270.33523969842315 31.74964052100247 32.24963347211302
-579.244 341.0670502774422 341.66608629048267 31.74964052100247 32.24963347211302
-580.244 341.66608629048267 342.2556754921827 31.74964052100247 32.24963347211302
-581.244 342.2556754921827 342.8452646938827 31.74964052100247 32.24963347211302
-582.244 342.8452646938827 343.4348538955827 31.74964052100247 32.24963347211302
-583.244 343.4348538955827 344.0244430972326 31.74964052100247 32.24963347211302
-584.244 344.0244430972326 344.61403229888265 31.74964052100247 32.24963347211302
-585.244 344.61403229888265 345.2036215005827 31.74964052100247 32.24963347211302
-586.244 345.2036215005827 345.7932107022827 31.74964052100247 32.24963347211302
-587.244 345.7932107022827 346.3827999039827 31.74964052100247 32.24963347211302
-588.244 346.3827999039827 346.9723891056327 31.74964052100247 32.24963347211302
-589.244 346.9723891056327 347.56197830728274 31.74964052100247 32.24963347211302
-590.244 347.56197830728274 348.1515675089827 31.74964052100247 32.24963347211302
-591.244 348.1515675089827 348.74115671068273 31.74964052100247 32.24963347211302
-592.244 348.74115671068273 349.3307459123827 31.74964052100247 32.24963347211302
-593.244 349.3307459123827 349.9203351140327 31.74964052100247 32.24963347211302
-594.244 349.9203351140327 350.5099243156827 31.74964052100247 32.24963347211302
-595.244 350.5099243156827 351.0995135173827 31.74964052100247 32.24963347211302
-596.244 351.0995135173827 351.6891027190827 31.74964052100247 32.24963347211302
-597.244 351.6891027190827 352.27869192078265 31.74964052100247 32.24963347211302
-598.244 352.27869192078265 352.8682811224327 31.74964052100247 32.24963347211302
-599.244 352.8682811224327 353.4578703240827 31.74964052100247 32.24963347211302
-600.244 353.4578703240827 354.0474595257827 31.74964052100247 32.24963347211302
-601.244 354.0474595257827 354.63704872748264 31.74964052100247 32.24963347211302
-602.244 354.63704872748264 355.2266379291827 31.74964052100247 32.24963347211302
-603.244 355.2266379291827 355.81622713088274 31.74964052100247 32.24963347211302
-604.244 355.81622713088274 356.4058163325327 31.74964052100247 32.24963347211302
-605.244 356.4058163325327 356.99540553418274 31.74964052100247 32.24963347211302
-606.244 356.99540553418274 357.58499473588273 31.74964052100247 32.24963347211302
-607.244 357.58499473588273 358.1745839375827 31.74964052100247 32.24963347211302
-608.244 358.1745839375827 358.76417313928266 31.74964052100247 32.24963347211302
-609.244 358.76417313928266 359.3537623409327 31.74964052100247 32.24963347211302
-610.244 359.3537623409327 359.82385042903275 31.74964052100247 32.24963347211302
-000.244 359.82385042903275 0.29393851718269515 31.74964052100247 32.24963347211302
-001.245 0.295544643670109 0.8883891673701088 32.24963347211302 32.749626345169645
-002.245 0.8883891673701088 1.4812336911201092 32.24963347211302 32.749626345169645
-003.245 1.4812336911201092 2.074078214870109 32.24963347211302 32.749626345169645
-004.245 2.074078214870109 2.6669227385701086 32.24963347211302 32.749626345169645
-005.245 2.6669227385701086 3.259767262270109 32.24963347211302 32.749626345169645
-006.245 3.259767262270109 3.852611785970109 32.24963347211302 32.749626345169645
-007.245 3.852611785970109 4.445456309670109 32.24963347211302 32.749626345169645
-008.245 4.445456309670109 5.0383008334201085 32.24963347211302 32.749626345169645
-009.245 5.0383008334201085 5.631145357170109 32.24963347211302 32.749626345169645
-010.245 5.631145357170109 6.223989880870109 32.24963347211302 32.749626345169645
-011.245 6.223989880870109 6.81683440457011 32.24963347211302 32.749626345169645
-012.245 6.81683440457011 7.409678928270107 32.24963347211302 32.749626345169645
-013.245 7.409678928270107 8.00252345197011 32.24963347211302 32.749626345169645
-014.245 8.00252345197011 8.595367975720109 32.24963347211302 32.749626345169645
-015.245 8.595367975720109 9.188212499470108 32.24963347211302 32.749626345169645
-016.245 9.188212499470108 9.781057023170108 32.24963347211302 32.749626345169645
-017.245 9.781057023170108 10.373901546870108 32.24963347211302 32.749626345169645
-018.245 10.373901546870108 10.966746070570109 32.24963347211302 32.749626345169645
-019.245 10.966746070570109 11.559590594270109 32.24963347211302 32.749626345169645
-020.245 11.559590594270109 12.152435118020108 32.24963347211302 32.749626345169645
-021.245 12.152435118020108 12.74527964177011 32.24963347211302 32.749626345169645
-022.245 12.74527964177011 13.33812416547011 32.24963347211302 32.749626345169645
-023.245 13.33812416547011 13.930968689170111 32.24963347211302 32.749626345169645
-024.245 13.930968689170111 14.523813212870108 32.24963347211302 32.749626345169645
-025.245 14.523813212870108 15.116657736570108 32.24963347211302 32.749626345169645
-026.245 15.116657736570108 15.709502260320107 32.24963347211302 32.749626345169645
-027.245 15.709502260320107 16.30234678407011 32.24963347211302 32.749626345169645
-028.245 16.30234678407011 16.895191307770112 32.24963347211302 32.749626345169645
-029.245 16.895191307770112 17.488035831470114 32.24963347211302 32.749626345169645
-030.245 17.488035831470114 18.08088035517011 32.24963347211302 32.749626345169645
-031.245 18.08088035517011 18.67372487887011 32.24963347211302 32.749626345169645
-032.245 18.67372487887011 19.266569402620107 32.24963347211302 32.749626345169645
-033.245 19.266569402620107 19.85941392637011 32.24963347211302 32.749626345169645
-034.245 19.85941392637011 20.452258450070108 32.24963347211302 32.749626345169645
-035.245 20.452258450070108 21.045102973770106 32.24963347211302 32.749626345169645
-036.245 21.045102973770106 21.63794749747011 32.24963347211302 32.749626345169645
-037.245 21.63794749747011 22.230792021170107 32.24963347211302 32.749626345169645
-038.245 22.230792021170107 22.823636544920113 32.24963347211302 32.749626345169645
-039.245 22.823636544920113 23.41648106867011 32.24963347211302 32.749626345169645
-040.245 23.41648106867011 24.00932559237011 32.24963347211302 32.749626345169645
-041.245 24.00932559237011 24.60217011607011 32.24963347211302 32.749626345169645
-042.245 24.60217011607011 25.195014639770108 32.24963347211302 32.749626345169645
-043.245 25.195014639770108 25.78785916352011 32.24963347211302 32.749626345169645
-044.245 25.78785916352011 26.380703687270113 32.24963347211302 32.749626345169645
-045.245 26.380703687270113 26.973548210970108 32.24963347211302 32.749626345169645
-046.245 26.973548210970108 27.566392734670107 32.24963347211302 32.749626345169645
-047.245 27.566392734670107 28.15923725837011 32.24963347211302 32.749626345169645
-048.245 28.15923725837011 28.75208178207011 32.24963347211302 32.749626345169645
-049.245 28.75208178207011 29.34492630582011 32.24963347211302 32.749626345169645
-050.245 29.34492630582011 29.937770829570105 32.24963347211302 32.749626345169645
-051.245 29.937770829570105 30.530615353270115 32.24963347211302 32.749626345169645
-052.245 30.530615353270115 31.12345987697011 32.24963347211302 32.749626345169645
-053.245 31.12345987697011 31.716304400670108 32.24963347211302 32.749626345169645
-054.245 31.716304400670108 32.309148924370106 32.24963347211302 32.749626345169645
-055.245 32.309148924370106 32.90199344812011 32.24963347211302 32.749626345169645
-056.245 32.90199344812011 33.49483797187011 32.24963347211302 32.749626345169645
-057.245 33.49483797187011 34.087682495570114 32.24963347211302 32.749626345169645
-058.245 34.087682495570114 34.680527019270116 32.24963347211302 32.749626345169645
-059.245 34.680527019270116 35.27337154297011 32.24963347211302 32.749626345169645
-060.245 35.27337154297011 35.86621606667012 32.24963347211302 32.749626345169645
-061.245 35.86621606667012 36.45906059042011 32.24963347211302 32.749626345169645
-062.245 36.45906059042011 37.05190511417011 32.24963347211302 32.749626345169645
-063.245 37.05190511417011 37.65424867195229 32.24963347211302 32.749626345169645
-194.245 114.70503868698795 115.30738224477011 32.24963347211302 32.749626345169645
-195.245 115.30738224477011 115.9002267684701 32.24963347211302 32.749626345169645
-196.245 115.9002267684701 116.4930712922201 32.24963347211302 32.749626345169645
-197.245 116.4930712922201 117.0859158159701 32.24963347211302 32.749626345169645
-198.245 117.0859158159701 117.6787603396701 32.24963347211302 32.749626345169645
-199.245 117.6787603396701 118.2716048633701 32.24963347211302 32.749626345169645
-200.245 118.2716048633701 118.86444938707012 32.24963347211302 32.749626345169645
-201.245 118.86444938707012 119.45729391077012 32.24963347211302 32.749626345169645
-202.245 119.45729391077012 120.05013843452011 32.24963347211302 32.749626345169645
-203.245 120.05013843452011 120.64298295827011 32.24963347211302 32.749626345169645
-204.245 120.64298295827011 121.2358274819701 32.24963347211302 32.749626345169645
-205.245 121.2358274819701 121.8286720056701 32.24963347211302 32.749626345169645
-206.245 121.8286720056701 122.42151652937011 32.24963347211302 32.749626345169645
-207.245 122.42151652937011 123.0143610531201 32.24963347211302 32.749626345169645
-208.245 123.0143610531201 123.6072055768701 32.24963347211302 32.749626345169645
-209.245 123.6072055768701 124.20005010057011 32.24963347211302 32.749626345169645
-210.245 124.20005010057011 124.79289462427012 32.24963347211302 32.749626345169645
-211.245 124.79289462427012 125.38573914797013 32.24963347211302 32.749626345169645
-212.245 125.38573914797013 125.97858367167011 32.24963347211302 32.749626345169645
-213.245 125.97858367167011 126.57142819542011 32.24963347211302 32.749626345169645
-214.245 126.57142819542011 127.16427271917011 32.24963347211302 32.749626345169645
-215.245 127.16427271917011 127.75711724287011 32.24963347211302 32.749626345169645
-216.245 127.75711724287011 128.34996176657012 32.24963347211302 32.749626345169645
-217.245 128.34996176657012 128.9428062902701 32.24963347211302 32.749626345169645
-218.245 128.9428062902701 129.5356508139701 32.24963347211302 32.749626345169645
-219.245 129.5356508139701 130.1284953377201 32.24963347211302 32.749626345169645
-220.245 130.1284953377201 130.72133986147014 32.24963347211302 32.749626345169645
-221.245 130.72133986147014 131.3141843851701 32.24963347211302 32.749626345169645
-222.245 131.3141843851701 131.90702890887013 32.24963347211302 32.749626345169645
-223.245 131.90702890887013 132.4998734325701 32.24963347211302 32.749626345169645
-224.245 132.4998734325701 133.09271795627012 32.24963347211302 32.749626345169645
-225.245 133.09271795627012 133.6855624800201 32.24963347211302 32.749626345169645
-226.245 133.6855624800201 134.27840700377013 32.24963347211302 32.749626345169645
-227.245 134.27840700377013 134.87125152747012 32.24963347211302 32.749626345169645
-228.245 134.87125152747012 135.46409605117015 32.24963347211302 32.749626345169645
-229.245 135.46409605117015 136.0569405748701 32.24963347211302 32.749626345169645
-230.245 136.0569405748701 136.64978509857013 32.24963347211302 32.749626345169645
-231.245 136.64978509857013 137.24262962232012 32.24963347211302 32.749626345169645
-232.245 137.24262962232012 137.83547414607014 32.24963347211302 32.749626345169645
-233.245 137.83547414607014 138.42831866977014 32.24963347211302 32.749626345169645
-234.245 138.42831866977014 139.02116319347013 32.24963347211302 32.749626345169645
-235.245 139.02116319347013 139.61400771717013 32.24963347211302 32.749626345169645
-236.245 139.61400771717013 140.20685224087012 32.24963347211302 32.749626345169645
-237.245 140.20685224087012 140.7996967646201 32.24963347211302 32.749626345169645
-238.245 140.7996967646201 141.3925412883701 32.24963347211302 32.749626345169645
-239.245 141.3925412883701 141.9853858120701 32.24963347211302 32.749626345169645
-240.245 141.9853858120701 142.57823033577012 32.24963347211302 32.749626345169645
-241.245 142.57823033577012 143.17107485947014 32.24963347211302 32.749626345169645
-242.245 143.17107485947014 143.76391938322013 32.24963347211302 32.749626345169645
-243.245 143.76391938322013 144.35676390697012 32.24963347211302 32.749626345169645
-244.245 144.35676390697012 144.9496084306701 32.24963347211302 32.749626345169645
-245.245 144.9496084306701 145.5424529543701 32.24963347211302 32.749626345169645
-246.245 145.5424529543701 146.1352974780701 32.24963347211302 32.749626345169645
-247.245 146.1352974780701 146.7281420017701 32.24963347211302 32.749626345169645
-248.245 146.7281420017701 147.32098652552008 32.24963347211302 32.749626345169645
-249.245 147.32098652552008 147.9138310492701 32.24963347211302 32.749626345169645
-250.245 147.9138310492701 148.5066755729701 32.24963347211302 32.749626345169645
-251.245 148.5066755729701 149.0995200966701 32.24963347211302 32.749626345169645
-252.245 149.0995200966701 149.69236462037009 32.24963347211302 32.749626345169645
-253.245 149.69236462037009 150.2852091440701 32.24963347211302 32.749626345169645
-254.245 150.2852091440701 150.8780536678201 32.24963347211302 32.749626345169645
-255.245 150.8780536678201 151.4708981915701 32.24963347211302 32.749626345169645
-256.245 151.4708981915701 152.0637427152701 32.24963347211302 32.749626345169645
-257.245 152.0637427152701 152.6565872389701 32.24963347211302 32.749626345169645
-258.245 152.6565872389701 153.2494317626701 32.24963347211302 32.749626345169645
-259.245 153.2494317626701 153.8422762863701 32.24963347211302 32.749626345169645
-260.245 153.8422762863701 154.4351208101201 32.24963347211302 32.749626345169645
-261.245 154.4351208101201 155.0279653338701 32.24963347211302 32.749626345169645
-262.245 155.0279653338701 155.6208098575701 32.24963347211302 32.749626345169645
-263.245 155.6208098575701 156.2136543812701 32.24963347211302 32.749626345169645
-264.245 156.2136543812701 156.81599793905227 32.24963347211302 32.749626345169645
-268.245 158.57553344208796 159.1778769998701 32.24963347211302 32.749626345169645
-269.245 159.1778769998701 159.7707215235701 32.24963347211302 32.749626345169645
-270.245 159.7707215235701 160.3635660472701 32.24963347211302 32.749626345169645
-271.245 160.3635660472701 160.9564105709701 32.24963347211302 32.749626345169645
-272.245 160.9564105709701 161.5492550947201 32.24963347211302 32.749626345169645
-273.245 161.5492550947201 162.14209961847013 32.24963347211302 32.749626345169645
-274.245 162.14209961847013 162.7349441421701 32.24963347211302 32.749626345169645
-275.245 162.7349441421701 163.32778866587012 32.24963347211302 32.749626345169645
-276.245 163.32778866587012 163.9206331895701 32.24963347211302 32.749626345169645
-277.245 163.9206331895701 164.5134777132701 32.24963347211302 32.749626345169645
-278.245 164.5134777132701 165.10632223702012 32.24963347211302 32.749626345169645
-279.245 165.10632223702012 165.69916676077014 32.24963347211302 32.749626345169645
-280.245 165.69916676077014 166.2920112844701 32.24963347211302 32.749626345169645
-281.245 166.2920112844701 166.88485580817013 32.24963347211302 32.749626345169645
-282.245 166.88485580817013 167.4777003318701 32.24963347211302 32.749626345169645
-283.245 167.4777003318701 168.0705448556201 32.24963347211302 32.749626345169645
-284.245 168.0705448556201 168.66338937937013 32.24963347211302 32.749626345169645
-285.245 168.66338937937013 169.25623390307013 32.24963347211302 32.749626345169645
-286.245 169.25623390307013 169.84907842677012 32.24963347211302 32.749626345169645
-287.245 169.84907842677012 170.44192295047011 32.24963347211302 32.749626345169645
-288.245 170.44192295047011 171.0347674741701 32.24963347211302 32.749626345169645
-289.245 171.0347674741701 171.6276119979201 32.24963347211302 32.749626345169645
-290.245 171.6276119979201 172.22045652167014 32.24963347211302 32.749626345169645
-291.245 172.22045652167014 172.81330104537014 32.24963347211302 32.749626345169645
-292.245 172.81330104537014 173.40614556907013 32.24963347211302 32.749626345169645
-293.245 173.40614556907013 173.9989900927701 32.24963347211302 32.749626345169645
-294.245 173.9989900927701 174.59183461647012 32.24963347211302 32.749626345169645
-295.245 174.59183461647012 175.1846791402201 32.24963347211302 32.749626345169645
-296.245 175.1846791402201 175.7775236639701 32.24963347211302 32.749626345169645
-297.245 175.7775236639701 176.37036818767012 32.24963347211302 32.749626345169645
-298.245 176.37036818767012 176.96321271137012 32.24963347211302 32.749626345169645
-299.245 176.96321271137012 177.5560572350701 32.24963347211302 32.749626345169645
-300.245 177.5560572350701 178.14890175877014 32.24963347211302 32.749626345169645
-301.245 178.14890175877014 178.7417462825201 32.24963347211302 32.749626345169645
-302.245 178.7417462825201 179.3345908062701 32.24963347211302 32.749626345169645
-303.245 179.3345908062701 179.9274353299701 32.24963347211302 32.749626345169645
-304.245 179.9274353299701 180.5202798536701 32.24963347211302 32.749626345169645
-305.245 180.5202798536701 181.11312437737013 32.24963347211302 32.749626345169645
-306.245 181.11312437737013 181.7059689010701 32.24963347211302 32.749626345169645
-307.245 181.7059689010701 182.29881342482008 32.24963347211302 32.749626345169645
-308.245 182.29881342482008 182.89165794857007 32.24963347211302 32.749626345169645
-309.245 182.89165794857007 183.4845024722701 32.24963347211302 32.749626345169645
-310.245 183.4845024722701 184.0773469959701 32.24963347211302 32.749626345169645
-311.245 184.0773469959701 184.67019151967008 32.24963347211302 32.749626345169645
-312.245 184.67019151967008 185.2630360433701 32.24963347211302 32.749626345169645
-313.245 185.2630360433701 185.8558805671201 32.24963347211302 32.749626345169645
-314.245 185.8558805671201 186.44872509087008 32.24963347211302 32.749626345169645
-315.245 186.44872509087008 187.0415696145701 32.24963347211302 32.749626345169645
-316.245 187.0415696145701 187.63441413827007 32.24963347211302 32.749626345169645
-317.245 187.63441413827007 188.2272586619701 32.24963347211302 32.749626345169645
-318.245 188.2272586619701 188.82010318567006 32.24963347211302 32.749626345169645
-319.245 188.82010318567006 189.4129477094201 32.24963347211302 32.749626345169645
-320.245 189.4129477094201 190.0057922331701 32.24963347211302 32.749626345169645
-321.245 190.0057922331701 190.5986367568701 32.24963347211302 32.749626345169645
-322.245 190.5986367568701 191.1914812805701 32.24963347211302 32.749626345169645
-323.245 191.1914812805701 191.7843258042701 32.24963347211302 32.749626345169645
-324.245 191.7843258042701 192.3771703280201 32.24963347211302 32.749626345169645
-325.245 192.3771703280201 192.9700148517701 32.24963347211302 32.749626345169645
-326.245 192.9700148517701 193.5628593754701 32.24963347211302 32.749626345169645
-327.245 193.5628593754701 194.15570389917008 32.24963347211302 32.749626345169645
-328.245 194.15570389917008 194.7485484228701 32.24963347211302 32.749626345169645
-329.245 194.7485484228701 195.3413929465701 32.24963347211302 32.749626345169645
-330.245 195.3413929465701 195.93423747032008 32.24963347211302 32.749626345169645
-331.245 195.93423747032008 196.5270819940701 32.24963347211302 32.749626345169645
-332.245 196.5270819940701 197.11992651777012 32.24963347211302 32.749626345169645
-333.245 197.11992651777012 197.7127710414701 32.24963347211302 32.749626345169645
-334.245 197.7127710414701 198.30561556517011 32.24963347211302 32.749626345169645
-335.245 198.30561556517011 198.8984600888701 32.24963347211302 32.749626345169645
-336.245 198.8984600888701 199.4913046126201 32.24963347211302 32.749626345169645
-337.245 199.4913046126201 200.08414913637012 32.24963347211302 32.749626345169645
-338.245 200.08414913637012 200.6769936600701 32.24963347211302 32.749626345169645
-339.245 200.6769936600701 201.2698381837701 32.24963347211302 32.749626345169645
-340.245 201.2698381837701 201.8626827074701 32.24963347211302 32.749626345169645
-341.245 201.8626827074701 202.4555272311701 32.24963347211302 32.749626345169645
-342.245 202.4555272311701 203.04837175492008 32.24963347211302 32.749626345169645
-343.245 203.04837175492008 203.6412162786701 32.24963347211302 32.749626345169645
-344.245 203.6412162786701 204.2340608023701 32.24963347211302 32.749626345169645
-345.245 204.2340608023701 204.8269053260701 32.24963347211302 32.749626345169645
-346.245 204.8269053260701 205.4197498497701 32.24963347211302 32.749626345169645
-347.245 205.4197498497701 206.0125943734701 32.24963347211302 32.749626345169645
-348.245 206.0125943734701 206.6054388972201 32.24963347211302 32.749626345169645
-349.245 206.6054388972201 207.19828342097014 32.24963347211302 32.749626345169645
-350.245 207.19828342097014 207.7911279446701 32.24963347211302 32.749626345169645
-351.245 207.7911279446701 208.3934715024523 32.24963347211302 32.749626345169645
-390.245 230.90256533558795 231.5049088933701 32.24963347211302 32.749626345169645
-391.245 231.5049088933701 232.09775341707007 32.24963347211302 32.749626345169645
-392.245 232.09775341707007 232.69059794077012 32.24963347211302 32.749626345169645
-393.245 232.69059794077012 233.2834424644701 32.24963347211302 32.749626345169645
-394.245 233.2834424644701 233.87628698817014 32.24963347211302 32.749626345169645
-395.245 233.87628698817014 234.46913151192007 32.24963347211302 32.749626345169645
-396.245 234.46913151192007 235.06197603567009 32.24963347211302 32.749626345169645
-397.245 235.06197603567009 235.65482055937014 32.24963347211302 32.749626345169645
-398.245 235.65482055937014 236.2476650830701 32.24963347211302 32.749626345169645
-399.245 236.2476650830701 236.84050960677013 32.24963347211302 32.749626345169645
-400.245 236.84050960677013 237.4333541304701 32.24963347211302 32.749626345169645
-401.245 237.4333541304701 238.02619865422008 32.24963347211302 32.749626345169645
-402.245 238.02619865422008 238.6190431779701 32.24963347211302 32.749626345169645
-403.245 238.6190431779701 239.2118877016701 32.24963347211302 32.749626345169645
-404.245 239.2118877016701 239.8047322253701 32.24963347211302 32.749626345169645
-405.245 239.8047322253701 240.3975767490701 32.24963347211302 32.749626345169645
-406.245 240.3975767490701 240.9904212728201 32.24963347211302 32.749626345169645
-407.245 240.9904212728201 241.5832657965701 32.24963347211302 32.749626345169645
-408.245 241.5832657965701 242.17611032027008 32.24963347211302 32.749626345169645
-409.245 242.17611032027008 242.7689548439701 32.24963347211302 32.749626345169645
-410.245 242.7689548439701 243.36179936767007 32.24963347211302 32.749626345169645
-411.245 243.36179936767007 243.9546438913701 32.24963347211302 32.749626345169645
-412.245 243.9546438913701 244.54748841512009 32.24963347211302 32.749626345169645
-413.245 244.54748841512009 245.1403329388701 32.24963347211302 32.749626345169645
-414.245 245.1403329388701 245.7331774625701 32.24963347211302 32.749626345169645
-415.245 245.7331774625701 246.3260219862701 32.24963347211302 32.749626345169645
-416.245 246.3260219862701 246.9188665099701 32.24963347211302 32.749626345169645
-417.245 246.9188665099701 247.5117110336701 32.24963347211302 32.749626345169645
-418.245 247.5117110336701 248.1045555574201 32.24963347211302 32.749626345169645
-419.245 248.1045555574201 248.69740008117012 32.24963347211302 32.749626345169645
-420.245 248.69740008117012 249.2902446048701 32.24963347211302 32.749626345169645
-421.245 249.2902446048701 249.8830891285701 32.24963347211302 32.749626345169645
-422.245 249.8830891285701 250.4759336522701 32.24963347211302 32.749626345169645
-423.245 250.4759336522701 251.0687781759701 32.24963347211302 32.749626345169645
-424.245 251.0687781759701 251.6616226997201 32.24963347211302 32.749626345169645
-425.245 251.6616226997201 252.2544672234701 32.24963347211302 32.749626345169645
-426.245 252.2544672234701 252.8473117471701 32.24963347211302 32.749626345169645
-427.245 252.8473117471701 253.4401562708701 32.24963347211302 32.749626345169645
-428.245 253.4401562708701 254.03300079457009 32.24963347211302 32.749626345169645
-429.245 254.03300079457009 254.6258453182701 32.24963347211302 32.749626345169645
-430.245 254.6258453182701 255.2186898420201 32.24963347211302 32.749626345169645
-431.245 255.2186898420201 255.8115343657701 32.24963347211302 32.749626345169645
-432.245 255.8115343657701 256.4043788894701 32.24963347211302 32.749626345169645
-433.245 256.4043788894701 256.9972234131701 32.24963347211302 32.749626345169645
-434.245 256.9972234131701 257.5900679368701 32.24963347211302 32.749626345169645
-435.245 257.5900679368701 258.18291246057015 32.24963347211302 32.749626345169645
-436.245 258.18291246057015 258.7757569843201 32.24963347211302 32.749626345169645
-437.245 258.7757569843201 259.3686015080701 32.24963347211302 32.749626345169645
-438.245 259.3686015080701 259.96144603177015 32.24963347211302 32.749626345169645
-439.245 259.96144603177015 260.5542905554701 32.24963347211302 32.749626345169645
-440.245 260.5542905554701 261.1471350791701 32.24963347211302 32.749626345169645
-441.245 261.1471350791701 261.7399796028701 32.24963347211302 32.749626345169645
-442.245 261.7399796028701 262.3328241266201 32.24963347211302 32.749626345169645
-443.245 262.3328241266201 262.9256686503701 32.24963347211302 32.749626345169645
-444.245 262.9256686503701 263.5185131740701 32.24963347211302 32.749626345169645
-445.245 263.5185131740701 264.11135769777013 32.24963347211302 32.749626345169645
-446.245 264.11135769777013 264.70420222147015 32.24963347211302 32.749626345169645
-447.245 264.70420222147015 265.2970467452201 32.24963347211302 32.749626345169645
-448.245 265.2970467452201 265.88989126897013 32.24963347211302 32.749626345169645
-449.245 265.88989126897013 266.48273579267016 32.24963347211302 32.749626345169645
-450.245 266.48273579267016 267.0755803163701 32.24963347211302 32.749626345169645
-451.245 267.0755803163701 267.6684248400701 32.24963347211302 32.749626345169645
-452.245 267.6684248400701 268.2612693637701 32.24963347211302 32.749626345169645
-453.245 268.2612693637701 268.8541138875201 32.24963347211302 32.749626345169645
-454.245 268.8541138875201 269.4469584112701 32.24963347211302 32.749626345169645
-455.245 269.4469584112701 270.0398029349701 32.24963347211302 32.749626345169645
-456.245 270.0398029349701 270.64214649275226 32.24963347211302 32.749626345169645
-578.245 342.35733579438795 342.95967935217016 32.24963347211302 32.749626345169645
-579.245 342.95967935217016 343.5525238758701 32.24963347211302 32.749626345169645
-580.245 343.5525238758701 344.1453683995701 32.24963347211302 32.749626345169645
-581.245 344.1453683995701 344.7382129232701 32.24963347211302 32.749626345169645
-582.245 344.7382129232701 345.3310574470201 32.24963347211302 32.749626345169645
-583.245 345.3310574470201 345.9239019707701 32.24963347211302 32.749626345169645
-584.245 345.9239019707701 346.5167464944701 32.24963347211302 32.749626345169645
-585.245 346.5167464944701 347.10959101817014 32.24963347211302 32.749626345169645
-586.245 347.10959101817014 347.70243554187016 32.24963347211302 32.749626345169645
-587.245 347.70243554187016 348.2952800655701 32.24963347211302 32.749626345169645
-588.245 348.2952800655701 348.8881245893201 32.24963347211302 32.749626345169645
-589.245 348.8881245893201 349.48096911307016 32.24963347211302 32.749626345169645
-590.245 349.48096911307016 350.0738136367701 32.24963347211302 32.749626345169645
-591.245 350.0738136367701 350.6666581604701 32.24963347211302 32.749626345169645
-592.245 350.6666581604701 351.2595026841701 32.24963347211302 32.749626345169645
-593.245 351.2595026841701 351.85234720787014 32.24963347211302 32.749626345169645
-594.245 351.85234720787014 352.4451917316201 32.24963347211302 32.749626345169645
-595.245 352.4451917316201 353.0380362553701 32.24963347211302 32.749626345169645
-596.245 353.0380362553701 353.63088077907014 32.24963347211302 32.749626345169645
-597.245 353.63088077907014 354.2237253027701 32.24963347211302 32.749626345169645
-598.245 354.2237253027701 354.8165698264701 32.24963347211302 32.749626345169645
-599.245 354.8165698264701 355.4094143501701 32.24963347211302 32.749626345169645
-600.245 355.4094143501701 356.0022588739201 32.24963347211302 32.749626345169645
-601.245 356.0022588739201 356.5951033976701 32.24963347211302 32.749626345169645
-602.245 356.5951033976701 357.1879479213701 32.24963347211302 32.749626345169645
-603.245 357.1879479213701 357.7807924450701 32.24963347211302 32.749626345169645
-604.245 357.7807924450701 358.37363696877014 32.24963347211302 32.749626345169645
-605.245 358.37363696877014 358.9664814924701 32.24963347211302 32.749626345169645
-606.245 358.9664814924701 359.56882505025226 32.24963347211302 32.749626345169645
-000.245 359.69320108588795 0.295544643670109 32.24963347211302 32.749626345169645
-001.246 0.29719117351806723 0.8933728199180672 32.749626345169645 33.249619137764846
-002.246 0.8933728199180672 1.489554466368067 32.749626345169645 33.249619137764846
-003.246 1.489554466368067 2.0857361128180667 32.749626345169645 33.249619137764846
-004.246 2.0857361128180667 2.6819177592180665 32.749626345169645 33.249619137764846
-005.246 2.6819177592180665 3.278099405618067 32.749626345169645 33.249619137764846
-006.246 3.278099405618067 3.874281052018066 32.749626345169645 33.249619137764846
-007.246 3.874281052018066 4.470462698418066 32.749626345169645 33.249619137764846
-008.246 4.470462698418066 5.066644344868067 32.749626345169645 33.249619137764846
-009.246 5.066644344868067 5.662825991318067 32.749626345169645 33.249619137764846
-010.246 5.662825991318067 6.259007637718067 32.749626345169645 33.249619137764846
-011.246 6.259007637718067 6.855189284118066 32.749626345169645 33.249619137764846
-012.246 6.855189284118066 7.451370930518067 32.749626345169645 33.249619137764846
-013.246 7.451370930518067 8.047552576968066 32.749626345169645 33.249619137764846
-014.246 8.047552576968066 8.643734223418067 32.749626345169645 33.249619137764846
-015.246 8.643734223418067 9.239915869818068 32.749626345169645 33.249619137764846
-016.246 9.239915869818068 9.836097516218068 32.749626345169645 33.249619137764846
-017.246 9.836097516218068 10.43227916261807 32.749626345169645 33.249619137764846
-018.246 10.43227916261807 11.028460809018068 32.749626345169645 33.249619137764846
-019.246 11.028460809018068 11.624642455468067 32.749626345169645 33.249619137764846
-020.246 11.624642455468067 12.220824101918067 32.749626345169645 33.249619137764846
-021.246 12.220824101918067 12.817005748318067 32.749626345169645 33.249619137764846
-022.246 12.817005748318067 13.413187394718069 32.749626345169645 33.249619137764846
-023.246 13.413187394718069 14.009369041118067 32.749626345169645 33.249619137764846
-024.246 14.009369041118067 14.605550687518068 32.749626345169645 33.249619137764846
-025.246 14.605550687518068 15.201732333968069 32.749626345169645 33.249619137764846
-026.246 15.201732333968069 15.797913980418064 32.749626345169645 33.249619137764846
-027.246 15.797913980418064 16.394095626818068 32.749626345169645 33.249619137764846
-028.246 16.394095626818068 16.99027727321807 32.749626345169645 33.249619137764846
-029.246 16.99027727321807 17.586458919618067 32.749626345169645 33.249619137764846
-030.246 17.586458919618067 18.182640566068066 32.749626345169645 33.249619137764846
-031.246 18.182640566068066 18.778822212518065 32.749626345169645 33.249619137764846
-032.246 18.778822212518065 19.37500385891807 32.749626345169645 33.249619137764846
-033.246 19.37500385891807 19.97118550531807 32.749626345169645 33.249619137764846
-034.246 19.97118550531807 20.567367151718067 32.749626345169645 33.249619137764846
-035.246 20.567367151718067 21.163548798118068 32.749626345169645 33.249619137764846
-036.246 21.163548798118068 21.75973044456807 32.749626345169645 33.249619137764846
-037.246 21.75973044456807 22.35591209101807 32.749626345169645 33.249619137764846
-038.246 22.35591209101807 22.952093737418068 32.749626345169645 33.249619137764846
-039.246 22.952093737418068 23.548275383818066 32.749626345169645 33.249619137764846
-040.246 23.548275383818066 24.14445703021807 32.749626345169645 33.249619137764846
-041.246 24.14445703021807 24.74063867666807 32.749626345169645 33.249619137764846
-042.246 24.74063867666807 25.33682032311807 32.749626345169645 33.249619137764846
-043.246 25.33682032311807 25.933001969518067 32.749626345169645 33.249619137764846
-044.246 25.933001969518067 26.529183615918065 32.749626345169645 33.249619137764846
-045.246 26.529183615918065 27.12536526231807 32.749626345169645 33.249619137764846
-046.246 27.12536526231807 27.721546908718068 32.749626345169645 33.249619137764846
-047.246 27.721546908718068 28.317728555168067 32.749626345169645 33.249619137764846
-048.246 28.317728555168067 28.91391020161807 32.749626345169645 33.249619137764846
-049.246 28.91391020161807 29.510091848018064 32.749626345169645 33.249619137764846
-050.246 29.510091848018064 30.10627349441807 32.749626345169645 33.249619137764846
-051.246 30.10627349441807 30.702455140818067 32.749626345169645 33.249619137764846
-052.246 30.702455140818067 31.298636787268066 32.749626345169645 33.249619137764846
-053.246 31.298636787268066 31.89481843371806 32.749626345169645 33.249619137764846
-054.246 31.89481843371806 32.49100008011807 32.749626345169645 33.249619137764846
-055.246 32.49100008011807 33.087181726518075 32.749626345169645 33.249619137764846
-056.246 33.087181726518075 33.683363372918066 32.749626345169645 33.249619137764846
-057.246 33.683363372918066 34.279545019318064 32.749626345169645 33.249619137764846
-058.246 34.279545019318064 34.875726665768056 32.749626345169645 33.249619137764846
-059.246 34.875726665768056 35.47190831221807 32.749626345169645 33.249619137764846
-060.246 35.47190831221807 36.068089958618074 32.749626345169645 33.249619137764846
-061.246 36.068089958618074 36.66427160501807 32.749626345169645 33.249619137764846
-062.246 36.66427160501807 37.26045325141808 32.749626345169645 33.249619137764846
-063.246 37.26045325141808 37.86618746798366 32.749626345169645 33.249619137764846
-193.246 114.75451471565249 115.36024893221807 32.749626345169645 33.249619137764846
-194.246 115.36024893221807 115.95643057861808 32.749626345169645 33.249619137764846
-195.246 115.95643057861808 116.55261222501807 32.749626345169645 33.249619137764846
-196.246 116.55261222501807 117.14879387141808 32.749626345169645 33.249619137764846
-197.246 117.14879387141808 117.74497551786806 32.749626345169645 33.249619137764846
-198.246 117.74497551786806 118.34115716431806 32.749626345169645 33.249619137764846
-199.246 118.34115716431806 118.93733881071809 32.749626345169645 33.249619137764846
-200.246 118.93733881071809 119.53352045711807 32.749626345169645 33.249619137764846
-201.246 119.53352045711807 120.12970210351806 32.749626345169645 33.249619137764846
-202.246 120.12970210351806 120.72588374991808 32.749626345169645 33.249619137764846
-203.246 120.72588374991808 121.32206539636806 32.749626345169645 33.249619137764846
-204.246 121.32206539636806 121.91824704281807 32.749626345169645 33.249619137764846
-205.246 121.91824704281807 122.51442868921808 32.749626345169645 33.249619137764846
-206.246 122.51442868921808 123.11061033561808 32.749626345169645 33.249619137764846
-207.246 123.11061033561808 123.70679198201809 32.749626345169645 33.249619137764846
-208.246 123.70679198201809 124.30297362846808 32.749626345169645 33.249619137764846
-209.246 124.30297362846808 124.89915527491807 32.749626345169645 33.249619137764846
-210.246 124.89915527491807 125.49533692131808 32.749626345169645 33.249619137764846
-211.246 125.49533692131808 126.09151856771805 32.749626345169645 33.249619137764846
-212.246 126.09151856771805 126.68770021411807 32.749626345169645 33.249619137764846
-213.246 126.68770021411807 127.28388186051808 32.749626345169645 33.249619137764846
-214.246 127.28388186051808 127.88006350696807 32.749626345169645 33.249619137764846
-215.246 127.88006350696807 128.47624515341806 32.749626345169645 33.249619137764846
-216.246 128.47624515341806 129.0724267998181 32.749626345169645 33.249619137764846
-217.246 129.0724267998181 129.66860844621806 32.749626345169645 33.249619137764846
-218.246 129.66860844621806 130.26479009261806 32.749626345169645 33.249619137764846
-219.246 130.26479009261806 130.86097173906808 32.749626345169645 33.249619137764846
-220.246 130.86097173906808 131.4571533855181 32.749626345169645 33.249619137764846
-221.246 131.4571533855181 132.0533350319181 32.749626345169645 33.249619137764846
-222.246 132.0533350319181 132.6495166783181 32.749626345169645 33.249619137764846
-223.246 132.6495166783181 133.2456983247181 32.749626345169645 33.249619137764846
-224.246 133.2456983247181 133.8418799711181 32.749626345169645 33.249619137764846
-225.246 133.8418799711181 134.43806161756808 32.749626345169645 33.249619137764846
-226.246 134.43806161756808 135.03424326401807 32.749626345169645 33.249619137764846
-227.246 135.03424326401807 135.63042491041807 32.749626345169645 33.249619137764846
-228.246 135.63042491041807 136.22660655681807 32.749626345169645 33.249619137764846
-229.246 136.22660655681807 136.8227882032181 32.749626345169645 33.249619137764846
-230.246 136.8227882032181 137.4189698496681 32.749626345169645 33.249619137764846
-231.246 137.4189698496681 138.01515149611805 32.749626345169645 33.249619137764846
-232.246 138.01515149611805 138.61133314251805 32.749626345169645 33.249619137764846
-233.246 138.61133314251805 139.20751478891808 32.749626345169645 33.249619137764846
-234.246 139.20751478891808 139.8036964353181 32.749626345169645 33.249619137764846
-235.246 139.8036964353181 140.39987808171807 32.749626345169645 33.249619137764846
-236.246 140.39987808171807 140.99605972816806 32.749626345169645 33.249619137764846
-237.246 140.99605972816806 141.59224137461808 32.749626345169645 33.249619137764846
-238.246 141.59224137461808 142.18842302101805 32.749626345169645 33.249619137764846
-239.246 142.18842302101805 142.78460466741808 32.749626345169645 33.249619137764846
-240.246 142.78460466741808 143.38078631381808 32.749626345169645 33.249619137764846
-241.246 143.38078631381808 143.97696796021808 32.749626345169645 33.249619137764846
-242.246 143.97696796021808 144.57314960666807 32.749626345169645 33.249619137764846
-243.246 144.57314960666807 145.1693312531181 32.749626345169645 33.249619137764846
-244.246 145.1693312531181 145.7655128995181 32.749626345169645 33.249619137764846
-245.246 145.7655128995181 146.36169454591806 32.749626345169645 33.249619137764846
-246.246 146.36169454591806 146.95787619231805 32.749626345169645 33.249619137764846
-247.246 146.95787619231805 147.55405783876807 32.749626345169645 33.249619137764846
-248.246 147.55405783876807 148.1502394852181 32.749626345169645 33.249619137764846
-249.246 148.1502394852181 148.7464211316181 32.749626345169645 33.249619137764846
-250.246 148.7464211316181 149.3426027780181 32.749626345169645 33.249619137764846
-251.246 149.3426027780181 149.9387844244181 32.749626345169645 33.249619137764846
-252.246 149.9387844244181 150.53496607081806 32.749626345169645 33.249619137764846
-253.246 150.53496607081806 151.1311477172681 32.749626345169645 33.249619137764846
-254.246 151.1311477172681 151.7273293637181 32.749626345169645 33.249619137764846
-255.246 151.7273293637181 152.32351101011807 32.749626345169645 33.249619137764846
-256.246 152.32351101011807 152.91969265651807 32.749626345169645 33.249619137764846
-257.246 152.91969265651807 153.51587430291806 32.749626345169645 33.249619137764846
-258.246 153.51587430291806 154.11205594936806 32.749626345169645 33.249619137764846
-259.246 154.11205594936806 154.70823759581805 32.749626345169645 33.249619137764846
-260.246 154.70823759581805 155.30441924221807 32.749626345169645 33.249619137764846
-261.246 155.30441924221807 155.9006008886181 32.749626345169645 33.249619137764846
-262.246 155.9006008886181 156.49678253501807 32.749626345169645 33.249619137764846
-263.246 156.49678253501807 157.09296418141807 32.749626345169645 33.249619137764846
-264.246 157.09296418141807 157.69869839798366 32.749626345169645 33.249619137764846
-267.246 158.87195655055248 159.47769076711805 32.749626345169645 33.249619137764846
-268.246 159.47769076711805 160.07387241351807 32.749626345169645 33.249619137764846
-269.246 160.07387241351807 160.6700540599681 32.749626345169645 33.249619137764846
-270.246 160.6700540599681 161.26623570641806 32.749626345169645 33.249619137764846
-271.246 161.26623570641806 161.86241735281808 32.749626345169645 33.249619137764846
-272.246 161.86241735281808 162.45859899921805 32.749626345169645 33.249619137764846
-273.246 162.45859899921805 163.05478064561805 32.749626345169645 33.249619137764846
-274.246 163.05478064561805 163.65096229201808 32.749626345169645 33.249619137764846
-275.246 163.65096229201808 164.24714393846807 32.749626345169645 33.249619137764846
-276.246 164.24714393846807 164.8433255849181 32.749626345169645 33.249619137764846
-277.246 164.8433255849181 165.4395072313181 32.749626345169645 33.249619137764846
-278.246 165.4395072313181 166.0356888777181 32.749626345169645 33.249619137764846
-279.246 166.0356888777181 166.63187052411809 32.749626345169645 33.249619137764846
-280.246 166.63187052411809 167.22805217051805 32.749626345169645 33.249619137764846
-281.246 167.22805217051805 167.82423381696807 32.749626345169645 33.249619137764846
-282.246 167.82423381696807 168.42041546341807 32.749626345169645 33.249619137764846
-283.246 168.42041546341807 169.01659710981806 32.749626345169645 33.249619137764846
-284.246 169.01659710981806 169.6127787562181 32.749626345169645 33.249619137764846
-285.246 169.6127787562181 170.20896040261806 32.749626345169645 33.249619137764846
-286.246 170.20896040261806 170.80514204906808 32.749626345169645 33.249619137764846
-287.246 170.80514204906808 171.40132369551807 32.749626345169645 33.249619137764846
-288.246 171.40132369551807 171.9975053419181 32.749626345169645 33.249619137764846
-289.246 171.9975053419181 172.5936869883181 32.749626345169645 33.249619137764846
-290.246 172.5936869883181 173.1898686347181 32.749626345169645 33.249619137764846
-291.246 173.1898686347181 173.7860502811181 32.749626345169645 33.249619137764846
-292.246 173.7860502811181 174.38223192756809 32.749626345169645 33.249619137764846
-293.246 174.38223192756809 174.97841357401808 32.749626345169645 33.249619137764846
-294.246 174.97841357401808 175.57459522041808 32.749626345169645 33.249619137764846
-295.246 175.57459522041808 176.17077686681807 32.749626345169645 33.249619137764846
-296.246 176.17077686681807 176.7669585132181 32.749626345169645 33.249619137764846
-297.246 176.7669585132181 177.3631401596681 32.749626345169645 33.249619137764846
-298.246 177.3631401596681 177.95932180611808 32.749626345169645 33.249619137764846
-299.246 177.95932180611808 178.55550345251808 32.749626345169645 33.249619137764846
-300.246 178.55550345251808 179.15168509891805 32.749626345169645 33.249619137764846
-301.246 179.15168509891805 179.74786674531805 32.749626345169645 33.249619137764846
-302.246 179.74786674531805 180.34404839171805 32.749626345169645 33.249619137764846
-303.246 180.34404839171805 180.94023003816807 32.749626345169645 33.249619137764846
-304.246 180.94023003816807 181.53641168461806 32.749626345169645 33.249619137764846
-305.246 181.53641168461806 182.13259333101803 32.749626345169645 33.249619137764846
-306.246 182.13259333101803 182.72877497741806 32.749626345169645 33.249619137764846
-307.246 182.72877497741806 183.32495662381803 32.749626345169645 33.249619137764846
-308.246 183.32495662381803 183.92113827026805 32.749626345169645 33.249619137764846
-309.246 183.92113827026805 184.51731991671807 32.749626345169645 33.249619137764846
-310.246 184.51731991671807 185.11350156311806 32.749626345169645 33.249619137764846
-311.246 185.11350156311806 185.70968320951806 32.749626345169645 33.249619137764846
-312.246 185.70968320951806 186.30586485591806 32.749626345169645 33.249619137764846
-313.246 186.30586485591806 186.90204650231806 32.749626345169645 33.249619137764846
-314.246 186.90204650231806 187.49822814876808 32.749626345169645 33.249619137764846
-315.246 187.49822814876808 188.09440979521804 32.749626345169645 33.249619137764846
-316.246 188.09440979521804 188.69059144161807 32.749626345169645 33.249619137764846
-317.246 188.69059144161807 189.28677308801804 32.749626345169645 33.249619137764846
-318.246 189.28677308801804 189.88295473441806 32.749626345169645 33.249619137764846
-319.246 189.88295473441806 190.47913638086806 32.749626345169645 33.249619137764846
-320.246 190.47913638086806 191.07531802731805 32.749626345169645 33.249619137764846
-321.246 191.07531802731805 191.67149967371807 32.749626345169645 33.249619137764846
-322.246 191.67149967371807 192.26768132011807 32.749626345169645 33.249619137764846
-323.246 192.26768132011807 192.86386296651807 32.749626345169645 33.249619137764846
-324.246 192.86386296651807 193.46004461291807 32.749626345169645 33.249619137764846
-325.246 193.46004461291807 194.05622625936806 32.749626345169645 33.249619137764846
-326.246 194.05622625936806 194.65240790581805 32.749626345169645 33.249619137764846
-327.246 194.65240790581805 195.24858955221805 32.749626345169645 33.249619137764846
-328.246 195.24858955221805 195.84477119861805 32.749626345169645 33.249619137764846
-329.246 195.84477119861805 196.44095284501805 32.749626345169645 33.249619137764846
-330.246 196.44095284501805 197.03713449141804 32.749626345169645 33.249619137764846
-331.246 197.03713449141804 197.63331613786806 32.749626345169645 33.249619137764846
-332.246 197.63331613786806 198.22949778431803 32.749626345169645 33.249619137764846
-333.246 198.22949778431803 198.82567943071805 32.749626345169645 33.249619137764846
-334.246 198.82567943071805 199.42186107711805 32.749626345169645 33.249619137764846
-335.246 199.42186107711805 200.01804272351802 32.749626345169645 33.249619137764846
-336.246 200.01804272351802 200.61422436996804 32.749626345169645 33.249619137764846
-337.246 200.61422436996804 201.21995858658363 32.749626345169645 33.249619137764846
-388.246 231.00993576715248 231.61566998371808 32.749626345169645 33.249619137764846
-389.246 231.61566998371808 232.21185163011808 32.749626345169645 33.249619137764846
-390.246 232.21185163011808 232.80803327651807 32.749626345169645 33.249619137764846
-391.246 232.80803327651807 233.40421492291807 32.749626345169645 33.249619137764846
-392.246 233.40421492291807 234.00039656936804 32.749626345169645 33.249619137764846
-393.246 234.00039656936804 234.59657821581806 32.749626345169645 33.249619137764846
-394.246 234.59657821581806 235.19275986221805 32.749626345169645 33.249619137764846
-395.246 235.19275986221805 235.78894150861805 32.749626345169645 33.249619137764846
-396.246 235.78894150861805 236.38512315501805 32.749626345169645 33.249619137764846
-397.246 236.38512315501805 236.98130480146807 32.749626345169645 33.249619137764846
-398.246 236.98130480146807 237.57748644791806 32.749626345169645 33.249619137764846
-399.246 237.57748644791806 238.1736680943181 32.749626345169645 33.249619137764846
-400.246 238.1736680943181 238.76984974071806 32.749626345169645 33.249619137764846
-401.246 238.76984974071806 239.36603138711803 32.749626345169645 33.249619137764846
-402.246 239.36603138711803 239.96221303351803 32.749626345169645 33.249619137764846
-403.246 239.96221303351803 240.55839467996805 32.749626345169645 33.249619137764846
-404.246 240.55839467996805 241.15457632641807 32.749626345169645 33.249619137764846
-405.246 241.15457632641807 241.75075797281806 32.749626345169645 33.249619137764846
-406.246 241.75075797281806 242.34693961921806 32.749626345169645 33.249619137764846
-407.246 242.34693961921806 242.94312126561806 32.749626345169645 33.249619137764846
-408.246 242.94312126561806 243.53930291201806 32.749626345169645 33.249619137764846
-409.246 243.53930291201806 244.13548455846808 32.749626345169645 33.249619137764846
-410.246 244.13548455846808 244.73166620491807 32.749626345169645 33.249619137764846
-411.246 244.73166620491807 245.32784785131804 32.749626345169645 33.249619137764846
-412.246 245.32784785131804 245.92402949771807 32.749626345169645 33.249619137764846
-413.246 245.92402949771807 246.52021114411806 32.749626345169645 33.249619137764846
-414.246 246.52021114411806 247.11639279056806 32.749626345169645 33.249619137764846
-415.246 247.11639279056806 247.71257443701805 32.749626345169645 33.249619137764846
-416.246 247.71257443701805 248.30875608341802 32.749626345169645 33.249619137764846
-417.246 248.30875608341802 248.90493772981807 32.749626345169645 33.249619137764846
-418.246 248.90493772981807 249.50111937621807 32.749626345169645 33.249619137764846
-419.246 249.50111937621807 250.09730102261807 32.749626345169645 33.249619137764846
-420.246 250.09730102261807 250.69348266906806 32.749626345169645 33.249619137764846
-421.246 250.69348266906806 251.28966431551805 32.749626345169645 33.249619137764846
-422.246 251.28966431551805 251.88584596191805 32.749626345169645 33.249619137764846
-423.246 251.88584596191805 252.48202760831805 32.749626345169645 33.249619137764846
-424.246 252.48202760831805 253.07820925471805 32.749626345169645 33.249619137764846
-425.246 253.07820925471805 253.67439090116804 32.749626345169645 33.249619137764846
-426.246 253.67439090116804 254.27057254761803 32.749626345169645 33.249619137764846
-427.246 254.27057254761803 254.86675419401803 32.749626345169645 33.249619137764846
-428.246 254.86675419401803 255.46293584041806 32.749626345169645 33.249619137764846
-429.246 255.46293584041806 256.0591174868181 32.749626345169645 33.249619137764846
-430.246 256.0591174868181 256.6552991332181 32.749626345169645 33.249619137764846
-431.246 256.6552991332181 257.2514807796681 32.749626345169645 33.249619137764846
-432.246 257.2514807796681 257.84766242611806 32.749626345169645 33.249619137764846
-433.246 257.84766242611806 258.44384407251806 32.749626345169645 33.249619137764846
-434.246 258.44384407251806 259.04002571891806 32.749626345169645 33.249619137764846
-435.246 259.04002571891806 259.63620736531806 32.749626345169645 33.249619137764846
-436.246 259.63620736531806 260.2323890117681 32.749626345169645 33.249619137764846
-437.246 260.2323890117681 260.82857065821804 32.749626345169645 33.249619137764846
-438.246 260.82857065821804 261.42475230461804 32.749626345169645 33.249619137764846
-439.246 261.42475230461804 262.02093395101804 32.749626345169645 33.249619137764846
-440.246 262.02093395101804 262.61711559741804 32.749626345169645 33.249619137764846
-441.246 262.61711559741804 263.21329724381803 32.749626345169645 33.249619137764846
-442.246 263.21329724381803 263.80947889026805 32.749626345169645 33.249619137764846
-443.246 263.80947889026805 264.4056605367181 32.749626345169645 33.249619137764846
-444.246 264.4056605367181 265.0018421831181 32.749626345169645 33.249619137764846
-445.246 265.0018421831181 265.59802382951807 32.749626345169645 33.249619137764846
-446.246 265.59802382951807 266.19420547591807 32.749626345169645 33.249619137764846
-447.246 266.19420547591807 266.79038712231807 32.749626345169645 33.249619137764846
-448.246 266.79038712231807 267.38656876876803 32.749626345169645 33.249619137764846
-449.246 267.38656876876803 267.98275041521805 32.749626345169645 33.249619137764846
-450.246 267.98275041521805 268.57893206161805 32.749626345169645 33.249619137764846
-451.246 268.57893206161805 269.17511370801805 32.749626345169645 33.249619137764846
-452.246 269.17511370801805 269.77129535441804 32.749626345169645 33.249619137764846
-453.246 269.77129535441804 270.367477000868 32.749626345169645 33.249619137764846
-454.246 270.367477000868 270.9636586473181 32.749626345169645 33.249619137764846
-455.246 270.9636586473181 271.56939286388365 32.749626345169645 33.249619137764846
-576.246 343.0920852936525 343.69781951026806 32.749626345169645 33.249619137764846
-577.246 343.69781951026806 344.2940011567181 32.749626345169645 33.249619137764846
-578.246 344.2940011567181 344.8901828031181 32.749626345169645 33.249619137764846
-579.246 344.8901828031181 345.4863644495181 32.749626345169645 33.249619137764846
-580.246 345.4863644495181 346.0825460959181 32.749626345169645 33.249619137764846
-581.246 346.0825460959181 346.6787277423681 32.749626345169645 33.249619137764846
-582.246 346.6787277423681 347.27490938881806 32.749626345169645 33.249619137764846
-583.246 347.27490938881806 347.87109103521806 32.749626345169645 33.249619137764846
-584.246 347.87109103521806 348.46727268161806 32.749626345169645 33.249619137764846
-585.246 348.46727268161806 349.06345432801805 32.749626345169645 33.249619137764846
-586.246 349.06345432801805 349.65963597441805 32.749626345169645 33.249619137764846
-587.246 349.65963597441805 350.255817620868 32.749626345169645 33.249619137764846
-588.246 350.255817620868 350.85199926731804 32.749626345169645 33.249619137764846
-589.246 350.85199926731804 351.44818091371803 32.749626345169645 33.249619137764846
-590.246 351.44818091371803 352.0443625601181 32.749626345169645 33.249619137764846
-591.246 352.0443625601181 352.6405442065181 32.749626345169645 33.249619137764846
-592.246 352.6405442065181 353.2367258529681 32.749626345169645 33.249619137764846
-593.246 353.2367258529681 353.83290749941807 32.749626345169645 33.249619137764846
-594.246 353.83290749941807 354.42908914581807 32.749626345169645 33.249619137764846
-595.246 354.42908914581807 355.02527079221807 32.749626345169645 33.249619137764846
-596.246 355.02527079221807 355.62145243861806 32.749626345169645 33.249619137764846
-597.246 355.62145243861806 356.21763408501806 32.749626345169645 33.249619137764846
-598.246 356.21763408501806 356.813815731468 32.749626345169645 33.249619137764846
-599.246 356.813815731468 357.40999737791805 32.749626345169645 33.249619137764846
-600.246 357.40999737791805 358.00617902431804 32.749626345169645 33.249619137764846
-601.246 358.00617902431804 358.60236067071804 32.749626345169645 33.249619137764846
-602.246 358.60236067071804 359.19854231711804 32.749626345169645 33.249619137764846
-603.246 359.19854231711804 359.7478667453181 32.749626345169645 33.249619137764846
-000.246 359.7478667453181 0.29719117351806723 32.749626345169645 33.249619137764846
-001.247 0.29887903867390936 0.8984815103239094 33.249619137764846 33.749611847411686
-002.247 0.8984815103239094 1.4980839819739091 33.249619137764846 33.749611847411686
-003.247 1.4980839819739091 2.0976864536739086 33.249619137764846 33.749611847411686
-004.247 2.0976864536739086 2.6972889253239094 33.249619137764846 33.749611847411686
-005.247 2.6972889253239094 3.2968913969739093 33.249619137764846 33.749611847411686
-006.247 3.2968913969739093 3.8964938686739092 33.249619137764846 33.749611847411686
-007.247 3.8964938686739092 4.496096340323909 33.249619137764846 33.749611847411686
-008.247 4.496096340323909 5.095698811973909 33.249619137764846 33.749611847411686
-009.247 5.095698811973909 5.69530128367391 33.249619137764846 33.749611847411686
-010.247 5.69530128367391 6.294903755323909 33.249619137764846 33.749611847411686
-011.247 6.294903755323909 6.894506226973909 33.249619137764846 33.749611847411686
-012.247 6.894506226973909 7.494108698673909 33.249619137764846 33.749611847411686
-013.247 7.494108698673909 8.09371117032391 33.249619137764846 33.749611847411686
-014.247 8.09371117032391 8.693313641973909 33.249619137764846 33.749611847411686
-015.247 8.693313641973909 9.29291611367391 33.249619137764846 33.749611847411686
-016.247 9.29291611367391 9.89251858532391 33.249619137764846 33.749611847411686
-017.247 9.89251858532391 10.492121056973911 33.249619137764846 33.749611847411686
-018.247 10.492121056973911 11.091723528673912 33.249619137764846 33.749611847411686
-019.247 11.091723528673912 11.69132600037391 33.249619137764846 33.749611847411686
-020.247 11.69132600037391 12.290928472023909 33.249619137764846 33.749611847411686
-021.247 12.290928472023909 12.890530943673909 33.249619137764846 33.749611847411686
-022.247 12.890530943673909 13.490133415373911 33.249619137764846 33.749611847411686
-023.247 13.490133415373911 14.08973588702391 33.249619137764846 33.749611847411686
-024.247 14.08973588702391 14.689338358673908 33.249619137764846 33.749611847411686
-025.247 14.689338358673908 15.28894083037391 33.249619137764846 33.749611847411686
-026.247 15.28894083037391 15.888543302023908 33.249619137764846 33.749611847411686
-027.247 15.888543302023908 16.488145773673907 33.249619137764846 33.749611847411686
-028.247 16.488145773673907 17.08774824537391 33.249619137764846 33.749611847411686
-029.247 17.08774824537391 17.68735071702391 33.249619137764846 33.749611847411686
-030.247 17.68735071702391 18.286953188673905 33.249619137764846 33.749611847411686
-031.247 18.286953188673905 18.886555660373908 33.249619137764846 33.749611847411686
-032.247 18.886555660373908 19.48615813202391 33.249619137764846 33.749611847411686
-033.247 19.48615813202391 20.085760603673908 33.249619137764846 33.749611847411686
-034.247 20.085760603673908 20.68536307537391 33.249619137764846 33.749611847411686
-035.247 20.68536307537391 21.28496554702391 33.249619137764846 33.749611847411686
-036.247 21.28496554702391 21.88456801867391 33.249619137764846 33.749611847411686
-037.247 21.88456801867391 22.484170490373913 33.249619137764846 33.749611847411686
-038.247 22.484170490373913 23.083772962023907 33.249619137764846 33.749611847411686
-039.247 23.083772962023907 23.68337543367391 33.249619137764846 33.749611847411686
-040.247 23.68337543367391 24.28297790537391 33.249619137764846 33.749611847411686
-041.247 24.28297790537391 24.882580377023913 33.249619137764846 33.749611847411686
-042.247 24.882580377023913 25.48218284867391 33.249619137764846 33.749611847411686
-043.247 25.48218284867391 26.08178532037391 33.249619137764846 33.749611847411686
-044.247 26.08178532037391 26.681387792023912 33.249619137764846 33.749611847411686
-045.247 26.681387792023912 27.280990263673907 33.249619137764846 33.749611847411686
-046.247 27.280990263673907 27.880592735373902 33.249619137764846 33.749611847411686
-047.247 27.880592735373902 28.480195207023907 33.249619137764846 33.749611847411686
-048.247 28.480195207023907 29.079797678673906 33.249619137764846 33.749611847411686
-049.247 29.079797678673906 29.67940015037391 33.249619137764846 33.749611847411686
-050.247 29.67940015037391 30.279002622023906 33.249619137764846 33.749611847411686
-051.247 30.279002622023906 30.878605093673908 33.249619137764846 33.749611847411686
-052.247 30.878605093673908 31.47820756537391 33.249619137764846 33.749611847411686
-053.247 31.47820756537391 32.07781003702391 33.249619137764846 33.749611847411686
-054.247 32.07781003702391 32.67741250867391 33.249619137764846 33.749611847411686
-055.247 32.67741250867391 33.277014980373906 33.249619137764846 33.749611847411686
-056.247 33.277014980373906 33.87661745207391 33.249619137764846 33.749611847411686
-057.247 33.87661745207391 34.47621992372392 33.249619137764846 33.749611847411686
-058.247 34.47621992372392 35.075822395373905 33.249619137764846 33.749611847411686
-059.247 35.075822395373905 35.675424867073914 33.249619137764846 33.749611847411686
-060.247 35.675424867073914 36.275027338723916 33.249619137764846 33.749611847411686
-061.247 36.275027338723916 36.87462981037391 33.249619137764846 33.749611847411686
-062.247 36.87462981037391 37.4742322820739 33.249619137764846 33.749611847411686
-063.247 37.4742322820739 38.08344220395638 33.249619137764846 33.749611847411686
-193.247 115.41294614859143 116.02215607047391 33.249619137764846 33.749611847411686
-194.247 116.02215607047391 116.62175854217391 33.249619137764846 33.749611847411686
-195.247 116.62175854217391 117.2213610138239 33.249619137764846 33.749611847411686
-196.247 117.2213610138239 117.8209634854739 33.249619137764846 33.749611847411686
-197.247 117.8209634854739 118.4205659571739 33.249619137764846 33.749611847411686
-198.247 118.4205659571739 119.02016842882392 33.249619137764846 33.749611847411686
-199.247 119.02016842882392 119.61977090047392 33.249619137764846 33.749611847411686
-200.247 119.61977090047392 120.2193733721739 33.249619137764846 33.749611847411686
-201.247 120.2193733721739 120.81897584382392 33.249619137764846 33.749611847411686
-202.247 120.81897584382392 121.41857831547392 33.249619137764846 33.749611847411686
-203.247 121.41857831547392 122.01818078717392 33.249619137764846 33.749611847411686
-204.247 122.01818078717392 122.61778325882392 33.249619137764846 33.749611847411686
-205.247 122.61778325882392 123.21738573047392 33.249619137764846 33.749611847411686
-206.247 123.21738573047392 123.81698820217392 33.249619137764846 33.749611847411686
-207.247 123.81698820217392 124.41659067387391 33.249619137764846 33.749611847411686
-208.247 124.41659067387391 125.01619314552391 33.249619137764846 33.749611847411686
-209.247 125.01619314552391 125.61579561717392 33.249619137764846 33.749611847411686
-210.247 125.61579561717392 126.21539808887391 33.249619137764846 33.749611847411686
-211.247 126.21539808887391 126.81500056052391 33.249619137764846 33.749611847411686
-212.247 126.81500056052391 127.41460303217391 33.249619137764846 33.749611847411686
-213.247 127.41460303217391 128.0142055038739 33.249619137764846 33.749611847411686
-214.247 128.0142055038739 128.6138079755239 33.249619137764846 33.749611847411686
-215.247 128.6138079755239 129.2134104471739 33.249619137764846 33.749611847411686
-216.247 129.2134104471739 129.81301291887388 33.249619137764846 33.749611847411686
-217.247 129.81301291887388 130.4126153905239 33.249619137764846 33.749611847411686
-218.247 130.4126153905239 131.01221786217394 33.249619137764846 33.749611847411686
-219.247 131.01221786217394 131.6118203338739 33.249619137764846 33.749611847411686
-220.247 131.6118203338739 132.2114228055239 33.249619137764846 33.749611847411686
-221.247 132.2114228055239 132.81102527717394 33.249619137764846 33.749611847411686
-222.247 132.81102527717394 133.4106277488739 33.249619137764846 33.749611847411686
-223.247 133.4106277488739 134.0102302205239 33.249619137764846 33.749611847411686
-224.247 134.0102302205239 134.60983269217394 33.249619137764846 33.749611847411686
-225.247 134.60983269217394 135.20943516387393 33.249619137764846 33.749611847411686
-226.247 135.20943516387393 135.8090376355239 33.249619137764846 33.749611847411686
-227.247 135.8090376355239 136.40864010717394 33.249619137764846 33.749611847411686
-228.247 136.40864010717394 137.00824257887393 33.249619137764846 33.749611847411686
-229.247 137.00824257887393 137.6078450505239 33.249619137764846 33.749611847411686
-230.247 137.6078450505239 138.20744752217394 33.249619137764846 33.749611847411686
-231.247 138.20744752217394 138.80704999387393 33.249619137764846 33.749611847411686
-232.247 138.80704999387393 139.4066524655239 33.249619137764846 33.749611847411686
-233.247 139.4066524655239 140.0062549371739 33.249619137764846 33.749611847411686
-234.247 140.0062549371739 140.60585740887393 33.249619137764846 33.749611847411686
-235.247 140.60585740887393 141.2054598805239 33.249619137764846 33.749611847411686
-236.247 141.2054598805239 141.8050623521739 33.249619137764846 33.749611847411686
-237.247 141.8050623521739 142.40466482387393 33.249619137764846 33.749611847411686
-238.247 142.40466482387393 143.0042672955239 33.249619137764846 33.749611847411686
-239.247 143.0042672955239 143.6038697671739 33.249619137764846 33.749611847411686
-240.247 143.6038697671739 144.2034722388739 33.249619137764846 33.749611847411686
-241.247 144.2034722388739 144.8030747105239 33.249619137764846 33.749611847411686
-242.247 144.8030747105239 145.4026771821739 33.249619137764846 33.749611847411686
-243.247 145.4026771821739 146.0022796538739 33.249619137764846 33.749611847411686
-244.247 146.0022796538739 146.6018821255239 33.249619137764846 33.749611847411686
-245.247 146.6018821255239 147.20148459717393 33.249619137764846 33.749611847411686
-246.247 147.20148459717393 147.8010870688739 33.249619137764846 33.749611847411686
-247.247 147.8010870688739 148.4006895405739 33.249619137764846 33.749611847411686
-248.247 148.4006895405739 149.0002920122239 33.249619137764846 33.749611847411686
-249.247 149.0002920122239 149.5998944838739 33.249619137764846 33.749611847411686
-250.247 149.5998944838739 150.19949695557392 33.249619137764846 33.749611847411686
-251.247 150.19949695557392 150.79909942722392 33.249619137764846 33.749611847411686
-252.247 150.79909942722392 151.39870189887392 33.249619137764846 33.749611847411686
-253.247 151.39870189887392 151.99830437057392 33.249619137764846 33.749611847411686
-254.247 151.99830437057392 152.59790684222392 33.249619137764846 33.749611847411686
-255.247 152.59790684222392 153.19750931387392 33.249619137764846 33.749611847411686
-256.247 153.19750931387392 153.79711178557392 33.249619137764846 33.749611847411686
-257.247 153.79711178557392 154.3967142572239 33.249619137764846 33.749611847411686
-258.247 154.3967142572239 154.99631672887392 33.249619137764846 33.749611847411686
-259.247 154.99631672887392 155.59591920057392 33.249619137764846 33.749611847411686
-260.247 155.59591920057392 156.1955216722239 33.249619137764846 33.749611847411686
-261.247 156.1955216722239 156.79512414387392 33.249619137764846 33.749611847411686
-262.247 156.79512414387392 157.39472661557392 33.249619137764846 33.749611847411686
-263.247 157.39472661557392 158.0039365374564 33.249619137764846 33.749611847411686
-266.247 159.18392658039144 159.79313650222392 33.249619137764846 33.749611847411686
-267.247 159.79313650222392 160.39273897387392 33.249619137764846 33.749611847411686
-268.247 160.39273897387392 160.9923414455739 33.249619137764846 33.749611847411686
-269.247 160.9923414455739 161.59194391722394 33.249619137764846 33.749611847411686
-270.247 161.59194391722394 162.19154638887392 33.249619137764846 33.749611847411686
-271.247 162.19154638887392 162.7911488605739 33.249619137764846 33.749611847411686
-272.247 162.7911488605739 163.3907513322239 33.249619137764846 33.749611847411686
-273.247 163.3907513322239 163.99035380387392 33.249619137764846 33.749611847411686
-274.247 163.99035380387392 164.5899562755739 33.249619137764846 33.749611847411686
-275.247 164.5899562755739 165.1895587472239 33.249619137764846 33.749611847411686
-276.247 165.1895587472239 165.78916121887391 33.249619137764846 33.749611847411686
-277.247 165.78916121887391 166.3887636905739 33.249619137764846 33.749611847411686
-278.247 166.3887636905739 166.98836616222394 33.249619137764846 33.749611847411686
-279.247 166.98836616222394 167.5879686338739 33.249619137764846 33.749611847411686
-280.247 167.5879686338739 168.1875711055739 33.249619137764846 33.749611847411686
-281.247 168.1875711055739 168.78717357722394 33.249619137764846 33.749611847411686
-282.247 168.78717357722394 169.3867760488739 33.249619137764846 33.749611847411686
-283.247 169.3867760488739 169.9863785205739 33.249619137764846 33.749611847411686
-284.247 169.9863785205739 170.5859809922739 33.249619137764846 33.749611847411686
-285.247 170.5859809922739 171.18558346392393 33.249619137764846 33.749611847411686
-286.247 171.18558346392393 171.7851859355739 33.249619137764846 33.749611847411686
-287.247 171.7851859355739 172.3847884072739 33.249619137764846 33.749611847411686
-288.247 172.3847884072739 172.98439087892393 33.249619137764846 33.749611847411686
-289.247 172.98439087892393 173.5839933505739 33.249619137764846 33.749611847411686
-290.247 173.5839933505739 174.1835958222739 33.249619137764846 33.749611847411686
-291.247 174.1835958222739 174.7831982939239 33.249619137764846 33.749611847411686
-292.247 174.7831982939239 175.3828007655739 33.249619137764846 33.749611847411686
-293.247 175.3828007655739 175.9824032372739 33.249619137764846 33.749611847411686
-294.247 175.9824032372739 176.5820057089239 33.249619137764846 33.749611847411686
-295.247 176.5820057089239 177.1816081805739 33.249619137764846 33.749611847411686
-296.247 177.1816081805739 177.7812106522739 33.249619137764846 33.749611847411686
-297.247 177.7812106522739 178.38081312392393 33.249619137764846 33.749611847411686
-298.247 178.38081312392393 178.9804155955739 33.249619137764846 33.749611847411686
-299.247 178.9804155955739 179.5800180672739 33.249619137764846 33.749611847411686
-300.247 179.5800180672739 180.1796205389239 33.249619137764846 33.749611847411686
-301.247 180.1796205389239 180.7792230105739 33.249619137764846 33.749611847411686
-302.247 180.7792230105739 181.3788254822739 33.249619137764846 33.749611847411686
-303.247 181.3788254822739 181.9784279539239 33.249619137764846 33.749611847411686
-304.247 181.9784279539239 182.5780304255739 33.249619137764846 33.749611847411686
-305.247 182.5780304255739 183.1776328972739 33.249619137764846 33.749611847411686
-306.247 183.1776328972739 183.77723536892387 33.249619137764846 33.749611847411686
-307.247 183.77723536892387 184.3768378405739 33.249619137764846 33.749611847411686
-308.247 184.3768378405739 184.9764403122739 33.249619137764846 33.749611847411686
-309.247 184.9764403122739 185.57604278392387 33.249619137764846 33.749611847411686
-310.247 185.57604278392387 186.1756452555739 33.249619137764846 33.749611847411686
-311.247 186.1756452555739 186.7752477272739 33.249619137764846 33.749611847411686
-312.247 186.7752477272739 187.37485019892392 33.249619137764846 33.749611847411686
-313.247 187.37485019892392 187.9744526705739 33.249619137764846 33.749611847411686
-314.247 187.9744526705739 188.5740551422739 33.249619137764846 33.749611847411686
-315.247 188.5740551422739 189.17365761392392 33.249619137764846 33.749611847411686
-316.247 189.17365761392392 189.7732600855739 33.249619137764846 33.749611847411686
-317.247 189.7732600855739 190.3728625572739 33.249619137764846 33.749611847411686
-318.247 190.3728625572739 190.97246502892392 33.249619137764846 33.749611847411686
-319.247 190.97246502892392 191.5720675005739 33.249619137764846 33.749611847411686
-320.247 191.5720675005739 192.1716699722739 33.249619137764846 33.749611847411686
-321.247 192.1716699722739 192.7712724439739 33.249619137764846 33.749611847411686
-322.247 192.7712724439739 193.37087491562392 33.249619137764846 33.749611847411686
-323.247 193.37087491562392 193.9704773872739 33.249619137764846 33.749611847411686
-324.247 193.9704773872739 194.5700798589739 33.249619137764846 33.749611847411686
-325.247 194.5700798589739 195.1696823306239 33.249619137764846 33.749611847411686
-326.247 195.1696823306239 195.76928480227392 33.249619137764846 33.749611847411686
-327.247 195.76928480227392 196.36888727397388 33.249619137764846 33.749611847411686
-328.247 196.36888727397388 196.9684897456239 33.249619137764846 33.749611847411686
-329.247 196.9684897456239 197.56809221727391 33.249619137764846 33.749611847411686
-330.247 197.56809221727391 198.16769468897388 33.249619137764846 33.749611847411686
-331.247 198.16769468897388 198.7672971606239 33.249619137764846 33.749611847411686
-332.247 198.7672971606239 199.36689963227388 33.249619137764846 33.749611847411686
-333.247 199.36689963227388 199.9665021039739 33.249619137764846 33.749611847411686
-334.247 199.9665021039739 200.5661045756239 33.249619137764846 33.749611847411686
-335.247 200.5661045756239 201.17531449745638 33.249619137764846 33.749611847411686
-387.247 231.73582565209145 232.3450355739739 33.249619137764846 33.749611847411686
-388.247 232.3450355739739 232.94463804567388 33.249619137764846 33.749611847411686
-389.247 232.94463804567388 233.54424051732389 33.249619137764846 33.749611847411686
-390.247 233.54424051732389 234.14384298897394 33.249619137764846 33.749611847411686
-391.247 234.14384298897394 234.7434454606739 33.249619137764846 33.749611847411686
-392.247 234.7434454606739 235.3430479323239 33.249619137764846 33.749611847411686
-393.247 235.3430479323239 235.94265040397391 33.249619137764846 33.749611847411686
-394.247 235.94265040397391 236.54225287567388 33.249619137764846 33.749611847411686
-395.247 236.54225287567388 237.1418553473239 33.249619137764846 33.749611847411686
-396.247 237.1418553473239 237.74145781897394 33.249619137764846 33.749611847411686
-397.247 237.74145781897394 238.3410602906739 33.249619137764846 33.749611847411686
-398.247 238.3410602906739 238.9406627623739 33.249619137764846 33.749611847411686
-399.247 238.9406627623739 239.54026523402393 33.249619137764846 33.749611847411686
-400.247 239.54026523402393 240.1398677056739 33.249619137764846 33.749611847411686
-401.247 240.1398677056739 240.73947017737387 33.249619137764846 33.749611847411686
-402.247 240.73947017737387 241.3390726490239 33.249619137764846 33.749611847411686
-403.247 241.3390726490239 241.93867512067393 33.249619137764846 33.749611847411686
-404.247 241.93867512067393 242.53827759237393 33.249619137764846 33.749611847411686
-405.247 242.53827759237393 243.13788006402393 33.249619137764846 33.749611847411686
-406.247 243.13788006402393 243.7374825356739 33.249619137764846 33.749611847411686
-407.247 243.7374825356739 244.3370850073739 33.249619137764846 33.749611847411686
-408.247 244.3370850073739 244.93668747902387 33.249619137764846 33.749611847411686
-409.247 244.93668747902387 245.5362899506739 33.249619137764846 33.749611847411686
-410.247 245.5362899506739 246.1358924223739 33.249619137764846 33.749611847411686
-411.247 246.1358924223739 246.7354948940239 33.249619137764846 33.749611847411686
-412.247 246.7354948940239 247.3350973656739 33.249619137764846 33.749611847411686
-413.247 247.3350973656739 247.9346998373739 33.249619137764846 33.749611847411686
-414.247 247.9346998373739 248.5343023090239 33.249619137764846 33.749611847411686
-415.247 248.5343023090239 249.13390478067387 33.249619137764846 33.749611847411686
-416.247 249.13390478067387 249.73350725237387 33.249619137764846 33.749611847411686
-417.247 249.73350725237387 250.33310972402387 33.249619137764846 33.749611847411686
-418.247 250.33310972402387 250.9327121956739 33.249619137764846 33.749611847411686
-419.247 250.9327121956739 251.5323146673739 33.249619137764846 33.749611847411686
-420.247 251.5323146673739 252.1319171390239 33.249619137764846 33.749611847411686
-421.247 252.1319171390239 252.73151961067387 33.249619137764846 33.749611847411686
-422.247 252.73151961067387 253.3311220823739 33.249619137764846 33.749611847411686
-423.247 253.3311220823739 253.93072455402387 33.249619137764846 33.749611847411686
-424.247 253.93072455402387 254.5303270256739 33.249619137764846 33.749611847411686
-425.247 254.5303270256739 255.1299294973739 33.249619137764846 33.749611847411686
-426.247 255.1299294973739 255.72953196902392 33.249619137764846 33.749611847411686
-427.247 255.72953196902392 256.3291344406739 33.249619137764846 33.749611847411686
-428.247 256.3291344406739 256.92873691237395 33.249619137764846 33.749611847411686
-429.247 256.92873691237395 257.52833938402387 33.249619137764846 33.749611847411686
-430.247 257.52833938402387 258.1279418556739 33.249619137764846 33.749611847411686
-431.247 258.1279418556739 258.7275443273739 33.249619137764846 33.749611847411686
-432.247 258.7275443273739 259.3271467990239 33.249619137764846 33.749611847411686
-433.247 259.3271467990239 259.92674927067395 33.249619137764846 33.749611847411686
-434.247 259.92674927067395 260.52635174237395 33.249619137764846 33.749611847411686
-435.247 260.52635174237395 261.125954214024 33.249619137764846 33.749611847411686
-436.247 261.125954214024 261.72555668567395 33.249619137764846 33.749611847411686
-437.247 261.72555668567395 262.3251591573739 33.249619137764846 33.749611847411686
-438.247 262.3251591573739 262.9247616290739 33.249619137764846 33.749611847411686
-439.247 262.9247616290739 263.5243641007239 33.249619137764846 33.749611847411686
-440.247 263.5243641007239 264.12396657237394 33.249619137764846 33.749611847411686
-441.247 264.12396657237394 264.72356904407394 33.249619137764846 33.749611847411686
-442.247 264.72356904407394 265.32317151572397 33.249619137764846 33.749611847411686
-443.247 265.32317151572397 265.92277398737394 33.249619137764846 33.749611847411686
-444.247 265.92277398737394 266.5223764590739 33.249619137764846 33.749611847411686
-445.247 266.5223764590739 267.1219789307239 33.249619137764846 33.749611847411686
-446.247 267.1219789307239 267.7215814023739 33.249619137764846 33.749611847411686
-447.247 267.7215814023739 268.32118387407394 33.249619137764846 33.749611847411686
-448.247 268.32118387407394 268.92078634572397 33.249619137764846 33.749611847411686
-449.247 268.92078634572397 269.52038881737394 33.249619137764846 33.749611847411686
-450.247 269.52038881737394 270.11999128907394 33.249619137764846 33.749611847411686
-451.247 270.11999128907394 270.7195937607239 33.249619137764846 33.749611847411686
-452.247 270.7195937607239 271.3288036825564 33.249619137764846 33.749611847411686
-575.247 344.46109032559144 345.07030024747394 33.249619137764846 33.749611847411686
-576.247 345.07030024747394 345.66990271917393 33.249619137764846 33.749611847411686
-577.247 345.66990271917393 346.2695051908239 33.249619137764846 33.749611847411686
-578.247 346.2695051908239 346.8691076624739 33.249619137764846 33.749611847411686
-579.247 346.8691076624739 347.4687101341739 33.249619137764846 33.749611847411686
-580.247 347.4687101341739 348.0683126058239 33.249619137764846 33.749611847411686
-581.247 348.0683126058239 348.66791507747394 33.249619137764846 33.749611847411686
-582.247 348.66791507747394 349.26751754917393 33.249619137764846 33.749611847411686
-583.247 349.26751754917393 349.8671200208239 33.249619137764846 33.749611847411686
-584.247 349.8671200208239 350.4667224924739 33.249619137764846 33.749611847411686
-585.247 350.4667224924739 351.0663249641739 33.249619137764846 33.749611847411686
-586.247 351.0663249641739 351.66592743582385 33.249619137764846 33.749611847411686
-587.247 351.66592743582385 352.26552990747393 33.249619137764846 33.749611847411686
-588.247 352.26552990747393 352.86513237917393 33.249619137764846 33.749611847411686
-589.247 352.86513237917393 353.4647348508739 33.249619137764846 33.749611847411686
-590.247 353.4647348508739 354.0643373225239 33.249619137764846 33.749611847411686
-591.247 354.0643373225239 354.66393979417387 33.249619137764846 33.749611847411686
-592.247 354.66393979417387 355.26354226587387 33.249619137764846 33.749611847411686
-593.247 355.26354226587387 355.86314473752384 33.249619137764846 33.749611847411686
-594.247 355.86314473752384 356.4627472091739 33.249619137764846 33.749611847411686
-595.247 356.4627472091739 357.0623496808739 33.249619137764846 33.749611847411686
-596.247 357.0623496808739 357.6619521525239 33.249619137764846 33.749611847411686
-597.247 357.6619521525239 358.26155462417387 33.249619137764846 33.749611847411686
-598.247 358.26155462417387 358.86115709587386 33.249619137764846 33.749611847411686
-599.247 358.86115709587386 359.47036701775636 33.249619137764846 33.749611847411686
-000.247 359.68966911679144 0.29887903867390936 33.249619137764846 33.749611847411686
-001.248 0.3006092066588345 0.9037181809088344 33.749611847411686 34.249604471540096
-002.248 0.9037181809088344 1.5068271551588346 33.749611847411686 34.249604471540096
-003.248 1.5068271551588346 2.1099361294088346 33.749611847411686 34.249604471540096
-004.248 2.1099361294088346 2.713045103658835 33.749611847411686 34.249604471540096
-005.248 2.713045103658835 3.316154077908834 33.749611847411686 34.249604471540096
-006.248 3.316154077908834 3.9192630521588345 33.749611847411686 34.249604471540096
-007.248 3.9192630521588345 4.522372026408834 33.749611847411686 34.249604471540096
-008.248 4.522372026408834 5.125481000658835 33.749611847411686 34.249604471540096
-009.248 5.125481000658835 5.728589974908836 33.749611847411686 34.249604471540096
-010.248 5.728589974908836 6.3316989491588345 33.749611847411686 34.249604471540096
-011.248 6.3316989491588345 6.934807923408835 33.749611847411686 34.249604471540096
-012.248 6.934807923408835 7.5379168976588335 33.749611847411686 34.249604471540096
-013.248 7.5379168976588335 8.141025871908834 33.749611847411686 34.249604471540096
-014.248 8.141025871908834 8.744134846158833 33.749611847411686 34.249604471540096
-015.248 8.744134846158833 9.347243820408835 33.749611847411686 34.249604471540096
-016.248 9.347243820408835 9.950352794658833 33.749611847411686 34.249604471540096
-017.248 9.950352794658833 10.553461768908836 33.749611847411686 34.249604471540096
-018.248 10.553461768908836 11.156570743158834 33.749611847411686 34.249604471540096
-019.248 11.156570743158834 11.759679717408837 33.749611847411686 34.249604471540096
-020.248 11.759679717408837 12.362788691658835 33.749611847411686 34.249604471540096
-021.248 12.362788691658835 12.965897665908834 33.749611847411686 34.249604471540096
-022.248 12.965897665908834 13.569006640158838 33.749611847411686 34.249604471540096
-023.248 13.569006640158838 14.172115614408836 33.749611847411686 34.249604471540096
-024.248 14.172115614408836 14.775224588658835 33.749611847411686 34.249604471540096
-025.248 14.775224588658835 15.378333562958836 33.749611847411686 34.249604471540096
-026.248 15.378333562958836 15.981442537208835 33.749611847411686 34.249604471540096
-027.248 15.981442537208835 16.58455151145884 33.749611847411686 34.249604471540096
-028.248 16.58455151145884 17.187660485708836 33.749611847411686 34.249604471540096
-029.248 17.187660485708836 17.79076945995883 33.749611847411686 34.249604471540096
-030.248 17.79076945995883 18.393878434208837 33.749611847411686 34.249604471540096
-031.248 18.393878434208837 18.996987408458835 33.749611847411686 34.249604471540096
-032.248 18.996987408458835 19.600096382708834 33.749611847411686 34.249604471540096
-033.248 19.600096382708834 20.203205356958833 33.749611847411686 34.249604471540096
-034.248 20.203205356958833 20.80631433120883 33.749611847411686 34.249604471540096
-035.248 20.80631433120883 21.409423305458834 33.749611847411686 34.249604471540096
-036.248 21.409423305458834 22.01253227970883 33.749611847411686 34.249604471540096
-037.248 22.01253227970883 22.615641253958838 33.749611847411686 34.249604471540096
-038.248 22.615641253958838 23.21875022820884 33.749611847411686 34.249604471540096
-039.248 23.21875022820884 23.82185920245884 33.749611847411686 34.249604471540096
-040.248 23.82185920245884 24.424968176708838 33.749611847411686 34.249604471540096
-041.248 24.424968176708838 25.028077150958836 33.749611847411686 34.249604471540096
-042.248 25.028077150958836 25.63118612520884 33.749611847411686 34.249604471540096
-043.248 25.63118612520884 26.234295099458834 33.749611847411686 34.249604471540096
-044.248 26.234295099458834 26.83740407370884 33.749611847411686 34.249604471540096
-045.248 26.83740407370884 27.440513047958845 33.749611847411686 34.249604471540096
-046.248 27.440513047958845 28.043622022208837 33.749611847411686 34.249604471540096
-047.248 28.043622022208837 28.646730996458835 33.749611847411686 34.249604471540096
-048.248 28.646730996458835 29.249839970708834 33.749611847411686 34.249604471540096
-049.248 29.249839970708834 29.852948944958833 33.749611847411686 34.249604471540096
-050.248 29.852948944958833 30.45605791920883 33.749611847411686 34.249604471540096
-051.248 30.45605791920883 31.059166893458837 33.749611847411686 34.249604471540096
-052.248 31.059166893458837 31.662275867758837 33.749611847411686 34.249604471540096
-053.248 31.662275867758837 32.26538484200883 33.749611847411686 34.249604471540096
-054.248 32.26538484200883 32.868493816258834 33.749611847411686 34.249604471540096
-055.248 32.868493816258834 33.47160279050884 33.749611847411686 34.249604471540096
-056.248 33.47160279050884 34.07471176475883 33.749611847411686 34.249604471540096
-057.248 34.07471176475883 34.67782073900884 33.749611847411686 34.249604471540096
-058.248 34.67782073900884 35.28092971325884 33.749611847411686 34.249604471540096
-059.248 35.28092971325884 35.884038687508834 33.749611847411686 34.249604471540096
-060.248 35.884038687508834 36.487147661758826 33.749611847411686 34.249604471540096
-061.248 36.487147661758826 37.09025663600884 33.749611847411686 34.249604471540096
-062.248 37.09025663600884 37.70302931620984 33.749611847411686 34.249604471540096
-191.248 114.88165060850785 115.49442328875887 33.749611847411686 34.249604471540096
-192.248 115.49442328875887 116.09753226300884 33.749611847411686 34.249604471540096
-193.248 116.09753226300884 116.70064123725885 33.749611847411686 34.249604471540096
-194.248 116.70064123725885 117.30375021150884 33.749611847411686 34.249604471540096
-195.248 117.30375021150884 117.90685918575885 33.749611847411686 34.249604471540096
-196.248 117.90685918575885 118.50996816000882 33.749611847411686 34.249604471540096
-197.248 118.50996816000882 119.11307713425884 33.749611847411686 34.249604471540096
-198.248 119.11307713425884 119.71618610850885 33.749611847411686 34.249604471540096
-199.248 119.71618610850885 120.31929508275883 33.749611847411686 34.249604471540096
-200.248 120.31929508275883 120.92240405700885 33.749611847411686 34.249604471540096
-201.248 120.92240405700885 121.52551303125884 33.749611847411686 34.249604471540096
-202.248 121.52551303125884 122.12862200550884 33.749611847411686 34.249604471540096
-203.248 122.12862200550884 122.73173097975884 33.749611847411686 34.249604471540096
-204.248 122.73173097975884 123.33483995405884 33.749611847411686 34.249604471540096
-205.248 123.33483995405884 123.93794892830884 33.749611847411686 34.249604471540096
-206.248 123.93794892830884 124.54105790255885 33.749611847411686 34.249604471540096
-207.248 124.54105790255885 125.14416687680885 33.749611847411686 34.249604471540096
-208.248 125.14416687680885 125.74727585105883 33.749611847411686 34.249604471540096
-209.248 125.74727585105883 126.35038482530882 33.749611847411686 34.249604471540096
-210.248 126.35038482530882 126.95349379955884 33.749611847411686 34.249604471540096
-211.248 126.95349379955884 127.55660277380886 33.749611847411686 34.249604471540096
-212.248 127.55660277380886 128.15971174805884 33.749611847411686 34.249604471540096
-213.248 128.15971174805884 128.76282072230885 33.749611847411686 34.249604471540096
-214.248 128.76282072230885 129.36592969655882 33.749611847411686 34.249604471540096
-215.248 129.36592969655882 129.96903867080883 33.749611847411686 34.249604471540096
-216.248 129.96903867080883 130.57214764505883 33.749611847411686 34.249604471540096
-217.248 130.57214764505883 131.17525661930887 33.749611847411686 34.249604471540096
-218.248 131.17525661930887 131.77836559355885 33.749611847411686 34.249604471540096
-219.248 131.77836559355885 132.38147456780885 33.749611847411686 34.249604471540096
-220.248 132.38147456780885 132.98458354205883 33.749611847411686 34.249604471540096
-221.248 132.98458354205883 133.58769251630883 33.749611847411686 34.249604471540096
-222.248 133.58769251630883 134.19080149055884 33.749611847411686 34.249604471540096
-223.248 134.19080149055884 134.79391046480885 33.749611847411686 34.249604471540096
-224.248 134.79391046480885 135.39701943905882 33.749611847411686 34.249604471540096
-225.248 135.39701943905882 136.00012841330886 33.749611847411686 34.249604471540096
-226.248 136.00012841330886 136.60323738755886 33.749611847411686 34.249604471540096
-227.248 136.60323738755886 137.20634636180884 33.749611847411686 34.249604471540096
-228.248 137.20634636180884 137.80945533605882 33.749611847411686 34.249604471540096
-229.248 137.80945533605882 138.41256431030882 33.749611847411686 34.249604471540096
-230.248 138.41256431030882 139.01567328455883 33.749611847411686 34.249604471540096
-231.248 139.01567328455883 139.61878225885883 33.749611847411686 34.249604471540096
-232.248 139.61878225885883 140.22189123310886 33.749611847411686 34.249604471540096
-233.248 140.22189123310886 140.8250002073588 33.749611847411686 34.249604471540096
-234.248 140.8250002073588 141.42810918160885 33.749611847411686 34.249604471540096
-235.248 141.42810918160885 142.03121815585882 33.749611847411686 34.249604471540096
-236.248 142.03121815585882 142.63432713010886 33.749611847411686 34.249604471540096
-237.248 142.63432713010886 143.23743610435884 33.749611847411686 34.249604471540096
-238.248 143.23743610435884 143.84054507860884 33.749611847411686 34.249604471540096
-239.248 143.84054507860884 144.44365405285885 33.749611847411686 34.249604471540096
-240.248 144.44365405285885 145.04676302710885 33.749611847411686 34.249604471540096
-241.248 145.04676302710885 145.64987200135886 33.749611847411686 34.249604471540096
-242.248 145.64987200135886 146.25298097560886 33.749611847411686 34.249604471540096
-243.248 146.25298097560886 146.85608994985887 33.749611847411686 34.249604471540096
-244.248 146.85608994985887 147.45919892410888 33.749611847411686 34.249604471540096
-245.248 147.45919892410888 148.06230789835882 33.749611847411686 34.249604471540096
-246.248 148.06230789835882 148.66541687260883 33.749611847411686 34.249604471540096
-247.248 148.66541687260883 149.26852584685884 33.749611847411686 34.249604471540096
-248.248 149.26852584685884 149.87163482110884 33.749611847411686 34.249604471540096
-249.248 149.87163482110884 150.47474379535885 33.749611847411686 34.249604471540096
-250.248 150.47474379535885 151.07785276960885 33.749611847411686 34.249604471540096
-251.248 151.07785276960885 151.68096174385883 33.749611847411686 34.249604471540096
-252.248 151.68096174385883 152.28407071810884 33.749611847411686 34.249604471540096
-253.248 152.28407071810884 152.88717969235884 33.749611847411686 34.249604471540096
-254.248 152.88717969235884 153.49028866660882 33.749611847411686 34.249604471540096
-255.248 153.49028866660882 154.09339764085883 33.749611847411686 34.249604471540096
-256.248 154.09339764085883 154.69650661515882 33.749611847411686 34.249604471540096
-257.248 154.69650661515882 155.29961558940883 33.749611847411686 34.249604471540096
-258.248 155.29961558940883 155.90272456365884 33.749611847411686 34.249604471540096
-259.248 155.90272456365884 156.50583353790884 33.749611847411686 34.249604471540096
-260.248 156.50583353790884 157.10894251215885 33.749611847411686 34.249604471540096
-261.248 157.10894251215885 157.71205148640885 33.749611847411686 34.249604471540096
-262.248 157.71205148640885 158.32482416660986 33.749611847411686 34.249604471540096
-265.248 159.51171470320784 160.12448738340885 33.749611847411686 34.249604471540096
-266.248 160.12448738340885 160.72759635765883 33.749611847411686 34.249604471540096
-267.248 160.72759635765883 161.33070533190886 33.749611847411686 34.249604471540096
-268.248 161.33070533190886 161.93381430615887 33.749611847411686 34.249604471540096
-269.248 161.93381430615887 162.53692328040884 33.749611847411686 34.249604471540096
-270.248 162.53692328040884 163.14003225465882 33.749611847411686 34.249604471540096
-271.248 163.14003225465882 163.74314122890885 33.749611847411686 34.249604471540096
-272.248 163.74314122890885 164.34625020315883 33.749611847411686 34.249604471540096
-273.248 164.34625020315883 164.94935917740884 33.749611847411686 34.249604471540096
-274.248 164.94935917740884 165.55246815165884 33.749611847411686 34.249604471540096
-275.248 165.55246815165884 166.15557712590885 33.749611847411686 34.249604471540096
-276.248 166.15557712590885 166.75868610015885 33.749611847411686 34.249604471540096
-277.248 166.75868610015885 167.36179507440883 33.749611847411686 34.249604471540096
-278.248 167.36179507440883 167.96490404865887 33.749611847411686 34.249604471540096
-279.248 167.96490404865887 168.56801302290881 33.749611847411686 34.249604471540096
-280.248 168.56801302290881 169.17112199715882 33.749611847411686 34.249604471540096
-281.248 169.17112199715882 169.77423097145882 33.749611847411686 34.249604471540096
-282.248 169.77423097145882 170.37733994570883 33.749611847411686 34.249604471540096
-283.248 170.37733994570883 170.9804489199588 33.749611847411686 34.249604471540096
-284.248 170.9804489199588 171.58355789420887 33.749611847411686 34.249604471540096
-285.248 171.58355789420887 172.18666686845887 33.749611847411686 34.249604471540096
-286.248 172.18666686845887 172.78977584270885 33.749611847411686 34.249604471540096
-287.248 172.78977584270885 173.39288481695883 33.749611847411686 34.249604471540096
-288.248 173.39288481695883 173.99599379120886 33.749611847411686 34.249604471540096
-289.248 173.99599379120886 174.59910276545884 33.749611847411686 34.249604471540096
-290.248 174.59910276545884 175.20221173970884 33.749611847411686 34.249604471540096
-291.248 175.20221173970884 175.80532071395885 33.749611847411686 34.249604471540096
-292.248 175.80532071395885 176.40842968820886 33.749611847411686 34.249604471540096
-293.248 176.40842968820886 177.01153866245886 33.749611847411686 34.249604471540096
-294.248 177.01153866245886 177.61464763670887 33.749611847411686 34.249604471540096
-295.248 177.61464763670887 178.21775661095887 33.749611847411686 34.249604471540096
-296.248 178.21775661095887 178.82086558520885 33.749611847411686 34.249604471540096
-297.248 178.82086558520885 179.42397455945883 33.749611847411686 34.249604471540096
-298.248 179.42397455945883 180.02708353370883 33.749611847411686 34.249604471540096
-299.248 180.02708353370883 180.63019250795884 33.749611847411686 34.249604471540096
-300.248 180.63019250795884 181.23330148220884 33.749611847411686 34.249604471540096
-301.248 181.23330148220884 181.8364104564588 33.749611847411686 34.249604471540096
-302.248 181.8364104564588 182.4395194307088 33.749611847411686 34.249604471540096
-303.248 182.4395194307088 183.0426284049588 33.749611847411686 34.249604471540096
-304.248 183.0426284049588 183.6457373792088 33.749611847411686 34.249604471540096
-305.248 183.6457373792088 184.24884635345882 33.749611847411686 34.249604471540096
-306.248 184.24884635345882 184.85195532775884 33.749611847411686 34.249604471540096
-307.248 184.85195532775884 185.45506430200882 33.749611847411686 34.249604471540096
-308.248 185.45506430200882 186.0581732762588 33.749611847411686 34.249604471540096
-309.248 186.0581732762588 186.66128225050883 33.749611847411686 34.249604471540096
-310.248 186.66128225050883 187.26439122475884 33.749611847411686 34.249604471540096
-311.248 187.26439122475884 187.86750019900882 33.749611847411686 34.249604471540096
-312.248 187.86750019900882 188.47060917325882 33.749611847411686 34.249604471540096
-313.248 188.47060917325882 189.07371814750883 33.749611847411686 34.249604471540096
-314.248 189.07371814750883 189.67682712175883 33.749611847411686 34.249604471540096
-315.248 189.67682712175883 190.27993609600884 33.749611847411686 34.249604471540096
-316.248 190.27993609600884 190.88304507025885 33.749611847411686 34.249604471540096
-317.248 190.88304507025885 191.48615404450885 33.749611847411686 34.249604471540096
-318.248 191.48615404450885 192.0892630187588 33.749611847411686 34.249604471540096
-319.248 192.0892630187588 192.69237199300883 33.749611847411686 34.249604471540096
-320.248 192.69237199300883 193.2954809672588 33.749611847411686 34.249604471540096
-321.248 193.2954809672588 193.89858994150882 33.749611847411686 34.249604471540096
-322.248 193.89858994150882 194.50169891575882 33.749611847411686 34.249604471540096
-323.248 194.50169891575882 195.10480789000883 33.749611847411686 34.249604471540096
-324.248 195.10480789000883 195.70791686425883 33.749611847411686 34.249604471540096
-325.248 195.70791686425883 196.31102583850884 33.749611847411686 34.249604471540096
-326.248 196.31102583850884 196.91413481275885 33.749611847411686 34.249604471540096
-327.248 196.91413481275885 197.51724378700882 33.749611847411686 34.249604471540096
-328.248 197.51724378700882 198.1203527612588 33.749611847411686 34.249604471540096
-329.248 198.1203527612588 198.7234617355088 33.749611847411686 34.249604471540096
-330.248 198.7234617355088 199.3265707097588 33.749611847411686 34.249604471540096
-331.248 199.3265707097588 199.92967968400882 33.749611847411686 34.249604471540096
-332.248 199.92967968400882 200.54245236420982 33.749611847411686 34.249604471540096
-375.248 225.8537018709078 226.46647455110883 33.749611847411686 34.249604471540096
-376.248 226.46647455110883 227.06958352535884 33.749611847411686 34.249604471540096
-377.248 227.06958352535884 227.67269249960881 33.749611847411686 34.249604471540096
-378.248 227.67269249960881 228.2758014738588 33.749611847411686 34.249604471540096
-379.248 228.2758014738588 228.8789104481088 33.749611847411686 34.249604471540096
-380.248 228.8789104481088 229.48201942235883 33.749611847411686 34.249604471540096
-381.248 229.48201942235883 230.08512839660884 33.749611847411686 34.249604471540096
-382.248 230.08512839660884 230.68823737085884 33.749611847411686 34.249604471540096
-383.248 230.68823737085884 231.29134634515884 33.749611847411686 34.249604471540096
-384.248 231.29134634515884 231.89445531940882 33.749611847411686 34.249604471540096
-385.248 231.89445531940882 232.49756429365883 33.749611847411686 34.249604471540096
-386.248 232.49756429365883 233.10067326790883 33.749611847411686 34.249604471540096
-387.248 233.10067326790883 233.70378224215884 33.749611847411686 34.249604471540096
-388.248 233.70378224215884 234.30689121640884 33.749611847411686 34.249604471540096
-389.248 234.30689121640884 234.91000019065882 33.749611847411686 34.249604471540096
-390.248 234.91000019065882 235.51310916490883 33.749611847411686 34.249604471540096
-391.248 235.51310916490883 236.1162181391588 33.749611847411686 34.249604471540096
-392.248 236.1162181391588 236.71932711340884 33.749611847411686 34.249604471540096
-393.248 236.71932711340884 237.32243608765884 33.749611847411686 34.249604471540096
-394.248 237.32243608765884 237.92554506190882 33.749611847411686 34.249604471540096
-395.248 237.92554506190882 238.52865403615883 33.749611847411686 34.249604471540096
-396.248 238.52865403615883 239.13176301040883 33.749611847411686 34.249604471540096
-397.248 239.13176301040883 239.7348719846588 33.749611847411686 34.249604471540096
-398.248 239.7348719846588 240.3379809589088 33.749611847411686 34.249604471540096
-399.248 240.3379809589088 240.9410899331588 33.749611847411686 34.249604471540096
-400.248 240.9410899331588 241.54419890740883 33.749611847411686 34.249604471540096
-401.248 241.54419890740883 242.14730788165883 33.749611847411686 34.249604471540096
-402.248 242.14730788165883 242.75041685590884 33.749611847411686 34.249604471540096
-403.248 242.75041685590884 243.35352583015884 33.749611847411686 34.249604471540096
-404.248 243.35352583015884 243.95663480440885 33.749611847411686 34.249604471540096
-405.248 243.95663480440885 244.5597437786588 33.749611847411686 34.249604471540096
-406.248 244.5597437786588 245.1628527529088 33.749611847411686 34.249604471540096
-407.248 245.1628527529088 245.76596172715884 33.749611847411686 34.249604471540096
-408.248 245.76596172715884 246.36907070145884 33.749611847411686 34.249604471540096
-409.248 246.36907070145884 246.97217967570882 33.749611847411686 34.249604471540096
-410.248 246.97217967570882 247.5752886499588 33.749611847411686 34.249604471540096
-411.248 247.5752886499588 248.1783976242088 33.749611847411686 34.249604471540096
-412.248 248.1783976242088 248.78150659845883 33.749611847411686 34.249604471540096
-413.248 248.78150659845883 249.3846155727088 33.749611847411686 34.249604471540096
-414.248 249.3846155727088 249.98772454695884 33.749611847411686 34.249604471540096
-415.248 249.98772454695884 250.59083352120885 33.749611847411686 34.249604471540096
-416.248 250.59083352120885 251.19394249545883 33.749611847411686 34.249604471540096
-417.248 251.19394249545883 251.7970514697088 33.749611847411686 34.249604471540096
-418.248 251.7970514697088 252.4001604439588 33.749611847411686 34.249604471540096
-419.248 252.4001604439588 253.00326941820882 33.749611847411686 34.249604471540096
-420.248 253.00326941820882 253.6063783924588 33.749611847411686 34.249604471540096
-421.248 253.6063783924588 254.2094873667088 33.749611847411686 34.249604471540096
-422.248 254.2094873667088 254.81259634095883 33.749611847411686 34.249604471540096
-423.248 254.81259634095883 255.41570531520887 33.749611847411686 34.249604471540096
-424.248 255.41570531520887 256.0188142894588 33.749611847411686 34.249604471540096
-425.248 256.0188142894588 256.6219232637088 33.749611847411686 34.249604471540096
-426.248 256.6219232637088 257.2250322379588 33.749611847411686 34.249604471540096
-427.248 257.2250322379588 257.82814121220883 33.749611847411686 34.249604471540096
-428.248 257.82814121220883 258.43125018645884 33.749611847411686 34.249604471540096
-429.248 258.43125018645884 259.03435916070885 33.749611847411686 34.249604471540096
-430.248 259.03435916070885 259.6374681349588 33.749611847411686 34.249604471540096
-431.248 259.6374681349588 260.24057710920886 33.749611847411686 34.249604471540096
-432.248 260.24057710920886 260.8436860834588 33.749611847411686 34.249604471540096
-433.248 260.8436860834588 261.4467950577588 33.749611847411686 34.249604471540096
-434.248 261.4467950577588 262.04990403200884 33.749611847411686 34.249604471540096
-435.248 262.04990403200884 262.65301300625885 33.749611847411686 34.249604471540096
-436.248 262.65301300625885 263.25612198050885 33.749611847411686 34.249604471540096
-437.248 263.25612198050885 263.8592309547588 33.749611847411686 34.249604471540096
-438.248 263.8592309547588 264.46233992900886 33.749611847411686 34.249604471540096
-439.248 264.46233992900886 265.0654489032588 33.749611847411686 34.249604471540096
-440.248 265.0654489032588 265.6685578775089 33.749611847411686 34.249604471540096
-441.248 265.6685578775089 266.2716668517588 33.749611847411686 34.249604471540096
-442.248 266.2716668517588 266.8747758260088 33.749611847411686 34.249604471540096
-443.248 266.8747758260088 267.47788480025883 33.749611847411686 34.249604471540096
-444.248 267.47788480025883 268.0809937745088 33.749611847411686 34.249604471540096
-445.248 268.0809937745088 268.68410274875885 33.749611847411686 34.249604471540096
-446.248 268.68410274875885 269.2872117230088 33.749611847411686 34.249604471540096
-447.248 269.2872117230088 269.89032069725886 33.749611847411686 34.249604471540096
-448.248 269.89032069725886 270.4934296715088 33.749611847411686 34.249604471540096
-449.248 270.4934296715088 271.10620235170984 33.749611847411686 34.249604471540096
-573.248 345.2692787728078 345.88205145300884 33.749611847411686 34.249604471540096
-574.248 345.88205145300884 346.48516042725885 33.749611847411686 34.249604471540096
-575.248 346.48516042725885 347.0882694015088 33.749611847411686 34.249604471540096
-576.248 347.0882694015088 347.69137837575886 33.749611847411686 34.249604471540096
-577.248 347.69137837575886 348.29448735000886 33.749611847411686 34.249604471540096
-578.248 348.29448735000886 348.89759632425887 33.749611847411686 34.249604471540096
-579.248 348.89759632425887 349.5007052985088 33.749611847411686 34.249604471540096
-580.248 349.5007052985088 350.1038142727588 33.749611847411686 34.249604471540096
-581.248 350.1038142727588 350.70692324700883 33.749611847411686 34.249604471540096
-582.248 350.70692324700883 351.3100322212588 33.749611847411686 34.249604471540096
-583.248 351.3100322212588 351.91314119550884 33.749611847411686 34.249604471540096
-584.248 351.91314119550884 352.5162501697588 33.749611847411686 34.249604471540096
-585.248 352.5162501697588 353.11935914400885 33.749611847411686 34.249604471540096
-586.248 353.11935914400885 353.7224681182588 33.749611847411686 34.249604471540096
-587.248 353.7224681182588 354.32557709250887 33.749611847411686 34.249604471540096
-588.248 354.32557709250887 354.9286860667588 33.749611847411686 34.249604471540096
-589.248 354.9286860667588 355.53179504105884 33.749611847411686 34.249604471540096
-590.248 355.53179504105884 356.13490401530885 33.749611847411686 34.249604471540096
-591.248 356.13490401530885 356.7380129895588 33.749611847411686 34.249604471540096
-592.248 356.7380129895588 357.34112196380886 33.749611847411686 34.249604471540096
-593.248 357.34112196380886 357.9442309380588 33.749611847411686 34.249604471540096
-594.248 357.9442309380588 358.5473399123088 33.749611847411686 34.249604471540096
-595.248 358.5473399123088 359.1504488865588 33.749611847411686 34.249604471540096
-596.248 359.1504488865588 359.7255290466088 33.749611847411686 34.249604471540096
-000.248 359.7255290466088 0.3006092066588345 33.749611847411686 34.249604471540096
-001.249 0.3023826821723936 0.9090858872223936 34.249604471540096 34.74959700749294
-002.249 0.9090858872223936 1.5157890922723938 34.249604471540096 34.74959700749294
-003.249 1.5157890922723938 2.1224922973223936 34.249604471540096 34.74959700749294
-004.249 2.1224922973223936 2.7291955023723937 34.249604471540096 34.74959700749294
-005.249 2.7291955023723937 3.335898707422394 34.249604471540096 34.74959700749294
-006.249 3.335898707422394 3.9426019124723934 34.249604471540096 34.74959700749294
-007.249 3.9426019124723934 4.549305117522394 34.249604471540096 34.74959700749294
-008.249 4.549305117522394 5.156008322572394 34.249604471540096 34.74959700749294
-009.249 5.156008322572394 5.762711527622393 34.249604471540096 34.74959700749294
-010.249 5.762711527622393 6.369414732672393 34.249604471540096 34.74959700749294
-011.249 6.369414732672393 6.976117937722394 34.249604471540096 34.74959700749294
-012.249 6.976117937722394 7.582821142772394 34.249604471540096 34.74959700749294
-013.249 7.582821142772394 8.189524347822394 34.249604471540096 34.74959700749294
-014.249 8.189524347822394 8.796227552872391 34.249604471540096 34.74959700749294
-015.249 8.796227552872391 9.402930757872394 34.249604471540096 34.74959700749294
-016.249 9.402930757872394 10.009633962922393 34.249604471540096 34.74959700749294
-017.249 10.009633962922393 10.616337167972395 34.249604471540096 34.74959700749294
-018.249 10.616337167972395 11.223040373022394 34.249604471540096 34.74959700749294
-019.249 11.223040373022394 11.829743578072394 34.249604471540096 34.74959700749294
-020.249 11.829743578072394 12.436446783122395 34.249604471540096 34.74959700749294
-021.249 12.436446783122395 13.043149988172395 34.249604471540096 34.74959700749294
-022.249 13.043149988172395 13.649853193222391 34.249604471540096 34.74959700749294
-023.249 13.649853193222391 14.256556398272396 34.249604471540096 34.74959700749294
-024.249 14.256556398272396 14.863259603322396 34.249604471540096 34.74959700749294
-025.249 14.863259603322396 15.46996280837239 34.249604471540096 34.74959700749294
-026.249 15.46996280837239 16.076666013422393 34.249604471540096 34.74959700749294
-027.249 16.076666013422393 16.683369218472393 34.249604471540096 34.74959700749294
-028.249 16.683369218472393 17.29007242352239 34.249604471540096 34.74959700749294
-029.249 17.29007242352239 17.896775628572392 34.249604471540096 34.74959700749294
-030.249 17.896775628572392 18.503478833622395 34.249604471540096 34.74959700749294
-031.249 18.503478833622395 19.11018203867239 34.249604471540096 34.74959700749294
-032.249 19.11018203867239 19.716885243672394 34.249604471540096 34.74959700749294
-033.249 19.716885243672394 20.323588448722397 34.249604471540096 34.74959700749294
-034.249 20.323588448722397 20.930291653772393 34.249604471540096 34.74959700749294
-035.249 20.930291653772393 21.536994858822393 34.249604471540096 34.74959700749294
-036.249 21.536994858822393 22.143698063872392 34.249604471540096 34.74959700749294
-037.249 22.143698063872392 22.75040126892239 34.249604471540096 34.74959700749294
-038.249 22.75040126892239 23.35710447397239 34.249604471540096 34.74959700749294
-039.249 23.35710447397239 23.963807679022395 34.249604471540096 34.74959700749294
-040.249 23.963807679022395 24.57051088407239 34.249604471540096 34.74959700749294
-041.249 24.57051088407239 25.177214089122394 34.249604471540096 34.74959700749294
-042.249 25.177214089122394 25.783917294172397 34.249604471540096 34.74959700749294
-043.249 25.783917294172397 26.390620499222393 34.249604471540096 34.74959700749294
-044.249 26.390620499222393 26.99732370427239 34.249604471540096 34.74959700749294
-045.249 26.99732370427239 27.604026909322396 34.249604471540096 34.74959700749294
-046.249 27.604026909322396 28.210730114372396 34.249604471540096 34.74959700749294
-047.249 28.210730114372396 28.817433319372398 34.249604471540096 34.74959700749294
-048.249 28.817433319372398 29.424136524422394 34.249604471540096 34.74959700749294
-049.249 29.424136524422394 30.03083972947239 34.249604471540096 34.74959700749294
-050.249 30.03083972947239 30.637542934522394 34.249604471540096 34.74959700749294
-051.249 30.637542934522394 31.24424613957239 34.249604471540096 34.74959700749294
-052.249 31.24424613957239 31.850949344622393 34.249604471540096 34.74959700749294
-053.249 31.850949344622393 32.457652549672396 34.249604471540096 34.74959700749294
-054.249 32.457652549672396 33.06435575472239 34.249604471540096 34.74959700749294
-055.249 33.06435575472239 33.671058959772395 34.249604471540096 34.74959700749294
-056.249 33.671058959772395 34.27776216482239 34.249604471540096 34.74959700749294
-057.249 34.27776216482239 34.88446536987239 34.249604471540096 34.74959700749294
-058.249 34.88446536987239 35.49116857492238 34.249604471540096 34.74959700749294
-059.249 35.49116857492238 36.097871779972394 34.249604471540096 34.74959700749294
-060.249 36.097871779972394 36.714296355483185 34.249604471540096 34.74959700749294
-189.249 114.3528638605616 114.96928843607239 34.249604471540096 34.74959700749294
-190.249 114.96928843607239 115.57599164107239 34.249604471540096 34.74959700749294
-191.249 115.57599164107239 116.18269484612239 34.249604471540096 34.74959700749294
-192.249 116.18269484612239 116.78939805117238 34.249604471540096 34.74959700749294
-193.249 116.78939805117238 117.39610125622238 34.249604471540096 34.74959700749294
-194.249 117.39610125622238 118.0028044612724 34.249604471540096 34.74959700749294
-195.249 118.0028044612724 118.60950766632239 34.249604471540096 34.74959700749294
-196.249 118.60950766632239 119.2162108713724 34.249604471540096 34.74959700749294
-197.249 119.2162108713724 119.8229140764224 34.249604471540096 34.74959700749294
-198.249 119.8229140764224 120.42961728147239 34.249604471540096 34.74959700749294
-199.249 120.42961728147239 121.0363204865224 34.249604471540096 34.74959700749294
-200.249 121.0363204865224 121.64302369157241 34.249604471540096 34.74959700749294
-201.249 121.64302369157241 122.2497268966224 34.249604471540096 34.74959700749294
-202.249 122.2497268966224 122.8564301016724 34.249604471540096 34.74959700749294
-203.249 122.8564301016724 123.4631333067224 34.249604471540096 34.74959700749294
-204.249 123.4631333067224 124.0698365117724 34.249604471540096 34.74959700749294
-205.249 124.0698365117724 124.6765397167724 34.249604471540096 34.74959700749294
-206.249 124.6765397167724 125.2832429218224 34.249604471540096 34.74959700749294
-207.249 125.2832429218224 125.88994612687239 34.249604471540096 34.74959700749294
-208.249 125.88994612687239 126.49664933192241 34.249604471540096 34.74959700749294
-209.249 126.49664933192241 127.10335253697241 34.249604471540096 34.74959700749294
-210.249 127.10335253697241 127.7100557420224 34.249604471540096 34.74959700749294
-211.249 127.7100557420224 128.3167589470724 34.249604471540096 34.74959700749294
-212.249 128.3167589470724 128.9234621521224 34.249604471540096 34.74959700749294
-213.249 128.9234621521224 129.5301653571724 34.249604471540096 34.74959700749294
-214.249 129.5301653571724 130.1368685622224 34.249604471540096 34.74959700749294
-215.249 130.1368685622224 130.74357176727239 34.249604471540096 34.74959700749294
-216.249 130.74357176727239 131.35027497232238 34.249604471540096 34.74959700749294
-217.249 131.35027497232238 131.95697817737238 34.249604471540096 34.74959700749294
-218.249 131.95697817737238 132.56368138242237 34.249604471540096 34.74959700749294
-219.249 132.56368138242237 133.1703845874724 34.249604471540096 34.74959700749294
-220.249 133.1703845874724 133.7770877924724 34.249604471540096 34.74959700749294
-221.249 133.7770877924724 134.3837909975224 34.249604471540096 34.74959700749294
-222.249 134.3837909975224 134.9904942025724 34.249604471540096 34.74959700749294
-223.249 134.9904942025724 135.5971974076224 34.249604471540096 34.74959700749294
-224.249 135.5971974076224 136.2039006126724 34.249604471540096 34.74959700749294
-225.249 136.2039006126724 136.8106038177224 34.249604471540096 34.74959700749294
-226.249 136.8106038177224 137.41730702277238 34.249604471540096 34.74959700749294
-227.249 137.41730702277238 138.02401022782237 34.249604471540096 34.74959700749294
-228.249 138.02401022782237 138.63071343287237 34.249604471540096 34.74959700749294
-229.249 138.63071343287237 139.2374166379224 34.249604471540096 34.74959700749294
-230.249 139.2374166379224 139.84411984297242 34.249604471540096 34.74959700749294
-231.249 139.84411984297242 140.45082304802241 34.249604471540096 34.74959700749294
-232.249 140.45082304802241 141.0575262530724 34.249604471540096 34.74959700749294
-233.249 141.0575262530724 141.6642294581224 34.249604471540096 34.74959700749294
-234.249 141.6642294581224 142.2709326631724 34.249604471540096 34.74959700749294
-235.249 142.2709326631724 142.87763586822237 34.249604471540096 34.74959700749294
-236.249 142.87763586822237 143.48433907327237 34.249604471540096 34.74959700749294
-237.249 143.48433907327237 144.0910422782724 34.249604471540096 34.74959700749294
-238.249 144.0910422782724 144.6977454833224 34.249604471540096 34.74959700749294
-239.249 144.6977454833224 145.30444868837242 34.249604471540096 34.74959700749294
-240.249 145.30444868837242 145.9111518934224 34.249604471540096 34.74959700749294
-241.249 145.9111518934224 146.5178550984724 34.249604471540096 34.74959700749294
-242.249 146.5178550984724 147.1245583035224 34.249604471540096 34.74959700749294
-243.249 147.1245583035224 147.7312615085724 34.249604471540096 34.74959700749294
-244.249 147.7312615085724 148.3379647136224 34.249604471540096 34.74959700749294
-245.249 148.3379647136224 148.9446679186724 34.249604471540096 34.74959700749294
-246.249 148.9446679186724 149.5513711237224 34.249604471540096 34.74959700749294
-247.249 149.5513711237224 150.1580743287724 34.249604471540096 34.74959700749294
-248.249 150.1580743287724 150.76477753382238 34.249604471540096 34.74959700749294
-249.249 150.76477753382238 151.37148073887238 34.249604471540096 34.74959700749294
-250.249 151.37148073887238 151.9781839439224 34.249604471540096 34.74959700749294
-251.249 151.9781839439224 152.5848871489724 34.249604471540096 34.74959700749294
-252.249 152.5848871489724 153.1915903539724 34.249604471540096 34.74959700749294
-253.249 153.1915903539724 153.79829355902237 34.249604471540096 34.74959700749294
-254.249 153.79829355902237 154.4049967640724 34.249604471540096 34.74959700749294
-255.249 154.4049967640724 155.0116999691224 34.249604471540096 34.74959700749294
-256.249 155.0116999691224 155.61840317417239 34.249604471540096 34.74959700749294
-257.249 155.61840317417239 156.22510637922238 34.249604471540096 34.74959700749294
-258.249 156.22510637922238 156.83180958427238 34.249604471540096 34.74959700749294
-259.249 156.83180958427238 157.4385127893224 34.249604471540096 34.74959700749294
-260.249 157.4385127893224 158.0549373648832 34.249604471540096 34.74959700749294
-263.249 159.2489010339616 159.86532560952242 34.249604471540096 34.74959700749294
-264.249 159.86532560952242 160.4720288145724 34.249604471540096 34.74959700749294
-265.249 160.4720288145724 161.0787320196224 34.249604471540096 34.74959700749294
-266.249 161.0787320196224 161.6854352246724 34.249604471540096 34.74959700749294
-267.249 161.6854352246724 162.29213842967238 34.249604471540096 34.74959700749294
-268.249 162.29213842967238 162.8988416347224 34.249604471540096 34.74959700749294
-269.249 162.8988416347224 163.5055448397724 34.249604471540096 34.74959700749294
-270.249 163.5055448397724 164.11224804482242 34.249604471540096 34.74959700749294
-271.249 164.11224804482242 164.71895124987242 34.249604471540096 34.74959700749294
-272.249 164.71895124987242 165.32565445492241 34.249604471540096 34.74959700749294
-273.249 165.32565445492241 165.9323576599724 34.249604471540096 34.74959700749294
-274.249 165.9323576599724 166.5390608650224 34.249604471540096 34.74959700749294
-275.249 166.5390608650224 167.1457640700724 34.249604471540096 34.74959700749294
-276.249 167.1457640700724 167.7524672751224 34.249604471540096 34.74959700749294
-277.249 167.7524672751224 168.3591704801724 34.249604471540096 34.74959700749294
-278.249 168.3591704801724 168.9658736852224 34.249604471540096 34.74959700749294
-279.249 168.9658736852224 169.57257689027242 34.249604471540096 34.74959700749294
-280.249 169.57257689027242 170.17928009532238 34.249604471540096 34.74959700749294
-281.249 170.17928009532238 170.7859833003724 34.249604471540096 34.74959700749294
-282.249 170.7859833003724 171.39268650542238 34.249604471540096 34.74959700749294
-283.249 171.39268650542238 171.9993897104724 34.249604471540096 34.74959700749294
-284.249 171.9993897104724 172.6060929154724 34.249604471540096 34.74959700749294
-285.249 172.6060929154724 173.2127961205224 34.249604471540096 34.74959700749294
-286.249 173.2127961205224 173.8194993255724 34.249604471540096 34.74959700749294
-287.249 173.8194993255724 174.4262025306224 34.249604471540096 34.74959700749294
-288.249 174.4262025306224 175.03290573567241 34.249604471540096 34.74959700749294
-289.249 175.03290573567241 175.63960894072238 34.249604471540096 34.74959700749294
-290.249 175.63960894072238 176.2463121457724 34.249604471540096 34.74959700749294
-291.249 176.2463121457724 176.85301535082237 34.249604471540096 34.74959700749294
-292.249 176.85301535082237 177.4597185558724 34.249604471540096 34.74959700749294
-293.249 177.4597185558724 178.0664217609224 34.249604471540096 34.74959700749294
-294.249 178.0664217609224 178.67312496597242 34.249604471540096 34.74959700749294
-295.249 178.67312496597242 179.2798281710224 34.249604471540096 34.74959700749294
-296.249 179.2798281710224 179.8865313760724 34.249604471540096 34.74959700749294
-297.249 179.8865313760724 180.49323458112238 34.249604471540096 34.74959700749294
-298.249 180.49323458112238 181.09993778617238 34.249604471540096 34.74959700749294
-299.249 181.09993778617238 181.70664099117238 34.249604471540096 34.74959700749294
-300.249 181.70664099117238 182.31334419622237 34.249604471540096 34.74959700749294
-301.249 182.31334419622237 182.92004740127237 34.249604471540096 34.74959700749294
-302.249 182.92004740127237 183.52675060632237 34.249604471540096 34.74959700749294
-303.249 183.52675060632237 184.1334538113724 34.249604471540096 34.74959700749294
-304.249 184.1334538113724 184.74015701642236 34.249604471540096 34.74959700749294
-305.249 184.74015701642236 185.3468602214724 34.249604471540096 34.74959700749294
-306.249 185.3468602214724 185.95356342652238 34.249604471540096 34.74959700749294
-307.249 185.95356342652238 186.56026663157238 34.249604471540096 34.74959700749294
-308.249 186.56026663157238 187.16696983662237 34.249604471540096 34.74959700749294
-309.249 187.16696983662237 187.77367304167237 34.249604471540096 34.74959700749294
-310.249 187.77367304167237 188.3803762467224 34.249604471540096 34.74959700749294
-311.249 188.3803762467224 188.9870794517724 34.249604471540096 34.74959700749294
-312.249 188.9870794517724 189.59378265682238 34.249604471540096 34.74959700749294
-313.249 189.59378265682238 190.20048586187238 34.249604471540096 34.74959700749294
-314.249 190.20048586187238 190.8071890668724 34.249604471540096 34.74959700749294
-315.249 190.8071890668724 191.41389227192238 34.249604471540096 34.74959700749294
-316.249 191.41389227192238 192.02059547697237 34.249604471540096 34.74959700749294
-317.249 192.02059547697237 192.62729868202237 34.249604471540096 34.74959700749294
-318.249 192.62729868202237 193.23400188707237 34.249604471540096 34.74959700749294
-319.249 193.23400188707237 193.8407050921224 34.249604471540096 34.74959700749294
-320.249 193.8407050921224 194.4571296676832 34.249604471540096 34.74959700749294
-372.249 225.3795503840616 225.99597495962237 34.249604471540096 34.74959700749294
-373.249 225.99597495962237 226.60267816467237 34.249604471540096 34.74959700749294
-374.249 226.60267816467237 227.2093813697224 34.249604471540096 34.74959700749294
-375.249 227.2093813697224 227.8160845747724 34.249604471540096 34.74959700749294
-376.249 227.8160845747724 228.4227877798224 34.249604471540096 34.74959700749294
-377.249 228.4227877798224 229.02949098487238 34.249604471540096 34.74959700749294
-378.249 229.02949098487238 229.63619418987238 34.249604471540096 34.74959700749294
-379.249 229.63619418987238 230.2428973949224 34.249604471540096 34.74959700749294
-380.249 230.2428973949224 230.8496005999724 34.249604471540096 34.74959700749294
-381.249 230.8496005999724 231.4563038050224 34.249604471540096 34.74959700749294
-382.249 231.4563038050224 232.06300701007237 34.249604471540096 34.74959700749294
-383.249 232.06300701007237 232.6697102151224 34.249604471540096 34.74959700749294
-384.249 232.6697102151224 233.2764134201724 34.249604471540096 34.74959700749294
-385.249 233.2764134201724 233.88311662522239 34.249604471540096 34.74959700749294
-386.249 233.88311662522239 234.4898198302724 34.249604471540096 34.74959700749294
-387.249 234.4898198302724 235.09652303532238 34.249604471540096 34.74959700749294
-388.249 235.09652303532238 235.70322624037237 34.249604471540096 34.74959700749294
-389.249 235.70322624037237 236.30992944542237 34.249604471540096 34.74959700749294
-390.249 236.30992944542237 236.9166326504724 34.249604471540096 34.74959700749294
-391.249 236.9166326504724 237.52333585552242 34.249604471540096 34.74959700749294
-392.249 237.52333585552242 238.13003906057241 34.249604471540096 34.74959700749294
-393.249 238.13003906057241 238.7367422655724 34.249604471540096 34.74959700749294
-394.249 238.7367422655724 239.34344547062238 34.249604471540096 34.74959700749294
-395.249 239.34344547062238 239.95014867567238 34.249604471540096 34.74959700749294
-396.249 239.95014867567238 240.55685188072238 34.249604471540096 34.74959700749294
-397.249 240.55685188072238 241.1635550857724 34.249604471540096 34.74959700749294
-398.249 241.1635550857724 241.77025829082237 34.249604471540096 34.74959700749294
-399.249 241.77025829082237 242.37696149587234 34.249604471540096 34.74959700749294
-400.249 242.37696149587234 242.98366470092236 34.249604471540096 34.74959700749294
-401.249 242.98366470092236 243.59036790597236 34.249604471540096 34.74959700749294
-402.249 243.59036790597236 244.1970711110224 34.249604471540096 34.74959700749294
-403.249 244.1970711110224 244.8037743160724 34.249604471540096 34.74959700749294
-404.249 244.8037743160724 245.4104775211224 34.249604471540096 34.74959700749294
-405.249 245.4104775211224 246.0171807261724 34.249604471540096 34.74959700749294
-406.249 246.0171807261724 246.6238839312224 34.249604471540096 34.74959700749294
-407.249 246.6238839312224 247.2305871362724 34.249604471540096 34.74959700749294
-408.249 247.2305871362724 247.8372903412724 34.249604471540096 34.74959700749294
-409.249 247.8372903412724 248.4439935463224 34.249604471540096 34.74959700749294
-410.249 248.4439935463224 249.05069675137239 34.249604471540096 34.74959700749294
-411.249 249.05069675137239 249.65739995642238 34.249604471540096 34.74959700749294
-412.249 249.65739995642238 250.26410316147238 34.249604471540096 34.74959700749294
-413.249 250.26410316147238 250.87080636652237 34.249604471540096 34.74959700749294
-414.249 250.87080636652237 251.47750957157237 34.249604471540096 34.74959700749294
-415.249 251.47750957157237 252.0842127766224 34.249604471540096 34.74959700749294
-416.249 252.0842127766224 252.6909159816724 34.249604471540096 34.74959700749294
-417.249 252.6909159816724 253.2976191867224 34.249604471540096 34.74959700749294
-418.249 253.2976191867224 253.90432239177238 34.249604471540096 34.74959700749294
-419.249 253.90432239177238 254.51102559682238 34.249604471540096 34.74959700749294
-420.249 254.51102559682238 255.11772880187237 34.249604471540096 34.74959700749294
-421.249 255.11772880187237 255.72443200692237 34.249604471540096 34.74959700749294
-422.249 255.72443200692237 256.3311352119724 34.249604471540096 34.74959700749294
-423.249 256.3311352119724 256.93783841702236 34.249604471540096 34.74959700749294
-424.249 256.93783841702236 257.5445416220724 34.249604471540096 34.74959700749294
-425.249 257.5445416220724 258.1512448270724 34.249604471540096 34.74959700749294
-426.249 258.1512448270724 258.7579480321224 34.249604471540096 34.74959700749294
-427.249 258.7579480321224 259.3646512371724 34.249604471540096 34.74959700749294
-428.249 259.3646512371724 259.9713544422224 34.249604471540096 34.74959700749294
-429.249 259.9713544422224 260.57805764727243 34.249604471540096 34.74959700749294
-430.249 260.57805764727243 261.18476085232237 34.249604471540096 34.74959700749294
-431.249 261.18476085232237 261.7914640573724 34.249604471540096 34.74959700749294
-432.249 261.7914640573724 262.39816726242236 34.249604471540096 34.74959700749294
-433.249 262.39816726242236 263.0048704674724 34.249604471540096 34.74959700749294
-434.249 263.0048704674724 263.6115736725224 34.249604471540096 34.74959700749294
-435.249 263.6115736725224 264.2182768775724 34.249604471540096 34.74959700749294
-436.249 264.2182768775724 264.8249800826224 34.249604471540096 34.74959700749294
-437.249 264.8249800826224 265.4316832876724 34.249604471540096 34.74959700749294
-438.249 265.4316832876724 266.0383864927224 34.249604471540096 34.74959700749294
-439.249 266.0383864927224 266.6450896977724 34.249604471540096 34.74959700749294
-440.249 266.6450896977724 267.2517929027724 34.249604471540096 34.74959700749294
-441.249 267.2517929027724 267.85849610782236 34.249604471540096 34.74959700749294
-442.249 267.85849610782236 268.4651993128724 34.249604471540096 34.74959700749294
-443.249 268.4651993128724 269.0719025179224 34.249604471540096 34.74959700749294
-444.249 269.0719025179224 269.6786057229724 34.249604471540096 34.74959700749294
-445.249 269.6786057229724 270.2853089280224 34.249604471540096 34.74959700749294
-446.249 270.2853089280224 270.90173350358316 34.249604471540096 34.74959700749294
-574.249 347.9335978035616 348.5500223790724 34.249604471540096 34.74959700749294
-575.249 348.5500223790724 349.1567255841224 34.249604471540096 34.74959700749294
-576.249 349.1567255841224 349.7634287891724 34.249604471540096 34.74959700749294
-577.249 349.7634287891724 350.3701319942224 34.249604471540096 34.74959700749294
-578.249 350.3701319942224 350.9768351992724 34.249604471540096 34.74959700749294
-579.249 350.9768351992724 351.5835384043224 34.249604471540096 34.74959700749294
-580.249 351.5835384043224 352.1902416093724 34.249604471540096 34.74959700749294
-581.249 352.1902416093724 352.79694481437235 34.249604471540096 34.74959700749294
-582.249 352.79694481437235 353.4036480194224 34.249604471540096 34.74959700749294
-583.249 353.4036480194224 354.0103512244724 34.249604471540096 34.74959700749294
-584.249 354.0103512244724 354.6170544295224 34.249604471540096 34.74959700749294
-585.249 354.6170544295224 355.2237576345724 34.249604471540096 34.74959700749294
-586.249 355.2237576345724 355.8304608396224 34.249604471540096 34.74959700749294
-587.249 355.8304608396224 356.4371640446724 34.249604471540096 34.74959700749294
-588.249 356.4371640446724 357.0438672497224 34.249604471540096 34.74959700749294
-589.249 357.0438672497224 357.6505704547724 34.249604471540096 34.74959700749294
-590.249 357.6505704547724 358.2572736598224 34.249604471540096 34.74959700749294
-591.249 358.2572736598224 358.86397686487237 34.249604471540096 34.74959700749294
-592.249 358.86397686487237 359.48040144038316 34.249604471540096 34.74959700749294
-000.249 359.6859581066616 0.3023826821723936 34.249604471540096 34.74959700749294
-001.250 0.30420050889409045 0.9145878032940904 34.74959700749294 35.24958945252204
-002.250 0.9145878032940904 1.5249750976440906 34.74959700749294 35.24958945252204
-003.250 1.5249750976440906 2.1353623919940903 34.74959700749294 35.24958945252204
-004.250 2.1353623919940903 2.745749686394091 34.74959700749294 35.24958945252204
-005.250 2.745749686394091 3.356136980794091 34.74959700749294 35.24958945252204
-006.250 3.356136980794091 3.9665242751940903 34.74959700749294 35.24958945252204
-007.250 3.9665242751940903 4.576911569544091 34.74959700749294 35.24958945252204
-008.250 4.576911569544091 5.187298863894091 34.74959700749294 35.24958945252204
-009.250 5.187298863894091 5.7976861582940895 34.74959700749294 35.24958945252204
-010.250 5.7976861582940895 6.40807345269409 34.74959700749294 35.24958945252204
-011.250 6.40807345269409 7.018460747094091 34.74959700749294 35.24958945252204
-012.250 7.018460747094091 7.6288480414440905 34.74959700749294 35.24958945252204
-013.250 7.6288480414440905 8.239235335794088 34.74959700749294 35.24958945252204
-014.250 8.239235335794088 8.84962263019409 34.74959700749294 35.24958945252204
-015.250 8.84962263019409 9.46000992459409 34.74959700749294 35.24958945252204
-016.250 9.46000992459409 10.070397218994088 34.74959700749294 35.24958945252204
-017.250 10.070397218994088 10.68078451339409 34.74959700749294 35.24958945252204
-018.250 10.68078451339409 11.291171807744089 34.74959700749294 35.24958945252204
-019.250 11.291171807744089 11.90155910209409 34.74959700749294 35.24958945252204
-020.250 11.90155910209409 12.511946396494093 34.74959700749294 35.24958945252204
-021.250 12.511946396494093 13.122333690894092 34.74959700749294 35.24958945252204
-022.250 13.122333690894092 13.73272098529409 34.74959700749294 35.24958945252204
-023.250 13.73272098529409 14.343108279644088 34.74959700749294 35.24958945252204
-024.250 14.343108279644088 14.953495573994092 34.74959700749294 35.24958945252204
-025.250 14.953495573994092 15.563882868394089 34.74959700749294 35.24958945252204
-026.250 15.563882868394089 16.174270162794095 34.74959700749294 35.24958945252204
-027.250 16.174270162794095 16.784657457194093 34.74959700749294 35.24958945252204
-028.250 16.784657457194093 17.395044751544095 34.74959700749294 35.24958945252204
-029.250 17.395044751544095 18.00543204589409 34.74959700749294 35.24958945252204
-030.250 18.00543204589409 18.615819340294088 34.74959700749294 35.24958945252204
-031.250 18.615819340294088 19.22620663469409 34.74959700749294 35.24958945252204
-032.250 19.22620663469409 19.836593929094093 34.74959700749294 35.24958945252204
-033.250 19.836593929094093 20.44698122344409 34.74959700749294 35.24958945252204
-034.250 20.44698122344409 21.05736851779409 34.74959700749294 35.24958945252204
-035.250 21.05736851779409 21.66775581219409 34.74959700749294 35.24958945252204
-036.250 21.66775581219409 22.27814310659409 34.74959700749294 35.24958945252204
-037.250 22.27814310659409 22.888530400994092 34.74959700749294 35.24958945252204
-038.250 22.888530400994092 23.49891769534409 34.74959700749294 35.24958945252204
-039.250 23.49891769534409 24.10930498969409 34.74959700749294 35.24958945252204
-040.250 24.10930498969409 24.71969228409409 34.74959700749294 35.24958945252204
-041.250 24.71969228409409 25.330079578494093 34.74959700749294 35.24958945252204
-042.250 25.330079578494093 25.940466872894092 34.74959700749294 35.24958945252204
-043.250 25.940466872894092 26.55085416729409 34.74959700749294 35.24958945252204
-044.250 26.55085416729409 27.16124146164409 34.74959700749294 35.24958945252204
-045.250 27.16124146164409 27.77162875599409 34.74959700749294 35.24958945252204
-046.250 27.77162875599409 28.382016050394093 34.74959700749294 35.24958945252204
-047.250 28.382016050394093 28.992403344794095 34.74959700749294 35.24958945252204
-048.250 28.992403344794095 29.60279063919409 34.74959700749294 35.24958945252204
-049.250 29.60279063919409 30.21317793354409 34.74959700749294 35.24958945252204
-050.250 30.21317793354409 30.823565227894086 34.74959700749294 35.24958945252204
-051.250 30.823565227894086 31.43395252229409 34.74959700749294 35.24958945252204
-052.250 31.43395252229409 32.044339816694084 34.74959700749294 35.24958945252204
-053.250 32.044339816694084 32.65472711109409 34.74959700749294 35.24958945252204
-054.250 32.65472711109409 33.265114405444095 34.74959700749294 35.24958945252204
-055.250 33.265114405444095 33.8755016997941 34.74959700749294 35.24958945252204
-056.250 33.8755016997941 34.485888994194084 34.74959700749294 35.24958945252204
-057.250 34.485888994194084 35.09627628859409 34.74959700749294 35.24958945252204
-058.250 35.09627628859409 35.70666358299408 34.74959700749294 35.24958945252204
-059.250 35.70666358299408 36.32683135540318 34.74959700749294 35.24958945252204
-187.250 113.82645678568501 114.4466245580941 34.74959700749294 35.24958945252204
-188.250 114.4466245580941 115.0570118524941 34.74959700749294 35.24958945252204
-189.250 115.0570118524941 115.6673991468441 34.74959700749294 35.24958945252204
-190.250 115.6673991468441 116.2777864411941 34.74959700749294 35.24958945252204
-191.250 116.2777864411941 116.88817373559408 34.74959700749294 35.24958945252204
-192.250 116.88817373559408 117.49856102999408 34.74959700749294 35.24958945252204
-193.250 117.49856102999408 118.10894832439409 34.74959700749294 35.24958945252204
-194.250 118.10894832439409 118.71933561874411 34.74959700749294 35.24958945252204
-195.250 118.71933561874411 119.32972291309409 34.74959700749294 35.24958945252204
-196.250 119.32972291309409 119.94011020749409 34.74959700749294 35.24958945252204
-197.250 119.94011020749409 120.55049750189409 34.74959700749294 35.24958945252204
-198.250 120.55049750189409 121.16088479629408 34.74959700749294 35.24958945252204
-199.250 121.16088479629408 121.7712720906441 34.74959700749294 35.24958945252204
-200.250 121.7712720906441 122.3816593849941 34.74959700749294 35.24958945252204
-201.250 122.3816593849941 122.99204667939408 34.74959700749294 35.24958945252204
-202.250 122.99204667939408 123.60243397379409 34.74959700749294 35.24958945252204
-203.250 123.60243397379409 124.21282126819412 34.74959700749294 35.24958945252204
-204.250 124.21282126819412 124.8232085625441 34.74959700749294 35.24958945252204
-205.250 124.8232085625441 125.4335958568941 34.74959700749294 35.24958945252204
-206.250 125.4335958568941 126.0439831512941 34.74959700749294 35.24958945252204
-207.250 126.0439831512941 126.6543704456941 34.74959700749294 35.24958945252204
-208.250 126.6543704456941 127.26475774009408 34.74959700749294 35.24958945252204
-209.250 127.26475774009408 127.8751450344941 34.74959700749294 35.24958945252204
-210.250 127.8751450344941 128.4855323288441 34.74959700749294 35.24958945252204
-211.250 128.4855323288441 129.0959196231941 34.74959700749294 35.24958945252204
-212.250 129.0959196231941 129.70630691759408 34.74959700749294 35.24958945252204
-213.250 129.70630691759408 130.3166942119941 34.74959700749294 35.24958945252204
-214.250 130.3166942119941 130.92708150639413 34.74959700749294 35.24958945252204
-215.250 130.92708150639413 131.53746880074408 34.74959700749294 35.24958945252204
-216.250 131.53746880074408 132.14785609509408 34.74959700749294 35.24958945252204
-217.250 132.14785609509408 132.7582433894941 34.74959700749294 35.24958945252204
-218.250 132.7582433894941 133.36863068389414 34.74959700749294 35.24958945252204
-219.250 133.36863068389414 133.9790179782941 34.74959700749294 35.24958945252204
-220.250 133.9790179782941 134.58940527264411 34.74959700749294 35.24958945252204
-221.250 134.58940527264411 135.19979256699406 34.74959700749294 35.24958945252204
-222.250 135.19979256699406 135.8101798613941 34.74959700749294 35.24958945252204
-223.250 135.8101798613941 136.42056715579412 34.74959700749294 35.24958945252204
-224.250 136.42056715579412 137.0309544501941 34.74959700749294 35.24958945252204
-225.250 137.0309544501941 137.6413417445441 34.74959700749294 35.24958945252204
-226.250 137.6413417445441 138.2517290388941 34.74959700749294 35.24958945252204
-227.250 138.2517290388941 138.86211633329413 34.74959700749294 35.24958945252204
-228.250 138.86211633329413 139.4725036276941 34.74959700749294 35.24958945252204
-229.250 139.4725036276941 140.08289092209407 34.74959700749294 35.24958945252204
-230.250 140.08289092209407 140.6932782164441 34.74959700749294 35.24958945252204
-231.250 140.6932782164441 141.3036655107941 34.74959700749294 35.24958945252204
-232.250 141.3036655107941 141.9140528051941 34.74959700749294 35.24958945252204
-233.250 141.9140528051941 142.52444009959407 34.74959700749294 35.24958945252204
-234.250 142.52444009959407 143.1348273939941 34.74959700749294 35.24958945252204
-235.250 143.1348273939941 143.74521468839407 34.74959700749294 35.24958945252204
-236.250 143.74521468839407 144.35560198274408 34.74959700749294 35.24958945252204
-237.250 144.35560198274408 144.96598927709408 34.74959700749294 35.24958945252204
-238.250 144.96598927709408 145.5763765714941 34.74959700749294 35.24958945252204
-239.250 145.5763765714941 146.1867638658941 34.74959700749294 35.24958945252204
-240.250 146.1867638658941 146.7971511602941 34.74959700749294 35.24958945252204
-241.250 146.7971511602941 147.4075384546441 34.74959700749294 35.24958945252204
-242.250 147.4075384546441 148.01792574899406 34.74959700749294 35.24958945252204
-243.250 148.01792574899406 148.6283130433941 34.74959700749294 35.24958945252204
-244.250 148.6283130433941 149.23870033779409 34.74959700749294 35.24958945252204
-245.250 149.23870033779409 149.84908763219408 34.74959700749294 35.24958945252204
-246.250 149.84908763219408 150.4594749265441 34.74959700749294 35.24958945252204
-247.250 150.4594749265441 151.0698622208941 34.74959700749294 35.24958945252204
-248.250 151.0698622208941 151.6802495152941 34.74959700749294 35.24958945252204
-249.250 151.6802495152941 152.2906368096941 34.74959700749294 35.24958945252204
-250.250 152.2906368096941 152.9010241040941 34.74959700749294 35.24958945252204
-251.250 152.9010241040941 153.5114113984441 34.74959700749294 35.24958945252204
-252.250 153.5114113984441 154.1217986927941 34.74959700749294 35.24958945252204
-253.250 154.1217986927941 154.7321859871941 34.74959700749294 35.24958945252204
-254.250 154.7321859871941 155.3425732815941 34.74959700749294 35.24958945252204
-255.250 155.3425732815941 155.9529605759941 34.74959700749294 35.24958945252204
-256.250 155.9529605759941 156.5633478703441 34.74959700749294 35.24958945252204
-257.250 156.5633478703441 157.1737351646941 34.74959700749294 35.24958945252204
-258.250 157.1737351646941 157.7939029371032 34.74959700749294 35.24958945252204
-261.250 158.995116569885 159.6152843422941 34.74959700749294 35.24958945252204
-262.250 159.6152843422941 160.2256716366441 34.74959700749294 35.24958945252204
-263.250 160.2256716366441 160.8360589309941 34.74959700749294 35.24958945252204
-264.250 160.8360589309941 161.44644622539408 34.74959700749294 35.24958945252204
-265.250 161.44644622539408 162.0568335197941 34.74959700749294 35.24958945252204
-266.250 162.0568335197941 162.6672208141941 34.74959700749294 35.24958945252204
-267.250 162.6672208141941 163.2776081085441 34.74959700749294 35.24958945252204
-268.250 163.2776081085441 163.8879954028941 34.74959700749294 35.24958945252204
-269.250 163.8879954028941 164.49838269729406 34.74959700749294 35.24958945252204
-270.250 164.49838269729406 165.1087699916941 34.74959700749294 35.24958945252204
-271.250 165.1087699916941 165.7191572860941 34.74959700749294 35.24958945252204
-272.250 165.7191572860941 166.3295445804441 34.74959700749294 35.24958945252204
-273.250 166.3295445804441 166.93993187479407 34.74959700749294 35.24958945252204
-274.250 166.93993187479407 167.5503191691941 34.74959700749294 35.24958945252204
-275.250 167.5503191691941 168.1607064635941 34.74959700749294 35.24958945252204
-276.250 168.1607064635941 168.7710937579941 34.74959700749294 35.24958945252204
-277.250 168.7710937579941 169.3814810523441 34.74959700749294 35.24958945252204
-278.250 169.3814810523441 169.9918683466941 34.74959700749294 35.24958945252204
-279.250 169.9918683466941 170.60225564109413 34.74959700749294 35.24958945252204
-280.250 170.60225564109413 171.2126429354941 34.74959700749294 35.24958945252204
-281.250 171.2126429354941 171.8230302298941 34.74959700749294 35.24958945252204
-282.250 171.8230302298941 172.4334175242441 34.74959700749294 35.24958945252204
-283.250 172.4334175242441 173.04380481859414 34.74959700749294 35.24958945252204
-284.250 173.04380481859414 173.6541921129941 34.74959700749294 35.24958945252204
-285.250 173.6541921129941 174.2645794073941 34.74959700749294 35.24958945252204
-286.250 174.2645794073941 174.8749667017941 34.74959700749294 35.24958945252204
-287.250 174.8749667017941 175.4853539961441 34.74959700749294 35.24958945252204
-288.250 175.4853539961441 176.09574129049412 34.74959700749294 35.24958945252204
-289.250 176.09574129049412 176.7061285848941 34.74959700749294 35.24958945252204
-290.250 176.7061285848941 177.3165158792941 34.74959700749294 35.24958945252204
-291.250 177.3165158792941 177.9269031736941 34.74959700749294 35.24958945252204
-292.250 177.9269031736941 178.5372904680941 34.74959700749294 35.24958945252204
-293.250 178.5372904680941 179.14767776244412 34.74959700749294 35.24958945252204
-294.250 179.14767776244412 179.7580650567941 34.74959700749294 35.24958945252204
-295.250 179.7580650567941 180.36845235119407 34.74959700749294 35.24958945252204
-296.250 180.36845235119407 180.97883964559406 34.74959700749294 35.24958945252204
-297.250 180.97883964559406 181.58922693999406 34.74959700749294 35.24958945252204
-298.250 181.58922693999406 182.19961423434407 34.74959700749294 35.24958945252204
-299.250 182.19961423434407 182.81000152869407 34.74959700749294 35.24958945252204
-300.250 182.81000152869407 183.42038882309407 34.74959700749294 35.24958945252204
-301.250 183.42038882309407 184.03077611749407 34.74959700749294 35.24958945252204
-302.250 184.03077611749407 184.64116341189407 34.74959700749294 35.24958945252204
-303.250 184.64116341189407 185.25155070624407 34.74959700749294 35.24958945252204
-304.250 185.25155070624407 185.86193800059408 34.74959700749294 35.24958945252204
-305.250 185.86193800059408 186.47232529499408 34.74959700749294 35.24958945252204
-306.250 186.47232529499408 187.08271258939408 34.74959700749294 35.24958945252204
-307.250 187.08271258939408 187.6930998837941 34.74959700749294 35.24958945252204
-308.250 187.6930998837941 188.30348717814405 34.74959700749294 35.24958945252204
-309.250 188.30348717814405 188.91387447249406 34.74959700749294 35.24958945252204
-310.250 188.91387447249406 189.52426176689409 34.74959700749294 35.24958945252204
-311.250 189.52426176689409 190.13464906129408 34.74959700749294 35.24958945252204
-312.250 190.13464906129408 190.74503635569408 34.74959700749294 35.24958945252204
-313.250 190.74503635569408 191.3554236500441 34.74959700749294 35.24958945252204
-314.250 191.3554236500441 191.9658109443941 34.74959700749294 35.24958945252204
-315.250 191.9658109443941 192.5761982387941 34.74959700749294 35.24958945252204
-316.250 192.5761982387941 193.1865855331941 34.74959700749294 35.24958945252204
-317.250 193.1865855331941 193.79697282759406 34.74959700749294 35.24958945252204
-318.250 193.79697282759406 194.41714060000314 34.74959700749294 35.24958945252204
-370.250 225.527331657385 226.1474994297941 34.74959700749294 35.24958945252204
-371.250 226.1474994297941 226.7578867241441 34.74959700749294 35.24958945252204
-372.250 226.7578867241441 227.3682740184941 34.74959700749294 35.24958945252204
-373.250 227.3682740184941 227.9786613128941 34.74959700749294 35.24958945252204
-374.250 227.9786613128941 228.58904860729407 34.74959700749294 35.24958945252204
-375.250 228.58904860729407 229.1994359016941 34.74959700749294 35.24958945252204
-376.250 229.1994359016941 229.80982319604408 34.74959700749294 35.24958945252204
-377.250 229.80982319604408 230.42021049039408 34.74959700749294 35.24958945252204
-378.250 230.42021049039408 231.0305977847941 34.74959700749294 35.24958945252204
-379.250 231.0305977847941 231.64098507919408 34.74959700749294 35.24958945252204
-380.250 231.64098507919408 232.2513723735941 34.74959700749294 35.24958945252204
-381.250 232.2513723735941 232.86175966794406 34.74959700749294 35.24958945252204
-382.250 232.86175966794406 233.47214696229406 34.74959700749294 35.24958945252204
-383.250 233.47214696229406 234.08253425669406 34.74959700749294 35.24958945252204
-384.250 234.08253425669406 234.69292155109406 34.74959700749294 35.24958945252204
-385.250 234.69292155109406 235.30330884549406 34.74959700749294 35.24958945252204
-386.250 235.30330884549406 235.9136961398441 34.74959700749294 35.24958945252204
-387.250 235.9136961398441 236.5240834341941 34.74959700749294 35.24958945252204
-388.250 236.5240834341941 237.13447072859407 34.74959700749294 35.24958945252204
-389.250 237.13447072859407 237.7448580229941 34.74959700749294 35.24958945252204
-390.250 237.7448580229941 238.35524531739406 34.74959700749294 35.24958945252204
-391.250 238.35524531739406 238.96563261174407 34.74959700749294 35.24958945252204
-392.250 238.96563261174407 239.57601990609407 34.74959700749294 35.24958945252204
-393.250 239.57601990609407 240.1864072004941 34.74959700749294 35.24958945252204
-394.250 240.1864072004941 240.79679449489407 34.74959700749294 35.24958945252204
-395.250 240.79679449489407 241.40718178929407 34.74959700749294 35.24958945252204
-396.250 241.40718178929407 242.01756908364405 34.74959700749294 35.24958945252204
-397.250 242.01756908364405 242.6279563779941 34.74959700749294 35.24958945252204
-398.250 242.6279563779941 243.23834367239408 34.74959700749294 35.24958945252204
-399.250 243.23834367239408 243.84873096679408 34.74959700749294 35.24958945252204
-400.250 243.84873096679408 244.45911826119408 34.74959700749294 35.24958945252204
-401.250 244.45911826119408 245.06950555559408 34.74959700749294 35.24958945252204
-402.250 245.06950555559408 245.67989284994405 34.74959700749294 35.24958945252204
-403.250 245.67989284994405 246.29028014429406 34.74959700749294 35.24958945252204
-404.250 246.29028014429406 246.90066743869406 34.74959700749294 35.24958945252204
-405.250 246.90066743869406 247.51105473309406 34.74959700749294 35.24958945252204
-406.250 247.51105473309406 248.1214420274941 34.74959700749294 35.24958945252204
-407.250 248.1214420274941 248.7318293218441 34.74959700749294 35.24958945252204
-408.250 248.7318293218441 249.34221661619407 34.74959700749294 35.24958945252204
-409.250 249.34221661619407 249.95260391059406 34.74959700749294 35.24958945252204
-410.250 249.95260391059406 250.56299120499406 34.74959700749294 35.24958945252204
-411.250 250.56299120499406 251.17337849939406 34.74959700749294 35.24958945252204
-412.250 251.17337849939406 251.7837657937441 34.74959700749294 35.24958945252204
-413.250 251.7837657937441 252.3941530880941 34.74959700749294 35.24958945252204
-414.250 252.3941530880941 253.0045403824941 34.74959700749294 35.24958945252204
-415.250 253.0045403824941 253.61492767689407 34.74959700749294 35.24958945252204
-416.250 253.61492767689407 254.2253149712941 34.74959700749294 35.24958945252204
-417.250 254.2253149712941 254.8357022656441 34.74959700749294 35.24958945252204
-418.250 254.8357022656441 255.4460895599941 34.74959700749294 35.24958945252204
-419.250 255.4460895599941 256.0564768543941 34.74959700749294 35.24958945252204
-420.250 256.0564768543941 256.66686414879405 34.74959700749294 35.24958945252204
-421.250 256.66686414879405 257.2772514431941 34.74959700749294 35.24958945252204
-422.250 257.2772514431941 257.8876387375441 34.74959700749294 35.24958945252204
-423.250 257.8876387375441 258.4980260318941 34.74959700749294 35.24958945252204
-424.250 258.4980260318941 259.1084133262941 34.74959700749294 35.24958945252204
-425.250 259.1084133262941 259.7188006206941 34.74959700749294 35.24958945252204
-426.250 259.7188006206941 260.32918791509405 34.74959700749294 35.24958945252204
-427.250 260.32918791509405 260.9395752094941 34.74959700749294 35.24958945252204
-428.250 260.9395752094941 261.5499625038441 34.74959700749294 35.24958945252204
-429.250 261.5499625038441 262.1603497981941 34.74959700749294 35.24958945252204
-430.250 262.1603497981941 262.7707370925941 34.74959700749294 35.24958945252204
-431.250 262.7707370925941 263.3811243869941 34.74959700749294 35.24958945252204
-432.250 263.3811243869941 263.99151168139406 34.74959700749294 35.24958945252204
-433.250 263.99151168139406 264.60189897574406 34.74959700749294 35.24958945252204
-434.250 264.60189897574406 265.21228627009407 34.74959700749294 35.24958945252204
-435.250 265.21228627009407 265.8226735644941 34.74959700749294 35.24958945252204
-436.250 265.8226735644941 266.4330608588941 34.74959700749294 35.24958945252204
-437.250 266.4330608588941 267.0434481532941 34.74959700749294 35.24958945252204
-438.250 267.0434481532941 267.6538354476441 34.74959700749294 35.24958945252204
-439.250 267.6538354476441 268.2642227419941 34.74959700749294 35.24958945252204
-440.250 268.2642227419941 268.8746100363941 34.74959700749294 35.24958945252204
-441.250 268.8746100363941 269.48499733079404 34.74959700749294 35.24958945252204
-442.250 269.48499733079404 270.0953846251941 34.74959700749294 35.24958945252204
-443.250 270.0953846251941 270.7057719195441 34.74959700749294 35.24958945252204
-444.250 270.7057719195441 271.32593969190316 34.74959700749294 35.24958945252204
-571.250 348.215177827885 348.8353456002941 34.74959700749294 35.24958945252204
-572.250 348.8353456002941 349.44573289469406 34.74959700749294 35.24958945252204
-573.250 349.44573289469406 350.05612018904407 34.74959700749294 35.24958945252204
-574.250 350.05612018904407 350.66650748339407 34.74959700749294 35.24958945252204
-575.250 350.66650748339407 351.2768947777941 34.74959700749294 35.24958945252204
-576.250 351.2768947777941 351.8872820721941 34.74959700749294 35.24958945252204
-577.250 351.8872820721941 352.4976693665941 34.74959700749294 35.24958945252204
-578.250 352.4976693665941 353.1080566609441 34.74959700749294 35.24958945252204
-579.250 353.1080566609441 353.7184439552941 34.74959700749294 35.24958945252204
-580.250 353.7184439552941 354.3288312496941 34.74959700749294 35.24958945252204
-581.250 354.3288312496941 354.93921854409405 34.74959700749294 35.24958945252204
-582.250 354.93921854409405 355.5496058384941 34.74959700749294 35.24958945252204
-583.250 355.5496058384941 356.1599931328441 34.74959700749294 35.24958945252204
-584.250 356.1599931328441 356.7703804271941 34.74959700749294 35.24958945252204
-585.250 356.7703804271941 357.3807677215941 34.74959700749294 35.24958945252204
-586.250 357.3807677215941 357.9911550159941 34.74959700749294 35.24958945252204
-587.250 357.9911550159941 358.60154231039405 34.74959700749294 35.24958945252204
-588.250 358.60154231039405 359.2119296047441 34.74959700749294 35.24958945252204
-589.250 359.2119296047441 359.75806505679407 34.74959700749294 35.24958945252204
-000.250 359.75806505679407 0.30420050889409045 34.74959700749294 35.24958945252204
-001.251 0.30606377078187835 0.9202272263818784 35.24958945252204 35.74958180378378
-002.251 0.9202272263818784 1.5343906819818782 35.24958945252204 35.74958180378378
-003.251 1.5343906819818782 2.148554137531878 35.24958945252204 35.74958180378378
-004.251 2.148554137531878 2.7627175930818786 35.24958945252204 35.74958180378378
-005.251 2.7627175930818786 3.376881048681879 35.24958945252204 35.74958180378378
-006.251 3.376881048681879 3.991044504281878 35.24958945252204 35.74958180378378
-007.251 3.991044504281878 4.605207959881879 35.24958945252204 35.74958180378378
-008.251 4.605207959881879 5.219371415481879 35.24958945252204 35.74958180378378
-009.251 5.219371415481879 5.833534871081879 35.24958945252204 35.74958180378378
-010.251 5.833534871081879 6.447698326631878 35.24958945252204 35.74958180378378
-011.251 6.447698326631878 7.061861782181879 35.24958945252204 35.74958180378378
-012.251 7.061861782181879 7.6760252377818805 35.24958945252204 35.74958180378378
-013.251 7.6760252377818805 8.290188693381879 35.24958945252204 35.74958180378378
-014.251 8.290188693381879 8.904352148981879 35.24958945252204 35.74958180378378
-015.251 8.904352148981879 9.518515604581879 35.24958945252204 35.74958180378378
-016.251 9.518515604581879 10.132679060181877 35.24958945252204 35.74958180378378
-017.251 10.132679060181877 10.746842515781879 35.24958945252204 35.74958180378378
-018.251 10.746842515781879 11.361005971331878 35.24958945252204 35.74958180378378
-019.251 11.361005971331878 11.975169426881877 35.24958945252204 35.74958180378378
-020.251 11.975169426881877 12.589332882481878 35.24958945252204 35.74958180378378
-021.251 12.589332882481878 13.203496338081878 35.24958945252204 35.74958180378378
-022.251 13.203496338081878 13.81765979368188 35.24958945252204 35.74958180378378
-023.251 13.81765979368188 14.431823249281878 35.24958945252204 35.74958180378378
-024.251 14.431823249281878 15.04598670488188 35.24958945252204 35.74958180378378
-025.251 15.04598670488188 15.660150160431881 35.24958945252204 35.74958180378378
-026.251 15.660150160431881 16.274313615981875 35.24958945252204 35.74958180378378
-027.251 16.274313615981875 16.888477071581875 35.24958945252204 35.74958180378378
-028.251 16.888477071581875 17.502640527181875 35.24958945252204 35.74958180378378
-029.251 17.502640527181875 18.116803982781875 35.24958945252204 35.74958180378378
-030.251 18.116803982781875 18.730967438381875 35.24958945252204 35.74958180378378
-031.251 18.730967438381875 19.345130893981878 35.24958945252204 35.74958180378378
-032.251 19.345130893981878 19.959294349531874 35.24958945252204 35.74958180378378
-033.251 19.959294349531874 20.57345780508188 35.24958945252204 35.74958180378378
-034.251 20.57345780508188 21.18762126068188 35.24958945252204 35.74958180378378
-035.251 21.18762126068188 21.80178471628188 35.24958945252204 35.74958180378378
-036.251 21.80178471628188 22.41594817188188 35.24958945252204 35.74958180378378
-037.251 22.41594817188188 23.03011162748188 35.24958945252204 35.74958180378378
-038.251 23.03011162748188 23.64427508308188 35.24958945252204 35.74958180378378
-039.251 23.64427508308188 24.25843853863188 35.24958945252204 35.74958180378378
-040.251 24.25843853863188 24.872601994181878 35.24958945252204 35.74958180378378
-041.251 24.872601994181878 25.486765449781878 35.24958945252204 35.74958180378378
-042.251 25.486765449781878 26.100928905381878 35.24958945252204 35.74958180378378
-043.251 26.100928905381878 26.715092360981878 35.24958945252204 35.74958180378378
-044.251 26.715092360981878 27.329255816581874 35.24958945252204 35.74958180378378
-045.251 27.329255816581874 27.943419272181877 35.24958945252204 35.74958180378378
-046.251 27.943419272181877 28.55758272773188 35.24958945252204 35.74958180378378
-047.251 28.55758272773188 29.171746183281876 35.24958945252204 35.74958180378378
-048.251 29.171746183281876 29.78590963888188 35.24958945252204 35.74958180378378
-049.251 29.78590963888188 30.40007309448188 35.24958945252204 35.74958180378378
-050.251 30.40007309448188 31.024077614265543 35.24958945252204 35.74958180378378
-185.251 113.30229853439822 113.92630305418189 35.24958945252204 35.74958180378378
-186.251 113.92630305418189 114.54046650978188 35.24958945252204 35.74958180378378
-187.251 114.54046650978188 115.15462996538189 35.24958945252204 35.74958180378378
-188.251 115.15462996538189 115.76879342098188 35.24958945252204 35.74958180378378
-189.251 115.76879342098188 116.38295687658189 35.24958945252204 35.74958180378378
-190.251 116.38295687658189 116.99712033213189 35.24958945252204 35.74958180378378
-191.251 116.99712033213189 117.61128378768188 35.24958945252204 35.74958180378378
-192.251 117.61128378768188 118.22544724328186 35.24958945252204 35.74958180378378
-193.251 118.22544724328186 118.83961069888187 35.24958945252204 35.74958180378378
-194.251 118.83961069888187 119.45377415448188 35.24958945252204 35.74958180378378
-195.251 119.45377415448188 120.06793761008188 35.24958945252204 35.74958180378378
-196.251 120.06793761008188 120.68210106568189 35.24958945252204 35.74958180378378
-197.251 120.68210106568189 121.29626452128187 35.24958945252204 35.74958180378378
-198.251 121.29626452128187 121.91042797683188 35.24958945252204 35.74958180378378
-199.251 121.91042797683188 122.5245914323819 35.24958945252204 35.74958180378378
-200.251 122.5245914323819 123.13875488798189 35.24958945252204 35.74958180378378
-201.251 123.13875488798189 123.75291834358188 35.24958945252204 35.74958180378378
-202.251 123.75291834358188 124.36708179918189 35.24958945252204 35.74958180378378
-203.251 124.36708179918189 124.98124525478187 35.24958945252204 35.74958180378378
-204.251 124.98124525478187 125.59540871038189 35.24958945252204 35.74958180378378
-205.251 125.59540871038189 126.20957216593189 35.24958945252204 35.74958180378378
-206.251 126.20957216593189 126.82373562148189 35.24958945252204 35.74958180378378
-207.251 126.82373562148189 127.43789907708188 35.24958945252204 35.74958180378378
-208.251 127.43789907708188 128.0520625326819 35.24958945252204 35.74958180378378
-209.251 128.0520625326819 128.6662259882819 35.24958945252204 35.74958180378378
-210.251 128.6662259882819 129.28038944388186 35.24958945252204 35.74958180378378
-211.251 129.28038944388186 129.89455289948188 35.24958945252204 35.74958180378378
-212.251 129.89455289948188 130.50871635503188 35.24958945252204 35.74958180378378
-213.251 130.50871635503188 131.12287981058188 35.24958945252204 35.74958180378378
-214.251 131.12287981058188 131.7370432661819 35.24958945252204 35.74958180378378
-215.251 131.7370432661819 132.35120672178186 35.24958945252204 35.74958180378378
-216.251 132.35120672178186 132.96537017738189 35.24958945252204 35.74958180378378
-217.251 132.96537017738189 133.57953363298188 35.24958945252204 35.74958180378378
-218.251 133.57953363298188 134.19369708858187 35.24958945252204 35.74958180378378
-219.251 134.19369708858187 134.80786054413187 35.24958945252204 35.74958180378378
-220.251 134.80786054413187 135.4220239996819 35.24958945252204 35.74958180378378
-221.251 135.4220239996819 136.0361874552819 35.24958945252204 35.74958180378378
-222.251 136.0361874552819 136.65035091088185 35.24958945252204 35.74958180378378
-223.251 136.65035091088185 137.26451436648188 35.24958945252204 35.74958180378378
-224.251 137.26451436648188 137.8786778220819 35.24958945252204 35.74958180378378
-225.251 137.8786778220819 138.49284127768186 35.24958945252204 35.74958180378378
-226.251 138.49284127768186 139.10700473323186 35.24958945252204 35.74958180378378
-227.251 139.10700473323186 139.7211681887819 35.24958945252204 35.74958180378378
-228.251 139.7211681887819 140.33533164438188 35.24958945252204 35.74958180378378
-229.251 140.33533164438188 140.9494950999819 35.24958945252204 35.74958180378378
-230.251 140.9494950999819 141.56365855558187 35.24958945252204 35.74958180378378
-231.251 141.56365855558187 142.1778220111819 35.24958945252204 35.74958180378378
-232.251 142.1778220111819 142.79198546678188 35.24958945252204 35.74958180378378
-233.251 142.79198546678188 143.40614892238187 35.24958945252204 35.74958180378378
-234.251 143.40614892238187 144.0203123779319 35.24958945252204 35.74958180378378
-235.251 144.0203123779319 144.63447583348187 35.24958945252204 35.74958180378378
-236.251 144.63447583348187 145.2486392890819 35.24958945252204 35.74958180378378
-237.251 145.2486392890819 145.8628027446819 35.24958945252204 35.74958180378378
-238.251 145.8628027446819 146.47696620028188 35.24958945252204 35.74958180378378
-239.251 146.47696620028188 147.0911296558819 35.24958945252204 35.74958180378378
-240.251 147.0911296558819 147.70529311148186 35.24958945252204 35.74958180378378
-241.251 147.70529311148186 148.31945656703186 35.24958945252204 35.74958180378378
-242.251 148.31945656703186 148.9336200225819 35.24958945252204 35.74958180378378
-243.251 148.9336200225819 149.54778347818188 35.24958945252204 35.74958180378378
-244.251 149.54778347818188 150.16194693378188 35.24958945252204 35.74958180378378
-245.251 150.16194693378188 150.77611038938187 35.24958945252204 35.74958180378378
-246.251 150.77611038938187 151.3902738449819 35.24958945252204 35.74958180378378
-247.251 151.3902738449819 152.00443730058186 35.24958945252204 35.74958180378378
-248.251 152.00443730058186 152.61860075613185 35.24958945252204 35.74958180378378
-249.251 152.61860075613185 153.2327642116819 35.24958945252204 35.74958180378378
-250.251 153.2327642116819 153.84692766728188 35.24958945252204 35.74958180378378
-251.251 153.84692766728188 154.4610911228819 35.24958945252204 35.74958180378378
-252.251 154.4610911228819 155.07525457848186 35.24958945252204 35.74958180378378
-253.251 155.07525457848186 155.68941803408188 35.24958945252204 35.74958180378378
-254.251 155.68941803408188 156.30358148968187 35.24958945252204 35.74958180378378
-255.251 156.30358148968187 156.9177449452319 35.24958945252204 35.74958180378378
-256.251 156.9177449452319 157.5319084007819 35.24958945252204 35.74958180378378
-257.251 157.5319084007819 158.15591292056556 35.24958945252204 35.74958180378378
-259.251 158.75039424779823 159.37439876758188 35.24958945252204 35.74958180378378
-260.251 159.37439876758188 159.98856222318187 35.24958945252204 35.74958180378378
-261.251 159.98856222318187 160.6027256787819 35.24958945252204 35.74958180378378
-262.251 160.6027256787819 161.21688913433186 35.24958945252204 35.74958180378378
-263.251 161.21688913433186 161.8310525898819 35.24958945252204 35.74958180378378
-264.251 161.8310525898819 162.44521604548189 35.24958945252204 35.74958180378378
-265.251 162.44521604548189 163.05937950108188 35.24958945252204 35.74958180378378
-266.251 163.05937950108188 163.6735429566819 35.24958945252204 35.74958180378378
-267.251 163.6735429566819 164.28770641228186 35.24958945252204 35.74958180378378
-268.251 164.28770641228186 164.90186986788189 35.24958945252204 35.74958180378378
-269.251 164.90186986788189 165.5160333234819 35.24958945252204 35.74958180378378
-270.251 165.5160333234819 166.1301967790319 35.24958945252204 35.74958180378378
-271.251 166.1301967790319 166.7443602345819 35.24958945252204 35.74958180378378
-272.251 166.7443602345819 167.3585236901819 35.24958945252204 35.74958180378378
-273.251 167.3585236901819 167.9726871457819 35.24958945252204 35.74958180378378
-274.251 167.9726871457819 168.58685060138185 35.24958945252204 35.74958180378378
-275.251 168.58685060138185 169.20101405698188 35.24958945252204 35.74958180378378
-276.251 169.20101405698188 169.8151775125819 35.24958945252204 35.74958180378378
-277.251 169.8151775125819 170.4293409681319 35.24958945252204 35.74958180378378
-278.251 170.4293409681319 171.0435044236819 35.24958945252204 35.74958180378378
-279.251 171.0435044236819 171.6576678792819 35.24958945252204 35.74958180378378
-280.251 171.6576678792819 172.27183133488188 35.24958945252204 35.74958180378378
-281.251 172.27183133488188 172.8859947904819 35.24958945252204 35.74958180378378
-282.251 172.8859947904819 173.50015824608187 35.24958945252204 35.74958180378378
-283.251 173.50015824608187 174.1143217016819 35.24958945252204 35.74958180378378
-284.251 174.1143217016819 174.7284851572319 35.24958945252204 35.74958180378378
-285.251 174.7284851572319 175.3426486127819 35.24958945252204 35.74958180378378
-286.251 175.3426486127819 175.9568120683819 35.24958945252204 35.74958180378378
-287.251 175.9568120683819 176.5709755239819 35.24958945252204 35.74958180378378
-288.251 176.5709755239819 177.1851389795819 35.24958945252204 35.74958180378378
-289.251 177.1851389795819 177.79930243518186 35.24958945252204 35.74958180378378
-290.251 177.79930243518186 178.41346589078188 35.24958945252204 35.74958180378378
-291.251 178.41346589078188 179.02762934633188 35.24958945252204 35.74958180378378
-292.251 179.02762934633188 179.64179280188188 35.24958945252204 35.74958180378378
-293.251 179.64179280188188 180.25595625748187 35.24958945252204 35.74958180378378
-294.251 180.25595625748187 180.87011971308186 35.24958945252204 35.74958180378378
-295.251 180.87011971308186 181.48428316868186 35.24958945252204 35.74958180378378
-296.251 181.48428316868186 182.09844662428185 35.24958945252204 35.74958180378378
-297.251 182.09844662428185 182.71261007988187 35.24958945252204 35.74958180378378
-298.251 182.71261007988187 183.32677353548186 35.24958945252204 35.74958180378378
-299.251 183.32677353548186 183.94093699103186 35.24958945252204 35.74958180378378
-300.251 183.94093699103186 184.55510044658186 35.24958945252204 35.74958180378378
-301.251 184.55510044658186 185.16926390218185 35.24958945252204 35.74958180378378
-302.251 185.16926390218185 185.78342735778187 35.24958945252204 35.74958180378378
-303.251 185.78342735778187 186.39759081338187 35.24958945252204 35.74958180378378
-304.251 186.39759081338187 187.01175426898186 35.24958945252204 35.74958180378378
-305.251 187.01175426898186 187.62591772458188 35.24958945252204 35.74958180378378
-306.251 187.62591772458188 188.24008118013188 35.24958945252204 35.74958180378378
-307.251 188.24008118013188 188.85424463568188 35.24958945252204 35.74958180378378
-308.251 188.85424463568188 189.46840809128187 35.24958945252204 35.74958180378378
-309.251 189.46840809128187 190.08257154688187 35.24958945252204 35.74958180378378
-310.251 190.08257154688187 190.69673500248186 35.24958945252204 35.74958180378378
-311.251 190.69673500248186 191.31089845808185 35.24958945252204 35.74958180378378
-312.251 191.31089845808185 191.92506191368187 35.24958945252204 35.74958180378378
-313.251 191.92506191368187 192.53922536923187 35.24958945252204 35.74958180378378
-314.251 192.53922536923187 193.15338882478187 35.24958945252204 35.74958180378378
-315.251 193.15338882478187 193.76755228038186 35.24958945252204 35.74958180378378
-316.251 193.76755228038186 194.39155680016555 35.24958945252204 35.74958180378378
-367.251 225.0800474510982 225.7040519708819 35.24958945252204 35.74958180378378
-368.251 225.7040519708819 226.31821542648186 35.24958945252204 35.74958180378378
-369.251 226.31821542648186 226.93237888208188 35.24958945252204 35.74958180378378
-370.251 226.93237888208188 227.5465423376819 35.24958945252204 35.74958180378378
-371.251 227.5465423376819 228.1607057932319 35.24958945252204 35.74958180378378
-372.251 228.1607057932319 228.77486924878187 35.24958945252204 35.74958180378378
-373.251 228.77486924878187 229.38903270438186 35.24958945252204 35.74958180378378
-374.251 229.38903270438186 230.00319615998188 35.24958945252204 35.74958180378378
-375.251 230.00319615998188 230.61735961558185 35.24958945252204 35.74958180378378
-376.251 230.61735961558185 231.23152307118187 35.24958945252204 35.74958180378378
-377.251 231.23152307118187 231.84568652678186 35.24958945252204 35.74958180378378
-378.251 231.84568652678186 232.45984998233186 35.24958945252204 35.74958180378378
-379.251 232.45984998233186 233.0740134378819 35.24958945252204 35.74958180378378
-380.251 233.0740134378819 233.6881768934819 35.24958945252204 35.74958180378378
-381.251 233.6881768934819 234.30234034908187 35.24958945252204 35.74958180378378
-382.251 234.30234034908187 234.9165038046819 35.24958945252204 35.74958180378378
-383.251 234.9165038046819 235.53066726028186 35.24958945252204 35.74958180378378
-384.251 235.53066726028186 236.14483071588185 35.24958945252204 35.74958180378378
-385.251 236.14483071588185 236.75899417143188 35.24958945252204 35.74958180378378
-386.251 236.75899417143188 237.37315762698185 35.24958945252204 35.74958180378378
-387.251 237.37315762698185 237.98732108258187 35.24958945252204 35.74958180378378
-388.251 237.98732108258187 238.60148453818186 35.24958945252204 35.74958180378378
-389.251 238.60148453818186 239.21564799378186 35.24958945252204 35.74958180378378
-390.251 239.21564799378186 239.82981144938185 35.24958945252204 35.74958180378378
-391.251 239.82981144938185 240.44397490498187 35.24958945252204 35.74958180378378
-392.251 240.44397490498187 241.05813836053187 35.24958945252204 35.74958180378378
-393.251 241.05813836053187 241.67230181608187 35.24958945252204 35.74958180378378
-394.251 241.67230181608187 242.2864652716819 35.24958945252204 35.74958180378378
-395.251 242.2864652716819 242.90062872728186 35.24958945252204 35.74958180378378
-396.251 242.90062872728186 243.51479218288188 35.24958945252204 35.74958180378378
-397.251 243.51479218288188 244.1289556384819 35.24958945252204 35.74958180378378
-398.251 244.1289556384819 244.7431190940819 35.24958945252204 35.74958180378378
-399.251 244.7431190940819 245.35728254963186 35.24958945252204 35.74958180378378
-400.251 245.35728254963186 245.97144600518186 35.24958945252204 35.74958180378378
-401.251 245.97144600518186 246.58560946078188 35.24958945252204 35.74958180378378
-402.251 246.58560946078188 247.19977291638187 35.24958945252204 35.74958180378378
-403.251 247.19977291638187 247.81393637198187 35.24958945252204 35.74958180378378
-404.251 247.81393637198187 248.42809982758186 35.24958945252204 35.74958180378378
-405.251 248.42809982758186 249.04226328318185 35.24958945252204 35.74958180378378
-406.251 249.04226328318185 249.65642673878187 35.24958945252204 35.74958180378378
-407.251 249.65642673878187 250.2705901943319 35.24958945252204 35.74958180378378
-408.251 250.2705901943319 250.8847536498819 35.24958945252204 35.74958180378378
-409.251 250.8847536498819 251.4989171054819 35.24958945252204 35.74958180378378
-410.251 251.4989171054819 252.11308056108186 35.24958945252204 35.74958180378378
-411.251 252.11308056108186 252.72724401668188 35.24958945252204 35.74958180378378
-412.251 252.72724401668188 253.3414074722819 35.24958945252204 35.74958180378378
-413.251 253.3414074722819 253.95557092788187 35.24958945252204 35.74958180378378
-414.251 253.95557092788187 254.56973438343186 35.24958945252204 35.74958180378378
-415.251 254.56973438343186 255.18389783898186 35.24958945252204 35.74958180378378
-416.251 255.18389783898186 255.79806129458188 35.24958945252204 35.74958180378378
-417.251 255.79806129458188 256.41222475018185 35.24958945252204 35.74958180378378
-418.251 256.41222475018185 257.0263882057818 35.24958945252204 35.74958180378378
-419.251 257.0263882057818 257.64055166138183 35.24958945252204 35.74958180378378
-420.251 257.64055166138183 258.25471511698186 35.24958945252204 35.74958180378378
-421.251 258.25471511698186 258.86887857253186 35.24958945252204 35.74958180378378
-422.251 258.86887857253186 259.48304202808185 35.24958945252204 35.74958180378378
-423.251 259.48304202808185 260.09720548368193 35.24958945252204 35.74958180378378
-424.251 260.09720548368193 260.7113689392819 35.24958945252204 35.74958180378378
-425.251 260.7113689392819 261.32553239488186 35.24958945252204 35.74958180378378
-426.251 261.32553239488186 261.93969585048194 35.24958945252204 35.74958180378378
-427.251 261.93969585048194 262.5538593060819 35.24958945252204 35.74958180378378
-428.251 262.5538593060819 263.16802276163185 35.24958945252204 35.74958180378378
-429.251 263.16802276163185 263.7821862171819 35.24958945252204 35.74958180378378
-430.251 263.7821862171819 264.39634967278187 35.24958945252204 35.74958180378378
-431.251 264.39634967278187 265.01051312838183 35.24958945252204 35.74958180378378
-432.251 265.01051312838183 265.62467658398185 35.24958945252204 35.74958180378378
-433.251 265.62467658398185 266.2388400395819 35.24958945252204 35.74958180378378
-434.251 266.2388400395819 266.85300349518184 35.24958945252204 35.74958180378378
-435.251 266.85300349518184 267.46716695073184 35.24958945252204 35.74958180378378
-436.251 267.46716695073184 268.08133040628184 35.24958945252204 35.74958180378378
-437.251 268.08133040628184 268.6954938618819 35.24958945252204 35.74958180378378
-438.251 268.6954938618819 269.3096573174819 35.24958945252204 35.74958180378378
-439.251 269.3096573174819 269.92382077308184 35.24958945252204 35.74958180378378
-440.251 269.92382077308184 270.5379842286819 35.24958945252204 35.74958180378378
-441.251 270.5379842286819 271.1521476842819 35.24958945252204 35.74958180378378
-442.251 271.1521476842819 271.76631113988185 35.24958945252204 35.74958180378378
-443.251 271.76631113988185 272.3903156596656 35.24958945252204 35.74958180378378
-570.251 349.7552289350982 350.37923345488184 35.24958945252204 35.74958180378378
-571.251 350.37923345488184 350.9933969104819 35.24958945252204 35.74958180378378
-572.251 350.9933969104819 351.60756036603186 35.24958945252204 35.74958180378378
-573.251 351.60756036603186 352.22172382158186 35.24958945252204 35.74958180378378
-574.251 352.22172382158186 352.8358872771819 35.24958945252204 35.74958180378378
-575.251 352.8358872771819 353.45005073278185 35.24958945252204 35.74958180378378
-576.251 353.45005073278185 354.06421418838187 35.24958945252204 35.74958180378378
-577.251 354.06421418838187 354.6783776439819 35.24958945252204 35.74958180378378
-578.251 354.6783776439819 355.29254109958185 35.24958945252204 35.74958180378378
-579.251 355.29254109958185 355.9067045551319 35.24958945252204 35.74958180378378
-580.251 355.9067045551319 356.5208680106819 35.24958945252204 35.74958180378378
-581.251 356.5208680106819 357.13503146628193 35.24958945252204 35.74958180378378
-582.251 357.13503146628193 357.7491949218819 35.24958945252204 35.74958180378378
-583.251 357.7491949218819 358.3633583774819 35.24958945252204 35.74958180378378
-584.251 358.3633583774819 358.9775218330819 35.24958945252204 35.74958180378378
-585.251 358.9775218330819 359.6015263528655 35.24958945252204 35.74958180378378
-000.251 359.68205925099824 0.30606377078187835 35.24958945252204 35.74958180378378
-001.252 0.3079735942673215 0.9260075830173214 35.74958180378378 36.24957405833459
-002.252 0.9260075830173214 1.5440415717673217 35.74958180378378 36.24957405833459
-003.252 1.5440415717673217 2.1620755605173216 35.74958180378378 36.24957405833459
-004.252 2.1620755605173216 2.7801095492673213 35.74958180378378 36.24957405833459
-005.252 2.7801095492673213 3.3981435380173206 35.74958180378378 36.24957405833459
-006.252 3.3981435380173206 4.016177526767321 35.74958180378378 36.24957405833459
-007.252 4.016177526767321 4.634211515517322 35.74958180378378 36.24957405833459
-008.252 4.634211515517322 5.2522455042673215 35.74958180378378 36.24957405833459
-009.252 5.2522455042673215 5.870279493017321 35.74958180378378 36.24957405833459
-010.252 5.870279493017321 6.488313481767321 35.74958180378378 36.24957405833459
-011.252 6.488313481767321 7.106347470517322 35.74958180378378 36.24957405833459
-012.252 7.106347470517322 7.724381459267322 35.74958180378378 36.24957405833459
-013.252 7.724381459267322 8.34241544801732 35.74958180378378 36.24957405833459
-014.252 8.34241544801732 8.96044943676732 35.74958180378378 36.24957405833459
-015.252 8.96044943676732 9.57848342551732 35.74958180378378 36.24957405833459
-016.252 9.57848342551732 10.196517414267321 35.74958180378378 36.24957405833459
-017.252 10.196517414267321 10.814551403017319 35.74958180378378 36.24957405833459
-018.252 10.814551403017319 11.43258539176732 35.74958180378378 36.24957405833459
-019.252 11.43258539176732 12.05061938051732 35.74958180378378 36.24957405833459
-020.252 12.05061938051732 12.668653369267322 35.74958180378378 36.24957405833459
-021.252 12.668653369267322 13.286687358017321 35.74958180378378 36.24957405833459
-022.252 13.286687358017321 13.904721346767323 35.74958180378378 36.24957405833459
-023.252 13.904721346767323 14.522755335517322 35.74958180378378 36.24957405833459
-024.252 14.522755335517322 15.14078932426732 35.74958180378378 36.24957405833459
-025.252 15.14078932426732 15.758823313017324 35.74958180378378 36.24957405833459
-026.252 15.758823313017324 16.37685730176732 35.74958180378378 36.24957405833459
-027.252 16.37685730176732 16.99489129051732 35.74958180378378 36.24957405833459
-028.252 16.99489129051732 17.612925279267323 35.74958180378378 36.24957405833459
-029.252 17.612925279267323 18.230959268017322 35.74958180378378 36.24957405833459
-030.252 18.230959268017322 18.848993256767322 35.74958180378378 36.24957405833459
-031.252 18.848993256767322 19.467027245517325 35.74958180378378 36.24957405833459
-032.252 19.467027245517325 20.08506123426732 35.74958180378378 36.24957405833459
-033.252 20.08506123426732 20.703095223017318 35.74958180378378 36.24957405833459
-034.252 20.703095223017318 21.32112921176732 35.74958180378378 36.24957405833459
-035.252 21.32112921176732 21.93916320051732 35.74958180378378 36.24957405833459
-036.252 21.93916320051732 22.55719718926732 35.74958180378378 36.24957405833459
-037.252 22.55719718926732 23.17523117801732 35.74958180378378 36.24957405833459
-038.252 23.17523117801732 23.79326516676732 35.74958180378378 36.24957405833459
-039.252 23.79326516676732 24.41129915551732 35.74958180378378 36.24957405833459
-040.252 24.41129915551732 25.029333144267323 35.74958180378378 36.24957405833459
-041.252 25.029333144267323 25.647367133017323 35.74958180378378 36.24957405833459
-042.252 25.647367133017323 26.265401121767326 35.74958180378378 36.24957405833459
-043.252 26.265401121767326 26.883435110517325 35.74958180378378 36.24957405833459
-044.252 26.883435110517325 27.501469099267325 35.74958180378378 36.24957405833459
-045.252 27.501469099267325 28.11950308801732 35.74958180378378 36.24957405833459
-046.252 28.11950308801732 28.737537076767318 35.74958180378378 36.24957405833459
-047.252 28.737537076767318 29.355571065517317 35.74958180378378 36.24957405833459
-048.252 29.355571065517317 29.973605054267317 35.74958180378378 36.24957405833459
-049.252 29.973605054267317 30.60154220901605 35.74958180378378 36.24957405833459
-183.252 112.78025638071861 113.40819353551731 35.74958180378378 36.24957405833459
-184.252 113.40819353551731 114.02622752426733 35.74958180378378 36.24957405833459
-185.252 114.02622752426733 114.64426151301731 35.74958180378378 36.24957405833459
-186.252 114.64426151301731 115.26229550176731 35.74958180378378 36.24957405833459
-187.252 115.26229550176731 115.88032949051733 35.74958180378378 36.24957405833459
-188.252 115.88032949051733 116.49836347926733 35.74958180378378 36.24957405833459
-189.252 116.49836347926733 117.11639746801731 35.74958180378378 36.24957405833459
-190.252 117.11639746801731 117.73443145676733 35.74958180378378 36.24957405833459
-191.252 117.73443145676733 118.35246544551731 35.74958180378378 36.24957405833459
-192.252 118.35246544551731 118.97049943426734 35.74958180378378 36.24957405833459
-193.252 118.97049943426734 119.58853342301732 35.74958180378378 36.24957405833459
-194.252 119.58853342301732 120.20656741176732 35.74958180378378 36.24957405833459
-195.252 120.20656741176732 120.82460140051731 35.74958180378378 36.24957405833459
-196.252 120.82460140051731 121.44263538926732 35.74958180378378 36.24957405833459
-197.252 121.44263538926732 122.06066937801731 35.74958180378378 36.24957405833459
-198.252 122.06066937801731 122.67870336676731 35.74958180378378 36.24957405833459
-199.252 122.67870336676731 123.29673735551734 35.74958180378378 36.24957405833459
-200.252 123.29673735551734 123.91477134426732 35.74958180378378 36.24957405833459
-201.252 123.91477134426732 124.53280533301734 35.74958180378378 36.24957405833459
-202.252 124.53280533301734 125.15083932176732 35.74958180378378 36.24957405833459
-203.252 125.15083932176732 125.76887331051731 35.74958180378378 36.24957405833459
-204.252 125.76887331051731 126.38690729926734 35.74958180378378 36.24957405833459
-205.252 126.38690729926734 127.00494128801733 35.74958180378378 36.24957405833459
-206.252 127.00494128801733 127.62297527676733 35.74958180378378 36.24957405833459
-207.252 127.62297527676733 128.24100926551733 35.74958180378378 36.24957405833459
-208.252 128.24100926551733 128.85904325426733 35.74958180378378 36.24957405833459
-209.252 128.85904325426733 129.47707724301733 35.74958180378378 36.24957405833459
-210.252 129.47707724301733 130.0951112317673 35.74958180378378 36.24957405833459
-211.252 130.0951112317673 130.7131452205173 35.74958180378378 36.24957405833459
-212.252 130.7131452205173 131.3311792092673 35.74958180378378 36.24957405833459
-213.252 131.3311792092673 131.94921319801733 35.74958180378378 36.24957405833459
-214.252 131.94921319801733 132.56724718676733 35.74958180378378 36.24957405833459
-215.252 132.56724718676733 133.18528117551733 35.74958180378378 36.24957405833459
-216.252 133.18528117551733 133.8033151642673 35.74958180378378 36.24957405833459
-217.252 133.8033151642673 134.42134915301733 35.74958180378378 36.24957405833459
-218.252 134.42134915301733 135.0393831417673 35.74958180378378 36.24957405833459
-219.252 135.0393831417673 135.65741713051733 35.74958180378378 36.24957405833459
-220.252 135.65741713051733 136.27545111926733 35.74958180378378 36.24957405833459
-221.252 136.27545111926733 136.89348510801733 35.74958180378378 36.24957405833459
-222.252 136.89348510801733 137.5115190967673 35.74958180378378 36.24957405833459
-223.252 137.5115190967673 138.1295530855173 35.74958180378378 36.24957405833459
-224.252 138.1295530855173 138.7475870742673 35.74958180378378 36.24957405833459
-225.252 138.7475870742673 139.36562106301733 35.74958180378378 36.24957405833459
-226.252 139.36562106301733 139.9836550517673 35.74958180378378 36.24957405833459
-227.252 139.9836550517673 140.60168904051733 35.74958180378378 36.24957405833459
-228.252 140.60168904051733 141.2197230292673 35.74958180378378 36.24957405833459
-229.252 141.2197230292673 141.83775701801733 35.74958180378378 36.24957405833459
-230.252 141.83775701801733 142.4557910067673 35.74958180378378 36.24957405833459
-231.252 142.4557910067673 143.07382499551733 35.74958180378378 36.24957405833459
-232.252 143.07382499551733 143.6918589842673 35.74958180378378 36.24957405833459
-233.252 143.6918589842673 144.30989297301733 35.74958180378378 36.24957405833459
-234.252 144.30989297301733 144.92792696176733 35.74958180378378 36.24957405833459
-235.252 144.92792696176733 145.54596095051733 35.74958180378378 36.24957405833459
-236.252 145.54596095051733 146.1639949392673 35.74958180378378 36.24957405833459
-237.252 146.1639949392673 146.78202892801733 35.74958180378378 36.24957405833459
-238.252 146.78202892801733 147.4000629167673 35.74958180378378 36.24957405833459
-239.252 147.4000629167673 148.01809690551733 35.74958180378378 36.24957405833459
-240.252 148.01809690551733 148.63613089426732 35.74958180378378 36.24957405833459
-241.252 148.63613089426732 149.25416488301732 35.74958180378378 36.24957405833459
-242.252 149.25416488301732 149.8721988717673 35.74958180378378 36.24957405833459
-243.252 149.8721988717673 150.49023286051732 35.74958180378378 36.24957405833459
-244.252 150.49023286051732 151.10826684926735 35.74958180378378 36.24957405833459
-245.252 151.10826684926735 151.72630083801732 35.74958180378378 36.24957405833459
-246.252 151.72630083801732 152.34433482676735 35.74958180378378 36.24957405833459
-247.252 152.34433482676735 152.96236881551732 35.74958180378378 36.24957405833459
-248.252 152.96236881551732 153.5804028042673 35.74958180378378 36.24957405833459
-249.252 153.5804028042673 154.19843679301732 35.74958180378378 36.24957405833459
-250.252 154.19843679301732 154.81647078176732 35.74958180378378 36.24957405833459
-251.252 154.81647078176732 155.43450477051732 35.74958180378378 36.24957405833459
-252.252 155.43450477051732 156.05253875926735 35.74958180378378 36.24957405833459
-253.252 156.05253875926735 156.67057274801732 35.74958180378378 36.24957405833459
-254.252 156.67057274801732 157.29850990281605 35.74958180378378 36.24957405833459
-257.252 158.5147715482186 159.14270870301732 35.74958180378378 36.24957405833459
-258.252 159.14270870301732 159.76074269176732 35.74958180378378 36.24957405833459
-259.252 159.76074269176732 160.37877668051732 35.74958180378378 36.24957405833459
-260.252 160.37877668051732 160.99681066926732 35.74958180378378 36.24957405833459
-261.252 160.99681066926732 161.61484465801732 35.74958180378378 36.24957405833459
-262.252 161.61484465801732 162.23287864676732 35.74958180378378 36.24957405833459
-263.252 162.23287864676732 162.85091263551732 35.74958180378378 36.24957405833459
-264.252 162.85091263551732 163.46894662426735 35.74958180378378 36.24957405833459
-265.252 163.46894662426735 164.08698061301735 35.74958180378378 36.24957405833459
-266.252 164.08698061301735 164.70501460176735 35.74958180378378 36.24957405833459
-267.252 164.70501460176735 165.32304859051732 35.74958180378378 36.24957405833459
-268.252 165.32304859051732 165.94108257926734 35.74958180378378 36.24957405833459
-269.252 165.94108257926734 166.55911656801734 35.74958180378378 36.24957405833459
-270.252 166.55911656801734 167.17715055676734 35.74958180378378 36.24957405833459
-271.252 167.17715055676734 167.79518454551734 35.74958180378378 36.24957405833459
-272.252 167.79518454551734 168.41321853426734 35.74958180378378 36.24957405833459
-273.252 168.41321853426734 169.03125252301732 35.74958180378378 36.24957405833459
-274.252 169.03125252301732 169.64928651176731 35.74958180378378 36.24957405833459
-275.252 169.64928651176731 170.26732050051734 35.74958180378378 36.24957405833459
-276.252 170.26732050051734 170.88535448926734 35.74958180378378 36.24957405833459
-277.252 170.88535448926734 171.50338847801734 35.74958180378378 36.24957405833459
-278.252 171.50338847801734 172.12142246676734 35.74958180378378 36.24957405833459
-279.252 172.12142246676734 172.7394564555173 35.74958180378378 36.24957405833459
-280.252 172.7394564555173 173.35749044426734 35.74958180378378 36.24957405833459
-281.252 173.35749044426734 173.97552443301734 35.74958180378378 36.24957405833459
-282.252 173.97552443301734 174.59355842176734 35.74958180378378 36.24957405833459
-283.252 174.59355842176734 175.21159241051734 35.74958180378378 36.24957405833459
-284.252 175.21159241051734 175.82962639926734 35.74958180378378 36.24957405833459
-285.252 175.82962639926734 176.4476603880173 35.74958180378378 36.24957405833459
-286.252 176.4476603880173 177.0656943767673 35.74958180378378 36.24957405833459
-287.252 177.0656943767673 177.6837283655173 35.74958180378378 36.24957405833459
-288.252 177.6837283655173 178.30176235426734 35.74958180378378 36.24957405833459
-289.252 178.30176235426734 178.91979634301734 35.74958180378378 36.24957405833459
-290.252 178.91979634301734 179.53783033176734 35.74958180378378 36.24957405833459
-291.252 179.53783033176734 180.1558643205173 35.74958180378378 36.24957405833459
-292.252 180.1558643205173 180.77389830926734 35.74958180378378 36.24957405833459
-293.252 180.77389830926734 181.3919322980173 35.74958180378378 36.24957405833459
-294.252 181.3919322980173 182.0099662867673 35.74958180378378 36.24957405833459
-295.252 182.0099662867673 182.6280002755173 35.74958180378378 36.24957405833459
-296.252 182.6280002755173 183.24603426426734 35.74958180378378 36.24957405833459
-297.252 183.24603426426734 183.8640682530173 35.74958180378378 36.24957405833459
-298.252 183.8640682530173 184.48210224176734 35.74958180378378 36.24957405833459
-299.252 184.48210224176734 185.1001362305173 35.74958180378378 36.24957405833459
-300.252 185.1001362305173 185.7181702192673 35.74958180378378 36.24957405833459
-301.252 185.7181702192673 186.3362042080173 35.74958180378378 36.24957405833459
-302.252 186.3362042080173 186.95423819676734 35.74958180378378 36.24957405833459
-303.252 186.95423819676734 187.5722721855173 35.74958180378378 36.24957405833459
-304.252 187.5722721855173 188.19030617426733 35.74958180378378 36.24957405833459
-305.252 188.19030617426733 188.8083401630173 35.74958180378378 36.24957405833459
-306.252 188.8083401630173 189.4263741517673 35.74958180378378 36.24957405833459
-307.252 189.4263741517673 190.0444081405173 35.74958180378378 36.24957405833459
-308.252 190.0444081405173 190.66244212926733 35.74958180378378 36.24957405833459
-309.252 190.66244212926733 191.2804761180173 35.74958180378378 36.24957405833459
-310.252 191.2804761180173 191.89851010676733 35.74958180378378 36.24957405833459
-311.252 191.89851010676733 192.5165440955173 35.74958180378378 36.24957405833459
-312.252 192.5165440955173 193.13457808426733 35.74958180378378 36.24957405833459
-313.252 193.13457808426733 193.7526120730173 35.74958180378378 36.24957405833459
-314.252 193.7526120730173 194.38054922781603 35.74958180378378 36.24957405833459
-365.252 225.26244233321862 225.89037948801735 35.74958180378378 36.24957405833459
-366.252 225.89037948801735 226.50841347676732 35.74958180378378 36.24957405833459
-367.252 226.50841347676732 227.12644746551732 35.74958180378378 36.24957405833459
-368.252 227.12644746551732 227.74448145426732 35.74958180378378 36.24957405833459
-369.252 227.74448145426732 228.36251544301732 35.74958180378378 36.24957405833459
-370.252 228.36251544301732 228.9805494317673 35.74958180378378 36.24957405833459
-371.252 228.9805494317673 229.5985834205173 35.74958180378378 36.24957405833459
-372.252 229.5985834205173 230.21661740926731 35.74958180378378 36.24957405833459
-373.252 230.21661740926731 230.83465139801734 35.74958180378378 36.24957405833459
-374.252 230.83465139801734 231.45268538676737 35.74958180378378 36.24957405833459
-375.252 231.45268538676737 232.07071937551734 35.74958180378378 36.24957405833459
-376.252 232.07071937551734 232.6887533642673 35.74958180378378 36.24957405833459
-377.252 232.6887533642673 233.3067873530173 35.74958180378378 36.24957405833459
-378.252 233.3067873530173 233.9248213417673 35.74958180378378 36.24957405833459
-379.252 233.9248213417673 234.54285533051734 35.74958180378378 36.24957405833459
-380.252 234.54285533051734 235.1608893192673 35.74958180378378 36.24957405833459
-381.252 235.1608893192673 235.7789233080173 35.74958180378378 36.24957405833459
-382.252 235.7789233080173 236.3969572967673 35.74958180378378 36.24957405833459
-383.252 236.3969572967673 237.01499128551728 35.74958180378378 36.24957405833459
-384.252 237.01499128551728 237.6330252742673 35.74958180378378 36.24957405833459
-385.252 237.6330252742673 238.25105926301728 35.74958180378378 36.24957405833459
-386.252 238.25105926301728 238.8690932517673 35.74958180378378 36.24957405833459
-387.252 238.8690932517673 239.48712724051734 35.74958180378378 36.24957405833459
-388.252 239.48712724051734 240.1051612292673 35.74958180378378 36.24957405833459
-389.252 240.1051612292673 240.72319521801734 35.74958180378378 36.24957405833459
-390.252 240.72319521801734 241.3412292067673 35.74958180378378 36.24957405833459
-391.252 241.3412292067673 241.95926319551734 35.74958180378378 36.24957405833459
-392.252 241.95926319551734 242.5772971842673 35.74958180378378 36.24957405833459
-393.252 242.5772971842673 243.19533117301734 35.74958180378378 36.24957405833459
-394.252 243.19533117301734 243.8133651617673 35.74958180378378 36.24957405833459
-395.252 243.8133651617673 244.4313991505173 35.74958180378378 36.24957405833459
-396.252 244.4313991505173 245.0494331392673 35.74958180378378 36.24957405833459
-397.252 245.0494331392673 245.66746712801728 35.74958180378378 36.24957405833459
-398.252 245.66746712801728 246.2855011167673 35.74958180378378 36.24957405833459
-399.252 246.2855011167673 246.90353510551734 35.74958180378378 36.24957405833459
-400.252 246.90353510551734 247.52156909426733 35.74958180378378 36.24957405833459
-401.252 247.52156909426733 248.13960308301733 35.74958180378378 36.24957405833459
-402.252 248.13960308301733 248.7576370717673 35.74958180378378 36.24957405833459
-403.252 248.7576370717673 249.37567106051733 35.74958180378378 36.24957405833459
-404.252 249.37567106051733 249.9937050492673 35.74958180378378 36.24957405833459
-405.252 249.9937050492673 250.6117390380173 35.74958180378378 36.24957405833459
-406.252 250.6117390380173 251.2297730267673 35.74958180378378 36.24957405833459
-407.252 251.2297730267673 251.8478070155173 35.74958180378378 36.24957405833459
-408.252 251.8478070155173 252.4658410042673 35.74958180378378 36.24957405833459
-409.252 252.4658410042673 253.08387499301728 35.74958180378378 36.24957405833459
-410.252 253.08387499301728 253.7019089817673 35.74958180378378 36.24957405833459
-411.252 253.7019089817673 254.31994297051733 35.74958180378378 36.24957405833459
-412.252 254.31994297051733 254.9379769592673 35.74958180378378 36.24957405833459
-413.252 254.9379769592673 255.55601094801733 35.74958180378378 36.24957405833459
-414.252 255.55601094801733 256.17404493676736 35.74958180378378 36.24957405833459
-415.252 256.17404493676736 256.79207892551733 35.74958180378378 36.24957405833459
-416.252 256.79207892551733 257.4101129142673 35.74958180378378 36.24957405833459
-417.252 257.4101129142673 258.0281469030173 35.74958180378378 36.24957405833459
-418.252 258.0281469030173 258.6461808917673 35.74958180378378 36.24957405833459
-419.252 258.6461808917673 259.26421488051733 35.74958180378378 36.24957405833459
-420.252 259.26421488051733 259.8822488692673 35.74958180378378 36.24957405833459
-421.252 259.8822488692673 260.5002828580173 35.74958180378378 36.24957405833459
-422.252 260.5002828580173 261.1183168467673 35.74958180378378 36.24957405833459
-423.252 261.1183168467673 261.7363508355173 35.74958180378378 36.24957405833459
-424.252 261.7363508355173 262.3543848242673 35.74958180378378 36.24957405833459
-425.252 262.3543848242673 262.9724188130173 35.74958180378378 36.24957405833459
-426.252 262.9724188130173 263.59045280176736 35.74958180378378 36.24957405833459
-427.252 263.59045280176736 264.2084867905173 35.74958180378378 36.24957405833459
-428.252 264.2084867905173 264.8265207792673 35.74958180378378 36.24957405833459
-429.252 264.8265207792673 265.44455476801727 35.74958180378378 36.24957405833459
-430.252 265.44455476801727 266.0625887567673 35.74958180378378 36.24957405833459
-431.252 266.0625887567673 266.6806227455173 35.74958180378378 36.24957405833459
-432.252 266.6806227455173 267.2986567342673 35.74958180378378 36.24957405833459
-433.252 267.2986567342673 267.91669072301727 35.74958180378378 36.24957405833459
-434.252 267.91669072301727 268.5347247117673 35.74958180378378 36.24957405833459
-435.252 268.5347247117673 269.1527587005173 35.74958180378378 36.24957405833459
-436.252 269.1527587005173 269.7707926892673 35.74958180378378 36.24957405833459
-437.252 269.7707926892673 270.3888266780173 35.74958180378378 36.24957405833459
-438.252 270.3888266780173 271.00686066676735 35.74958180378378 36.24957405833459
-439.252 271.00686066676735 271.6248946555173 35.74958180378378 36.24957405833459
-440.252 271.6248946555173 272.2429286442673 35.74958180378378 36.24957405833459
-441.252 272.2429286442673 272.87086579901603 35.74958180378378 36.24957405833459
-567.252 350.10530806071864 350.7332452154673 35.74958180378378 36.24957405833459
-568.252 350.7332452154673 351.35127920421735 35.74958180378378 36.24957405833459
-569.252 351.35127920421735 351.9693131929673 35.74958180378378 36.24957405833459
-570.252 351.9693131929673 352.5873471817173 35.74958180378378 36.24957405833459
-571.252 352.5873471817173 353.2053811704673 35.74958180378378 36.24957405833459
-572.252 353.2053811704673 353.82341515921735 35.74958180378378 36.24957405833459
-573.252 353.82341515921735 354.4414491479673 35.74958180378378 36.24957405833459
-574.252 354.4414491479673 355.0594831367173 35.74958180378378 36.24957405833459
-575.252 355.0594831367173 355.6775171254673 35.74958180378378 36.24957405833459
-576.252 355.6775171254673 356.29555111421735 35.74958180378378 36.24957405833459
-577.252 356.29555111421735 356.9135851029673 35.74958180378378 36.24957405833459
-578.252 356.9135851029673 357.53161909171735 35.74958180378378 36.24957405833459
-579.252 357.53161909171735 358.1496530804673 35.74958180378378 36.24957405833459
-580.252 358.1496530804673 358.76768706921735 35.74958180378378 36.24957405833459
-581.252 358.76768706921735 359.39562422401605 35.74958180378378 36.24957405833459
-000.252 359.6800364395186 0.3079735942673215 35.74958180378378 36.24957405833459
-001.253 0.3099311501471672 0.9319324348471674 36.24957405833459 36.74956621312616
-002.253 0.9319324348471674 1.5539337194971674 36.24957405833459 36.74956621312616
-003.253 1.5539337194971674 2.1759350041471675 36.24957405833459 36.74956621312616
-004.253 2.1759350041471675 2.7979362888471675 36.24957405833459 36.74956621312616
-005.253 2.7979362888471675 3.419937573547168 36.24957405833459 36.74956621312616
-006.253 3.419937573547168 4.041938858197167 36.24957405833459 36.74956621312616
-007.253 4.041938858197167 4.663940142847167 36.24957405833459 36.74956621312616
-008.253 4.663940142847167 5.285941427547169 36.24957405833459 36.74956621312616
-009.253 5.285941427547169 5.907942712247168 36.24957405833459 36.74956621312616
-010.253 5.907942712247168 6.529943996897167 36.24957405833459 36.74956621312616
-011.253 6.529943996897167 7.151945281547168 36.24957405833459 36.74956621312616
-012.253 7.151945281547168 7.773946566247167 36.24957405833459 36.74956621312616
-013.253 7.773946566247167 8.395947850947167 36.24957405833459 36.74956621312616
-014.253 8.395947850947167 9.017949135597167 36.24957405833459 36.74956621312616
-015.253 9.017949135597167 9.639950420247168 36.24957405833459 36.74956621312616
-016.253 9.639950420247168 10.261951704947169 36.24957405833459 36.74956621312616
-017.253 10.261951704947169 10.883952989647167 36.24957405833459 36.74956621312616
-018.253 10.883952989647167 11.505954274347168 36.24957405833459 36.74956621312616
-019.253 11.505954274347168 12.127955558997167 36.24957405833459 36.74956621312616
-020.253 12.127955558997167 12.749956843647167 36.24957405833459 36.74956621312616
-021.253 12.749956843647167 13.371958128347167 36.24957405833459 36.74956621312616
-022.253 13.371958128347167 13.993959413047167 36.24957405833459 36.74956621312616
-023.253 13.993959413047167 14.615960697697167 36.24957405833459 36.74956621312616
-024.253 14.615960697697167 15.23796198234717 36.24957405833459 36.74956621312616
-025.253 15.23796198234717 15.859963267047169 36.24957405833459 36.74956621312616
-026.253 15.859963267047169 16.48196455174717 36.24957405833459 36.74956621312616
-027.253 16.48196455174717 17.10396583639717 36.24957405833459 36.74956621312616
-028.253 17.10396583639717 17.72596712104717 36.24957405833459 36.74956621312616
-029.253 17.72596712104717 18.347968405747167 36.24957405833459 36.74956621312616
-030.253 18.347968405747167 18.969969690447165 36.24957405833459 36.74956621312616
-031.253 18.969969690447165 19.591970975147163 36.24957405833459 36.74956621312616
-032.253 19.591970975147163 20.213972259797167 36.24957405833459 36.74956621312616
-033.253 20.213972259797167 20.835973544447164 36.24957405833459 36.74956621312616
-034.253 20.835973544447164 21.457974829147165 36.24957405833459 36.74956621312616
-035.253 21.457974829147165 22.079976113847167 36.24957405833459 36.74956621312616
-036.253 22.079976113847167 22.701977398497164 36.24957405833459 36.74956621312616
-037.253 22.701977398497164 23.323978683147164 36.24957405833459 36.74956621312616
-038.253 23.323978683147164 23.945979967847165 36.24957405833459 36.74956621312616
-039.253 23.945979967847165 24.567981252547163 36.24957405833459 36.74956621312616
-040.253 24.567981252547163 25.19994935923781 36.24957405833459 36.74956621312616
-181.253 112.26019556995651 112.89216367659716 36.24957405833459 36.74956621312616
-182.253 112.89216367659716 113.51416496124716 36.24957405833459 36.74956621312616
-183.253 113.51416496124716 114.13616624594718 36.24957405833459 36.74956621312616
-184.253 114.13616624594718 114.75816753064717 36.24957405833459 36.74956621312616
-185.253 114.75816753064717 115.38016881529717 36.24957405833459 36.74956621312616
-186.253 115.38016881529717 116.00217009994718 36.24957405833459 36.74956621312616
-187.253 116.00217009994718 116.62417138464718 36.24957405833459 36.74956621312616
-188.253 116.62417138464718 117.24617266934717 36.24957405833459 36.74956621312616
-189.253 117.24617266934717 117.86817395404718 36.24957405833459 36.74956621312616
-190.253 117.86817395404718 118.49017523869716 36.24957405833459 36.74956621312616
-191.253 118.49017523869716 119.11217652334716 36.24957405833459 36.74956621312616
-192.253 119.11217652334716 119.73417780804718 36.24957405833459 36.74956621312616
-193.253 119.73417780804718 120.35617909274717 36.24957405833459 36.74956621312616
-194.253 120.35617909274717 120.97818037739717 36.24957405833459 36.74956621312616
-195.253 120.97818037739717 121.60018166204719 36.24957405833459 36.74956621312616
-196.253 121.60018166204719 122.22218294674718 36.24957405833459 36.74956621312616
-197.253 122.22218294674718 122.84418423144717 36.24957405833459 36.74956621312616
-198.253 122.84418423144717 123.46618551609717 36.24957405833459 36.74956621312616
-199.253 123.46618551609717 124.08818680074717 36.24957405833459 36.74956621312616
-200.253 124.08818680074717 124.71018808544716 36.24957405833459 36.74956621312616
-201.253 124.71018808544716 125.33218937014718 36.24957405833459 36.74956621312616
-202.253 125.33218937014718 125.95419065479717 36.24957405833459 36.74956621312616
-203.253 125.95419065479717 126.57619193944718 36.24957405833459 36.74956621312616
-204.253 126.57619193944718 127.19819322414719 36.24957405833459 36.74956621312616
-205.253 127.19819322414719 127.82019450884715 36.24957405833459 36.74956621312616
-206.253 127.82019450884715 128.44219579354717 36.24957405833459 36.74956621312616
-207.253 128.44219579354717 129.06419707819717 36.24957405833459 36.74956621312616
-208.253 129.06419707819717 129.68619836284716 36.24957405833459 36.74956621312616
-209.253 129.68619836284716 130.30819964754716 36.24957405833459 36.74956621312616
-210.253 130.30819964754716 130.93020093224715 36.24957405833459 36.74956621312616
-211.253 130.93020093224715 131.55220221689717 36.24957405833459 36.74956621312616
-212.253 131.55220221689717 132.17420350154717 36.24957405833459 36.74956621312616
-213.253 132.17420350154717 132.7962047862472 36.24957405833459 36.74956621312616
-214.253 132.7962047862472 133.41820607094718 36.24957405833459 36.74956621312616
-215.253 133.41820607094718 134.04020735559715 36.24957405833459 36.74956621312616
-216.253 134.04020735559715 134.66220864024717 36.24957405833459 36.74956621312616
-217.253 134.66220864024717 135.28420992494716 36.24957405833459 36.74956621312616
-218.253 135.28420992494716 135.90621120964715 36.24957405833459 36.74956621312616
-219.253 135.90621120964715 136.52821249429718 36.24957405833459 36.74956621312616
-220.253 136.52821249429718 137.15021377894715 36.24957405833459 36.74956621312616
-221.253 137.15021377894715 137.77221506364714 36.24957405833459 36.74956621312616
-222.253 137.77221506364714 138.3942163483472 36.24957405833459 36.74956621312616
-223.253 138.3942163483472 139.01621763304718 36.24957405833459 36.74956621312616
-224.253 139.01621763304718 139.63821891769717 36.24957405833459 36.74956621312616
-225.253 139.63821891769717 140.26022020234717 36.24957405833459 36.74956621312616
-226.253 140.26022020234717 140.8822214870472 36.24957405833459 36.74956621312616
-227.253 140.8822214870472 141.50422277174718 36.24957405833459 36.74956621312616
-228.253 141.50422277174718 142.12622405639715 36.24957405833459 36.74956621312616
-229.253 142.12622405639715 142.74822534104715 36.24957405833459 36.74956621312616
-230.253 142.74822534104715 143.3702266257472 36.24957405833459 36.74956621312616
-231.253 143.3702266257472 143.99222791044718 36.24957405833459 36.74956621312616
-232.253 143.99222791044718 144.61422919509718 36.24957405833459 36.74956621312616
-233.253 144.61422919509718 145.23623047974715 36.24957405833459 36.74956621312616
-234.253 145.23623047974715 145.85823176444717 36.24957405833459 36.74956621312616
-235.253 145.85823176444717 146.48023304914716 36.24957405833459 36.74956621312616
-236.253 146.48023304914716 147.10223433384715 36.24957405833459 36.74956621312616
-237.253 147.10223433384715 147.72423561849718 36.24957405833459 36.74956621312616
-238.253 147.72423561849718 148.3462369031472 36.24957405833459 36.74956621312616
-239.253 148.3462369031472 148.9682381878472 36.24957405833459 36.74956621312616
-240.253 148.9682381878472 149.59023947254718 36.24957405833459 36.74956621312616
-241.253 149.59023947254718 150.21224075719715 36.24957405833459 36.74956621312616
-242.253 150.21224075719715 150.83424204184718 36.24957405833459 36.74956621312616
-243.253 150.83424204184718 151.45624332654717 36.24957405833459 36.74956621312616
-244.253 151.45624332654717 152.0782446112472 36.24957405833459 36.74956621312616
-245.253 152.0782446112472 152.70024589589718 36.24957405833459 36.74956621312616
-246.253 152.70024589589718 153.32224718054715 36.24957405833459 36.74956621312616
-247.253 153.32224718054715 153.9442484652472 36.24957405833459 36.74956621312616
-248.253 153.9442484652472 154.5662497499472 36.24957405833459 36.74956621312616
-249.253 154.5662497499472 155.1882510345972 36.24957405833459 36.74956621312616
-250.253 155.1882510345972 155.81025231924718 36.24957405833459 36.74956621312616
-251.253 155.81025231924718 156.43225360394717 36.24957405833459 36.74956621312616
-252.253 156.43225360394717 157.06422171063778 36.24957405833459 36.74956621312616
-255.253 158.28829063595654 158.92025874264718 36.24957405833459 36.74956621312616
-256.253 158.92025874264718 159.5422600273472 36.24957405833459 36.74956621312616
-257.253 159.5422600273472 160.1642613120472 36.24957405833459 36.74956621312616
-258.253 160.1642613120472 160.78626259669716 36.24957405833459 36.74956621312616
-259.253 160.78626259669716 161.40826388134718 36.24957405833459 36.74956621312616
-260.253 161.40826388134718 162.03026516604717 36.24957405833459 36.74956621312616
-261.253 162.03026516604717 162.6522664507472 36.24957405833459 36.74956621312616
-262.253 162.6522664507472 163.2742677353972 36.24957405833459 36.74956621312616
-263.253 163.2742677353972 163.89626902004719 36.24957405833459 36.74956621312616
-264.253 163.89626902004719 164.51827030474718 36.24957405833459 36.74956621312616
-265.253 164.51827030474718 165.14027158944717 36.24957405833459 36.74956621312616
-266.253 165.14027158944717 165.7622728740972 36.24957405833459 36.74956621312616
-267.253 165.7622728740972 166.3842741587472 36.24957405833459 36.74956621312616
-268.253 166.3842741587472 167.00627544344718 36.24957405833459 36.74956621312616
-269.253 167.00627544344718 167.62827672814717 36.24957405833459 36.74956621312616
-270.253 167.62827672814717 168.2502780128472 36.24957405833459 36.74956621312616
-271.253 168.2502780128472 168.8722792974972 36.24957405833459 36.74956621312616
-272.253 168.8722792974972 169.49428058214718 36.24957405833459 36.74956621312616
-273.253 169.49428058214718 170.11628186684717 36.24957405833459 36.74956621312616
-274.253 170.11628186684717 170.7382831515472 36.24957405833459 36.74956621312616
-275.253 170.7382831515472 171.3602844361972 36.24957405833459 36.74956621312616
-276.253 171.3602844361972 171.9822857208472 36.24957405833459 36.74956621312616
-277.253 171.9822857208472 172.60428700554718 36.24957405833459 36.74956621312616
-278.253 172.60428700554718 173.22628829024717 36.24957405833459 36.74956621312616
-279.253 173.22628829024717 173.8482895748972 36.24957405833459 36.74956621312616
-280.253 173.8482895748972 174.4702908595472 36.24957405833459 36.74956621312616
-281.253 174.4702908595472 175.09229214424718 36.24957405833459 36.74956621312616
-282.253 175.09229214424718 175.71429342894717 36.24957405833459 36.74956621312616
-283.253 175.71429342894717 176.3362947136472 36.24957405833459 36.74956621312616
-284.253 176.3362947136472 176.9582959982972 36.24957405833459 36.74956621312616
-285.253 176.9582959982972 177.58029728294719 36.24957405833459 36.74956621312616
-286.253 177.58029728294719 178.20229856764718 36.24957405833459 36.74956621312616
-287.253 178.20229856764718 178.82429985234717 36.24957405833459 36.74956621312616
-288.253 178.82429985234717 179.4463011369972 36.24957405833459 36.74956621312616
-289.253 179.4463011369972 180.06830242164716 36.24957405833459 36.74956621312616
-290.253 180.06830242164716 180.69030370634715 36.24957405833459 36.74956621312616
-291.253 180.69030370634715 181.31230499104714 36.24957405833459 36.74956621312616
-292.253 181.31230499104714 181.93430627569717 36.24957405833459 36.74956621312616
-293.253 181.93430627569717 182.55630756034716 36.24957405833459 36.74956621312616
-294.253 182.55630756034716 183.17830884504716 36.24957405833459 36.74956621312616
-295.253 183.17830884504716 183.80031012974715 36.24957405833459 36.74956621312616
-296.253 183.80031012974715 184.42231141439714 36.24957405833459 36.74956621312616
-297.253 184.42231141439714 185.04431269904717 36.24957405833459 36.74956621312616
-298.253 185.04431269904717 185.66631398374716 36.24957405833459 36.74956621312616
-299.253 185.66631398374716 186.28831526844715 36.24957405833459 36.74956621312616
-300.253 186.28831526844715 186.91031655314714 36.24957405833459 36.74956621312616
-301.253 186.91031655314714 187.53231783779717 36.24957405833459 36.74956621312616
-302.253 187.53231783779717 188.15431912244716 36.24957405833459 36.74956621312616
-303.253 188.15431912244716 188.77632040714715 36.24957405833459 36.74956621312616
-304.253 188.77632040714715 189.39832169184717 36.24957405833459 36.74956621312616
-305.253 189.39832169184717 190.02032297649714 36.24957405833459 36.74956621312616
-306.253 190.02032297649714 190.64232426114717 36.24957405833459 36.74956621312616
-307.253 190.64232426114717 191.26432554584716 36.24957405833459 36.74956621312616
-308.253 191.26432554584716 191.88632683054715 36.24957405833459 36.74956621312616
-309.253 191.88632683054715 192.50832811519714 36.24957405833459 36.74956621312616
-310.253 192.50832811519714 193.13032939984714 36.24957405833459 36.74956621312616
-311.253 193.13032939984714 193.75233068454716 36.24957405833459 36.74956621312616
-312.253 193.75233068454716 194.3842987912378 36.24957405833459 36.74956621312616
-364.253 226.08643066575652 226.71839877244716 36.24957405833459 36.74956621312616
-365.253 226.71839877244716 227.34040005709716 36.24957405833459 36.74956621312616
-366.253 227.34040005709716 227.96240134174715 36.24957405833459 36.74956621312616
-367.253 227.96240134174715 228.58440262644717 36.24957405833459 36.74956621312616
-368.253 228.58440262644717 229.20640391114716 36.24957405833459 36.74956621312616
-369.253 229.20640391114716 229.82840519579713 36.24957405833459 36.74956621312616
-370.253 229.82840519579713 230.45040648044716 36.24957405833459 36.74956621312616
-371.253 230.45040648044716 231.07240776514715 36.24957405833459 36.74956621312616
-372.253 231.07240776514715 231.69440904984714 36.24957405833459 36.74956621312616
-373.253 231.69440904984714 232.31641033449716 36.24957405833459 36.74956621312616
-374.253 232.31641033449716 232.93841161914713 36.24957405833459 36.74956621312616
-375.253 232.93841161914713 233.56041290384718 36.24957405833459 36.74956621312616
-376.253 233.56041290384718 234.18241418854717 36.24957405833459 36.74956621312616
-377.253 234.18241418854717 234.80441547324716 36.24957405833459 36.74956621312616
-378.253 234.80441547324716 235.4264167578972 36.24957405833459 36.74956621312616
-379.253 235.4264167578972 236.04841804254715 36.24957405833459 36.74956621312616
-380.253 236.04841804254715 236.67041932724715 36.24957405833459 36.74956621312616
-381.253 236.67041932724715 237.2924206119472 36.24957405833459 36.74956621312616
-382.253 237.2924206119472 237.9144218965972 36.24957405833459 36.74956621312616
-383.253 237.9144218965972 238.53642318124716 36.24957405833459 36.74956621312616
-384.253 238.53642318124716 239.15842446594715 36.24957405833459 36.74956621312616
-385.253 239.15842446594715 239.78042575064717 36.24957405833459 36.74956621312616
-386.253 239.78042575064717 240.40242703529717 36.24957405833459 36.74956621312616
-387.253 240.40242703529717 241.02442831994716 36.24957405833459 36.74956621312616
-388.253 241.02442831994716 241.64642960464715 36.24957405833459 36.74956621312616
-389.253 241.64642960464715 242.26843088934714 36.24957405833459 36.74956621312616
-390.253 242.26843088934714 242.8904321739971 36.24957405833459 36.74956621312616
-391.253 242.8904321739971 243.51243345864717 36.24957405833459 36.74956621312616
-392.253 243.51243345864717 244.13443474334716 36.24957405833459 36.74956621312616
-393.253 244.13443474334716 244.75643602804715 36.24957405833459 36.74956621312616
-394.253 244.75643602804715 245.37843731274717 36.24957405833459 36.74956621312616
-395.253 245.37843731274717 246.00043859739716 36.24957405833459 36.74956621312616
-396.253 246.00043859739716 246.62243988204716 36.24957405833459 36.74956621312616
-397.253 246.62243988204716 247.24444116674715 36.24957405833459 36.74956621312616
-398.253 247.24444116674715 247.86644245144714 36.24957405833459 36.74956621312616
-399.253 247.86644245144714 248.48844373609717 36.24957405833459 36.74956621312616
-400.253 248.48844373609717 249.1104450207472 36.24957405833459 36.74956621312616
-401.253 249.1104450207472 249.73244630544716 36.24957405833459 36.74956621312616
-402.253 249.73244630544716 250.35444759014712 36.24957405833459 36.74956621312616
-403.253 250.35444759014712 250.97644887479714 36.24957405833459 36.74956621312616
-404.253 250.97644887479714 251.59845015944717 36.24957405833459 36.74956621312616
-405.253 251.59845015944717 252.22045144414716 36.24957405833459 36.74956621312616
-406.253 252.22045144414716 252.84245272884715 36.24957405833459 36.74956621312616
-407.253 252.84245272884715 253.46445401354714 36.24957405833459 36.74956621312616
-408.253 253.46445401354714 254.08645529819717 36.24957405833459 36.74956621312616
-409.253 254.08645529819717 254.7084565828472 36.24957405833459 36.74956621312616
-410.253 254.7084565828472 255.33045786754715 36.24957405833459 36.74956621312616
-411.253 255.33045786754715 255.95245915224712 36.24957405833459 36.74956621312616
-412.253 255.95245915224712 256.5744604368972 36.24957405833459 36.74956621312616
-413.253 256.5744604368972 257.19646172154717 36.24957405833459 36.74956621312616
-414.253 257.19646172154717 257.81846300624716 36.24957405833459 36.74956621312616
-415.253 257.81846300624716 258.44046429094715 36.24957405833459 36.74956621312616
-416.253 258.44046429094715 259.06246557559723 36.24957405833459 36.74956621312616
-417.253 259.06246557559723 259.6844668602472 36.24957405833459 36.74956621312616
-418.253 259.6844668602472 260.3064681449472 36.24957405833459 36.74956621312616
-419.253 260.3064681449472 260.9284694296472 36.24957405833459 36.74956621312616
-420.253 260.9284694296472 261.55047071429715 36.24957405833459 36.74956621312616
-421.253 261.55047071429715 262.1724719989471 36.24957405833459 36.74956621312616
-422.253 262.1724719989471 262.79447328364716 36.24957405833459 36.74956621312616
-423.253 262.79447328364716 263.41647456834716 36.24957405833459 36.74956621312616
-424.253 263.41647456834716 264.0384758530472 36.24957405833459 36.74956621312616
-425.253 264.0384758530472 264.66047713769717 36.24957405833459 36.74956621312616
-426.253 264.66047713769717 265.28247842234714 36.24957405833459 36.74956621312616
-427.253 265.28247842234714 265.90447970704713 36.24957405833459 36.74956621312616
-428.253 265.90447970704713 266.5264809917472 36.24957405833459 36.74956621312616
-429.253 266.5264809917472 267.14848227639715 36.24957405833459 36.74956621312616
-430.253 267.14848227639715 267.7704835610471 36.24957405833459 36.74956621312616
-431.253 267.7704835610471 268.39248484574716 36.24957405833459 36.74956621312616
-432.253 268.39248484574716 269.01448613044715 36.24957405833459 36.74956621312616
-433.253 269.01448613044715 269.6364874150971 36.24957405833459 36.74956621312616
-434.253 269.6364874150971 270.2584886997472 36.24957405833459 36.74956621312616
-435.253 270.2584886997472 270.8804899844472 36.24957405833459 36.74956621312616
-436.253 270.8804899844472 271.50249126914713 36.24957405833459 36.74956621312616
-437.253 271.50249126914713 272.12449255379715 36.24957405833459 36.74956621312616
-438.253 272.12449255379715 272.7564606604378 36.24957405833459 36.74956621312616
-568.253 352.97469273975656 353.6066608464472 36.24957405833459 36.74956621312616
-569.253 353.6066608464472 354.2286621311472 36.24957405833459 36.74956621312616
-570.253 354.2286621311472 354.85066341579716 36.24957405833459 36.74956621312616
-571.253 354.85066341579716 355.4726647004472 36.24957405833459 36.74956621312616
-572.253 355.4726647004472 356.0946659851471 36.24957405833459 36.74956621312616
-573.253 356.0946659851471 356.7166672698471 36.24957405833459 36.74956621312616
-574.253 356.7166672698471 357.3386685544972 36.24957405833459 36.74956621312616
-575.253 357.3386685544972 357.96066983914716 36.24957405833459 36.74956621312616
-576.253 357.96066983914716 358.58267112384715 36.24957405833459 36.74956621312616
-577.253 358.58267112384715 359.2046724085472 36.24957405833459 36.74956621312616
-578.253 359.2046724085472 359.7573017793472 36.24957405833459 36.74956621312616
-000.253 359.7573017793472 0.3099311501471672 36.24957405833459 36.74956621312616
-001.254 0.31193765532106 0.93800548442106 36.74956621312616 37.24955826500035
-002.254 0.93800548442106 1.5640733134710603 36.74956621312616 37.24955826500035
-003.254 1.5640733134710603 2.19014114252106 36.74956621312616 37.24955826500035
-004.254 2.19014114252106 2.8162089716210597 36.74956621312616 37.24955826500035
-005.254 2.8162089716210597 3.4422768007210593 36.74956621312616 37.24955826500035
-006.254 3.4422768007210593 4.068344629771061 36.74956621312616 37.24955826500035
-007.254 4.068344629771061 4.694412458821061 36.74956621312616 37.24955826500035
-008.254 4.694412458821061 5.320480287921059 36.74956621312616 37.24955826500035
-009.254 5.320480287921059 5.9465481170210595 36.74956621312616 37.24955826500035
-010.254 5.9465481170210595 6.572615946121058 36.74956621312616 37.24955826500035
-011.254 6.572615946121058 7.198683775171059 36.74956621312616 37.24955826500035
-012.254 7.198683775171059 7.824751604221059 36.74956621312616 37.24955826500035
-013.254 7.824751604221059 8.45081943332106 36.74956621312616 37.24955826500035
-014.254 8.45081943332106 9.07688726242106 36.74956621312616 37.24955826500035
-015.254 9.07688726242106 9.702955091471061 36.74956621312616 37.24955826500035
-016.254 9.702955091471061 10.329022920521062 36.74956621312616 37.24955826500035
-017.254 10.329022920521062 10.95509074962106 36.74956621312616 37.24955826500035
-018.254 10.95509074962106 11.581158578721059 36.74956621312616 37.24955826500035
-019.254 11.581158578721059 12.207226407821057 36.74956621312616 37.24955826500035
-020.254 12.207226407821057 12.833294236871058 36.74956621312616 37.24955826500035
-021.254 12.833294236871058 13.45936206592106 36.74956621312616 37.24955826500035
-022.254 13.45936206592106 14.085429895021061 36.74956621312616 37.24955826500035
-023.254 14.085429895021061 14.711497724121058 36.74956621312616 37.24955826500035
-024.254 14.711497724121058 15.337565553221058 36.74956621312616 37.24955826500035
-025.254 15.337565553221058 15.963633382271063 36.74956621312616 37.24955826500035
-026.254 15.963633382271063 16.58970121132106 36.74956621312616 37.24955826500035
-027.254 16.58970121132106 17.21576904042106 36.74956621312616 37.24955826500035
-028.254 17.21576904042106 17.84183686952106 36.74956621312616 37.24955826500035
-029.254 17.84183686952106 18.46790469857106 36.74956621312616 37.24955826500035
-030.254 18.46790469857106 19.093972527621062 36.74956621312616 37.24955826500035
-031.254 19.093972527621062 19.720040356721057 36.74956621312616 37.24955826500035
-032.254 19.720040356721057 20.346108185821063 36.74956621312616 37.24955826500035
-033.254 20.346108185821063 20.97217601492106 36.74956621312616 37.24955826500035
-034.254 20.97217601492106 21.598243843971062 36.74956621312616 37.24955826500035
-035.254 21.598243843971062 22.224311673021063 36.74956621312616 37.24955826500035
-036.254 22.224311673021063 22.850379502121058 36.74956621312616 37.24955826500035
-037.254 22.850379502121058 23.476447331221063 36.74956621312616 37.24955826500035
-038.254 23.476447331221063 24.10251516027106 36.74956621312616 37.24955826500035
-039.254 24.10251516027106 24.7386150614517 36.74956621312616 37.24955826500035
-180.254 112.36804698819041 113.00414688937106 36.74956621312616 37.24955826500035
-181.254 113.00414688937106 113.63021471842106 36.74956621312616 37.24955826500035
-182.254 113.63021471842106 114.25628254752107 36.74956621312616 37.24955826500035
-183.254 114.25628254752107 114.88235037662108 36.74956621312616 37.24955826500035
-184.254 114.88235037662108 115.50841820572107 36.74956621312616 37.24955826500035
-185.254 115.50841820572107 116.13448603477107 36.74956621312616 37.24955826500035
-186.254 116.13448603477107 116.76055386382107 36.74956621312616 37.24955826500035
-187.254 116.76055386382107 117.38662169292107 36.74956621312616 37.24955826500035
-188.254 117.38662169292107 118.01268952202106 36.74956621312616 37.24955826500035
-189.254 118.01268952202106 118.63875735107106 36.74956621312616 37.24955826500035
-190.254 118.63875735107106 119.26482518012108 36.74956621312616 37.24955826500035
-191.254 119.26482518012108 119.89089300922107 36.74956621312616 37.24955826500035
-192.254 119.89089300922107 120.51696083832105 36.74956621312616 37.24955826500035
-193.254 120.51696083832105 121.14302866742108 36.74956621312616 37.24955826500035
-194.254 121.14302866742108 121.7690964964711 36.74956621312616 37.24955826500035
-195.254 121.7690964964711 122.39516432552108 36.74956621312616 37.24955826500035
-196.254 122.39516432552108 123.02123215462106 36.74956621312616 37.24955826500035
-197.254 123.02123215462106 123.64729998372106 36.74956621312616 37.24955826500035
-198.254 123.64729998372106 124.27336781277106 36.74956621312616 37.24955826500035
-199.254 124.27336781277106 124.89943564182107 36.74956621312616 37.24955826500035
-200.254 124.89943564182107 125.52550347092108 36.74956621312616 37.24955826500035
-201.254 125.52550347092108 126.15157130002106 36.74956621312616 37.24955826500035
-202.254 126.15157130002106 126.77763912912107 36.74956621312616 37.24955826500035
-203.254 126.77763912912107 127.40370695817106 36.74956621312616 37.24955826500035
-204.254 127.40370695817106 128.02977478722107 36.74956621312616 37.24955826500035
-205.254 128.02977478722107 128.65584261632102 36.74956621312616 37.24955826500035
-206.254 128.65584261632102 129.2819104454211 36.74956621312616 37.24955826500035
-207.254 129.2819104454211 129.90797827447108 36.74956621312616 37.24955826500035
-208.254 129.90797827447108 130.53404610352106 36.74956621312616 37.24955826500035
-209.254 130.53404610352106 131.16011393262104 36.74956621312616 37.24955826500035
-210.254 131.16011393262104 131.78618176172105 36.74956621312616 37.24955826500035
-211.254 131.78618176172105 132.4122495908211 36.74956621312616 37.24955826500035
-212.254 132.4122495908211 133.03831741987108 36.74956621312616 37.24955826500035
-213.254 133.03831741987108 133.66438524892106 36.74956621312616 37.24955826500035
-214.254 133.66438524892106 134.29045307802107 36.74956621312616 37.24955826500035
-215.254 134.29045307802107 134.91652090712105 36.74956621312616 37.24955826500035
-216.254 134.91652090712105 135.5425887362211 36.74956621312616 37.24955826500035
-217.254 135.5425887362211 136.16865656527108 36.74956621312616 37.24955826500035
-218.254 136.16865656527108 136.79472439432107 36.74956621312616 37.24955826500035
-219.254 136.79472439432107 137.42079222342107 36.74956621312616 37.24955826500035
-220.254 137.42079222342107 138.04686005252108 36.74956621312616 37.24955826500035
-221.254 138.04686005252108 138.67292788157107 36.74956621312616 37.24955826500035
-222.254 138.67292788157107 139.29899571062106 36.74956621312616 37.24955826500035
-223.254 139.29899571062106 139.92506353972107 36.74956621312616 37.24955826500035
-224.254 139.92506353972107 140.55113136882107 36.74956621312616 37.24955826500035
-225.254 140.55113136882107 141.17719919792108 36.74956621312616 37.24955826500035
-226.254 141.17719919792108 141.80326702697107 36.74956621312616 37.24955826500035
-227.254 141.80326702697107 142.42933485602106 36.74956621312616 37.24955826500035
-228.254 142.42933485602106 143.05540268512107 36.74956621312616 37.24955826500035
-229.254 143.05540268512107 143.68147051422108 36.74956621312616 37.24955826500035
-230.254 143.68147051422108 144.30753834327106 36.74956621312616 37.24955826500035
-231.254 144.30753834327106 144.93360617232105 36.74956621312616 37.24955826500035
-232.254 144.93360617232105 145.55967400142106 36.74956621312616 37.24955826500035
-233.254 145.55967400142106 146.18574183052107 36.74956621312616 37.24955826500035
-234.254 146.18574183052107 146.81180965962108 36.74956621312616 37.24955826500035
-235.254 146.81180965962108 147.43787748867106 36.74956621312616 37.24955826500035
-236.254 147.43787748867106 148.06394531772105 36.74956621312616 37.24955826500035
-237.254 148.06394531772105 148.69001314682106 36.74956621312616 37.24955826500035
-238.254 148.69001314682106 149.31608097592107 36.74956621312616 37.24955826500035
-239.254 149.31608097592107 149.94214880497105 36.74956621312616 37.24955826500035
-240.254 149.94214880497105 150.56821663402104 36.74956621312616 37.24955826500035
-241.254 150.56821663402104 151.19428446312105 36.74956621312616 37.24955826500035
-242.254 151.19428446312105 151.82035229222106 36.74956621312616 37.24955826500035
-243.254 151.82035229222106 152.44642012132107 36.74956621312616 37.24955826500035
-244.254 152.44642012132107 153.07248795037106 36.74956621312616 37.24955826500035
-245.254 153.07248795037106 153.69855577942107 36.74956621312616 37.24955826500035
-246.254 153.69855577942107 154.32462360852105 36.74956621312616 37.24955826500035
-247.254 154.32462360852105 154.95069143762106 36.74956621312616 37.24955826500035
-248.254 154.95069143762106 155.57675926672104 36.74956621312616 37.24955826500035
-249.254 155.57675926672104 156.20282709577106 36.74956621312616 37.24955826500035
-250.254 156.20282709577106 156.82889492482104 36.74956621312616 37.24955826500035
-251.254 156.82889492482104 157.4649948260517 36.74956621312616 37.24955826500035
-254.254 158.69706633989043 159.3331662411211 36.74956621312616 37.24955826500035
-255.254 159.3331662411211 159.95923407022107 36.74956621312616 37.24955826500035
-256.254 159.95923407022107 160.58530189932105 36.74956621312616 37.24955826500035
-257.254 160.58530189932105 161.21136972842106 36.74956621312616 37.24955826500035
-258.254 161.21136972842106 161.83743755747108 36.74956621312616 37.24955826500035
-259.254 161.83743755747108 162.46350538652106 36.74956621312616 37.24955826500035
-260.254 162.46350538652106 163.08957321562104 36.74956621312616 37.24955826500035
-261.254 163.08957321562104 163.71564104472105 36.74956621312616 37.24955826500035
-262.254 163.71564104472105 164.34170887377104 36.74956621312616 37.24955826500035
-263.254 164.34170887377104 164.96777670282106 36.74956621312616 37.24955826500035
-264.254 164.96777670282106 165.59384453192106 36.74956621312616 37.24955826500035
-265.254 165.59384453192106 166.21991236102107 36.74956621312616 37.24955826500035
-266.254 166.21991236102107 166.84598019012105 36.74956621312616 37.24955826500035
-267.254 166.84598019012105 167.47204801917107 36.74956621312616 37.24955826500035
-268.254 167.47204801917107 168.09811584822108 36.74956621312616 37.24955826500035
-269.254 168.09811584822108 168.7241836773211 36.74956621312616 37.24955826500035
-270.254 168.7241836773211 169.35025150642107 36.74956621312616 37.24955826500035
-271.254 169.35025150642107 169.9763193354711 36.74956621312616 37.24955826500035
-272.254 169.9763193354711 170.60238716452105 36.74956621312616 37.24955826500035
-273.254 170.60238716452105 171.22845499362109 36.74956621312616 37.24955826500035
-274.254 171.22845499362109 171.85452282272104 36.74956621312616 37.24955826500035
-275.254 171.85452282272104 172.48059065182105 36.74956621312616 37.24955826500035
-276.254 172.48059065182105 173.10665848087103 36.74956621312616 37.24955826500035
-277.254 173.10665848087103 173.73272630992108 36.74956621312616 37.24955826500035
-278.254 173.73272630992108 174.35879413902106 36.74956621312616 37.24955826500035
-279.254 174.35879413902106 174.98486196812107 36.74956621312616 37.24955826500035
-280.254 174.98486196812107 175.61092979722105 36.74956621312616 37.24955826500035
-281.254 175.61092979722105 176.23699762627103 36.74956621312616 37.24955826500035
-282.254 176.23699762627103 176.86306545532105 36.74956621312616 37.24955826500035
-283.254 176.86306545532105 177.4891332844211 36.74956621312616 37.24955826500035
-284.254 177.4891332844211 178.11520111352104 36.74956621312616 37.24955826500035
-285.254 178.11520111352104 178.74126894257105 36.74956621312616 37.24955826500035
-286.254 178.74126894257105 179.36733677162107 36.74956621312616 37.24955826500035
-287.254 179.36733677162107 179.99340460072105 36.74956621312616 37.24955826500035
-288.254 179.99340460072105 180.61947242982103 36.74956621312616 37.24955826500035
-289.254 180.61947242982103 181.24554025892104 36.74956621312616 37.24955826500035
-290.254 181.24554025892104 181.87160808797105 36.74956621312616 37.24955826500035
-291.254 181.87160808797105 182.49767591702104 36.74956621312616 37.24955826500035
-292.254 182.49767591702104 183.12374374612102 36.74956621312616 37.24955826500035
-293.254 183.12374374612102 183.74981157522103 36.74956621312616 37.24955826500035
-294.254 183.74981157522103 184.37587940427107 36.74956621312616 37.24955826500035
-295.254 184.37587940427107 185.00194723332106 36.74956621312616 37.24955826500035
-296.254 185.00194723332106 185.62801506242104 36.74956621312616 37.24955826500035
-297.254 185.62801506242104 186.25408289152102 36.74956621312616 37.24955826500035
-298.254 186.25408289152102 186.88015072062103 36.74956621312616 37.24955826500035
-299.254 186.88015072062103 187.50621854967108 36.74956621312616 37.24955826500035
-300.254 187.50621854967108 188.13228637872106 36.74956621312616 37.24955826500035
-301.254 188.13228637872106 188.75835420782104 36.74956621312616 37.24955826500035
-302.254 188.75835420782104 189.38442203692102 36.74956621312616 37.24955826500035
-303.254 189.38442203692102 190.01048986597107 36.74956621312616 37.24955826500035
-304.254 190.01048986597107 190.63655769502105 36.74956621312616 37.24955826500035
-305.254 190.63655769502105 191.26262552412106 36.74956621312616 37.24955826500035
-306.254 191.26262552412106 191.88869335322104 36.74956621312616 37.24955826500035
-307.254 191.88869335322104 192.51476118232102 36.74956621312616 37.24955826500035
-308.254 192.51476118232102 193.14082901137107 36.74956621312616 37.24955826500035
-309.254 193.14082901137107 193.76689684042105 36.74956621312616 37.24955826500035
-310.254 193.76689684042105 194.39296466952106 36.74956621312616 37.24955826500035
-311.254 194.39296466952106 195.0290645707517 36.74956621312616 37.24955826500035
-362.254 226.3123918803904 226.94849178162104 36.74956621312616 37.24955826500035
-363.254 226.94849178162104 227.57455961067103 36.74956621312616 37.24955826500035
-364.254 227.57455961067103 228.20062743972107 36.74956621312616 37.24955826500035
-365.254 228.20062743972107 228.82669526882106 36.74956621312616 37.24955826500035
-366.254 228.82669526882106 229.45276309792106 36.74956621312616 37.24955826500035
-367.254 229.45276309792106 230.07883092697108 36.74956621312616 37.24955826500035
-368.254 230.07883092697108 230.70489875602107 36.74956621312616 37.24955826500035
-369.254 230.70489875602107 231.33096658512105 36.74956621312616 37.24955826500035
-370.254 231.33096658512105 231.95703441422106 36.74956621312616 37.24955826500035
-371.254 231.95703441422106 232.5831022433211 36.74956621312616 37.24955826500035
-372.254 232.5831022433211 233.20917007237108 36.74956621312616 37.24955826500035
-373.254 233.20917007237108 233.83523790142107 36.74956621312616 37.24955826500035
-374.254 233.83523790142107 234.46130573052105 36.74956621312616 37.24955826500035
-375.254 234.46130573052105 235.08737355962103 36.74956621312616 37.24955826500035
-376.254 235.08737355962103 235.71344138872104 36.74956621312616 37.24955826500035
-377.254 235.71344138872104 236.33950921777105 36.74956621312616 37.24955826500035
-378.254 236.33950921777105 236.96557704682107 36.74956621312616 37.24955826500035
-379.254 236.96557704682107 237.59164487592105 36.74956621312616 37.24955826500035
-380.254 237.59164487592105 238.21771270502103 36.74956621312616 37.24955826500035
-381.254 238.21771270502103 238.84378053407104 36.74956621312616 37.24955826500035
-382.254 238.84378053407104 239.46984836312106 36.74956621312616 37.24955826500035
-383.254 239.46984836312106 240.09591619222104 36.74956621312616 37.24955826500035
-384.254 240.09591619222104 240.72198402132105 36.74956621312616 37.24955826500035
-385.254 240.72198402132105 241.34805185042103 36.74956621312616 37.24955826500035
-386.254 241.34805185042103 241.97411967947104 36.74956621312616 37.24955826500035
-387.254 241.97411967947104 242.60018750852106 36.74956621312616 37.24955826500035
-388.254 242.60018750852106 243.22625533762104 36.74956621312616 37.24955826500035
-389.254 243.22625533762104 243.85232316672105 36.74956621312616 37.24955826500035
-390.254 243.85232316672105 244.47839099577104 36.74956621312616 37.24955826500035
-391.254 244.47839099577104 245.10445882482105 36.74956621312616 37.24955826500035
-392.254 245.10445882482105 245.73052665392106 36.74956621312616 37.24955826500035
-393.254 245.73052665392106 246.35659448302104 36.74956621312616 37.24955826500035
-394.254 246.35659448302104 246.98266231212108 36.74956621312616 37.24955826500035
-395.254 246.98266231212108 247.60873014117107 36.74956621312616 37.24955826500035
-396.254 247.60873014117107 248.23479797022105 36.74956621312616 37.24955826500035
-397.254 248.23479797022105 248.86086579932106 36.74956621312616 37.24955826500035
-398.254 248.86086579932106 249.48693362842104 36.74956621312616 37.24955826500035
-399.254 249.48693362842104 250.11300145747106 36.74956621312616 37.24955826500035
-400.254 250.11300145747106 250.73906928652107 36.74956621312616 37.24955826500035
-401.254 250.73906928652107 251.36513711562105 36.74956621312616 37.24955826500035
-402.254 251.36513711562105 251.99120494472106 36.74956621312616 37.24955826500035
-403.254 251.99120494472106 252.61727277382104 36.74956621312616 37.24955826500035
-404.254 252.61727277382104 253.24334060287106 36.74956621312616 37.24955826500035
-405.254 253.24334060287106 253.86940843192107 36.74956621312616 37.24955826500035
-406.254 253.86940843192107 254.49547626102105 36.74956621312616 37.24955826500035
-407.254 254.49547626102105 255.12154409012106 36.74956621312616 37.24955826500035
-408.254 255.12154409012106 255.74761191922107 36.74956621312616 37.24955826500035
-409.254 255.74761191922107 256.37367974827106 36.74956621312616 37.24955826500035
-410.254 256.37367974827106 256.99974757732105 36.74956621312616 37.24955826500035
-411.254 256.99974757732105 257.62581540642105 36.74956621312616 37.24955826500035
-412.254 257.62581540642105 258.25188323552106 36.74956621312616 37.24955826500035
-413.254 258.25188323552106 258.87795106457105 36.74956621312616 37.24955826500035
-414.254 258.87795106457105 259.50401889362104 36.74956621312616 37.24955826500035
-415.254 259.50401889362104 260.13008672272105 36.74956621312616 37.24955826500035
-416.254 260.13008672272105 260.75615455182106 36.74956621312616 37.24955826500035
-417.254 260.75615455182106 261.38222238092106 36.74956621312616 37.24955826500035
-418.254 261.38222238092106 262.00829020997105 36.74956621312616 37.24955826500035
-419.254 262.00829020997105 262.63435803902104 36.74956621312616 37.24955826500035
-420.254 262.63435803902104 263.26042586812105 36.74956621312616 37.24955826500035
-421.254 263.26042586812105 263.886493697221 36.74956621312616 37.24955826500035
-422.254 263.886493697221 264.51256152627104 36.74956621312616 37.24955826500035
-423.254 264.51256152627104 265.1386293553211 36.74956621312616 37.24955826500035
-424.254 265.1386293553211 265.76469718442104 36.74956621312616 37.24955826500035
-425.254 265.76469718442104 266.39076501352105 36.74956621312616 37.24955826500035
-426.254 266.39076501352105 267.01683284262106 36.74956621312616 37.24955826500035
-427.254 267.01683284262106 267.64290067167104 36.74956621312616 37.24955826500035
-428.254 267.64290067167104 268.26896850072103 36.74956621312616 37.24955826500035
-429.254 268.26896850072103 268.89503632982104 36.74956621312616 37.24955826500035
-430.254 268.89503632982104 269.52110415892105 36.74956621312616 37.24955826500035
-431.254 269.52110415892105 270.1471719879711 36.74956621312616 37.24955826500035
-432.254 270.1471719879711 270.7732398170211 36.74956621312616 37.24955826500035
-433.254 270.7732398170211 271.3993076461211 36.74956621312616 37.24955826500035
-434.254 271.3993076461211 272.02537547522104 36.74956621312616 37.24955826500035
-435.254 272.02537547522104 272.6614753764517 36.74956621312616 37.24955826500035
-565.254 353.40416118319035 354.04026108442105 36.74956621312616 37.24955826500035
-566.254 354.04026108442105 354.66632891352106 36.74956621312616 37.24955826500035
-567.254 354.66632891352106 355.29239674262107 36.74956621312616 37.24955826500035
-568.254 355.29239674262107 355.9184645717211 36.74956621312616 37.24955826500035
-569.254 355.9184645717211 356.544532400771 36.74956621312616 37.24955826500035
-570.254 356.544532400771 357.17060022982105 36.74956621312616 37.24955826500035
-571.254 357.17060022982105 357.79666805892106 36.74956621312616 37.24955826500035
-572.254 357.79666805892106 358.42273588802107 36.74956621312616 37.24955826500035
-573.254 358.42273588802107 359.04880371707105 36.74956621312616 37.24955826500035
-574.254 359.04880371707105 359.68037068617105 36.74956621312616 37.24955826500035
-000.254 359.68037068617105 0.31193765532106 36.74956621312616 37.24955826500035
-179.255 112.48594026411293 113.1262754291751 37.24955826500035 37.74955021068385
-180.255 113.1262754291751 113.7565116361751 37.24955826500035 37.74955021068385
-181.255 113.7565116361751 114.38674784317509 37.24955826500035 37.74955021068385
-182.255 114.38674784317509 115.0169840501751 37.24955826500035 37.74955021068385
-183.255 115.0169840501751 115.64722025717509 37.24955826500035 37.74955021068385
-184.255 115.64722025717509 116.27745646417509 37.24955826500035 37.74955021068385
-185.255 116.27745646417509 116.9076926712251 37.24955826500035 37.74955021068385
-186.255 116.9076926712251 117.5379288782751 37.24955826500035 37.74955021068385
-187.255 117.5379288782751 118.16816508527509 37.24955826500035 37.74955021068385
-188.255 118.16816508527509 118.79840129227509 37.24955826500035 37.74955021068385
-189.255 118.79840129227509 119.4286374992751 37.24955826500035 37.74955021068385
-190.255 119.4286374992751 120.05887370627511 37.24955826500035 37.74955021068385
-191.255 120.05887370627511 120.6891099132751 37.24955826500035 37.74955021068385
-192.255 120.6891099132751 121.31934612027509 37.24955826500035 37.74955021068385
-193.255 121.31934612027509 121.9495823272751 37.24955826500035 37.74955021068385
-194.255 121.9495823272751 122.57981853427509 37.24955826500035 37.74955021068385
-195.255 122.57981853427509 123.21005474127509 37.24955826500035 37.74955021068385
-196.255 123.21005474127509 123.8402909482751 37.24955826500035 37.74955021068385
-197.255 123.8402909482751 124.47052715527511 37.24955826500035 37.74955021068385
-198.255 124.47052715527511 125.1007633622751 37.24955826500035 37.74955021068385
-199.255 125.1007633622751 125.7309995692751 37.24955826500035 37.74955021068385
-200.255 125.7309995692751 126.3612357762751 37.24955826500035 37.74955021068385
-201.255 126.3612357762751 126.99147198327509 37.24955826500035 37.74955021068385
-202.255 126.99147198327509 127.62170819027509 37.24955826500035 37.74955021068385
-203.255 127.62170819027509 128.25194439727508 37.24955826500035 37.74955021068385
-204.255 128.25194439727508 128.88218060432507 37.24955826500035 37.74955021068385
-205.255 128.88218060432507 129.5124168113751 37.24955826500035 37.74955021068385
-206.255 129.5124168113751 130.14265301837509 37.24955826500035 37.74955021068385
-207.255 130.14265301837509 130.77288922537508 37.24955826500035 37.74955021068385
-208.255 130.77288922537508 131.40312543237508 37.24955826500035 37.74955021068385
-209.255 131.40312543237508 132.0333616393751 37.24955826500035 37.74955021068385
-210.255 132.0333616393751 132.66359784637513 37.24955826500035 37.74955021068385
-211.255 132.66359784637513 133.29383405337512 37.24955826500035 37.74955021068385
-212.255 133.29383405337512 133.9240702603751 37.24955826500035 37.74955021068385
-213.255 133.9240702603751 134.55430646737508 37.24955826500035 37.74955021068385
-214.255 134.55430646737508 135.1845426743751 37.24955826500035 37.74955021068385
-215.255 135.1845426743751 135.8147788813751 37.24955826500035 37.74955021068385
-216.255 135.8147788813751 136.4450150883751 37.24955826500035 37.74955021068385
-217.255 136.4450150883751 137.0752512953751 37.24955826500035 37.74955021068385
-218.255 137.0752512953751 137.7054875023751 37.24955826500035 37.74955021068385
-219.255 137.7054875023751 138.3357237093751 37.24955826500035 37.74955021068385
-220.255 138.3357237093751 138.96595991637508 37.24955826500035 37.74955021068385
-221.255 138.96595991637508 139.59619612337508 37.24955826500035 37.74955021068385
-222.255 139.59619612337508 140.2264323303751 37.24955826500035 37.74955021068385
-223.255 140.2264323303751 140.85666853737513 37.24955826500035 37.74955021068385
-224.255 140.85666853737513 141.4869047444251 37.24955826500035 37.74955021068385
-225.255 141.4869047444251 142.1171409514751 37.24955826500035 37.74955021068385
-226.255 142.1171409514751 142.7473771584751 37.24955826500035 37.74955021068385
-227.255 142.7473771584751 143.3776133654751 37.24955826500035 37.74955021068385
-228.255 143.3776133654751 144.0078495724751 37.24955826500035 37.74955021068385
-229.255 144.0078495724751 144.6380857794751 37.24955826500035 37.74955021068385
-230.255 144.6380857794751 145.2683219864751 37.24955826500035 37.74955021068385
-231.255 145.2683219864751 145.89855819347508 37.24955826500035 37.74955021068385
-232.255 145.89855819347508 146.52879440047508 37.24955826500035 37.74955021068385
-233.255 146.52879440047508 147.1590306074751 37.24955826500035 37.74955021068385
-234.255 147.1590306074751 147.78926681447513 37.24955826500035 37.74955021068385
-235.255 147.78926681447513 148.41950302147512 37.24955826500035 37.74955021068385
-236.255 148.41950302147512 149.04973922847512 37.24955826500035 37.74955021068385
-237.255 149.04973922847512 149.6799754354751 37.24955826500035 37.74955021068385
-238.255 149.6799754354751 150.3102116424751 37.24955826500035 37.74955021068385
-239.255 150.3102116424751 150.9404478494751 37.24955826500035 37.74955021068385
-240.255 150.9404478494751 151.5706840564751 37.24955826500035 37.74955021068385
-241.255 151.5706840564751 152.2009202634751 37.24955826500035 37.74955021068385
-242.255 152.2009202634751 152.8311564704751 37.24955826500035 37.74955021068385
-243.255 152.8311564704751 153.4613926775251 37.24955826500035 37.74955021068385
-244.255 153.4613926775251 154.0916288845751 37.24955826500035 37.74955021068385
-245.255 154.0916288845751 154.72186509157513 37.24955826500035 37.74955021068385
-246.255 154.72186509157513 155.3521012985751 37.24955826500035 37.74955021068385
-247.255 155.3521012985751 155.9823375055751 37.24955826500035 37.74955021068385
-248.255 155.9823375055751 156.6125737125751 37.24955826500035 37.74955021068385
-249.255 156.6125737125751 157.25290887763728 37.24955826500035 37.74955021068385
-253.255 159.12341958251292 159.7637547475751 37.24955826500035 37.74955021068385
-254.255 159.7637547475751 160.3939909545751 37.24955826500035 37.74955021068385
-255.255 160.3939909545751 161.02422716157508 37.24955826500035 37.74955021068385
-256.255 161.02422716157508 161.65446336857508 37.24955826500035 37.74955021068385
-257.255 161.65446336857508 162.2846995755751 37.24955826500035 37.74955021068385
-258.255 162.2846995755751 162.91493578257513 37.24955826500035 37.74955021068385
-259.255 162.91493578257513 163.54517198957512 37.24955826500035 37.74955021068385
-260.255 163.54517198957512 164.17540819657512 37.24955826500035 37.74955021068385
-261.255 164.17540819657512 164.80564440357512 37.24955826500035 37.74955021068385
-262.255 164.80564440357512 165.43588061057508 37.24955826500035 37.74955021068385
-263.255 165.43588061057508 166.06611681762507 37.24955826500035 37.74955021068385
-264.255 166.06611681762507 166.6963530246751 37.24955826500035 37.74955021068385
-265.255 166.6963530246751 167.3265892316751 37.24955826500035 37.74955021068385
-266.255 167.3265892316751 167.95682543867508 37.24955826500035 37.74955021068385
-267.255 167.95682543867508 168.58706164567508 37.24955826500035 37.74955021068385
-268.255 168.58706164567508 169.2172978526751 37.24955826500035 37.74955021068385
-269.255 169.2172978526751 169.84753405967513 37.24955826500035 37.74955021068385
-270.255 169.84753405967513 170.47777026667512 37.24955826500035 37.74955021068385
-271.255 170.47777026667512 171.1080064736751 37.24955826500035 37.74955021068385
-272.255 171.1080064736751 171.7382426806751 37.24955826500035 37.74955021068385
-273.255 171.7382426806751 172.3684788876751 37.24955826500035 37.74955021068385
-274.255 172.3684788876751 172.9987150946751 37.24955826500035 37.74955021068385
-275.255 172.9987150946751 173.6289513016751 37.24955826500035 37.74955021068385
-276.255 173.6289513016751 174.2591875086751 37.24955826500035 37.74955021068385
-277.255 174.2591875086751 174.8894237156751 37.24955826500035 37.74955021068385
-278.255 174.8894237156751 175.5196599226751 37.24955826500035 37.74955021068385
-279.255 175.5196599226751 176.14989612967508 37.24955826500035 37.74955021068385
-280.255 176.14989612967508 176.78013233667508 37.24955826500035 37.74955021068385
-281.255 176.78013233667508 177.4103685436751 37.24955826500035 37.74955021068385
-282.255 177.4103685436751 178.04060475072512 37.24955826500035 37.74955021068385
-283.255 178.04060475072512 178.6708409577751 37.24955826500035 37.74955021068385
-284.255 178.6708409577751 179.3010771647751 37.24955826500035 37.74955021068385
-285.255 179.3010771647751 179.9313133717751 37.24955826500035 37.74955021068385
-286.255 179.9313133717751 180.5615495787751 37.24955826500035 37.74955021068385
-287.255 180.5615495787751 181.1917857857751 37.24955826500035 37.74955021068385
-288.255 181.1917857857751 181.8220219927751 37.24955826500035 37.74955021068385
-289.255 181.8220219927751 182.4522581997751 37.24955826500035 37.74955021068385
-290.255 182.4522581997751 183.08249440677508 37.24955826500035 37.74955021068385
-291.255 183.08249440677508 183.71273061377508 37.24955826500035 37.74955021068385
-292.255 183.71273061377508 184.34296682077508 37.24955826500035 37.74955021068385
-293.255 184.34296682077508 184.9732030277751 37.24955826500035 37.74955021068385
-294.255 184.9732030277751 185.6034392347751 37.24955826500035 37.74955021068385
-295.255 185.6034392347751 186.2336754417751 37.24955826500035 37.74955021068385
-296.255 186.2336754417751 186.8639116487751 37.24955826500035 37.74955021068385
-297.255 186.8639116487751 187.49414785577508 37.24955826500035 37.74955021068385
-298.255 187.49414785577508 188.1243840627751 37.24955826500035 37.74955021068385
-299.255 188.1243840627751 188.7546202697751 37.24955826500035 37.74955021068385
-300.255 188.7546202697751 189.3848564767751 37.24955826500035 37.74955021068385
-301.255 189.3848564767751 190.0150926838251 37.24955826500035 37.74955021068385
-302.255 190.0150926838251 190.64532889087508 37.24955826500035 37.74955021068385
-303.255 190.64532889087508 191.27556509787507 37.24955826500035 37.74955021068385
-304.255 191.27556509787507 191.9058013048751 37.24955826500035 37.74955021068385
-305.255 191.9058013048751 192.5360375118751 37.24955826500035 37.74955021068385
-306.255 192.5360375118751 193.16627371887512 37.24955826500035 37.74955021068385
-307.255 193.16627371887512 193.7965099258751 37.24955826500035 37.74955021068385
-308.255 193.7965099258751 194.42674613287508 37.24955826500035 37.74955021068385
-309.255 194.42674613287508 195.06708129793725 37.24955826500035 37.74955021068385
-361.255 227.1889299391129 227.82926510417508 37.24955826500035 37.74955021068385
-362.255 227.82926510417508 228.45950131117507 37.24955826500035 37.74955021068385
-363.255 228.45950131117507 229.08973751817513 37.24955826500035 37.74955021068385
-364.255 229.08973751817513 229.71997372517512 37.24955826500035 37.74955021068385
-365.255 229.71997372517512 230.35020993217512 37.24955826500035 37.74955021068385
-366.255 230.35020993217512 230.98044613917511 37.24955826500035 37.74955021068385
-367.255 230.98044613917511 231.61068234617508 37.24955826500035 37.74955021068385
-368.255 231.61068234617508 232.24091855317508 37.24955826500035 37.74955021068385
-369.255 232.24091855317508 232.8711547601751 37.24955826500035 37.74955021068385
-370.255 232.8711547601751 233.50139096717513 37.24955826500035 37.74955021068385
-371.255 233.50139096717513 234.13162717417512 37.24955826500035 37.74955021068385
-372.255 234.13162717417512 234.76186338117512 37.24955826500035 37.74955021068385
-373.255 234.76186338117512 235.39209958817509 37.24955826500035 37.74955021068385
-374.255 235.39209958817509 236.0223357951751 37.24955826500035 37.74955021068385
-375.255 236.0223357951751 236.65257200217508 37.24955826500035 37.74955021068385
-376.255 236.65257200217508 237.2828082091751 37.24955826500035 37.74955021068385
-377.255 237.2828082091751 237.91304441617513 37.24955826500035 37.74955021068385
-378.255 237.91304441617513 238.54328062317512 37.24955826500035 37.74955021068385
-379.255 238.54328062317512 239.17351683022508 37.24955826500035 37.74955021068385
-380.255 239.17351683022508 239.8037530372751 37.24955826500035 37.74955021068385
-381.255 239.8037530372751 240.43398924427507 37.24955826500035 37.74955021068385
-382.255 240.43398924427507 241.06422545127506 37.24955826500035 37.74955021068385
-383.255 241.06422545127506 241.69446165827506 37.24955826500035 37.74955021068385
-384.255 241.69446165827506 242.32469786527506 37.24955826500035 37.74955021068385
-385.255 242.32469786527506 242.95493407227505 37.24955826500035 37.74955021068385
-386.255 242.95493407227505 243.58517027927508 37.24955826500035 37.74955021068385
-387.255 243.58517027927508 244.2154064862751 37.24955826500035 37.74955021068385
-388.255 244.2154064862751 244.84564269327507 37.24955826500035 37.74955021068385
-389.255 244.84564269327507 245.4758789002751 37.24955826500035 37.74955021068385
-390.255 245.4758789002751 246.1061151072751 37.24955826500035 37.74955021068385
-391.255 246.1061151072751 246.73635131427505 37.24955826500035 37.74955021068385
-392.255 246.73635131427505 247.36658752127505 37.24955826500035 37.74955021068385
-393.255 247.36658752127505 247.9968237282751 37.24955826500035 37.74955021068385
-394.255 247.9968237282751 248.6270599352751 37.24955826500035 37.74955021068385
-395.255 248.6270599352751 249.2572961422751 37.24955826500035 37.74955021068385
-396.255 249.2572961422751 249.88753234927506 37.24955826500035 37.74955021068385
-397.255 249.88753234927506 250.5177685562751 37.24955826500035 37.74955021068385
-398.255 250.5177685562751 251.14800476327508 37.24955826500035 37.74955021068385
-399.255 251.14800476327508 251.7782409703251 37.24955826500035 37.74955021068385
-400.255 251.7782409703251 252.40847717737512 37.24955826500035 37.74955021068385
-401.255 252.40847717737512 253.0387133843751 37.24955826500035 37.74955021068385
-402.255 253.0387133843751 253.66894959137508 37.24955826500035 37.74955021068385
-403.255 253.66894959137508 254.29918579837508 37.24955826500035 37.74955021068385
-404.255 254.29918579837508 254.9294220053751 37.24955826500035 37.74955021068385
-405.255 254.9294220053751 255.55965821237513 37.24955826500035 37.74955021068385
-406.255 255.55965821237513 256.1898944193751 37.24955826500035 37.74955021068385
-407.255 256.1898944193751 256.8201306263751 37.24955826500035 37.74955021068385
-408.255 256.8201306263751 257.4503668333751 37.24955826500035 37.74955021068385
-409.255 257.4503668333751 258.0806030403751 37.24955826500035 37.74955021068385
-410.255 258.0806030403751 258.71083924737513 37.24955826500035 37.74955021068385
-411.255 258.71083924737513 259.34107545437513 37.24955826500035 37.74955021068385
-412.255 259.34107545437513 259.9713116613751 37.24955826500035 37.74955021068385
-413.255 259.9713116613751 260.6015478683751 37.24955826500035 37.74955021068385
-414.255 260.6015478683751 261.2317840753751 37.24955826500035 37.74955021068385
-415.255 261.2317840753751 261.8620202823751 37.24955826500035 37.74955021068385
-416.255 261.8620202823751 262.4922564893751 37.24955826500035 37.74955021068385
-417.255 262.4922564893751 263.12249269637505 37.24955826500035 37.74955021068385
-418.255 263.12249269637505 263.7527289034251 37.24955826500035 37.74955021068385
-419.255 263.7527289034251 264.3829651104751 37.24955826500035 37.74955021068385
-420.255 264.3829651104751 265.01320131747514 37.24955826500035 37.74955021068385
-421.255 265.01320131747514 265.6434375244751 37.24955826500035 37.74955021068385
-422.255 265.6434375244751 266.2736737314751 37.24955826500035 37.74955021068385
-423.255 266.2736737314751 266.90390993847507 37.24955826500035 37.74955021068385
-424.255 266.90390993847507 267.5341461454751 37.24955826500035 37.74955021068385
-425.255 267.5341461454751 268.16438235247506 37.24955826500035 37.74955021068385
-426.255 268.16438235247506 268.79461855947505 37.24955826500035 37.74955021068385
-427.255 268.79461855947505 269.42485476647505 37.24955826500035 37.74955021068385
-428.255 269.42485476647505 270.0550909734751 37.24955826500035 37.74955021068385
-429.255 270.0550909734751 270.6853271804751 37.24955826500035 37.74955021068385
-430.255 270.6853271804751 271.3155633874751 37.24955826500035 37.74955021068385
-431.255 271.3155633874751 271.94579959447515 37.24955826500035 37.74955021068385
-432.255 271.94579959447515 272.5760358014751 37.24955826500035 37.74955021068385
-433.255 272.5760358014751 273.2163709665373 37.24955826500035 37.74955021068385
-178.256 112.61404713713947 113.25872376771093 37.74955021068385 38.24954204678249
-179.256 113.25872376771093 113.89323287521091 37.74955021068385 38.24954204678249
-180.256 113.89323287521091 114.52774198276092 37.74955021068385 38.24954204678249
-181.256 114.52774198276092 115.16225109031092 37.74955021068385 38.24954204678249
-182.256 115.16225109031092 115.79676019781093 37.74955021068385 38.24954204678249
-183.256 115.79676019781093 116.4312693053609 37.74955021068385 38.24954204678249
-184.256 116.4312693053609 117.06577841291093 37.74955021068385 38.24954204678249
-185.256 117.06577841291093 117.70028752041094 37.74955021068385 38.24954204678249
-186.256 117.70028752041094 118.33479662796093 37.74955021068385 38.24954204678249
-187.256 118.33479662796093 118.96930573551094 37.74955021068385 38.24954204678249
-188.256 118.96930573551094 119.60381484306092 37.74955021068385 38.24954204678249
-189.256 119.60381484306092 120.23832395061092 37.74955021068385 38.24954204678249
-190.256 120.23832395061092 120.87283305811093 37.74955021068385 38.24954204678249
-191.256 120.87283305811093 121.50734216566092 37.74955021068385 38.24954204678249
-192.256 121.50734216566092 122.14185127321093 37.74955021068385 38.24954204678249
-193.256 122.14185127321093 122.77636038071091 37.74955021068385 38.24954204678249
-194.256 122.77636038071091 123.41086948826091 37.74955021068385 38.24954204678249
-195.256 123.41086948826091 124.04537859581092 37.74955021068385 38.24954204678249
-196.256 124.04537859581092 124.67988770331092 37.74955021068385 38.24954204678249
-197.256 124.67988770331092 125.31439681086093 37.74955021068385 38.24954204678249
-198.256 125.31439681086093 125.94890591841093 37.74955021068385 38.24954204678249
-199.256 125.94890591841093 126.58341502596093 37.74955021068385 38.24954204678249
-200.256 126.58341502596093 127.2179241335109 37.74955021068385 38.24954204678249
-201.256 127.2179241335109 127.85243324101091 37.74955021068385 38.24954204678249
-202.256 127.85243324101091 128.48694234856092 37.74955021068385 38.24954204678249
-203.256 128.48694234856092 129.12145145611092 37.74955021068385 38.24954204678249
-204.256 129.12145145611092 129.75596056361093 37.74955021068385 38.24954204678249
-205.256 129.75596056361093 130.39046967116093 37.74955021068385 38.24954204678249
-206.256 130.39046967116093 131.0249787787109 37.74955021068385 38.24954204678249
-207.256 131.0249787787109 131.6594878862109 37.74955021068385 38.24954204678249
-208.256 131.6594878862109 132.2939969937609 37.74955021068385 38.24954204678249
-209.256 132.2939969937609 132.92850610131092 37.74955021068385 38.24954204678249
-210.256 132.92850610131092 133.56301520886092 37.74955021068385 38.24954204678249
-211.256 133.56301520886092 134.19752431641092 37.74955021068385 38.24954204678249
-212.256 134.19752431641092 134.8320334239109 37.74955021068385 38.24954204678249
-213.256 134.8320334239109 135.4665425314609 37.74955021068385 38.24954204678249
-214.256 135.4665425314609 136.1010516390109 37.74955021068385 38.24954204678249
-215.256 136.1010516390109 136.7355607465109 37.74955021068385 38.24954204678249
-216.256 136.7355607465109 137.37006985406092 37.74955021068385 38.24954204678249
-217.256 137.37006985406092 138.00457896161092 37.74955021068385 38.24954204678249
-218.256 138.00457896161092 138.63908806911093 37.74955021068385 38.24954204678249
-219.256 138.63908806911093 139.27359717666093 37.74955021068385 38.24954204678249
-220.256 139.27359717666093 139.9081062842109 37.74955021068385 38.24954204678249
-221.256 139.9081062842109 140.54261539176088 37.74955021068385 38.24954204678249
-222.256 140.54261539176088 141.17712449931093 37.74955021068385 38.24954204678249
-223.256 141.17712449931093 141.81163360681091 37.74955021068385 38.24954204678249
-224.256 141.81163360681091 142.44614271436092 37.74955021068385 38.24954204678249
-225.256 142.44614271436092 143.08065182191092 37.74955021068385 38.24954204678249
-226.256 143.08065182191092 143.7151609294109 37.74955021068385 38.24954204678249
-227.256 143.7151609294109 144.3496700369609 37.74955021068385 38.24954204678249
-228.256 144.3496700369609 144.98417914451093 37.74955021068385 38.24954204678249
-229.256 144.98417914451093 145.61868825201094 37.74955021068385 38.24954204678249
-230.256 145.61868825201094 146.25319735956094 37.74955021068385 38.24954204678249
-231.256 146.25319735956094 146.88770646711095 37.74955021068385 38.24954204678249
-232.256 146.88770646711095 147.52221557466095 37.74955021068385 38.24954204678249
-233.256 147.52221557466095 148.15672468221095 37.74955021068385 38.24954204678249
-234.256 148.15672468221095 148.79123378971093 37.74955021068385 38.24954204678249
-235.256 148.79123378971093 149.42574289726093 37.74955021068385 38.24954204678249
-236.256 149.42574289726093 150.06025200481093 37.74955021068385 38.24954204678249
-237.256 150.06025200481093 150.6947611123109 37.74955021068385 38.24954204678249
-238.256 150.6947611123109 151.32927021986092 37.74955021068385 38.24954204678249
-239.256 151.32927021986092 151.96377932741092 37.74955021068385 38.24954204678249
-240.256 151.96377932741092 152.5982884349109 37.74955021068385 38.24954204678249
-241.256 152.5982884349109 153.2327975424609 37.74955021068385 38.24954204678249
-242.256 153.2327975424609 153.8673066500109 37.74955021068385 38.24954204678249
-243.256 153.8673066500109 154.5018157575609 37.74955021068385 38.24954204678249
-244.256 154.5018157575609 155.1363248651109 37.74955021068385 38.24954204678249
-245.256 155.1363248651109 155.7708339726109 37.74955021068385 38.24954204678249
-246.256 155.7708339726109 156.4053430801609 37.74955021068385 38.24954204678249
-247.256 156.4053430801609 157.0398521877109 37.74955021068385 38.24954204678249
-248.256 157.0398521877109 157.6845288182824 37.74955021068385 38.24954204678249
-251.256 158.93321198723947 159.5778886178109 37.74955021068385 38.24954204678249
-252.256 159.5778886178109 160.21239772536092 37.74955021068385 38.24954204678249
-253.256 160.21239772536092 160.84690683291092 37.74955021068385 38.24954204678249
-254.256 160.84690683291092 161.48141594046092 37.74955021068385 38.24954204678249
-255.256 161.48141594046092 162.11592504801092 37.74955021068385 38.24954204678249
-256.256 162.11592504801092 162.7504341555109 37.74955021068385 38.24954204678249
-257.256 162.7504341555109 163.3849432630609 37.74955021068385 38.24954204678249
-258.256 163.3849432630609 164.0194523706109 37.74955021068385 38.24954204678249
-259.256 164.0194523706109 164.65396147811094 37.74955021068385 38.24954204678249
-260.256 164.65396147811094 165.28847058566095 37.74955021068385 38.24954204678249
-261.256 165.28847058566095 165.92297969321095 37.74955021068385 38.24954204678249
-262.256 165.92297969321095 166.55748880071093 37.74955021068385 38.24954204678249
-263.256 166.55748880071093 167.19199790826093 37.74955021068385 38.24954204678249
-264.256 167.19199790826093 167.82650701581093 37.74955021068385 38.24954204678249
-265.256 167.82650701581093 168.46101612336093 37.74955021068385 38.24954204678249
-266.256 168.46101612336093 169.0955252309109 37.74955021068385 38.24954204678249
-267.256 169.0955252309109 169.73003433841092 37.74955021068385 38.24954204678249
-268.256 169.73003433841092 170.36454344596092 37.74955021068385 38.24954204678249
-269.256 170.36454344596092 170.99905255351092 37.74955021068385 38.24954204678249
-270.256 170.99905255351092 171.63356166101093 37.74955021068385 38.24954204678249
-271.256 171.63356166101093 172.26807076856093 37.74955021068385 38.24954204678249
-272.256 172.26807076856093 172.90257987611093 37.74955021068385 38.24954204678249
-273.256 172.90257987611093 173.53708898361091 37.74955021068385 38.24954204678249
-274.256 173.53708898361091 174.17159809116094 37.74955021068385 38.24954204678249
-275.256 174.17159809116094 174.80610719871092 37.74955021068385 38.24954204678249
-276.256 174.80610719871092 175.44061630626092 37.74955021068385 38.24954204678249
-277.256 175.44061630626092 176.07512541381092 37.74955021068385 38.24954204678249
-278.256 176.07512541381092 176.70963452131093 37.74955021068385 38.24954204678249
-279.256 176.70963452131093 177.34414362886093 37.74955021068385 38.24954204678249
-280.256 177.34414362886093 177.9786527364109 37.74955021068385 38.24954204678249
-281.256 177.9786527364109 178.61316184391092 37.74955021068385 38.24954204678249
-282.256 178.61316184391092 179.24767095146092 37.74955021068385 38.24954204678249
-283.256 179.24767095146092 179.88218005901092 37.74955021068385 38.24954204678249
-284.256 179.88218005901092 180.5166891665109 37.74955021068385 38.24954204678249
-285.256 180.5166891665109 181.1511982740609 37.74955021068385 38.24954204678249
-286.256 181.1511982740609 181.7857073816109 37.74955021068385 38.24954204678249
-287.256 181.7857073816109 182.42021648916088 37.74955021068385 38.24954204678249
-288.256 182.42021648916088 183.0547255967109 37.74955021068385 38.24954204678249
-289.256 183.0547255967109 183.6892347042109 37.74955021068385 38.24954204678249
-290.256 183.6892347042109 184.3237438117609 37.74955021068385 38.24954204678249
-291.256 184.3237438117609 184.95825291931092 37.74955021068385 38.24954204678249
-292.256 184.95825291931092 185.5927620268109 37.74955021068385 38.24954204678249
-293.256 185.5927620268109 186.22727113436088 37.74955021068385 38.24954204678249
-294.256 186.22727113436088 186.86178024191088 37.74955021068385 38.24954204678249
-295.256 186.86178024191088 187.49628934941092 37.74955021068385 38.24954204678249
-296.256 187.49628934941092 188.13079845696092 37.74955021068385 38.24954204678249
-297.256 188.13079845696092 188.76530756451092 37.74955021068385 38.24954204678249
-298.256 188.76530756451092 189.39981667206092 37.74955021068385 38.24954204678249
-299.256 189.39981667206092 190.03432577961092 37.74955021068385 38.24954204678249
-300.256 190.03432577961092 190.6688348871109 37.74955021068385 38.24954204678249
-301.256 190.6688348871109 191.3033439946609 37.74955021068385 38.24954204678249
-302.256 191.3033439946609 191.9378531022109 37.74955021068385 38.24954204678249
-303.256 191.9378531022109 192.5723622097109 37.74955021068385 38.24954204678249
-304.256 192.5723622097109 193.2068713172609 37.74955021068385 38.24954204678249
-305.256 193.2068713172609 193.8413804248109 37.74955021068385 38.24954204678249
-306.256 193.8413804248109 194.4758895323109 37.74955021068385 38.24954204678249
-307.256 194.4758895323109 195.1103986398609 37.74955021068385 38.24954204678249
-308.256 195.1103986398609 195.75507527048237 37.74955021068385 38.24954204678249
-359.256 227.46019560113945 228.1048722317609 37.74955021068385 38.24954204678249
-360.256 228.1048722317609 228.7393813393109 37.74955021068385 38.24954204678249
-361.256 228.7393813393109 229.3738904468109 37.74955021068385 38.24954204678249
-362.256 229.3738904468109 230.0083995543609 37.74955021068385 38.24954204678249
-363.256 230.0083995543609 230.6429086619109 37.74955021068385 38.24954204678249
-364.256 230.6429086619109 231.27741776941087 37.74955021068385 38.24954204678249
-365.256 231.27741776941087 231.91192687696088 37.74955021068385 38.24954204678249
-366.256 231.91192687696088 232.54643598451088 37.74955021068385 38.24954204678249
-367.256 232.54643598451088 233.18094509206088 37.74955021068385 38.24954204678249
-368.256 233.18094509206088 233.81545419961088 37.74955021068385 38.24954204678249
-369.256 233.81545419961088 234.44996330711092 37.74955021068385 38.24954204678249
-370.256 234.44996330711092 235.08447241466092 37.74955021068385 38.24954204678249
-371.256 235.08447241466092 235.71898152221092 37.74955021068385 38.24954204678249
-372.256 235.71898152221092 236.3534906297109 37.74955021068385 38.24954204678249
-373.256 236.3534906297109 236.9879997372609 37.74955021068385 38.24954204678249
-374.256 236.9879997372609 237.6225088448109 37.74955021068385 38.24954204678249
-375.256 237.6225088448109 238.25701795231095 37.74955021068385 38.24954204678249
-376.256 238.25701795231095 238.89152705986092 37.74955021068385 38.24954204678249
-377.256 238.89152705986092 239.52603616741095 37.74955021068385 38.24954204678249
-378.256 239.52603616741095 240.16054527496092 37.74955021068385 38.24954204678249
-379.256 240.16054527496092 240.7950543825109 37.74955021068385 38.24954204678249
-380.256 240.7950543825109 241.42956349001088 37.74955021068385 38.24954204678249
-381.256 241.42956349001088 242.06407259756088 37.74955021068385 38.24954204678249
-382.256 242.06407259756088 242.69858170511088 37.74955021068385 38.24954204678249
-383.256 242.69858170511088 243.33309081261092 37.74955021068385 38.24954204678249
-384.256 243.33309081261092 243.9675999201609 37.74955021068385 38.24954204678249
-385.256 243.9675999201609 244.60210902771092 37.74955021068385 38.24954204678249
-386.256 244.60210902771092 245.2366181352109 37.74955021068385 38.24954204678249
-387.256 245.2366181352109 245.8711272427609 37.74955021068385 38.24954204678249
-388.256 245.8711272427609 246.5056363503109 37.74955021068385 38.24954204678249
-389.256 246.5056363503109 247.1401454578609 37.74955021068385 38.24954204678249
-390.256 247.1401454578609 247.7746545654109 37.74955021068385 38.24954204678249
-391.256 247.7746545654109 248.40916367291092 37.74955021068385 38.24954204678249
-392.256 248.40916367291092 249.04367278046092 37.74955021068385 38.24954204678249
-393.256 249.04367278046092 249.67818188801093 37.74955021068385 38.24954204678249
-394.256 249.67818188801093 250.3126909955109 37.74955021068385 38.24954204678249
-395.256 250.3126909955109 250.94720010306088 37.74955021068385 38.24954204678249
-396.256 250.94720010306088 251.58170921061088 37.74955021068385 38.24954204678249
-397.256 251.58170921061088 252.21621831811092 37.74955021068385 38.24954204678249
-398.256 252.21621831811092 252.85072742566092 37.74955021068385 38.24954204678249
-399.256 252.85072742566092 253.48523653321092 37.74955021068385 38.24954204678249
-400.256 253.48523653321092 254.11974564076093 37.74955021068385 38.24954204678249
-401.256 254.11974564076093 254.75425474831087 37.74955021068385 38.24954204678249
-402.256 254.75425474831087 255.3887638558109 37.74955021068385 38.24954204678249
-403.256 255.3887638558109 256.0232729633609 37.74955021068385 38.24954204678249
-404.256 256.0232729633609 256.6577820709109 37.74955021068385 38.24954204678249
-405.256 256.6577820709109 257.2922911784109 37.74955021068385 38.24954204678249
-406.256 257.2922911784109 257.9268002859609 37.74955021068385 38.24954204678249
-407.256 257.9268002859609 258.5613093935109 37.74955021068385 38.24954204678249
-408.256 258.5613093935109 259.1958185010109 37.74955021068385 38.24954204678249
-409.256 259.1958185010109 259.8303276085609 37.74955021068385 38.24954204678249
-410.256 259.8303276085609 260.4648367161109 37.74955021068385 38.24954204678249
-411.256 260.4648367161109 261.0993458236609 37.74955021068385 38.24954204678249
-412.256 261.0993458236609 261.7338549312109 37.74955021068385 38.24954204678249
-413.256 261.7338549312109 262.36836403871087 37.74955021068385 38.24954204678249
-414.256 262.36836403871087 263.00287314626087 37.74955021068385 38.24954204678249
-415.256 263.00287314626087 263.63738225381087 37.74955021068385 38.24954204678249
-416.256 263.63738225381087 264.2718913613109 37.74955021068385 38.24954204678249
-417.256 264.2718913613109 264.9064004688609 37.74955021068385 38.24954204678249
-418.256 264.9064004688609 265.5409095764109 37.74955021068385 38.24954204678249
-419.256 265.5409095764109 266.17541868391095 37.74955021068385 38.24954204678249
-420.256 266.17541868391095 266.8099277914609 37.74955021068385 38.24954204678249
-421.256 266.8099277914609 267.4444368990109 37.74955021068385 38.24954204678249
-422.256 267.4444368990109 268.0789460065609 37.74955021068385 38.24954204678249
-423.256 268.0789460065609 268.7134551141109 37.74955021068385 38.24954204678249
-424.256 268.7134551141109 269.34796422161094 37.74955021068385 38.24954204678249
-425.256 269.34796422161094 269.98247332916094 37.74955021068385 38.24954204678249
-426.256 269.98247332916094 270.61698243671094 37.74955021068385 38.24954204678249
-427.256 270.61698243671094 271.2514915442109 37.74955021068385 38.24954204678249
-428.256 271.2514915442109 271.8860006517609 37.74955021068385 38.24954204678249
-429.256 271.8860006517609 272.5205097593109 37.74955021068385 38.24954204678249
-430.256 272.5205097593109 273.1550188668109 37.74955021068385 38.24954204678249
-431.256 273.1550188668109 273.79969549738234 37.74955021068385 38.24954204678249
-177.257 112.7525478240699 113.40167496496994 38.24954204678249 38.74953376977524
-178.257 113.40167496496994 114.04056429366992 38.24954204678249 38.74953376977524
-179.257 114.04056429366992 114.67945362241993 38.24954204678249 38.74953376977524
-180.257 114.67945362241993 115.31834295116994 38.24954204678249 38.74953376977524
-181.257 115.31834295116994 115.95723227991994 38.24954204678249 38.74953376977524
-182.257 115.95723227991994 116.59612160866993 38.24954204678249 38.74953376977524
-183.257 116.59612160866993 117.23501093741994 38.24954204678249 38.74953376977524
-184.257 117.23501093741994 117.87390026616995 38.24954204678249 38.74953376977524
-185.257 117.87390026616995 118.51278959486996 38.24954204678249 38.74953376977524
-186.257 118.51278959486996 119.15167892361994 38.24954204678249 38.74953376977524
-187.257 119.15167892361994 119.79056825236995 38.24954204678249 38.74953376977524
-188.257 119.79056825236995 120.42945758111995 38.24954204678249 38.74953376977524
-189.257 120.42945758111995 121.06834690986993 38.24954204678249 38.74953376977524
-190.257 121.06834690986993 121.70723623861993 38.24954204678249 38.74953376977524
-191.257 121.70723623861993 122.34612556736994 38.24954204678249 38.74953376977524
-192.257 122.34612556736994 122.98501489606994 38.24954204678249 38.74953376977524
-193.257 122.98501489606994 123.62390422481994 38.24954204678249 38.74953376977524
-194.257 123.62390422481994 124.26279355356994 38.24954204678249 38.74953376977524
-195.257 124.26279355356994 124.90168288231993 38.24954204678249 38.74953376977524
-196.257 124.90168288231993 125.54057221106993 38.24954204678249 38.74953376977524
-197.257 125.54057221106993 126.17946153981993 38.24954204678249 38.74953376977524
-198.257 126.17946153981993 126.81835086856995 38.24954204678249 38.74953376977524
-199.257 126.81835086856995 127.45724019726995 38.24954204678249 38.74953376977524
-200.257 127.45724019726995 128.09612952601992 38.24954204678249 38.74953376977524
-201.257 128.09612952601992 128.73501885476992 38.24954204678249 38.74953376977524
-202.257 128.73501885476992 129.37390818351994 38.24954204678249 38.74953376977524
-203.257 129.37390818351994 130.0127975122699 38.24954204678249 38.74953376977524
-204.257 130.0127975122699 130.6516868410199 38.24954204678249 38.74953376977524
-205.257 130.6516868410199 131.29057616976996 38.24954204678249 38.74953376977524
-206.257 131.29057616976996 131.92946549846994 38.24954204678249 38.74953376977524
-207.257 131.92946549846994 132.56835482721993 38.24954204678249 38.74953376977524
-208.257 132.56835482721993 133.20724415596993 38.24954204678249 38.74953376977524
-209.257 133.20724415596993 133.84613348471993 38.24954204678249 38.74953376977524
-210.257 133.84613348471993 134.48502281346993 38.24954204678249 38.74953376977524
-211.257 134.48502281346993 135.12391214221992 38.24954204678249 38.74953376977524
-212.257 135.12391214221992 135.76280147096992 38.24954204678249 38.74953376977524
-213.257 135.76280147096992 136.40169079966995 38.24954204678249 38.74953376977524
-214.257 136.40169079966995 137.04058012841995 38.24954204678249 38.74953376977524
-215.257 137.04058012841995 137.67946945716994 38.24954204678249 38.74953376977524
-216.257 137.67946945716994 138.31835878591994 38.24954204678249 38.74953376977524
-217.257 138.31835878591994 138.95724811466994 38.24954204678249 38.74953376977524
-218.257 138.95724811466994 139.59613744341993 38.24954204678249 38.74953376977524
-219.257 139.59613744341993 140.23502677216993 38.24954204678249 38.74953376977524
-220.257 140.23502677216993 140.87391610086996 38.24954204678249 38.74953376977524
-221.257 140.87391610086996 141.51280542961993 38.24954204678249 38.74953376977524
-222.257 141.51280542961993 142.15169475836996 38.24954204678249 38.74953376977524
-223.257 142.15169475836996 142.79058408711992 38.24954204678249 38.74953376977524
-224.257 142.79058408711992 143.42947341586995 38.24954204678249 38.74953376977524
-225.257 143.42947341586995 144.06836274456995 38.24954204678249 38.74953376977524
-226.257 144.06836274456995 144.70725207331992 38.24954204678249 38.74953376977524
-227.257 144.70725207331992 145.34614140206992 38.24954204678249 38.74953376977524
-228.257 145.34614140206992 145.98503073081991 38.24954204678249 38.74953376977524
-229.257 145.98503073081991 146.6239200595699 38.24954204678249 38.74953376977524
-230.257 146.6239200595699 147.26280938831994 38.24954204678249 38.74953376977524
-231.257 147.26280938831994 147.90169871706996 38.24954204678249 38.74953376977524
-232.257 147.90169871706996 148.54058804576994 38.24954204678249 38.74953376977524
-233.257 148.54058804576994 149.17947737451993 38.24954204678249 38.74953376977524
-234.257 149.17947737451993 149.81836670326993 38.24954204678249 38.74953376977524
-235.257 149.81836670326993 150.45725603201993 38.24954204678249 38.74953376977524
-236.257 150.45725603201993 151.09614536076992 38.24954204678249 38.74953376977524
-237.257 151.09614536076992 151.73503468951995 38.24954204678249 38.74953376977524
-238.257 151.73503468951995 152.37392401826995 38.24954204678249 38.74953376977524
-239.257 152.37392401826995 153.01281334696995 38.24954204678249 38.74953376977524
-240.257 153.01281334696995 153.65170267571995 38.24954204678249 38.74953376977524
-241.257 153.65170267571995 154.29059200446994 38.24954204678249 38.74953376977524
-242.257 154.29059200446994 154.92948133321994 38.24954204678249 38.74953376977524
-243.257 154.92948133321994 155.56837066196994 38.24954204678249 38.74953376977524
-244.257 155.56837066196994 156.20725999071993 38.24954204678249 38.74953376977524
-245.257 156.20725999071993 156.84614931946996 38.24954204678249 38.74953376977524
-246.257 156.84614931946996 157.48503864816996 38.24954204678249 38.74953376977524
-247.257 157.48503864816996 158.13416578907 38.24954204678249 38.74953376977524
-249.257 158.7525794934699 159.40170663441992 38.24954204678249 38.74953376977524
-250.257 159.40170663441992 160.04059596316995 38.24954204678249 38.74953376977524
-251.257 160.04059596316995 160.67948529191995 38.24954204678249 38.74953376977524
-252.257 160.67948529191995 161.31837462066994 38.24954204678249 38.74953376977524
-253.257 161.31837462066994 161.95726394936992 38.24954204678249 38.74953376977524
-254.257 161.95726394936992 162.59615327811994 38.24954204678249 38.74953376977524
-255.257 162.59615327811994 163.23504260686994 38.24954204678249 38.74953376977524
-256.257 163.23504260686994 163.87393193561996 38.24954204678249 38.74953376977524
-257.257 163.87393193561996 164.51282126436996 38.24954204678249 38.74953376977524
-258.257 164.51282126436996 165.15171059311993 38.24954204678249 38.74953376977524
-259.257 165.15171059311993 165.79059992186995 38.24954204678249 38.74953376977524
-260.257 165.79059992186995 166.42948925056993 38.24954204678249 38.74953376977524
-261.257 166.42948925056993 167.06837857931993 38.24954204678249 38.74953376977524
-262.257 167.06837857931993 167.70726790806995 38.24954204678249 38.74953376977524
-263.257 167.70726790806995 168.34615723681995 38.24954204678249 38.74953376977524
-264.257 168.34615723681995 168.98504656556992 38.24954204678249 38.74953376977524
-265.257 168.98504656556992 169.62393589431994 38.24954204678249 38.74953376977524
-266.257 169.62393589431994 170.2628252230699 38.24954204678249 38.74953376977524
-267.257 170.2628252230699 170.90171455176994 38.24954204678249 38.74953376977524
-268.257 170.90171455176994 171.54060388051994 38.24954204678249 38.74953376977524
-269.257 171.54060388051994 172.17949320926994 38.24954204678249 38.74953376977524
-270.257 172.17949320926994 172.81838253801993 38.24954204678249 38.74953376977524
-271.257 172.81838253801993 173.45727186676996 38.24954204678249 38.74953376977524
-272.257 173.45727186676996 174.09616119551993 38.24954204678249 38.74953376977524
-273.257 174.09616119551993 174.73505052426992 38.24954204678249 38.74953376977524
-274.257 174.73505052426992 175.37393985296995 38.24954204678249 38.74953376977524
-275.257 175.37393985296995 176.01282918171992 38.24954204678249 38.74953376977524
-276.257 176.01282918171992 176.65171851046995 38.24954204678249 38.74953376977524
-277.257 176.65171851046995 177.29060783921994 38.24954204678249 38.74953376977524
-278.257 177.29060783921994 177.92949716796994 38.24954204678249 38.74953376977524
-279.257 177.92949716796994 178.56838649671994 38.24954204678249 38.74953376977524
-280.257 178.56838649671994 179.20727582546994 38.24954204678249 38.74953376977524
-281.257 179.20727582546994 179.8461651541699 38.24954204678249 38.74953376977524
-282.257 179.8461651541699 180.4850544829199 38.24954204678249 38.74953376977524
-283.257 180.4850544829199 181.1239438116699 38.24954204678249 38.74953376977524
-284.257 181.1239438116699 181.7628331404199 38.24954204678249 38.74953376977524
-285.257 181.7628331404199 182.40172246916993 38.24954204678249 38.74953376977524
-286.257 182.40172246916993 183.04061179791992 38.24954204678249 38.74953376977524
-287.257 183.04061179791992 183.67950112666992 38.24954204678249 38.74953376977524
-288.257 183.67950112666992 184.31839045536992 38.24954204678249 38.74953376977524
-289.257 184.31839045536992 184.95727978411992 38.24954204678249 38.74953376977524
-290.257 184.95727978411992 185.59616911286992 38.24954204678249 38.74953376977524
-291.257 185.59616911286992 186.2350584416199 38.24954204678249 38.74953376977524
-292.257 186.2350584416199 186.8739477703699 38.24954204678249 38.74953376977524
-293.257 186.8739477703699 187.5128370991199 38.24954204678249 38.74953376977524
-294.257 187.5128370991199 188.15172642786993 38.24954204678249 38.74953376977524
-295.257 188.15172642786993 188.79061575656993 38.24954204678249 38.74953376977524
-296.257 188.79061575656993 189.42950508531993 38.24954204678249 38.74953376977524
-297.257 189.42950508531993 190.06839441406993 38.24954204678249 38.74953376977524
-298.257 190.06839441406993 190.70728374281993 38.24954204678249 38.74953376977524
-299.257 190.70728374281993 191.34617307156992 38.24954204678249 38.74953376977524
-300.257 191.34617307156992 191.98506240031992 38.24954204678249 38.74953376977524
-301.257 191.98506240031992 192.62395172906992 38.24954204678249 38.74953376977524
-302.257 192.62395172906992 193.26284105776992 38.24954204678249 38.74953376977524
-303.257 193.26284105776992 193.90173038651992 38.24954204678249 38.74953376977524
-304.257 193.90173038651992 194.5406197152699 38.24954204678249 38.74953376977524
-305.257 194.5406197152699 195.17950904401994 38.24954204678249 38.74953376977524
-306.257 195.17950904401994 195.82863618496998 38.24954204678249 38.74953376977524
-357.257 227.75262699766986 228.40175413861994 38.24954204678249 38.74953376977524
-358.257 228.40175413861994 229.04064346736993 38.24954204678249 38.74953376977524
-359.257 229.04064346736993 229.67953279611993 38.24954204678249 38.74953376977524
-360.257 229.67953279611993 230.31842212486993 38.24954204678249 38.74953376977524
-361.257 230.31842212486993 230.95731145361992 38.24954204678249 38.74953376977524
-362.257 230.95731145361992 231.59620078236992 38.24954204678249 38.74953376977524
-363.257 231.59620078236992 232.2350901110699 38.24954204678249 38.74953376977524
-364.257 232.2350901110699 232.87397943981992 38.24954204678249 38.74953376977524
-365.257 232.87397943981992 233.51286876856994 38.24954204678249 38.74953376977524
-366.257 233.51286876856994 234.1517580973199 38.24954204678249 38.74953376977524
-367.257 234.1517580973199 234.79064742606988 38.24954204678249 38.74953376977524
-368.257 234.79064742606988 235.42953675481994 38.24954204678249 38.74953376977524
-369.257 235.42953675481994 236.06842608356993 38.24954204678249 38.74953376977524
-370.257 236.06842608356993 236.70731541226993 38.24954204678249 38.74953376977524
-371.257 236.70731541226993 237.3462047410199 38.24954204678249 38.74953376977524
-372.257 237.3462047410199 237.98509406976996 38.24954204678249 38.74953376977524
-373.257 237.98509406976996 238.62398339851993 38.24954204678249 38.74953376977524
-374.257 238.62398339851993 239.2628727272699 38.24954204678249 38.74953376977524
-375.257 239.2628727272699 239.90176205601992 38.24954204678249 38.74953376977524
-376.257 239.90176205601992 240.54065138476992 38.24954204678249 38.74953376977524
-377.257 240.54065138476992 241.17954071346992 38.24954204678249 38.74953376977524
-378.257 241.17954071346992 241.81843004221992 38.24954204678249 38.74953376977524
-379.257 241.81843004221992 242.4573193709699 38.24954204678249 38.74953376977524
-380.257 242.4573193709699 243.0962086997199 38.24954204678249 38.74953376977524
-381.257 243.0962086997199 243.73509802846993 38.24954204678249 38.74953376977524
-382.257 243.73509802846993 244.3739873572199 38.24954204678249 38.74953376977524
-383.257 244.3739873572199 245.01287668596996 38.24954204678249 38.74953376977524
-384.257 245.01287668596996 245.65176601466993 38.24954204678249 38.74953376977524
-385.257 245.65176601466993 246.29065534341993 38.24954204678249 38.74953376977524
-386.257 246.29065534341993 246.92954467216992 38.24954204678249 38.74953376977524
-387.257 246.92954467216992 247.56843400091992 38.24954204678249 38.74953376977524
-388.257 247.56843400091992 248.20732332966992 38.24954204678249 38.74953376977524
-389.257 248.20732332966992 248.84621265841992 38.24954204678249 38.74953376977524
-390.257 248.84621265841992 249.4851019871699 38.24954204678249 38.74953376977524
-391.257 249.4851019871699 250.1239913158699 38.24954204678249 38.74953376977524
-392.257 250.1239913158699 250.7628806446199 38.24954204678249 38.74953376977524
-393.257 250.7628806446199 251.4017699733699 38.24954204678249 38.74953376977524
-394.257 251.4017699733699 252.04065930211993 38.24954204678249 38.74953376977524
-395.257 252.04065930211993 252.67954863086993 38.24954204678249 38.74953376977524
-396.257 252.67954863086993 253.3184379595699 38.24954204678249 38.74953376977524
-397.257 253.3184379595699 253.95732728831993 38.24954204678249 38.74953376977524
-398.257 253.95732728831993 254.59621661706993 38.24954204678249 38.74953376977524
-399.257 254.59621661706993 255.2351059458199 38.24954204678249 38.74953376977524
-400.257 255.2351059458199 255.8739952745699 38.24954204678249 38.74953376977524
-401.257 255.8739952745699 256.5128846033199 38.24954204678249 38.74953376977524
-402.257 256.5128846033199 257.1517739320699 38.24954204678249 38.74953376977524
-403.257 257.1517739320699 257.79066326077 38.24954204678249 38.74953376977524
-404.257 257.79066326077 258.42955258952 38.24954204678249 38.74953376977524
-405.257 258.42955258952 259.0684419182699 38.24954204678249 38.74953376977524
-406.257 259.0684419182699 259.7073312470199 38.24954204678249 38.74953376977524
-407.257 259.7073312470199 260.3462205757699 38.24954204678249 38.74953376977524
-408.257 260.3462205757699 260.9851099045199 38.24954204678249 38.74953376977524
-409.257 260.9851099045199 261.6239992332699 38.24954204678249 38.74953376977524
-410.257 261.6239992332699 262.26288856196993 38.24954204678249 38.74953376977524
-411.257 262.26288856196993 262.9017778907199 38.24954204678249 38.74953376977524
-412.257 262.9017778907199 263.5406672194699 38.24954204678249 38.74953376977524
-413.257 263.5406672194699 264.1795565482199 38.24954204678249 38.74953376977524
-414.257 264.1795565482199 264.8184458769699 38.24954204678249 38.74953376977524
-415.257 264.8184458769699 265.4573352057199 38.24954204678249 38.74953376977524
-416.257 265.4573352057199 266.0962245344699 38.24954204678249 38.74953376977524
-417.257 266.0962245344699 266.73511386316994 38.24954204678249 38.74953376977524
-418.257 266.73511386316994 267.3740031919199 38.24954204678249 38.74953376977524
-419.257 267.3740031919199 268.0128925206699 38.24954204678249 38.74953376977524
-420.257 268.0128925206699 268.65178184941993 38.24954204678249 38.74953376977524
-421.257 268.65178184941993 269.29067117816993 38.24954204678249 38.74953376977524
-422.257 269.29067117816993 269.92956050691987 38.24954204678249 38.74953376977524
-423.257 269.92956050691987 270.5684498356699 38.24954204678249 38.74953376977524
-424.257 270.5684498356699 271.2073391643699 38.24954204678249 38.74953376977524
-425.257 271.2073391643699 271.8462284931199 38.24954204678249 38.74953376977524
-426.257 271.8462284931199 272.4851178218699 38.24954204678249 38.74953376977524
-427.257 272.4851178218699 273.13424496276997 38.24954204678249 38.74953376977524
-175.258 112.25825161449299 112.91194126975239 38.74953376977524 39.24952537600794
-176.258 112.91194126975239 113.55532105265239 38.74953376977524 39.24952537600794
-177.258 113.55532105265239 114.19870083560238 38.74953376977524 39.24952537600794
-178.258 114.19870083560238 114.84208061855239 38.74953376977524 39.24952537600794
-179.258 114.84208061855239 115.4854604015024 38.74953376977524 39.24952537600794
-180.258 115.4854604015024 116.1288401844524 38.74953376977524 39.24952537600794
-181.258 116.1288401844524 116.77221996740238 38.74953376977524 39.24952537600794
-182.258 116.77221996740238 117.41559975035238 38.74953376977524 39.24952537600794
-183.258 117.41559975035238 118.05897953330239 38.74953376977524 39.24952537600794
-184.258 118.05897953330239 118.7023593162524 38.74953376977524 39.24952537600794
-185.258 118.7023593162524 119.3457390992024 38.74953376977524 39.24952537600794
-186.258 119.3457390992024 119.98911888215238 38.74953376977524 39.24952537600794
-187.258 119.98911888215238 120.63249866510239 38.74953376977524 39.24952537600794
-188.258 120.63249866510239 121.27587844805238 38.74953376977524 39.24952537600794
-189.258 121.27587844805238 121.9192582310024 38.74953376977524 39.24952537600794
-190.258 121.9192582310024 122.56263801395238 38.74953376977524 39.24952537600794
-191.258 122.56263801395238 123.2060177968524 38.74953376977524 39.24952537600794
-192.258 123.2060177968524 123.8493975798024 38.74953376977524 39.24952537600794
-193.258 123.8493975798024 124.4927773627524 38.74953376977524 39.24952537600794
-194.258 124.4927773627524 125.13615714570241 38.74953376977524 39.24952537600794
-195.258 125.13615714570241 125.77953692865239 38.74953376977524 39.24952537600794
-196.258 125.77953692865239 126.4229167116024 38.74953376977524 39.24952537600794
-197.258 126.4229167116024 127.0662964945524 38.74953376977524 39.24952537600794
-198.258 127.0662964945524 127.70967627750238 38.74953376977524 39.24952537600794
-199.258 127.70967627750238 128.3530560604524 38.74953376977524 39.24952537600794
-200.258 128.3530560604524 128.99643584340237 38.74953376977524 39.24952537600794
-201.258 128.99643584340237 129.6398156263524 38.74953376977524 39.24952537600794
-202.258 129.6398156263524 130.2831954093024 38.74953376977524 39.24952537600794
-203.258 130.2831954093024 130.92657519225241 38.74953376977524 39.24952537600794
-204.258 130.92657519225241 131.56995497515243 38.74953376977524 39.24952537600794
-205.258 131.56995497515243 132.2133347581024 38.74953376977524 39.24952537600794
-206.258 132.2133347581024 132.8567145410524 38.74953376977524 39.24952537600794
-207.258 132.8567145410524 133.50009432400242 38.74953376977524 39.24952537600794
-208.258 133.50009432400242 134.1434741069524 38.74953376977524 39.24952537600794
-209.258 134.1434741069524 134.78685388990237 38.74953376977524 39.24952537600794
-210.258 134.78685388990237 135.4302336728524 38.74953376977524 39.24952537600794
-211.258 135.4302336728524 136.0736134558024 38.74953376977524 39.24952537600794
-212.258 136.0736134558024 136.71699323875242 38.74953376977524 39.24952537600794
-213.258 136.71699323875242 137.3603730217024 38.74953376977524 39.24952537600794
-214.258 137.3603730217024 138.0037528046524 38.74953376977524 39.24952537600794
-215.258 138.0037528046524 138.64713258760239 38.74953376977524 39.24952537600794
-216.258 138.64713258760239 139.2905123705524 38.74953376977524 39.24952537600794
-217.258 139.2905123705524 139.93389215350237 38.74953376977524 39.24952537600794
-218.258 139.93389215350237 140.5772719364524 38.74953376977524 39.24952537600794
-219.258 140.5772719364524 141.22065171935242 38.74953376977524 39.24952537600794
-220.258 141.22065171935242 141.8640315023024 38.74953376977524 39.24952537600794
-221.258 141.8640315023024 142.50741128525243 38.74953376977524 39.24952537600794
-222.258 142.50741128525243 143.1507910682024 38.74953376977524 39.24952537600794
-223.258 143.1507910682024 143.7941708511524 38.74953376977524 39.24952537600794
-224.258 143.7941708511524 144.4375506341024 38.74953376977524 39.24952537600794
-225.258 144.4375506341024 145.0809304170524 38.74953376977524 39.24952537600794
-226.258 145.0809304170524 145.7243102000024 38.74953376977524 39.24952537600794
-227.258 145.7243102000024 146.3676899829524 38.74953376977524 39.24952537600794
-228.258 146.3676899829524 147.0110697659024 38.74953376977524 39.24952537600794
-229.258 147.0110697659024 147.6544495488524 38.74953376977524 39.24952537600794
-230.258 147.6544495488524 148.2978293318024 38.74953376977524 39.24952537600794
-231.258 148.2978293318024 148.94120911475238 38.74953376977524 39.24952537600794
-232.258 148.94120911475238 149.58458889770236 38.74953376977524 39.24952537600794
-233.258 149.58458889770236 150.2279686806524 38.74953376977524 39.24952537600794
-234.258 150.2279686806524 150.8713484635524 38.74953376977524 39.24952537600794
-235.258 150.8713484635524 151.5147282465024 38.74953376977524 39.24952537600794
-236.258 151.5147282465024 152.15810802945236 38.74953376977524 39.24952537600794
-237.258 152.15810802945236 152.8014878124024 38.74953376977524 39.24952537600794
-238.258 152.8014878124024 153.44486759535238 38.74953376977524 39.24952537600794
-239.258 153.44486759535238 154.08824737830238 38.74953376977524 39.24952537600794
-240.258 154.08824737830238 154.7316271612524 38.74953376977524 39.24952537600794
-241.258 154.7316271612524 155.3750069442024 38.74953376977524 39.24952537600794
-242.258 155.3750069442024 156.0183867271524 38.74953376977524 39.24952537600794
-243.258 156.0183867271524 156.66176651010238 38.74953376977524 39.24952537600794
-244.258 156.66176651010238 157.3051462930524 38.74953376977524 39.24952537600794
-245.258 157.3051462930524 157.9485260760024 38.74953376977524 39.24952537600794
-246.258 157.9485260760024 158.5919058589524 38.74953376977524 39.24952537600794
-247.258 158.5919058589524 159.2352856419024 38.74953376977524 39.24952537600794
-248.258 159.2352856419024 159.8786654248524 38.74953376977524 39.24952537600794
-249.258 159.8786654248524 160.5220452077524 38.74953376977524 39.24952537600794
-250.258 160.5220452077524 161.1654249907024 38.74953376977524 39.24952537600794
-251.258 161.1654249907024 161.8088047736524 38.74953376977524 39.24952537600794
-252.258 161.8088047736524 162.4521845566024 38.74953376977524 39.24952537600794
-253.258 162.4521845566024 163.09556433955242 38.74953376977524 39.24952537600794
-254.258 163.09556433955242 163.7389441225024 38.74953376977524 39.24952537600794
-255.258 163.7389441225024 164.38232390545238 38.74953376977524 39.24952537600794
-256.258 164.38232390545238 165.02570368840236 38.74953376977524 39.24952537600794
-257.258 165.02570368840236 165.6690834713524 38.74953376977524 39.24952537600794
-258.258 165.6690834713524 166.3124632543024 38.74953376977524 39.24952537600794
-259.258 166.3124632543024 166.9558430372524 38.74953376977524 39.24952537600794
-260.258 166.9558430372524 167.59922282020239 38.74953376977524 39.24952537600794
-261.258 167.59922282020239 168.24260260315236 38.74953376977524 39.24952537600794
-262.258 168.24260260315236 168.8859823861024 38.74953376977524 39.24952537600794
-263.258 168.8859823861024 169.52936216905238 38.74953376977524 39.24952537600794
-264.258 169.52936216905238 170.1727419519524 38.74953376977524 39.24952537600794
-265.258 170.1727419519524 170.8161217349024 38.74953376977524 39.24952537600794
-266.258 170.8161217349024 171.4595015178524 38.74953376977524 39.24952537600794
-267.258 171.4595015178524 172.1028813008024 38.74953376977524 39.24952537600794
-268.258 172.1028813008024 172.74626108375242 38.74953376977524 39.24952537600794
-269.258 172.74626108375242 173.3896408667024 38.74953376977524 39.24952537600794
-270.258 173.3896408667024 174.03302064965237 38.74953376977524 39.24952537600794
-271.258 174.03302064965237 174.6764004326024 38.74953376977524 39.24952537600794
-272.258 174.6764004326024 175.31978021555238 38.74953376977524 39.24952537600794
-273.258 175.31978021555238 175.9631599985024 38.74953376977524 39.24952537600794
-274.258 175.9631599985024 176.6065397814524 38.74953376977524 39.24952537600794
-275.258 176.6065397814524 177.2499195644024 38.74953376977524 39.24952537600794
-276.258 177.2499195644024 177.8932993473524 38.74953376977524 39.24952537600794
-277.258 177.8932993473524 178.5366791303024 38.74953376977524 39.24952537600794
-278.258 178.5366791303024 179.1800589132524 38.74953376977524 39.24952537600794
-279.258 179.1800589132524 179.82343869615238 38.74953376977524 39.24952537600794
-280.258 179.82343869615238 180.46681847910236 38.74953376977524 39.24952537600794
-281.258 180.46681847910236 181.1101982620524 38.74953376977524 39.24952537600794
-282.258 181.1101982620524 181.75357804500237 38.74953376977524 39.24952537600794
-283.258 181.75357804500237 182.39695782795238 38.74953376977524 39.24952537600794
-284.258 182.39695782795238 183.04033761090238 38.74953376977524 39.24952537600794
-285.258 183.04033761090238 183.68371739385236 38.74953376977524 39.24952537600794
-286.258 183.68371739385236 184.32709717680237 38.74953376977524 39.24952537600794
-287.258 184.32709717680237 184.97047695975238 38.74953376977524 39.24952537600794
-288.258 184.97047695975238 185.61385674270235 38.74953376977524 39.24952537600794
-289.258 185.61385674270235 186.2572365256524 38.74953376977524 39.24952537600794
-290.258 186.2572365256524 186.9006163086024 38.74953376977524 39.24952537600794
-291.258 186.9006163086024 187.5439960915524 38.74953376977524 39.24952537600794
-292.258 187.5439960915524 188.1873758744524 38.74953376977524 39.24952537600794
-293.258 188.1873758744524 188.8307556574024 38.74953376977524 39.24952537600794
-294.258 188.8307556574024 189.47413544035237 38.74953376977524 39.24952537600794
-295.258 189.47413544035237 190.11751522330238 38.74953376977524 39.24952537600794
-296.258 190.11751522330238 190.76089500625238 38.74953376977524 39.24952537600794
-297.258 190.76089500625238 191.40427478920236 38.74953376977524 39.24952537600794
-298.258 191.40427478920236 192.0476545721524 38.74953376977524 39.24952537600794
-299.258 192.0476545721524 192.6910343551024 38.74953376977524 39.24952537600794
-300.258 192.6910343551024 193.3344141380524 38.74953376977524 39.24952537600794
-301.258 193.3344141380524 193.9777939210024 38.74953376977524 39.24952537600794
-302.258 193.9777939210024 194.62117370395237 38.74953376977524 39.24952537600794
-303.258 194.62117370395237 195.2645534869024 38.74953376977524 39.24952537600794
-304.258 195.2645534869024 195.9182431422118 38.74953376977524 39.24952537600794
-355.258 228.06661254479297 228.72030220010237 38.74953376977524 39.24952537600794
-356.258 228.72030220010237 229.3636819830524 38.74953376977524 39.24952537600794
-357.258 229.3636819830524 230.0070617660024 38.74953376977524 39.24952537600794
-358.258 230.0070617660024 230.65044154895241 38.74953376977524 39.24952537600794
-359.258 230.65044154895241 231.2938213319024 38.74953376977524 39.24952537600794
-360.258 231.2938213319024 231.93720111485237 38.74953376977524 39.24952537600794
-361.258 231.93720111485237 232.5805808978024 38.74953376977524 39.24952537600794
-362.258 232.5805808978024 233.22396068075238 38.74953376977524 39.24952537600794
-363.258 233.22396068075238 233.86734046370236 38.74953376977524 39.24952537600794
-364.258 233.86734046370236 234.51072024665237 38.74953376977524 39.24952537600794
-365.258 234.51072024665237 235.15410002960238 38.74953376977524 39.24952537600794
-366.258 235.15410002960238 235.7974798125524 38.74953376977524 39.24952537600794
-367.258 235.7974798125524 236.4408595954524 38.74953376977524 39.24952537600794
-368.258 236.4408595954524 237.08423937840237 38.74953376977524 39.24952537600794
-369.258 237.08423937840237 237.72761916135238 38.74953376977524 39.24952537600794
-370.258 237.72761916135238 238.37099894430236 38.74953376977524 39.24952537600794
-371.258 238.37099894430236 239.0143787272524 38.74953376977524 39.24952537600794
-372.258 239.0143787272524 239.65775851020243 38.74953376977524 39.24952537600794
-373.258 239.65775851020243 240.3011382931524 38.74953376977524 39.24952537600794
-374.258 240.3011382931524 240.94451807610238 38.74953376977524 39.24952537600794
-375.258 240.94451807610238 241.5878978590524 38.74953376977524 39.24952537600794
-376.258 241.5878978590524 242.2312776420024 38.74953376977524 39.24952537600794
-377.258 242.2312776420024 242.87465742495237 38.74953376977524 39.24952537600794
-378.258 242.87465742495237 243.51803720790235 38.74953376977524 39.24952537600794
-379.258 243.51803720790235 244.16141699085236 38.74953376977524 39.24952537600794
-380.258 244.16141699085236 244.80479677380237 38.74953376977524 39.24952537600794
-381.258 244.80479677380237 245.4481765567524 38.74953376977524 39.24952537600794
-382.258 245.4481765567524 246.09155633965239 38.74953376977524 39.24952537600794
-383.258 246.09155633965239 246.73493612260236 38.74953376977524 39.24952537600794
-384.258 246.73493612260236 247.37831590555237 38.74953376977524 39.24952537600794
-385.258 247.37831590555237 248.02169568850235 38.74953376977524 39.24952537600794
-386.258 248.02169568850235 248.66507547145238 38.74953376977524 39.24952537600794
-387.258 248.66507547145238 249.3084552544024 38.74953376977524 39.24952537600794
-388.258 249.3084552544024 249.9518350373524 38.74953376977524 39.24952537600794
-389.258 249.9518350373524 250.5952148203024 38.74953376977524 39.24952537600794
-390.258 250.5952148203024 251.2385946032524 38.74953376977524 39.24952537600794
-391.258 251.2385946032524 251.8819743862024 38.74953376977524 39.24952537600794
-392.258 251.8819743862024 252.5253541691524 38.74953376977524 39.24952537600794
-393.258 252.5253541691524 253.1687339521024 38.74953376977524 39.24952537600794
-394.258 253.1687339521024 253.81211373505238 38.74953376977524 39.24952537600794
-395.258 253.81211373505238 254.45549351795236 38.74953376977524 39.24952537600794
-396.258 254.45549351795236 255.09887330090237 38.74953376977524 39.24952537600794
-397.258 255.09887330090237 255.74225308385238 38.74953376977524 39.24952537600794
-398.258 255.74225308385238 256.3856328668023 38.74953376977524 39.24952537600794
-399.258 256.3856328668023 257.02901264975236 38.74953376977524 39.24952537600794
-400.258 257.02901264975236 257.67239243270234 38.74953376977524 39.24952537600794
-401.258 257.67239243270234 258.3157722156524 38.74953376977524 39.24952537600794
-402.258 258.3157722156524 258.9591519986024 38.74953376977524 39.24952537600794
-403.258 258.9591519986024 259.6025317815524 38.74953376977524 39.24952537600794
-404.258 259.6025317815524 260.2459115645024 38.74953376977524 39.24952537600794
-405.258 260.2459115645024 260.8892913474524 38.74953376977524 39.24952537600794
-406.258 260.8892913474524 261.5326711304024 38.74953376977524 39.24952537600794
-407.258 261.5326711304024 262.17605091335236 38.74953376977524 39.24952537600794
-408.258 262.17605091335236 262.8194306963024 38.74953376977524 39.24952537600794
-409.258 262.8194306963024 263.4628104792524 38.74953376977524 39.24952537600794
-410.258 263.4628104792524 264.1061902621524 38.74953376977524 39.24952537600794
-411.258 264.1061902621524 264.7495700451024 38.74953376977524 39.24952537600794
-412.258 264.7495700451024 265.3929498280524 38.74953376977524 39.24952537600794
-413.258 265.3929498280524 266.0363296110023 38.74953376977524 39.24952537600794
-414.258 266.0363296110023 266.67970939395235 38.74953376977524 39.24952537600794
-415.258 266.67970939395235 267.32308917690233 38.74953376977524 39.24952537600794
-416.258 267.32308917690233 267.96646895985236 38.74953376977524 39.24952537600794
-417.258 267.96646895985236 268.6098487428024 38.74953376977524 39.24952537600794
-418.258 268.6098487428024 269.2532285257524 38.74953376977524 39.24952537600794
-419.258 269.2532285257524 269.8966083087024 38.74953376977524 39.24952537600794
-420.258 269.8966083087024 270.5399880916524 38.74953376977524 39.24952537600794
-421.258 270.5399880916524 271.18336787460237 38.74953376977524 39.24952537600794
-422.258 271.18336787460237 271.82674765755235 38.74953376977524 39.24952537600794
-423.258 271.82674765755235 272.4701274405024 38.74953376977524 39.24952537600794
-424.258 272.4701274405024 273.1238170958118 38.74953376977524 39.24952537600794
-173.259 111.7655291816232 112.42389643628078 39.24952537600794 39.74951686168647
-174.259 112.42389643628078 113.07187993858079 39.24952537600794 39.74951686168647
-175.259 113.07187993858079 113.7198634408808 39.24952537600794 39.74951686168647
-176.259 113.7198634408808 114.36784694318081 39.24952537600794 39.74951686168647
-177.259 114.36784694318081 115.0158304454808 39.24952537600794 39.74951686168647
-178.259 115.0158304454808 115.6638139477808 39.24952537600794 39.74951686168647
-179.259 115.6638139477808 116.3117974500808 39.24952537600794 39.74951686168647
-180.259 116.3117974500808 116.95978095238081 39.24952537600794 39.74951686168647
-181.259 116.95978095238081 117.60776445468079 39.24952537600794 39.74951686168647
-182.259 117.60776445468079 118.2557479569808 39.24952537600794 39.74951686168647
-183.259 118.2557479569808 118.9037314592808 39.24952537600794 39.74951686168647
-184.259 118.9037314592808 119.55171496158081 39.24952537600794 39.74951686168647
-185.259 119.55171496158081 120.1996984638808 39.24952537600794 39.74951686168647
-186.259 120.1996984638808 120.8476819661308 39.24952537600794 39.74951686168647
-187.259 120.8476819661308 121.4956654683808 39.24952537600794 39.74951686168647
-188.259 121.4956654683808 122.1436489706808 39.24952537600794 39.74951686168647
-189.259 122.1436489706808 122.79163247298081 39.24952537600794 39.74951686168647
-190.259 122.79163247298081 123.43961597528082 39.24952537600794 39.74951686168647
-191.259 123.43961597528082 124.08759947758081 39.24952537600794 39.74951686168647
-192.259 124.08759947758081 124.7355829798808 39.24952537600794 39.74951686168647
-193.259 124.7355829798808 125.38356648218081 39.24952537600794 39.74951686168647
-194.259 125.38356648218081 126.03154998448082 39.24952537600794 39.74951686168647
-195.259 126.03154998448082 126.6795334867808 39.24952537600794 39.74951686168647
-196.259 126.6795334867808 127.3275169890808 39.24952537600794 39.74951686168647
-197.259 127.3275169890808 127.97550049138079 39.24952537600794 39.74951686168647
-198.259 127.97550049138079 128.6234839936808 39.24952537600794 39.74951686168647
-199.259 128.6234839936808 129.2714674959808 39.24952537600794 39.74951686168647
-200.259 129.2714674959808 129.91945099828078 39.24952537600794 39.74951686168647
-201.259 129.91945099828078 130.56743450058082 39.24952537600794 39.74951686168647
-202.259 130.56743450058082 131.21541800288082 39.24952537600794 39.74951686168647
-203.259 131.21541800288082 131.8634015051308 39.24952537600794 39.74951686168647
-204.259 131.8634015051308 132.5113850073808 39.24952537600794 39.74951686168647
-205.259 132.5113850073808 133.1593685096808 39.24952537600794 39.74951686168647
-206.259 133.1593685096808 133.8073520119808 39.24952537600794 39.74951686168647
-207.259 133.8073520119808 134.45533551428082 39.24952537600794 39.74951686168647
-208.259 134.45533551428082 135.10331901658083 39.24952537600794 39.74951686168647
-209.259 135.10331901658083 135.7513025188808 39.24952537600794 39.74951686168647
-210.259 135.7513025188808 136.39928602118079 39.24952537600794 39.74951686168647
-211.259 136.39928602118079 137.0472695234808 39.24952537600794 39.74951686168647
-212.259 137.0472695234808 137.6952530257808 39.24952537600794 39.74951686168647
-213.259 137.6952530257808 138.3432365280808 39.24952537600794 39.74951686168647
-214.259 138.3432365280808 138.9912200303808 39.24952537600794 39.74951686168647
-215.259 138.9912200303808 139.63920353268082 39.24952537600794 39.74951686168647
-216.259 139.63920353268082 140.2871870349808 39.24952537600794 39.74951686168647
-217.259 140.2871870349808 140.93517053728078 39.24952537600794 39.74951686168647
-218.259 140.93517053728078 141.5831540395808 39.24952537600794 39.74951686168647
-219.259 141.5831540395808 142.2311375418808 39.24952537600794 39.74951686168647
-220.259 142.2311375418808 142.8791210441808 39.24952537600794 39.74951686168647
-221.259 142.8791210441808 143.52710454643082 39.24952537600794 39.74951686168647
-222.259 143.52710454643082 144.1750880486808 39.24952537600794 39.74951686168647
-223.259 144.1750880486808 144.82307155098079 39.24952537600794 39.74951686168647
-224.259 144.82307155098079 145.4710550532808 39.24952537600794 39.74951686168647
-225.259 145.4710550532808 146.1190385555808 39.24952537600794 39.74951686168647
-226.259 146.1190385555808 146.7670220578808 39.24952537600794 39.74951686168647
-227.259 146.7670220578808 147.41500556018082 39.24952537600794 39.74951686168647
-228.259 147.41500556018082 148.06298906248082 39.24952537600794 39.74951686168647
-229.259 148.06298906248082 148.7109725647808 39.24952537600794 39.74951686168647
-230.259 148.7109725647808 149.35895606708078 39.24952537600794 39.74951686168647
-231.259 149.35895606708078 150.0069395693808 39.24952537600794 39.74951686168647
-232.259 150.0069395693808 150.6549230716808 39.24952537600794 39.74951686168647
-233.259 150.6549230716808 151.3029065739808 39.24952537600794 39.74951686168647
-234.259 151.3029065739808 151.9508900762808 39.24952537600794 39.74951686168647
-235.259 151.9508900762808 152.59887357858082 39.24952537600794 39.74951686168647
-236.259 152.59887357858082 153.2468570808808 39.24952537600794 39.74951686168647
-237.259 153.2468570808808 153.89484058318078 39.24952537600794 39.74951686168647
-238.259 153.89484058318078 154.5428240854808 39.24952537600794 39.74951686168647
-239.259 154.5428240854808 155.1908075877308 39.24952537600794 39.74951686168647
-240.259 155.1908075877308 155.83879108998082 39.24952537600794 39.74951686168647
-241.259 155.83879108998082 156.48677459228082 39.24952537600794 39.74951686168647
-242.259 156.48677459228082 157.1347580945808 39.24952537600794 39.74951686168647
-243.259 157.1347580945808 157.78274159688078 39.24952537600794 39.74951686168647
-244.259 157.78274159688078 158.4411088515384 39.24952537600794 39.74951686168647
-246.259 159.06832484912317 159.7266921037808 39.24952537600794 39.74951686168647
-247.259 159.7266921037808 160.3746756060808 39.24952537600794 39.74951686168647
-248.259 160.3746756060808 161.02265910838082 39.24952537600794 39.74951686168647
-249.259 161.02265910838082 161.6706426106808 39.24952537600794 39.74951686168647
-250.259 161.6706426106808 162.31862611298078 39.24952537600794 39.74951686168647
-251.259 162.31862611298078 162.9666096152808 39.24952537600794 39.74951686168647
-252.259 162.9666096152808 163.6145931175808 39.24952537600794 39.74951686168647
-253.259 163.6145931175808 164.2625766198808 39.24952537600794 39.74951686168647
-254.259 164.2625766198808 164.9105601221808 39.24952537600794 39.74951686168647
-255.259 164.9105601221808 165.55854362448082 39.24952537600794 39.74951686168647
-256.259 165.55854362448082 166.2065271267308 39.24952537600794 39.74951686168647
-257.259 166.2065271267308 166.8545106289808 39.24952537600794 39.74951686168647
-258.259 166.8545106289808 167.5024941312808 39.24952537600794 39.74951686168647
-259.259 167.5024941312808 168.15047763358078 39.24952537600794 39.74951686168647
-260.259 168.15047763358078 168.7984611358808 39.24952537600794 39.74951686168647
-261.259 168.7984611358808 169.44644463818082 39.24952537600794 39.74951686168647
-262.259 169.44644463818082 170.0944281404808 39.24952537600794 39.74951686168647
-263.259 170.0944281404808 170.74241164278078 39.24952537600794 39.74951686168647
-264.259 170.74241164278078 171.3903951450808 39.24952537600794 39.74951686168647
-265.259 171.3903951450808 172.0383786473808 39.24952537600794 39.74951686168647
-266.259 172.0383786473808 172.6863621496808 39.24952537600794 39.74951686168647
-267.259 172.6863621496808 173.3343456519808 39.24952537600794 39.74951686168647
-268.259 173.3343456519808 173.98232915428082 39.24952537600794 39.74951686168647
-269.259 173.98232915428082 174.6303126565808 39.24952537600794 39.74951686168647
-270.259 174.6303126565808 175.27829615888078 39.24952537600794 39.74951686168647
-271.259 175.27829615888078 175.92627966118079 39.24952537600794 39.74951686168647
-272.259 175.92627966118079 176.5742631634808 39.24952537600794 39.74951686168647
-273.259 176.5742631634808 177.2222466657808 39.24952537600794 39.74951686168647
-274.259 177.2222466657808 177.8702301680308 39.24952537600794 39.74951686168647
-275.259 177.8702301680308 178.5182136702808 39.24952537600794 39.74951686168647
-276.259 178.5182136702808 179.1661971725808 39.24952537600794 39.74951686168647
-277.259 179.1661971725808 179.8141806748808 39.24952537600794 39.74951686168647
-278.259 179.8141806748808 180.4621641771808 39.24952537600794 39.74951686168647
-279.259 180.4621641771808 181.11014767948078 39.24952537600794 39.74951686168647
-280.259 181.11014767948078 181.7581311817808 39.24952537600794 39.74951686168647
-281.259 181.7581311817808 182.40611468408082 39.24952537600794 39.74951686168647
-282.259 182.40611468408082 183.05409818638077 39.24952537600794 39.74951686168647
-283.259 183.05409818638077 183.70208168868078 39.24952537600794 39.74951686168647
-284.259 183.70208168868078 184.35006519098079 39.24952537600794 39.74951686168647
-285.259 184.35006519098079 184.9980486932808 39.24952537600794 39.74951686168647
-286.259 184.9980486932808 185.6460321955808 39.24952537600794 39.74951686168647
-287.259 185.6460321955808 186.29401569788075 39.24952537600794 39.74951686168647
-288.259 186.29401569788075 186.9419992001808 39.24952537600794 39.74951686168647
-289.259 186.9419992001808 187.58998270248077 39.24952537600794 39.74951686168647
-290.259 187.58998270248077 188.23796620478078 39.24952537600794 39.74951686168647
-291.259 188.23796620478078 188.88594970708078 39.24952537600794 39.74951686168647
-292.259 188.88594970708078 189.53393320933077 39.24952537600794 39.74951686168647
-293.259 189.53393320933077 190.18191671158075 39.24952537600794 39.74951686168647
-294.259 190.18191671158075 190.8299002138808 39.24952537600794 39.74951686168647
-295.259 190.8299002138808 191.4778837161808 39.24952537600794 39.74951686168647
-296.259 191.4778837161808 192.12586721848078 39.24952537600794 39.74951686168647
-297.259 192.12586721848078 192.77385072078079 39.24952537600794 39.74951686168647
-298.259 192.77385072078079 193.4218342230808 39.24952537600794 39.74951686168647
-299.259 193.4218342230808 194.0698177253808 39.24952537600794 39.74951686168647
-300.259 194.0698177253808 194.71780122768075 39.24952537600794 39.74951686168647
-301.259 194.71780122768075 195.36578472998076 39.24952537600794 39.74951686168647
-302.259 195.36578472998076 196.0241519846384 39.24952537600794 39.74951686168647
-354.259 229.0505430969232 229.7089103515808 39.24952537600794 39.74951686168647
-355.259 229.7089103515808 230.3568938538808 39.24952537600794 39.74951686168647
-356.259 230.3568938538808 231.00487735618077 39.24952537600794 39.74951686168647
-357.259 231.00487735618077 231.65286085848078 39.24952537600794 39.74951686168647
-358.259 231.65286085848078 232.3008443607808 39.24952537600794 39.74951686168647
-359.259 232.3008443607808 232.9488278630808 39.24952537600794 39.74951686168647
-360.259 232.9488278630808 233.59681136538074 39.24952537600794 39.74951686168647
-361.259 233.59681136538074 234.2447948676808 39.24952537600794 39.74951686168647
-362.259 234.2447948676808 234.89277836998082 39.24952537600794 39.74951686168647
-363.259 234.89277836998082 235.5407618722308 39.24952537600794 39.74951686168647
-364.259 235.5407618722308 236.1887453744808 39.24952537600794 39.74951686168647
-365.259 236.1887453744808 236.8367288767808 39.24952537600794 39.74951686168647
-366.259 236.8367288767808 237.48471237908078 39.24952537600794 39.74951686168647
-367.259 237.48471237908078 238.13269588138076 39.24952537600794 39.74951686168647
-368.259 238.13269588138076 238.78067938368076 39.24952537600794 39.74951686168647
-369.259 238.78067938368076 239.42866288598077 39.24952537600794 39.74951686168647
-370.259 239.42866288598077 240.07664638828078 39.24952537600794 39.74951686168647
-371.259 240.07664638828078 240.7246298905808 39.24952537600794 39.74951686168647
-372.259 240.7246298905808 241.3726133928808 39.24952537600794 39.74951686168647
-373.259 241.3726133928808 242.02059689518077 39.24952537600794 39.74951686168647
-374.259 242.02059689518077 242.66858039748075 39.24952537600794 39.74951686168647
-375.259 242.66858039748075 243.31656389978076 39.24952537600794 39.74951686168647
-376.259 243.31656389978076 243.96454740208077 39.24952537600794 39.74951686168647
-377.259 243.96454740208077 244.61253090438078 39.24952537600794 39.74951686168647
-378.259 244.61253090438078 245.26051440668078 39.24952537600794 39.74951686168647
-379.259 245.26051440668078 245.9084979089808 39.24952537600794 39.74951686168647
-380.259 245.9084979089808 246.5564814112308 39.24952537600794 39.74951686168647
-381.259 246.5564814112308 247.20446491348082 39.24952537600794 39.74951686168647
-382.259 247.20446491348082 247.8524484157808 39.24952537600794 39.74951686168647
-383.259 247.8524484157808 248.50043191808078 39.24952537600794 39.74951686168647
-384.259 248.50043191808078 249.1484154203808 39.24952537600794 39.74951686168647
-385.259 249.1484154203808 249.7963989226808 39.24952537600794 39.74951686168647
-386.259 249.7963989226808 250.4443824249808 39.24952537600794 39.74951686168647
-387.259 250.4443824249808 251.0923659272808 39.24952537600794 39.74951686168647
-388.259 251.0923659272808 251.74034942958082 39.24952537600794 39.74951686168647
-389.259 251.74034942958082 252.38833293188083 39.24952537600794 39.74951686168647
-390.259 252.38833293188083 253.0363164341808 39.24952537600794 39.74951686168647
-391.259 253.0363164341808 253.68429993648078 39.24952537600794 39.74951686168647
-392.259 253.68429993648078 254.3322834387808 39.24952537600794 39.74951686168647
-393.259 254.3322834387808 254.98026694108077 39.24952537600794 39.74951686168647
-394.259 254.98026694108077 255.62825044338078 39.24952537600794 39.74951686168647
-395.259 255.62825044338078 256.2762339456808 39.24952537600794 39.74951686168647
-396.259 256.2762339456808 256.9242174479808 39.24952537600794 39.74951686168647
-397.259 256.9242174479808 257.57220095028083 39.24952537600794 39.74951686168647
-398.259 257.57220095028083 258.2201844525308 39.24952537600794 39.74951686168647
-399.259 258.2201844525308 258.8681679547808 39.24952537600794 39.74951686168647
-400.259 258.8681679547808 259.5161514570808 39.24952537600794 39.74951686168647
-401.259 259.5161514570808 260.16413495938076 39.24952537600794 39.74951686168647
-402.259 260.16413495938076 260.8121184616808 39.24952537600794 39.74951686168647
-403.259 260.8121184616808 261.4601019639808 39.24952537600794 39.74951686168647
-404.259 261.4601019639808 262.10808546628084 39.24952537600794 39.74951686168647
-405.259 262.10808546628084 262.75606896858085 39.24952537600794 39.74951686168647
-406.259 262.75606896858085 263.40405247088074 39.24952537600794 39.74951686168647
-407.259 263.40405247088074 264.0520359731808 39.24952537600794 39.74951686168647
-408.259 264.0520359731808 264.7000194754808 39.24952537600794 39.74951686168647
-409.259 264.7000194754808 265.34800297778077 39.24952537600794 39.74951686168647
-410.259 265.34800297778077 265.9959864800808 39.24952537600794 39.74951686168647
-411.259 265.9959864800808 266.6439699823808 39.24952537600794 39.74951686168647
-412.259 266.6439699823808 267.2919534846808 39.24952537600794 39.74951686168647
-413.259 267.2919534846808 267.9399369869808 39.24952537600794 39.74951686168647
-414.259 267.9399369869808 268.5879204892808 39.24952537600794 39.74951686168647
-415.259 268.5879204892808 269.2359039915808 39.24952537600794 39.74951686168647
-416.259 269.2359039915808 269.8838874938308 39.24952537600794 39.74951686168647
-417.259 269.8838874938308 270.53187099608084 39.24952537600794 39.74951686168647
-418.259 270.53187099608084 271.1798544983808 39.24952537600794 39.74951686168647
-419.259 271.1798544983808 271.82783800068074 39.24952537600794 39.74951686168647
-420.259 271.82783800068074 272.48620525533835 39.24952537600794 39.74951686168647
-172.260 111.92694291285736 112.59010606060724 39.74951686168647 40.24950822286971
-173.260 112.59010606060724 113.24280970525726 39.74951686168647 40.24950822286971
-174.260 113.24280970525726 113.89551334995724 39.74951686168647 40.24950822286971
-175.260 113.89551334995724 114.54821699460723 39.74951686168647 40.24950822286971
-176.260 114.54821699460723 115.20092063925722 39.74951686168647 40.24950822286971
-177.260 115.20092063925722 115.85362428395725 39.74951686168647 40.24950822286971
-178.260 115.85362428395725 116.50632792860725 39.74951686168647 40.24950822286971
-179.260 116.50632792860725 117.15903157325727 39.74951686168647 40.24950822286971
-180.260 117.15903157325727 117.81173521795725 39.74951686168647 40.24950822286971
-181.260 117.81173521795725 118.46443886260724 39.74951686168647 40.24950822286971
-182.260 118.46443886260724 119.11714250725724 39.74951686168647 40.24950822286971
-183.260 119.11714250725724 119.76984615195725 39.74951686168647 40.24950822286971
-184.260 119.76984615195725 120.42254979660726 39.74951686168647 40.24950822286971
-185.260 120.42254979660726 121.07525344125725 39.74951686168647 40.24950822286971
-186.260 121.07525344125725 121.72795708595723 39.74951686168647 40.24950822286971
-187.260 121.72795708595723 122.38066073060725 39.74951686168647 40.24950822286971
-188.260 122.38066073060725 123.03336437525725 39.74951686168647 40.24950822286971
-189.260 123.03336437525725 123.68606801995725 39.74951686168647 40.24950822286971
-190.260 123.68606801995725 124.33877166460724 39.74951686168647 40.24950822286971
-191.260 124.33877166460724 124.99147530925723 39.74951686168647 40.24950822286971
-192.260 124.99147530925723 125.64417895395724 39.74951686168647 40.24950822286971
-193.260 125.64417895395724 126.29688259860724 39.74951686168647 40.24950822286971
-194.260 126.29688259860724 126.94958624325727 39.74951686168647 40.24950822286971
-195.260 126.94958624325727 127.60228988795726 39.74951686168647 40.24950822286971
-196.260 127.60228988795726 128.25499353260727 39.74951686168647 40.24950822286971
-197.260 128.25499353260727 128.90769717725723 39.74951686168647 40.24950822286971
-198.260 128.90769717725723 129.56040082195724 39.74951686168647 40.24950822286971
-199.260 129.56040082195724 130.21310446660723 39.74951686168647 40.24950822286971
-200.260 130.21310446660723 130.86580811125725 39.74951686168647 40.24950822286971
-201.260 130.86580811125725 131.51851175595726 39.74951686168647 40.24950822286971
-202.260 131.51851175595726 132.17121540060725 39.74951686168647 40.24950822286971
-203.260 132.17121540060725 132.82391904525724 39.74951686168647 40.24950822286971
-204.260 132.82391904525724 133.47662268995725 39.74951686168647 40.24950822286971
-205.260 133.47662268995725 134.12932633460724 39.74951686168647 40.24950822286971
-206.260 134.12932633460724 134.78202997925723 39.74951686168647 40.24950822286971
-207.260 134.78202997925723 135.43473362395724 39.74951686168647 40.24950822286971
-208.260 135.43473362395724 136.08743726860723 39.74951686168647 40.24950822286971
-209.260 136.08743726860723 136.74014091325725 39.74951686168647 40.24950822286971
-210.260 136.74014091325725 137.39284455795723 39.74951686168647 40.24950822286971
-211.260 137.39284455795723 138.04554820260722 39.74951686168647 40.24950822286971
-212.260 138.04554820260722 138.69825184725727 39.74951686168647 40.24950822286971
-213.260 138.69825184725727 139.35095549195725 39.74951686168647 40.24950822286971
-214.260 139.35095549195725 140.00365913660724 39.74951686168647 40.24950822286971
-215.260 140.00365913660724 140.65636278125726 39.74951686168647 40.24950822286971
-216.260 140.65636278125726 141.3090664259572 39.74951686168647 40.24950822286971
-217.260 141.3090664259572 141.96177007060726 39.74951686168647 40.24950822286971
-218.260 141.96177007060726 142.61447371525725 39.74951686168647 40.24950822286971
-219.260 142.61447371525725 143.26717735990724 39.74951686168647 40.24950822286971
-220.260 143.26717735990724 143.91988100455725 39.74951686168647 40.24950822286971
-221.260 143.91988100455725 144.57258464925724 39.74951686168647 40.24950822286971
-222.260 144.57258464925724 145.22528829390723 39.74951686168647 40.24950822286971
-223.260 145.22528829390723 145.87799193855724 39.74951686168647 40.24950822286971
-224.260 145.87799193855724 146.53069558325723 39.74951686168647 40.24950822286971
-225.260 146.53069558325723 147.18339922790724 39.74951686168647 40.24950822286971
-226.260 147.18339922790724 147.83610287255726 39.74951686168647 40.24950822286971
-227.260 147.83610287255726 148.48880651725722 39.74951686168647 40.24950822286971
-228.260 148.48880651725722 149.14151016190726 39.74951686168647 40.24950822286971
-229.260 149.14151016190726 149.79421380655725 39.74951686168647 40.24950822286971
-230.260 149.79421380655725 150.44691745125726 39.74951686168647 40.24950822286971
-231.260 150.44691745125726 151.09962109590725 39.74951686168647 40.24950822286971
-232.260 151.09962109590725 151.75232474055724 39.74951686168647 40.24950822286971
-233.260 151.75232474055724 152.40502838525725 39.74951686168647 40.24950822286971
-234.260 152.40502838525725 153.05773202990724 39.74951686168647 40.24950822286971
-235.260 153.05773202990724 153.71043567455723 39.74951686168647 40.24950822286971
-236.260 153.71043567455723 154.36313931925724 39.74951686168647 40.24950822286971
-237.260 154.36313931925724 155.01584296390723 39.74951686168647 40.24950822286971
-238.260 155.01584296390723 155.66854660855728 39.74951686168647 40.24950822286971
-239.260 155.66854660855728 156.32125025325723 39.74951686168647 40.24950822286971
-240.260 156.32125025325723 156.97395389790722 39.74951686168647 40.24950822286971
-241.260 156.97395389790722 157.6266575425572 39.74951686168647 40.24950822286971
-242.260 157.6266575425572 158.28982069035712 39.74951686168647 40.24950822286971
-244.260 158.92160532875735 159.58476847655723 39.74951686168647 40.24950822286971
-245.260 159.58476847655723 160.23747212125724 39.74951686168647 40.24950822286971
-246.260 160.23747212125724 160.89017576590723 39.74951686168647 40.24950822286971
-247.260 160.89017576590723 161.54287941055725 39.74951686168647 40.24950822286971
-248.260 161.54287941055725 162.19558305525726 39.74951686168647 40.24950822286971
-249.260 162.19558305525726 162.84828669990725 39.74951686168647 40.24950822286971
-250.260 162.84828669990725 163.50099034455724 39.74951686168647 40.24950822286971
-251.260 163.50099034455724 164.15369398925725 39.74951686168647 40.24950822286971
-252.260 164.15369398925725 164.80639763390724 39.74951686168647 40.24950822286971
-253.260 164.80639763390724 165.45910127855723 39.74951686168647 40.24950822286971
-254.260 165.45910127855723 166.11180492325724 39.74951686168647 40.24950822286971
-255.260 166.11180492325724 166.76450856790723 39.74951686168647 40.24950822286971
-256.260 166.76450856790723 167.41721221255722 39.74951686168647 40.24950822286971
-257.260 167.41721221255722 168.06991585725723 39.74951686168647 40.24950822286971
-258.260 168.06991585725723 168.72261950190725 39.74951686168647 40.24950822286971
-259.260 168.72261950190725 169.37532314655724 39.74951686168647 40.24950822286971
-260.260 169.37532314655724 170.02802679125728 39.74951686168647 40.24950822286971
-261.260 170.02802679125728 170.68073043590726 39.74951686168647 40.24950822286971
-262.260 170.68073043590726 171.33343408055725 39.74951686168647 40.24950822286971
-263.260 171.33343408055725 171.98613772525727 39.74951686168647 40.24950822286971
-264.260 171.98613772525727 172.63884136990723 39.74951686168647 40.24950822286971
-265.260 172.63884136990723 173.29154501455724 39.74951686168647 40.24950822286971
-266.260 173.29154501455724 173.94424865925725 39.74951686168647 40.24950822286971
-267.260 173.94424865925725 174.59695230390724 39.74951686168647 40.24950822286971
-268.260 174.59695230390724 175.24965594855726 39.74951686168647 40.24950822286971
-269.260 175.24965594855726 175.90235959325724 39.74951686168647 40.24950822286971
-270.260 175.90235959325724 176.55506323790726 39.74951686168647 40.24950822286971
-271.260 176.55506323790726 177.20776688255725 39.74951686168647 40.24950822286971
-272.260 177.20776688255725 177.86047052725723 39.74951686168647 40.24950822286971
-273.260 177.86047052725723 178.51317417190722 39.74951686168647 40.24950822286971
-274.260 178.51317417190722 179.1658778165572 39.74951686168647 40.24950822286971
-275.260 179.1658778165572 179.81858146125725 39.74951686168647 40.24950822286971
-276.260 179.81858146125725 180.4712851059072 39.74951686168647 40.24950822286971
-277.260 180.4712851059072 181.1239887505572 39.74951686168647 40.24950822286971
-278.260 181.1239887505572 181.77669239525721 39.74951686168647 40.24950822286971
-279.260 181.77669239525721 182.4293960399072 39.74951686168647 40.24950822286971
-280.260 182.4293960399072 183.08209968455725 39.74951686168647 40.24950822286971
-281.260 183.08209968455725 183.7348033292572 39.74951686168647 40.24950822286971
-282.260 183.7348033292572 184.38750697390722 39.74951686168647 40.24950822286971
-283.260 184.38750697390722 185.04021061855724 39.74951686168647 40.24950822286971
-284.260 185.04021061855724 185.69291426320723 39.74951686168647 40.24950822286971
-285.260 185.69291426320723 186.34561790785725 39.74951686168647 40.24950822286971
-286.260 186.34561790785725 186.99832155255723 39.74951686168647 40.24950822286971
-287.260 186.99832155255723 187.65102519720722 39.74951686168647 40.24950822286971
-288.260 187.65102519720722 188.30372884185724 39.74951686168647 40.24950822286971
-289.260 188.30372884185724 188.95643248655722 39.74951686168647 40.24950822286971
-290.260 188.95643248655722 189.60913613120724 39.74951686168647 40.24950822286971
-291.260 189.60913613120724 190.26183977585723 39.74951686168647 40.24950822286971
-292.260 190.26183977585723 190.9145434205572 39.74951686168647 40.24950822286971
-293.260 190.9145434205572 191.56724706520723 39.74951686168647 40.24950822286971
-294.260 191.56724706520723 192.21995070985722 39.74951686168647 40.24950822286971
-295.260 192.21995070985722 192.87265435455723 39.74951686168647 40.24950822286971
-296.260 192.87265435455723 193.52535799920722 39.74951686168647 40.24950822286971
-297.260 193.52535799920722 194.17806164385723 39.74951686168647 40.24950822286971
-298.260 194.17806164385723 194.83076528855725 39.74951686168647 40.24950822286971
-299.260 194.83076528855725 195.48346893320723 39.74951686168647 40.24950822286971
-300.260 195.48346893320723 196.13617257785722 39.74951686168647 40.24950822286971
-301.260 196.13617257785722 196.79933572565713 39.74951686168647 40.24950822286971
-352.260 229.41359895275738 230.07676210050727 39.74951686168647 40.24950822286971
-353.260 230.07676210050727 230.72946574515726 39.74951686168647 40.24950822286971
-354.260 230.72946574515726 231.3821693898572 39.74951686168647 40.24950822286971
-355.260 231.3821693898572 232.03487303450723 39.74951686168647 40.24950822286971
-356.260 232.03487303450723 232.68757667915725 39.74951686168647 40.24950822286971
-357.260 232.68757667915725 233.34028032385726 39.74951686168647 40.24950822286971
-358.260 233.34028032385726 233.99298396850722 39.74951686168647 40.24950822286971
-359.260 233.99298396850722 234.64568761315724 39.74951686168647 40.24950822286971
-360.260 234.64568761315724 235.29839125785725 39.74951686168647 40.24950822286971
-361.260 235.29839125785725 235.95109490250724 39.74951686168647 40.24950822286971
-362.260 235.95109490250724 236.60379854715723 39.74951686168647 40.24950822286971
-363.260 236.60379854715723 237.25650219185724 39.74951686168647 40.24950822286971
-364.260 237.25650219185724 237.90920583650723 39.74951686168647 40.24950822286971
-365.260 237.90920583650723 238.56190948115724 39.74951686168647 40.24950822286971
-366.260 238.56190948115724 239.21461312585723 39.74951686168647 40.24950822286971
-367.260 239.21461312585723 239.86731677050722 39.74951686168647 40.24950822286971
-368.260 239.86731677050722 240.52002041515723 39.74951686168647 40.24950822286971
-369.260 240.52002041515723 241.17272405985722 39.74951686168647 40.24950822286971
-370.260 241.17272405985722 241.82542770450723 39.74951686168647 40.24950822286971
-371.260 241.82542770450723 242.47813134915725 39.74951686168647 40.24950822286971
-372.260 242.47813134915725 243.1308349938572 39.74951686168647 40.24950822286971
-373.260 243.1308349938572 243.78353863850725 39.74951686168647 40.24950822286971
-374.260 243.78353863850725 244.43624228315724 39.74951686168647 40.24950822286971
-375.260 244.43624228315724 245.08894592785722 39.74951686168647 40.24950822286971
-376.260 245.08894592785722 245.74164957250724 39.74951686168647 40.24950822286971
-377.260 245.74164957250724 246.39435321715723 39.74951686168647 40.24950822286971
-378.260 246.39435321715723 247.04705686185721 39.74951686168647 40.24950822286971
-379.260 247.04705686185721 247.69976050650723 39.74951686168647 40.24950822286971
-380.260 247.69976050650723 248.35246415115722 39.74951686168647 40.24950822286971
-381.260 248.35246415115722 249.00516779585723 39.74951686168647 40.24950822286971
-382.260 249.00516779585723 249.65787144050722 39.74951686168647 40.24950822286971
-383.260 249.65787144050722 250.3105750851572 39.74951686168647 40.24950822286971
-384.260 250.3105750851572 250.96327872985722 39.74951686168647 40.24950822286971
-385.260 250.96327872985722 251.61598237450724 39.74951686168647 40.24950822286971
-386.260 251.61598237450724 252.2686860191572 39.74951686168647 40.24950822286971
-387.260 252.2686860191572 252.9213896638572 39.74951686168647 40.24950822286971
-388.260 252.9213896638572 253.5740933085072 39.74951686168647 40.24950822286971
-389.260 253.5740933085072 254.22679695315725 39.74951686168647 40.24950822286971
-390.260 254.22679695315725 254.87950059785726 39.74951686168647 40.24950822286971
-391.260 254.87950059785726 255.5322042425072 39.74951686168647 40.24950822286971
-392.260 255.5322042425072 256.18490788715724 39.74951686168647 40.24950822286971
-393.260 256.18490788715724 256.83761153185725 39.74951686168647 40.24950822286971
-394.260 256.83761153185725 257.49031517650724 39.74951686168647 40.24950822286971
-395.260 257.49031517650724 258.14301882115717 39.74951686168647 40.24950822286971
-396.260 258.14301882115717 258.79572246585724 39.74951686168647 40.24950822286971
-397.260 258.79572246585724 259.4484261105072 39.74951686168647 40.24950822286971
-398.260 259.4484261105072 260.1011297551572 39.74951686168647 40.24950822286971
-399.260 260.1011297551572 260.7538333998572 39.74951686168647 40.24950822286971
-400.260 260.7538333998572 261.4065370445073 39.74951686168647 40.24950822286971
-401.260 261.4065370445073 262.05924068915726 39.74951686168647 40.24950822286971
-402.260 262.05924068915726 262.7119443338572 39.74951686168647 40.24950822286971
-403.260 262.7119443338572 263.36464797850726 39.74951686168647 40.24950822286971
-404.260 263.36464797850726 264.01735162315725 39.74951686168647 40.24950822286971
-405.260 264.01735162315725 264.67005526785726 39.74951686168647 40.24950822286971
-406.260 264.67005526785726 265.32275891250725 39.74951686168647 40.24950822286971
-407.260 265.32275891250725 265.97546255715724 39.74951686168647 40.24950822286971
-408.260 265.97546255715724 266.62816620180723 39.74951686168647 40.24950822286971
-409.260 266.62816620180723 267.2808698464572 39.74951686168647 40.24950822286971
-410.260 267.2808698464572 267.93357349115723 39.74951686168647 40.24950822286971
-411.260 267.93357349115723 268.5862771358072 39.74951686168647 40.24950822286971
-412.260 268.5862771358072 269.23898078045727 39.74951686168647 40.24950822286971
-413.260 269.23898078045727 269.8916844251572 39.74951686168647 40.24950822286971
-414.260 269.8916844251572 270.5443880698072 39.74951686168647 40.24950822286971
-415.260 270.5443880698072 271.19709171445726 39.74951686168647 40.24950822286971
-416.260 271.19709171445726 271.84979535915727 39.74951686168647 40.24950822286971
-417.260 271.84979535915727 272.5024990038072 39.74951686168647 40.24950822286971
-418.260 272.5024990038072 273.15520264845725 39.74951686168647 40.24950822286971
-419.260 273.15520264845725 273.8183657962571 39.74951686168647 40.24950822286971
-171.261 112.09932459213913 112.76740526966418 40.24950822286971 40.7494994554619
-172.261 112.76740526966418 113.42494876961419 40.24950822286971 40.7494994554619
-173.261 113.42494876961419 114.08249226956418 40.24950822286971 40.7494994554619
-174.261 114.08249226956418 114.74003576946419 40.24950822286971 40.7494994554619
-175.261 114.74003576946419 115.39757926941418 40.24950822286971 40.7494994554619
-176.261 115.39757926941418 116.05512276936417 40.24950822286971 40.7494994554619
-177.261 116.05512276936417 116.71266626931418 40.24950822286971 40.7494994554619
-178.261 116.71266626931418 117.37020976926419 40.24950822286971 40.7494994554619
-179.261 117.37020976926419 118.02775326921419 40.24950822286971 40.7494994554619
-180.261 118.02775326921419 118.6852967691642 40.24950822286971 40.7494994554619
-181.261 118.6852967691642 119.3428402691142 40.24950822286971 40.7494994554619
-182.261 119.3428402691142 120.0003837690642 40.24950822286971 40.7494994554619
-183.261 120.0003837690642 120.65792726901418 40.24950822286971 40.7494994554619
-184.261 120.65792726901418 121.31547076896419 40.24950822286971 40.7494994554619
-185.261 121.31547076896419 121.97301426886418 40.24950822286971 40.7494994554619
-186.261 121.97301426886418 122.63055776881419 40.24950822286971 40.7494994554619
-187.261 122.63055776881419 123.2881012687642 40.24950822286971 40.7494994554619
-188.261 123.2881012687642 123.94564476871419 40.24950822286971 40.7494994554619
-189.261 123.94564476871419 124.6031882686642 40.24950822286971 40.7494994554619
-190.261 124.6031882686642 125.26073176861419 40.24950822286971 40.7494994554619
-191.261 125.26073176861419 125.91827526856417 40.24950822286971 40.7494994554619
-192.261 125.91827526856417 126.57581876851418 40.24950822286971 40.7494994554619
-193.261 126.57581876851418 127.23336226846419 40.24950822286971 40.7494994554619
-194.261 127.23336226846419 127.89090576841417 40.24950822286971 40.7494994554619
-195.261 127.89090576841417 128.54844926836418 40.24950822286971 40.7494994554619
-196.261 128.54844926836418 129.2059927682642 40.24950822286971 40.7494994554619
-197.261 129.2059927682642 129.8635362682142 40.24950822286971 40.7494994554619
-198.261 129.8635362682142 130.52107976816418 40.24950822286971 40.7494994554619
-199.261 130.52107976816418 131.17862326811417 40.24950822286971 40.7494994554619
-200.261 131.17862326811417 131.83616676806417 40.24950822286971 40.7494994554619
-201.261 131.83616676806417 132.49371026801418 40.24950822286971 40.7494994554619
-202.261 132.49371026801418 133.1512537679642 40.24950822286971 40.7494994554619
-203.261 133.1512537679642 133.80879726791417 40.24950822286971 40.7494994554619
-204.261 133.80879726791417 134.46634076786418 40.24950822286971 40.7494994554619
-205.261 134.46634076786418 135.1238842678142 40.24950822286971 40.7494994554619
-206.261 135.1238842678142 135.7814277677642 40.24950822286971 40.7494994554619
-207.261 135.7814277677642 136.4389712676642 40.24950822286971 40.7494994554619
-208.261 136.4389712676642 137.09651476761417 40.24950822286971 40.7494994554619
-209.261 137.09651476761417 137.75405826756418 40.24950822286971 40.7494994554619
-210.261 137.75405826756418 138.41160176751418 40.24950822286971 40.7494994554619
-211.261 138.41160176751418 139.0691452674642 40.24950822286971 40.7494994554619
-212.261 139.0691452674642 139.72668876741417 40.24950822286971 40.7494994554619
-213.261 139.72668876741417 140.38423226736418 40.24950822286971 40.7494994554619
-214.261 140.38423226736418 141.0417757673142 40.24950822286971 40.7494994554619
-215.261 141.0417757673142 141.6993192672642 40.24950822286971 40.7494994554619
-216.261 141.6993192672642 142.3568627672142 40.24950822286971 40.7494994554619
-217.261 142.3568627672142 143.0144062671642 40.24950822286971 40.7494994554619
-218.261 143.0144062671642 143.67194976706418 40.24950822286971 40.7494994554619
-219.261 143.67194976706418 144.3294932670142 40.24950822286971 40.7494994554619
-220.261 144.3294932670142 144.9870367669642 40.24950822286971 40.7494994554619
-221.261 144.9870367669642 145.6445802669142 40.24950822286971 40.7494994554619
-222.261 145.6445802669142 146.30212376686418 40.24950822286971 40.7494994554619
-223.261 146.30212376686418 146.9596672668142 40.24950822286971 40.7494994554619
-224.261 146.9596672668142 147.61721076676417 40.24950822286971 40.7494994554619
-225.261 147.61721076676417 148.2747542667142 40.24950822286971 40.7494994554619
-226.261 148.2747542667142 148.9322977666642 40.24950822286971 40.7494994554619
-227.261 148.9322977666642 149.58984126656418 40.24950822286971 40.7494994554619
-228.261 149.58984126656418 150.2473847665142 40.24950822286971 40.7494994554619
-229.261 150.2473847665142 150.9049282664642 40.24950822286971 40.7494994554619
-230.261 150.9049282664642 151.5624717664142 40.24950822286971 40.7494994554619
-231.261 151.5624717664142 152.2200152663642 40.24950822286971 40.7494994554619
-232.261 152.2200152663642 152.8775587663142 40.24950822286971 40.7494994554619
-233.261 152.8775587663142 153.53510226626418 40.24950822286971 40.7494994554619
-234.261 153.53510226626418 154.1926457662142 40.24950822286971 40.7494994554619
-235.261 154.1926457662142 154.8501892661642 40.24950822286971 40.7494994554619
-236.261 154.8501892661642 155.50773276611417 40.24950822286971 40.7494994554619
-237.261 155.50773276611417 156.16527626606415 40.24950822286971 40.7494994554619
-238.261 156.16527626606415 156.8228197659642 40.24950822286971 40.7494994554619
-239.261 156.8228197659642 157.4803632659142 40.24950822286971 40.7494994554619
-240.261 157.4803632659142 158.13790676586422 40.24950822286971 40.7494994554619
-241.261 158.13790676586422 158.7954502658142 40.24950822286971 40.7494994554619
-242.261 158.7954502658142 159.45299376576418 40.24950822286971 40.7494994554619
-243.261 159.45299376576418 160.11053726571419 40.24950822286971 40.7494994554619
-244.261 160.11053726571419 160.7680807656642 40.24950822286971 40.7494994554619
-245.261 160.7680807656642 161.42562426561418 40.24950822286971 40.7494994554619
-246.261 161.42562426561418 162.08316776556416 40.24950822286971 40.7494994554619
-247.261 162.08316776556416 162.74071126551416 40.24950822286971 40.7494994554619
-248.261 162.74071126551416 163.39825476546417 40.24950822286971 40.7494994554619
-249.261 163.39825476546417 164.05579826536422 40.24950822286971 40.7494994554619
-250.261 164.05579826536422 164.7133417653142 40.24950822286971 40.7494994554619
-251.261 164.7133417653142 165.37088526526418 40.24950822286971 40.7494994554619
-252.261 165.37088526526418 166.0284287652142 40.24950822286971 40.7494994554619
-253.261 166.0284287652142 166.6859722651642 40.24950822286971 40.7494994554619
-254.261 166.6859722651642 167.34351576511418 40.24950822286971 40.7494994554619
-255.261 167.34351576511418 168.00105926506416 40.24950822286971 40.7494994554619
-256.261 168.00105926506416 168.65860276501417 40.24950822286971 40.7494994554619
-257.261 168.65860276501417 169.31614626496417 40.24950822286971 40.7494994554619
-258.261 169.31614626496417 169.9736897649142 40.24950822286971 40.7494994554619
-259.261 169.9736897649142 170.6312332648642 40.24950822286971 40.7494994554619
-260.261 170.6312332648642 171.28877676476418 40.24950822286971 40.7494994554619
-261.261 171.28877676476418 171.9463202647142 40.24950822286971 40.7494994554619
-262.261 171.9463202647142 172.6038637646642 40.24950822286971 40.7494994554619
-263.261 172.6038637646642 173.26140726461418 40.24950822286971 40.7494994554619
-264.261 173.26140726461418 173.91895076456416 40.24950822286971 40.7494994554619
-265.261 173.91895076456416 174.57649426451417 40.24950822286971 40.7494994554619
-266.261 174.57649426451417 175.23403776446418 40.24950822286971 40.7494994554619
-267.261 175.23403776446418 175.89158126441419 40.24950822286971 40.7494994554619
-268.261 175.89158126441419 176.5491247643642 40.24950822286971 40.7494994554619
-269.261 176.5491247643642 177.2066682643142 40.24950822286971 40.7494994554619
-270.261 177.2066682643142 177.8642117642642 40.24950822286971 40.7494994554619
-271.261 177.8642117642642 178.5217552641642 40.24950822286971 40.7494994554619
-272.261 178.5217552641642 179.17929876411418 40.24950822286971 40.7494994554619
-273.261 179.17929876411418 179.83684226406416 40.24950822286971 40.7494994554619
-274.261 179.83684226406416 180.49438576401414 40.24950822286971 40.7494994554619
-275.261 180.49438576401414 181.15192926396418 40.24950822286971 40.7494994554619
-276.261 181.15192926396418 181.80947276391416 40.24950822286971 40.7494994554619
-277.261 181.80947276391416 182.46701626386414 40.24950822286971 40.7494994554619
-278.261 182.46701626386414 183.12455976381418 40.24950822286971 40.7494994554619
-279.261 183.12455976381418 183.78210326376416 40.24950822286971 40.7494994554619
-280.261 183.78210326376416 184.43964676371417 40.24950822286971 40.7494994554619
-281.261 184.43964676371417 185.09719026366417 40.24950822286971 40.7494994554619
-282.261 185.09719026366417 185.75473376356416 40.24950822286971 40.7494994554619
-283.261 185.75473376356416 186.41227726351414 40.24950822286971 40.7494994554619
-284.261 186.41227726351414 187.06982076346415 40.24950822286971 40.7494994554619
-285.261 187.06982076346415 187.72736426341413 40.24950822286971 40.7494994554619
-286.261 187.72736426341413 188.38490776336414 40.24950822286971 40.7494994554619
-287.261 188.38490776336414 189.04245126331418 40.24950822286971 40.7494994554619
-288.261 189.04245126331418 189.69999476326416 40.24950822286971 40.7494994554619
-289.261 189.69999476326416 190.35753826321417 40.24950822286971 40.7494994554619
-290.261 190.35753826321417 191.01508176316418 40.24950822286971 40.7494994554619
-291.261 191.01508176316418 191.67262526311418 40.24950822286971 40.7494994554619
-292.261 191.67262526311418 192.33016876306417 40.24950822286971 40.7494994554619
-293.261 192.33016876306417 192.98771226296415 40.24950822286971 40.7494994554619
-294.261 192.98771226296415 193.64525576291416 40.24950822286971 40.7494994554619
-295.261 193.64525576291416 194.30279926286417 40.24950822286971 40.7494994554619
-296.261 194.30279926286417 194.96034276281418 40.24950822286971 40.7494994554619
-297.261 194.96034276281418 195.61788626276416 40.24950822286971 40.7494994554619
-298.261 195.61788626276416 196.27542976271417 40.24950822286971 40.7494994554619
-299.261 196.27542976271417 196.93297326266418 40.24950822286971 40.7494994554619
-300.261 196.93297326266418 197.60105394018922 40.24950822286971 40.7494994554619
-377.261 247.5532855808391 248.22136625841418 40.24950822286971 40.7494994554619
-378.261 248.22136625841418 248.8789097583642 40.24950822286971 40.7494994554619
-379.261 248.8789097583642 249.53645325831417 40.24950822286971 40.7494994554619
-380.261 249.53645325831417 250.19399675826418 40.24950822286971 40.7494994554619
-381.261 250.19399675826418 250.85154025816416 40.24950822286971 40.7494994554619
-382.261 250.85154025816416 251.50908375811417 40.24950822286971 40.7494994554619
-383.261 251.50908375811417 252.16662725806418 40.24950822286971 40.7494994554619
-384.261 252.16662725806418 252.82417075801416 40.24950822286971 40.7494994554619
-385.261 252.82417075801416 253.4817142579642 40.24950822286971 40.7494994554619
-386.261 253.4817142579642 254.13925775791418 40.24950822286971 40.7494994554619
-387.261 254.13925775791418 254.79680125786416 40.24950822286971 40.7494994554619
-388.261 254.79680125786416 255.45434475781417 40.24950822286971 40.7494994554619
-389.261 255.45434475781417 256.1118882577642 40.24950822286971 40.7494994554619
-390.261 256.1118882577642 256.7694317577142 40.24950822286971 40.7494994554619
-391.261 256.7694317577142 257.42697525766414 40.24950822286971 40.7494994554619
-392.261 257.42697525766414 258.0845187575642 40.24950822286971 40.7494994554619
-393.261 258.0845187575642 258.7420622575142 40.24950822286971 40.7494994554619
-394.261 258.7420622575142 259.3996057574642 40.24950822286971 40.7494994554619
-395.261 259.3996057574642 260.05714925741415 40.24950822286971 40.7494994554619
-396.261 260.05714925741415 260.7146927573642 40.24950822286971 40.7494994554619
-397.261 260.7146927573642 261.37223625731417 40.24950822286971 40.7494994554619
-398.261 261.37223625731417 262.0297797572642 40.24950822286971 40.7494994554619
-399.261 262.0297797572642 262.6873232572142 40.24950822286971 40.7494994554619
-400.261 262.6873232572142 263.34486675716414 40.24950822286971 40.7494994554619
-401.261 263.34486675716414 264.0024102570642 40.24950822286971 40.7494994554619
-402.261 264.0024102570642 264.65995375701414 40.24950822286971 40.7494994554619
-403.261 264.65995375701414 265.31749725696415 40.24950822286971 40.7494994554619
-404.261 265.31749725696415 265.97504075691415 40.24950822286971 40.7494994554619
-405.261 265.97504075691415 266.63258425686416 40.24950822286971 40.7494994554619
-406.261 266.63258425686416 267.2901277568142 40.24950822286971 40.7494994554619
-407.261 267.2901277568142 267.9476712567641 40.24950822286971 40.7494994554619
-408.261 267.9476712567641 268.6052147567142 40.24950822286971 40.7494994554619
-409.261 268.6052147567142 269.2627582566642 40.24950822286971 40.7494994554619
-410.261 269.2627582566642 269.9203017566142 40.24950822286971 40.7494994554619
-411.261 269.9203017566142 270.57784525656416 40.24950822286971 40.7494994554619
-412.261 270.57784525656416 271.2353887564642 40.24950822286971 40.7494994554619
-413.261 271.2353887564642 271.89293225641416 40.24950822286971 40.7494994554619
-414.261 271.89293225641416 272.5504757563642 40.24950822286971 40.7494994554619
-415.261 272.5504757563642 273.2080192563142 40.24950822286971 40.7494994554619
-416.261 273.2080192563142 273.87609993388924 40.24950822286971 40.7494994554619
-169.262 111.62038962891701 112.29351295660811 40.7494994554619 41.249490555204694
-170.262 112.29351295660811 112.95601945325811 40.7494994554619 41.249490555204694
-171.262 112.95601945325811 113.61852594995811 40.7494994554619 41.249490555204694
-172.262 113.61852594995811 114.2810324466581 40.7494994554619 41.249490555204694
-173.262 114.2810324466581 114.94353894330811 40.7494994554619 41.249490555204694
-174.262 114.94353894330811 115.60604543995812 40.7494994554619 41.249490555204694
-175.262 115.60604543995812 116.2685519366581 40.7494994554619 41.249490555204694
-176.262 116.2685519366581 116.93105843335809 40.7494994554619 41.249490555204694
-177.262 116.93105843335809 117.59356493000811 40.7494994554619 41.249490555204694
-178.262 117.59356493000811 118.25607142665811 40.7494994554619 41.249490555204694
-179.262 118.25607142665811 118.9185779233581 40.7494994554619 41.249490555204694
-180.262 118.9185779233581 119.5810844200581 40.7494994554619 41.249490555204694
-181.262 119.5810844200581 120.24359091670811 40.7494994554619 41.249490555204694
-182.262 120.24359091670811 120.90609741335811 40.7494994554619 41.249490555204694
-183.262 120.90609741335811 121.56860391005813 40.7494994554619 41.249490555204694
-184.262 121.56860391005813 122.23111040675812 40.7494994554619 41.249490555204694
-185.262 122.23111040675812 122.89361690340809 40.7494994554619 41.249490555204694
-186.262 122.89361690340809 123.55612340005811 40.7494994554619 41.249490555204694
-187.262 123.55612340005811 124.21862989675813 40.7494994554619 41.249490555204694
-188.262 124.21862989675813 124.8811363934581 40.7494994554619 41.249490555204694
-189.262 124.8811363934581 125.54364289010809 40.7494994554619 41.249490555204694
-190.262 125.54364289010809 126.20614938675811 40.7494994554619 41.249490555204694
-191.262 126.20614938675811 126.86865588345812 40.7494994554619 41.249490555204694
-192.262 126.86865588345812 127.53116238015811 40.7494994554619 41.249490555204694
-193.262 127.53116238015811 128.19366887680812 40.7494994554619 41.249490555204694
-194.262 128.19366887680812 128.8561753734581 40.7494994554619 41.249490555204694
-195.262 128.8561753734581 129.5186818701581 40.7494994554619 41.249490555204694
-196.262 129.5186818701581 130.18118836685812 40.7494994554619 41.249490555204694
-197.262 130.18118836685812 130.84369486350812 40.7494994554619 41.249490555204694
-198.262 130.84369486350812 131.50620136015812 40.7494994554619 41.249490555204694
-199.262 131.50620136015812 132.16870785685813 40.7494994554619 41.249490555204694
-200.262 132.16870785685813 132.83121435355812 40.7494994554619 41.249490555204694
-201.262 132.83121435355812 133.49372085020812 40.7494994554619 41.249490555204694
-202.262 133.49372085020812 134.15622734685812 40.7494994554619 41.249490555204694
-203.262 134.15622734685812 134.8187338435581 40.7494994554619 41.249490555204694
-204.262 134.8187338435581 135.48124034025813 40.7494994554619 41.249490555204694
-205.262 135.48124034025813 136.14374683690812 40.7494994554619 41.249490555204694
-206.262 136.14374683690812 136.80625333355812 40.7494994554619 41.249490555204694
-207.262 136.80625333355812 137.46875983025814 40.7494994554619 41.249490555204694
-208.262 137.46875983025814 138.13126632695815 40.7494994554619 41.249490555204694
-209.262 138.13126632695815 138.79377282360812 40.7494994554619 41.249490555204694
-210.262 138.79377282360812 139.45627932025815 40.7494994554619 41.249490555204694
-211.262 139.45627932025815 140.1187858169581 40.7494994554619 41.249490555204694
-212.262 140.1187858169581 140.7812923136081 40.7494994554619 41.249490555204694
-213.262 140.7812923136081 141.44379881025813 40.7494994554619 41.249490555204694
-214.262 141.44379881025813 142.10630530695812 40.7494994554619 41.249490555204694
-215.262 142.10630530695812 142.76881180365808 40.7494994554619 41.249490555204694
-216.262 142.76881180365808 143.4313183003081 40.7494994554619 41.249490555204694
-217.262 143.4313183003081 144.09382479695813 40.7494994554619 41.249490555204694
-218.262 144.09382479695813 144.75633129365812 40.7494994554619 41.249490555204694
-219.262 144.75633129365812 145.4188377903581 40.7494994554619 41.249490555204694
-220.262 145.4188377903581 146.0813442870081 40.7494994554619 41.249490555204694
-221.262 146.0813442870081 146.7438507836581 40.7494994554619 41.249490555204694
-222.262 146.7438507836581 147.40635728035812 40.7494994554619 41.249490555204694
-223.262 147.40635728035812 148.06886377705808 40.7494994554619 41.249490555204694
-224.262 148.06886377705808 148.73137027370808 40.7494994554619 41.249490555204694
-225.262 148.73137027370808 149.39387677035813 40.7494994554619 41.249490555204694
-226.262 149.39387677035813 150.05638326705812 40.7494994554619 41.249490555204694
-227.262 150.05638326705812 150.71888976375809 40.7494994554619 41.249490555204694
-228.262 150.71888976375809 151.38139626040808 40.7494994554619 41.249490555204694
-229.262 151.38139626040808 152.0439027570581 40.7494994554619 41.249490555204694
-230.262 152.0439027570581 152.7064092537581 40.7494994554619 41.249490555204694
-231.262 152.7064092537581 153.3689157504581 40.7494994554619 41.249490555204694
-232.262 153.3689157504581 154.0314222471081 40.7494994554619 41.249490555204694
-233.262 154.0314222471081 154.69392874375808 40.7494994554619 41.249490555204694
-234.262 154.69392874375808 155.3564352404581 40.7494994554619 41.249490555204694
-235.262 155.3564352404581 156.01894173715812 40.7494994554619 41.249490555204694
-236.262 156.01894173715812 156.6814482338081 40.7494994554619 41.249490555204694
-237.262 156.6814482338081 157.3439547304581 40.7494994554619 41.249490555204694
-238.262 157.3439547304581 158.0064612271581 40.7494994554619 41.249490555204694
-239.262 158.0064612271581 158.66896772385812 40.7494994554619 41.249490555204694
-240.262 158.66896772385812 159.34209105159923 40.7494994554619 41.249490555204694
-242.262 159.98336388611696 160.6564872138581 40.7494994554619 41.249490555204694
-243.262 160.6564872138581 161.31899371055812 40.7494994554619 41.249490555204694
-244.262 161.31899371055812 161.98150020720811 40.7494994554619 41.249490555204694
-245.262 161.98150020720811 162.6440067038581 40.7494994554619 41.249490555204694
-246.262 162.6440067038581 163.30651320055813 40.7494994554619 41.249490555204694
-247.262 163.30651320055813 163.96901969725812 40.7494994554619 41.249490555204694
-248.262 163.96901969725812 164.6315261939081 40.7494994554619 41.249490555204694
-249.262 164.6315261939081 165.2940326905581 40.7494994554619 41.249490555204694
-250.262 165.2940326905581 165.9565391872581 40.7494994554619 41.249490555204694
-251.262 165.9565391872581 166.61904568395812 40.7494994554619 41.249490555204694
-252.262 166.61904568395812 167.28155218060812 40.7494994554619 41.249490555204694
-253.262 167.28155218060812 167.9440586772581 40.7494994554619 41.249490555204694
-254.262 167.9440586772581 168.60656517395813 40.7494994554619 41.249490555204694
-255.262 168.60656517395813 169.26907167060813 40.7494994554619 41.249490555204694
-256.262 169.26907167060813 169.93157816725812 40.7494994554619 41.249490555204694
-257.262 169.93157816725812 170.5940846639581 40.7494994554619 41.249490555204694
-258.262 170.5940846639581 171.2565911606581 40.7494994554619 41.249490555204694
-259.262 171.2565911606581 171.91909765730813 40.7494994554619 41.249490555204694
-260.262 171.91909765730813 172.58160415395812 40.7494994554619 41.249490555204694
-261.262 172.58160415395812 173.24411065065811 40.7494994554619 41.249490555204694
-262.262 173.24411065065811 173.90661714735813 40.7494994554619 41.249490555204694
-263.262 173.90661714735813 174.56912364400813 40.7494994554619 41.249490555204694
-264.262 174.56912364400813 175.23163014065813 40.7494994554619 41.249490555204694
-265.262 175.23163014065813 175.89413663735812 40.7494994554619 41.249490555204694
-266.262 175.89413663735812 176.5566431340581 40.7494994554619 41.249490555204694
-267.262 176.5566431340581 177.21914963070813 40.7494994554619 41.249490555204694
-268.262 177.21914963070813 177.88165612735813 40.7494994554619 41.249490555204694
-269.262 177.88165612735813 178.54416262405812 40.7494994554619 41.249490555204694
-270.262 178.54416262405812 179.20666912075808 40.7494994554619 41.249490555204694
-271.262 179.20666912075808 179.8691756174081 40.7494994554619 41.249490555204694
-272.262 179.8691756174081 180.5316821140581 40.7494994554619 41.249490555204694
-273.262 180.5316821140581 181.1941886107581 40.7494994554619 41.249490555204694
-274.262 181.1941886107581 181.8566951074581 40.7494994554619 41.249490555204694
-275.262 181.8566951074581 182.5192016041081 40.7494994554619 41.249490555204694
-276.262 182.5192016041081 183.18170810075807 40.7494994554619 41.249490555204694
-277.262 183.18170810075807 183.84421459745806 40.7494994554619 41.249490555204694
-278.262 183.84421459745806 184.50672109415808 40.7494994554619 41.249490555204694
-279.262 184.50672109415808 185.16922759080808 40.7494994554619 41.249490555204694
-280.262 185.16922759080808 185.83173408745807 40.7494994554619 41.249490555204694
-281.262 185.83173408745807 186.4942405841581 40.7494994554619 41.249490555204694
-282.262 186.4942405841581 187.15674708085808 40.7494994554619 41.249490555204694
-283.262 187.15674708085808 187.81925357750808 40.7494994554619 41.249490555204694
-284.262 187.81925357750808 188.4817600741581 40.7494994554619 41.249490555204694
-285.262 188.4817600741581 189.1442665708581 40.7494994554619 41.249490555204694
-286.262 189.1442665708581 189.80677306755808 40.7494994554619 41.249490555204694
-287.262 189.80677306755808 190.46927956420808 40.7494994554619 41.249490555204694
-288.262 190.46927956420808 191.13178606085808 40.7494994554619 41.249490555204694
-289.262 191.13178606085808 191.7942925575581 40.7494994554619 41.249490555204694
-290.262 191.7942925575581 192.4567990542581 40.7494994554619 41.249490555204694
-291.262 192.4567990542581 193.11930555090808 40.7494994554619 41.249490555204694
-292.262 193.11930555090808 193.7818120475581 40.7494994554619 41.249490555204694
-293.262 193.7818120475581 194.44431854425812 40.7494994554619 41.249490555204694
-294.262 194.44431854425812 195.10682504095809 40.7494994554619 41.249490555204694
-295.262 195.10682504095809 195.76933153760808 40.7494994554619 41.249490555204694
-296.262 195.76933153760808 196.4318380342581 40.7494994554619 41.249490555204694
-297.262 196.4318380342581 197.0943445309581 40.7494994554619 41.249490555204694
-298.262 197.0943445309581 197.7674678586992 40.7494994554619 41.249490555204694
-376.262 248.759234440517 249.4429745992992 40.7494994554619 41.249490555204694
-381.262 252.071766923817 252.7555070825992 40.7494994554619 41.249490555204694
-385.262 254.721792910517 255.40553306929922 40.7494994554619 41.249490555204694
-387.262 256.046805903917 256.7305460626992 40.7494994554619 41.249490555204694
-390.262 258.03432539391696 258.7074487216581 40.7494994554619 41.249490555204694
-391.262 258.7074487216581 259.3699552183581 40.7494994554619 41.249490555204694
-392.262 259.3699552183581 260.03246171500814 40.7494994554619 41.249490555204694
-393.262 260.03246171500814 260.6949682116581 40.7494994554619 41.249490555204694
-394.262 260.6949682116581 261.3574747083581 40.7494994554619 41.249490555204694
-395.262 261.3574747083581 262.01998120505806 40.7494994554619 41.249490555204694
-396.262 262.01998120505806 262.68248770170817 40.7494994554619 41.249490555204694
-397.262 262.68248770170817 263.3449941983581 40.7494994554619 41.249490555204694
-398.262 263.3449941983581 264.00750069505807 40.7494994554619 41.249490555204694
-399.262 264.00750069505807 264.6700071917581 40.7494994554619 41.249490555204694
-400.262 264.6700071917581 265.3325136884081 40.7494994554619 41.249490555204694
-401.262 265.3325136884081 265.9950201850581 40.7494994554619 41.249490555204694
-402.262 265.9950201850581 266.6575266817581 40.7494994554619 41.249490555204694
-403.262 266.6575266817581 267.32003317845806 40.7494994554619 41.249490555204694
-404.262 267.32003317845806 267.9825396751081 40.7494994554619 41.249490555204694
-405.262 267.9825396751081 268.64504617175817 40.7494994554619 41.249490555204694
-406.262 268.64504617175817 269.30755266845813 40.7494994554619 41.249490555204694
-407.262 269.30755266845813 269.9700591651581 40.7494994554619 41.249490555204694
-408.262 269.9700591651581 270.63256566180814 40.7494994554619 41.249490555204694
-409.262 270.63256566180814 271.2950721584581 40.7494994554619 41.249490555204694
-410.262 271.2950721584581 271.9575786551581 40.7494994554619 41.249490555204694
-411.262 271.9575786551581 272.62008515185806 40.7494994554619 41.249490555204694
-412.262 272.62008515185806 273.2825916485081 40.7494994554619 41.249490555204694
-413.262 273.2825916485081 273.9450981451581 40.7494994554619 41.249490555204694
-414.262 273.9450981451581 274.6182214728992 40.7494994554619 41.249490555204694
-167.263 111.1426978377812 111.82099256795551 41.249490555204694 41.74948151766863
-168.263 111.82099256795551 112.48858877710552 41.249490555204694 41.74948151766863
-169.263 112.48858877710552 113.15618498625551 41.249490555204694 41.74948151766863
-170.263 113.15618498625551 113.82378119535551 41.249490555204694 41.74948151766863
-171.263 113.82378119535551 114.49137740445552 41.249490555204694 41.74948151766863
-172.263 114.49137740445552 115.15897361355552 41.249490555204694 41.74948151766863
-173.263 115.15897361355552 115.82656982270552 41.249490555204694 41.74948151766863
-174.263 115.82656982270552 116.49416603185553 41.249490555204694 41.74948151766863
-175.263 116.49416603185553 117.16176224095551 41.249490555204694 41.74948151766863
-176.263 117.16176224095551 117.82935845005551 41.249490555204694 41.74948151766863
-177.263 117.82935845005551 118.49695465920551 41.249490555204694 41.74948151766863
-178.263 118.49695465920551 119.16455086835552 41.249490555204694 41.74948151766863
-179.263 119.16455086835552 119.83214707745552 41.249490555204694 41.74948151766863
-180.263 119.83214707745552 120.49974328655551 41.249490555204694 41.74948151766863
-181.263 120.49974328655551 121.1673394957055 41.249490555204694 41.74948151766863
-182.263 121.1673394957055 121.83493570485551 41.249490555204694 41.74948151766863
-183.263 121.83493570485551 122.50253191395551 41.249490555204694 41.74948151766863
-184.263 122.50253191395551 123.17012812305552 41.249490555204694 41.74948151766863
-185.263 123.17012812305552 123.83772433215552 41.249490555204694 41.74948151766863
-186.263 123.83772433215552 124.50532054130551 41.249490555204694 41.74948151766863
-187.263 124.50532054130551 125.17291675045553 41.249490555204694 41.74948151766863
-188.263 125.17291675045553 125.84051295955553 41.249490555204694 41.74948151766863
-189.263 125.84051295955553 126.50810916865551 41.249490555204694 41.74948151766863
-190.263 126.50810916865551 127.17570537780551 41.249490555204694 41.74948151766863
-191.263 127.17570537780551 127.84330158695552 41.249490555204694 41.74948151766863
-192.263 127.84330158695552 128.5108977960555 41.249490555204694 41.74948151766863
-193.263 128.5108977960555 129.17849400515553 41.249490555204694 41.74948151766863
-194.263 129.17849400515553 129.84609021430552 41.249490555204694 41.74948151766863
-195.263 129.84609021430552 130.5136864234555 41.249490555204694 41.74948151766863
-196.263 130.5136864234555 131.1812826325555 41.249490555204694 41.74948151766863
-197.263 131.1812826325555 131.8488788416555 41.249490555204694 41.74948151766863
-198.263 131.8488788416555 132.51647505080552 41.249490555204694 41.74948151766863
-199.263 132.51647505080552 133.1840712599555 41.249490555204694 41.74948151766863
-200.263 133.1840712599555 133.8516674690555 41.249490555204694 41.74948151766863
-201.263 133.8516674690555 134.5192636781555 41.249490555204694 41.74948151766863
-202.263 134.5192636781555 135.1868598872555 41.249490555204694 41.74948151766863
-203.263 135.1868598872555 135.8544560964055 41.249490555204694 41.74948151766863
-204.263 135.8544560964055 136.52205230555552 41.249490555204694 41.74948151766863
-205.263 136.52205230555552 137.18964851465552 41.249490555204694 41.74948151766863
-206.263 137.18964851465552 137.8572447237555 41.249490555204694 41.74948151766863
-207.263 137.8572447237555 138.52484093290553 41.249490555204694 41.74948151766863
-208.263 138.52484093290553 139.1924371420555 41.249490555204694 41.74948151766863
-209.263 139.1924371420555 139.86003335115552 41.249490555204694 41.74948151766863
-210.263 139.86003335115552 140.52762956025555 41.249490555204694 41.74948151766863
-211.263 140.52762956025555 141.1952257694055 41.249490555204694 41.74948151766863
-212.263 141.1952257694055 141.8628219785555 41.249490555204694 41.74948151766863
-213.263 141.8628219785555 142.5304181876555 41.249490555204694 41.74948151766863
-214.263 142.5304181876555 143.19801439675553 41.249490555204694 41.74948151766863
-215.263 143.19801439675553 143.86561060585552 41.249490555204694 41.74948151766863
-216.263 143.86561060585552 144.5332068150055 41.249490555204694 41.74948151766863
-217.263 144.5332068150055 145.2008030241555 41.249490555204694 41.74948151766863
-218.263 145.2008030241555 145.8683992332555 41.249490555204694 41.74948151766863
-219.263 145.8683992332555 146.5359954423555 41.249490555204694 41.74948151766863
-220.263 146.5359954423555 147.20359165150552 41.249490555204694 41.74948151766863
-221.263 147.20359165150552 147.8711878606555 41.249490555204694 41.74948151766863
-222.263 147.8711878606555 148.5387840697555 41.249490555204694 41.74948151766863
-223.263 148.5387840697555 149.2063802788555 41.249490555204694 41.74948151766863
-224.263 149.2063802788555 149.8739764880055 41.249490555204694 41.74948151766863
-225.263 149.8739764880055 150.54157269715552 41.249490555204694 41.74948151766863
-226.263 150.54157269715552 151.2091689062555 41.249490555204694 41.74948151766863
-227.263 151.2091689062555 151.8767651153555 41.249490555204694 41.74948151766863
-228.263 151.8767651153555 152.54436132450553 41.249490555204694 41.74948151766863
-229.263 152.54436132450553 153.21195753365552 41.249490555204694 41.74948151766863
-230.263 153.21195753365552 153.87955374275552 41.249490555204694 41.74948151766863
-231.263 153.87955374275552 154.54714995185554 41.249490555204694 41.74948151766863
-232.263 154.54714995185554 155.2147461609555 41.249490555204694 41.74948151766863
-233.263 155.2147461609555 155.8823423701055 41.249490555204694 41.74948151766863
-234.263 155.8823423701055 156.54993857925552 41.249490555204694 41.74948151766863
-235.263 156.54993857925552 157.21753478835552 41.249490555204694 41.74948151766863
-236.263 157.21753478835552 157.88513099745552 41.249490555204694 41.74948151766863
-237.263 157.88513099745552 158.5527272066055 41.249490555204694 41.74948151766863
-238.263 158.5527272066055 159.23102193682982 41.249490555204694 41.74948151766863
-240.263 159.8772211037812 160.5555158339555 41.249490555204694 41.74948151766863
-241.263 160.5555158339555 161.22311204310552 41.249490555204694 41.74948151766863
-242.263 161.22311204310552 161.8907082522555 41.249490555204694 41.74948151766863
-243.263 161.8907082522555 162.5583044613555 41.249490555204694 41.74948151766863
-244.263 162.5583044613555 163.2259006704555 41.249490555204694 41.74948151766863
-245.263 163.2259006704555 163.8934968795555 41.249490555204694 41.74948151766863
-246.263 163.8934968795555 164.5610930887055 41.249490555204694 41.74948151766863
-247.263 164.5610930887055 165.2286892978555 41.249490555204694 41.74948151766863
-248.263 165.2286892978555 165.8962855069555 41.249490555204694 41.74948151766863
-249.263 165.8962855069555 166.5638817160555 41.249490555204694 41.74948151766863
-250.263 166.5638817160555 167.23147792520552 41.249490555204694 41.74948151766863
-251.263 167.23147792520552 167.89907413435552 41.249490555204694 41.74948151766863
-252.263 167.89907413435552 168.56667034345554 41.249490555204694 41.74948151766863
-253.263 168.56667034345554 169.2342665525555 41.249490555204694 41.74948151766863
-254.263 169.2342665525555 169.9018627617055 41.249490555204694 41.74948151766863
-255.263 169.9018627617055 170.56945897085552 41.249490555204694 41.74948151766863
-256.263 170.56945897085552 171.23705517995552 41.249490555204694 41.74948151766863
-257.263 171.23705517995552 171.90465138905552 41.249490555204694 41.74948151766863
-258.263 171.90465138905552 172.5722475982055 41.249490555204694 41.74948151766863
-259.263 172.5722475982055 173.2398438073555 41.249490555204694 41.74948151766863
-260.263 173.2398438073555 173.90744001645552 41.249490555204694 41.74948151766863
-261.263 173.90744001645552 174.57503622555552 41.249490555204694 41.74948151766863
-262.263 174.57503622555552 175.24263243465552 41.249490555204694 41.74948151766863
-263.263 175.24263243465552 175.9102286438055 41.249490555204694 41.74948151766863
-264.263 175.9102286438055 176.5778248529555 41.249490555204694 41.74948151766863
-265.263 176.5778248529555 177.2454210620555 41.249490555204694 41.74948151766863
-266.263 177.2454210620555 177.91301727115552 41.249490555204694 41.74948151766863
-267.263 177.91301727115552 178.58061348030552 41.249490555204694 41.74948151766863
-268.263 178.58061348030552 179.2482096894555 41.249490555204694 41.74948151766863
-269.263 179.2482096894555 179.9158058985555 41.249490555204694 41.74948151766863
-270.263 179.9158058985555 180.58340210765547 41.249490555204694 41.74948151766863
-271.263 180.58340210765547 181.25099831680546 41.249490555204694 41.74948151766863
-272.263 181.25099831680546 181.91859452595548 41.249490555204694 41.74948151766863
-273.263 181.91859452595548 182.58619073505548 41.249490555204694 41.74948151766863
-274.263 182.58619073505548 183.25378694415548 41.249490555204694 41.74948151766863
-275.263 183.25378694415548 183.92138315325548 41.249490555204694 41.74948151766863
-276.263 183.92138315325548 184.5889793624055 41.249490555204694 41.74948151766863
-277.263 184.5889793624055 185.25657557155552 41.249490555204694 41.74948151766863
-278.263 185.25657557155552 185.92417178065548 41.249490555204694 41.74948151766863
-279.263 185.92417178065548 186.59176798975548 41.249490555204694 41.74948151766863
-280.263 186.59176798975548 187.25936419890547 41.249490555204694 41.74948151766863
-281.263 187.25936419890547 187.9269604080555 41.249490555204694 41.74948151766863
-282.263 187.9269604080555 188.59455661715552 41.249490555204694 41.74948151766863
-283.263 188.59455661715552 189.2621528262555 41.249490555204694 41.74948151766863
-284.263 189.2621528262555 189.92974903540548 41.249490555204694 41.74948151766863
-285.263 189.92974903540548 190.5973452445555 41.249490555204694 41.74948151766863
-286.263 190.5973452445555 191.26494145365552 41.249490555204694 41.74948151766863
-287.263 191.26494145365552 191.9325376627555 41.249490555204694 41.74948151766863
-288.263 191.9325376627555 192.60013387190548 41.249490555204694 41.74948151766863
-289.263 192.60013387190548 193.26773008105548 41.249490555204694 41.74948151766863
-290.263 193.26773008105548 193.9353262901555 41.249490555204694 41.74948151766863
-291.263 193.9353262901555 194.60292249925547 41.249490555204694 41.74948151766863
-292.263 194.60292249925547 195.2705187083555 41.249490555204694 41.74948151766863
-293.263 195.2705187083555 195.9381149175055 41.249490555204694 41.74948151766863
-294.263 195.9381149175055 196.60571112665548 41.249490555204694 41.74948151766863
-295.263 196.60571112665548 197.27330733575548 41.249490555204694 41.74948151766863
-296.263 197.27330733575548 197.9516020659298 41.249490555204694 41.74948151766863
-388.263 258.6814600540812 259.35975478425553 41.249490555204694 41.74948151766863
-389.263 259.35975478425553 260.0273509933555 41.249490555204694 41.74948151766863
-390.263 260.0273509933555 260.6949472024555 41.249490555204694 41.74948151766863
-391.263 260.6949472024555 261.36254341160554 41.249490555204694 41.74948151766863
-392.263 261.36254341160554 262.0301396207555 41.249490555204694 41.74948151766863
-393.263 262.0301396207555 262.6977358298555 41.249490555204694 41.74948151766863
-394.263 262.6977358298555 263.3653320389555 41.249490555204694 41.74948151766863
-395.263 263.3653320389555 264.03292824810546 41.249490555204694 41.74948151766863
-396.263 264.03292824810546 264.7005244572555 41.249490555204694 41.74948151766863
-397.263 264.7005244572555 265.36812066635554 41.249490555204694 41.74948151766863
-398.263 265.36812066635554 266.0357168754555 41.249490555204694 41.74948151766863
-399.263 266.0357168754555 266.70331308455553 41.249490555204694 41.74948151766863
-400.263 266.70331308455553 267.3709092937055 41.249490555204694 41.74948151766863
-401.263 267.3709092937055 268.0385055028555 41.249490555204694 41.74948151766863
-402.263 268.0385055028555 268.7061017119555 41.249490555204694 41.74948151766863
-403.263 268.7061017119555 269.3736979210555 41.249490555204694 41.74948151766863
-404.263 269.3736979210555 270.04129413020553 41.249490555204694 41.74948151766863
-405.263 270.04129413020553 270.7088903393555 41.249490555204694 41.74948151766863
-406.263 270.7088903393555 271.3764865484555 41.249490555204694 41.74948151766863
-407.263 271.3764865484555 272.0440827575555 41.249490555204694 41.74948151766863
-408.263 272.0440827575555 272.71167896670545 41.249490555204694 41.74948151766863
-409.263 272.71167896670545 273.37927517585547 41.249490555204694 41.74948151766863
-410.263 273.37927517585547 274.0468713849555 41.249490555204694 41.74948151766863
-411.263 274.0468713849555 274.7251661151298 41.249490555204694 41.74948151766863
-166.264 111.33891836286298 112.0225170353605 41.74948151766863 42.24947233824402
-167.264 112.0225170353605 112.6953334001605 41.74948151766863 42.24947233824402
-168.264 112.6953334001605 113.36814976496049 41.74948151766863 42.24947233824402
-169.264 113.36814976496049 114.04096612976049 41.74948151766863 42.24947233824402
-170.264 114.04096612976049 114.71378249456049 41.74948151766863 42.24947233824402
-171.264 114.71378249456049 115.38659885936048 41.74948151766863 42.24947233824402
-172.264 115.38659885936048 116.05941522421048 41.74948151766863 42.24947233824402
-173.264 116.05941522421048 116.73223158906048 41.74948151766863 42.24947233824402
-174.264 116.73223158906048 117.40504795386047 41.74948151766863 42.24947233824402
-175.264 117.40504795386047 118.07786431866049 41.74948151766863 42.24947233824402
-176.264 118.07786431866049 118.75068068346049 41.74948151766863 42.24947233824402
-177.264 118.75068068346049 119.42349704826049 41.74948151766863 42.24947233824402
-178.264 119.42349704826049 120.0963134130605 41.74948151766863 42.24947233824402
-179.264 120.0963134130605 120.7691297778605 41.74948151766863 42.24947233824402
-180.264 120.7691297778605 121.4419461426605 41.74948151766863 42.24947233824402
-181.264 121.4419461426605 122.1147625074605 41.74948151766863 42.24947233824402
-182.264 122.1147625074605 122.7875788722605 41.74948151766863 42.24947233824402
-183.264 122.7875788722605 123.46039523706048 41.74948151766863 42.24947233824402
-184.264 123.46039523706048 124.13321160186048 41.74948151766863 42.24947233824402
-185.264 124.13321160186048 124.8060279666605 41.74948151766863 42.24947233824402
-186.264 124.8060279666605 125.4788443314605 41.74948151766863 42.24947233824402
-187.264 125.4788443314605 126.15166069626049 41.74948151766863 42.24947233824402
-188.264 126.15166069626049 126.82447706106049 41.74948151766863 42.24947233824402
-189.264 126.82447706106049 127.49729342586049 41.74948151766863 42.24947233824402
-190.264 127.49729342586049 128.1701097906605 41.74948151766863 42.24947233824402
-191.264 128.1701097906605 128.84292615546048 41.74948151766863 42.24947233824402
-192.264 128.84292615546048 129.51574252026052 41.74948151766863 42.24947233824402
-193.264 129.51574252026052 130.1885588850605 41.74948151766863 42.24947233824402
-194.264 130.1885588850605 130.8613752498605 41.74948151766863 42.24947233824402
-195.264 130.8613752498605 131.53419161466053 41.74948151766863 42.24947233824402
-196.264 131.53419161466053 132.20700797946049 41.74948151766863 42.24947233824402
-197.264 132.20700797946049 132.8798243442605 41.74948151766863 42.24947233824402
-198.264 132.8798243442605 133.55264070906048 41.74948151766863 42.24947233824402
-199.264 133.55264070906048 134.22545707386047 41.74948151766863 42.24947233824402
-200.264 134.22545707386047 134.89827343866048 41.74948151766863 42.24947233824402
-201.264 134.89827343866048 135.5710898034605 41.74948151766863 42.24947233824402
-202.264 135.5710898034605 136.24390616826048 41.74948151766863 42.24947233824402
-203.264 136.24390616826048 136.9167225331105 41.74948151766863 42.24947233824402
-204.264 136.9167225331105 137.5895388979605 41.74948151766863 42.24947233824402
-205.264 137.5895388979605 138.26235526276048 41.74948151766863 42.24947233824402
-206.264 138.26235526276048 138.9351716275605 41.74948151766863 42.24947233824402
-207.264 138.9351716275605 139.6079879923605 41.74948151766863 42.24947233824402
-208.264 139.6079879923605 140.2808043571605 41.74948151766863 42.24947233824402
-209.264 140.2808043571605 140.95362072196048 41.74948151766863 42.24947233824402
-210.264 140.95362072196048 141.62643708676052 41.74948151766863 42.24947233824402
-211.264 141.62643708676052 142.2992534515605 41.74948151766863 42.24947233824402
-212.264 142.2992534515605 142.9720698163605 41.74948151766863 42.24947233824402
-213.264 142.9720698163605 143.6448861811605 41.74948151766863 42.24947233824402
-214.264 143.6448861811605 144.3177025459605 41.74948151766863 42.24947233824402
-215.264 144.3177025459605 144.9905189107605 41.74948151766863 42.24947233824402
-216.264 144.9905189107605 145.66333527556048 41.74948151766863 42.24947233824402
-217.264 145.66333527556048 146.33615164036047 41.74948151766863 42.24947233824402
-218.264 146.33615164036047 147.00896800516048 41.74948151766863 42.24947233824402
-219.264 147.00896800516048 147.6817843699605 41.74948151766863 42.24947233824402
-220.264 147.6817843699605 148.35460073476048 41.74948151766863 42.24947233824402
-221.264 148.35460073476048 149.02741709956047 41.74948151766863 42.24947233824402
-222.264 149.02741709956047 149.7002334643605 41.74948151766863 42.24947233824402
-223.264 149.7002334643605 150.3730498291605 41.74948151766863 42.24947233824402
-224.264 150.3730498291605 151.0458661939605 41.74948151766863 42.24947233824402
-225.264 151.0458661939605 151.7186825587605 41.74948151766863 42.24947233824402
-226.264 151.7186825587605 152.3914989235605 41.74948151766863 42.24947233824402
-227.264 152.3914989235605 153.0643152883605 41.74948151766863 42.24947233824402
-228.264 153.0643152883605 153.73713165316047 41.74948151766863 42.24947233824402
-229.264 153.73713165316047 154.4099480179605 41.74948151766863 42.24947233824402
-230.264 154.4099480179605 155.0827643827605 41.74948151766863 42.24947233824402
-231.264 155.0827643827605 155.7555807475605 41.74948151766863 42.24947233824402
-232.264 155.7555807475605 156.42839711236047 41.74948151766863 42.24947233824402
-233.264 156.42839711236047 157.1012134771605 41.74948151766863 42.24947233824402
-234.264 157.1012134771605 157.7740298419605 41.74948151766863 42.24947233824402
-235.264 157.7740298419605 158.44684620681048 41.74948151766863 42.24947233824402
-236.264 158.44684620681048 159.13044487935798 41.74948151766863 42.24947233824402
-238.264 159.781696628763 160.46529530126048 41.74948151766863 42.24947233824402
-239.264 160.46529530126048 161.13811166606047 41.74948151766863 42.24947233824402
-240.264 161.13811166606047 161.81092803086045 41.74948151766863 42.24947233824402
-241.264 161.81092803086045 162.4837443956605 41.74948151766863 42.24947233824402
-242.264 162.4837443956605 163.15656076046048 41.74948151766863 42.24947233824402
-243.264 163.15656076046048 163.8293771252605 41.74948151766863 42.24947233824402
-244.264 163.8293771252605 164.5021934900605 41.74948151766863 42.24947233824402
-245.264 164.5021934900605 165.1750098548605 41.74948151766863 42.24947233824402
-246.264 165.1750098548605 165.84782621966048 41.74948151766863 42.24947233824402
-247.264 165.84782621966048 166.5206425844605 41.74948151766863 42.24947233824402
-248.264 166.5206425844605 167.1934589492605 41.74948151766863 42.24947233824402
-249.264 167.1934589492605 167.8662753140605 41.74948151766863 42.24947233824402
-250.264 167.8662753140605 168.53909167886047 41.74948151766863 42.24947233824402
-251.264 168.53909167886047 169.21190804366051 41.74948151766863 42.24947233824402
-252.264 169.21190804366051 169.8847244084605 41.74948151766863 42.24947233824402
-253.264 169.8847244084605 170.55754077326048 41.74948151766863 42.24947233824402
-254.264 170.55754077326048 171.2303571380605 41.74948151766863 42.24947233824402
-255.264 171.2303571380605 171.90317350286048 41.74948151766863 42.24947233824402
-256.264 171.90317350286048 172.5759898676605 41.74948151766863 42.24947233824402
-257.264 172.5759898676605 173.24880623246048 41.74948151766863 42.24947233824402
-258.264 173.24880623246048 173.92162259726047 41.74948151766863 42.24947233824402
-259.264 173.92162259726047 174.5944389620605 41.74948151766863 42.24947233824402
-260.264 174.5944389620605 175.2672553268605 41.74948151766863 42.24947233824402
-261.264 175.2672553268605 175.94007169166048 41.74948151766863 42.24947233824402
-262.264 175.94007169166048 176.61288805646052 41.74948151766863 42.24947233824402
-263.264 176.61288805646052 177.2857044212605 41.74948151766863 42.24947233824402
-264.264 177.2857044212605 177.9585207860605 41.74948151766863 42.24947233824402
-265.264 177.9585207860605 178.6313371508605 41.74948151766863 42.24947233824402
-266.264 178.6313371508605 179.30415351571048 41.74948151766863 42.24947233824402
-267.264 179.30415351571048 179.9769698805605 41.74948151766863 42.24947233824402
-268.264 179.9769698805605 180.64978624536047 41.74948151766863 42.24947233824402
-269.264 180.64978624536047 181.3226026101605 41.74948151766863 42.24947233824402
-270.264 181.3226026101605 181.99541897496047 41.74948151766863 42.24947233824402
-271.264 181.99541897496047 182.66823533976049 41.74948151766863 42.24947233824402
-272.264 182.66823533976049 183.34105170456047 41.74948151766863 42.24947233824402
-273.264 183.34105170456047 184.01386806936046 41.74948151766863 42.24947233824402
-274.264 184.01386806936046 184.6866844341605 41.74948151766863 42.24947233824402
-275.264 184.6866844341605 185.35950079896048 41.74948151766863 42.24947233824402
-276.264 185.35950079896048 186.03231716376047 41.74948151766863 42.24947233824402
-277.264 186.03231716376047 186.7051335285605 41.74948151766863 42.24947233824402
-278.264 186.7051335285605 187.3779498933605 41.74948151766863 42.24947233824402
-279.264 187.3779498933605 188.05076625816048 41.74948151766863 42.24947233824402
-280.264 188.05076625816048 188.7235826229605 41.74948151766863 42.24947233824402
-281.264 188.7235826229605 189.39639898776048 41.74948151766863 42.24947233824402
-282.264 189.39639898776048 190.0692153525605 41.74948151766863 42.24947233824402
-283.264 190.0692153525605 190.74203171736048 41.74948151766863 42.24947233824402
-284.264 190.74203171736048 191.41484808216046 41.74948151766863 42.24947233824402
-285.264 191.41484808216046 192.08766444696047 41.74948151766863 42.24947233824402
-286.264 192.08766444696047 192.7604808117605 41.74948151766863 42.24947233824402
-287.264 192.7604808117605 193.43329717656047 41.74948151766863 42.24947233824402
-288.264 193.43329717656047 194.1061135413605 41.74948151766863 42.24947233824402
-289.264 194.1061135413605 194.7789299061605 41.74948151766863 42.24947233824402
-290.264 194.7789299061605 195.45174627096048 41.74948151766863 42.24947233824402
-291.264 195.45174627096048 196.1245626357605 41.74948151766863 42.24947233824402
-292.264 196.1245626357605 196.79737900056045 41.74948151766863 42.24947233824402
-293.264 196.79737900056045 197.48097767305796 41.74948151766863 42.24947233824402
-374.264 251.28472224196298 251.9683209144605 41.74948151766863 42.24947233824402
-375.264 251.9683209144605 252.6411372792605 41.74948151766863 42.24947233824402
-376.264 252.6411372792605 253.3139536440605 41.74948151766863 42.24947233824402
-377.264 253.3139536440605 253.9867700088605 41.74948151766863 42.24947233824402
-378.264 253.9867700088605 254.65958637366052 41.74948151766863 42.24947233824402
-379.264 254.65958637366052 255.33240273846047 41.74948151766863 42.24947233824402
-380.264 255.33240273846047 256.0052191032605 41.74948151766863 42.24947233824402
-381.264 256.0052191032605 256.6780354680605 41.74948151766863 42.24947233824402
-382.264 256.6780354680605 257.3508518328605 41.74948151766863 42.24947233824402
-383.264 257.3508518328605 258.0236681976604 41.74948151766863 42.24947233824402
-384.264 258.0236681976604 258.69648456246045 41.74948151766863 42.24947233824402
-385.264 258.69648456246045 259.3693009272605 41.74948151766863 42.24947233824402
-386.264 259.3693009272605 260.0421172920605 41.74948151766863 42.24947233824402
-387.264 260.0421172920605 260.725715964558 41.74948151766863 42.24947233824402
-394.264 264.741049538063 265.42464821056046 41.74948151766863 42.24947233824402
-395.264 265.42464821056046 266.0974645753605 41.74948151766863 42.24947233824402
-396.264 266.0974645753605 266.77028094016055 41.74948151766863 42.24947233824402
-397.264 266.77028094016055 267.453879612658 41.74948151766863 42.24947233824402
-400.264 268.77794772686303 269.4615463993605 41.74948151766863 42.24947233824402
-401.264 269.4615463993605 270.13436276416047 41.74948151766863 42.24947233824402
-402.264 270.13436276416047 270.80717912896046 41.74948151766863 42.24947233824402
-403.264 270.80717912896046 271.4799954937605 41.74948151766863 42.24947233824402
-404.264 271.4799954937605 272.1528118585605 41.74948151766863 42.24947233824402
-405.264 272.1528118585605 272.82562822336047 41.74948151766863 42.24947233824402
-406.264 272.82562822336047 273.4984445881605 41.74948151766863 42.24947233824402
-407.264 273.4984445881605 274.17126095296044 41.74948151766863 42.24947233824402
-408.264 274.17126095296044 274.85485962545795 41.74948151766863 42.24947233824402
-165.265 111.54679296897916 112.23583207508334 42.24947233824402 42.749463012131386
-166.265 112.23583207508334 112.91400292753335 42.24947233824402 42.749463012131386
-167.265 112.91400292753335 113.59217377998334 42.24947233824402 42.749463012131386
-168.265 113.59217377998334 114.27034463243334 42.24947233824402 42.749463012131386
-169.265 114.27034463243334 114.94851548488333 42.24947233824402 42.749463012131386
-170.265 114.94851548488333 115.62668633733334 42.24947233824402 42.749463012131386
-171.265 115.62668633733334 116.30485718978335 42.24947233824402 42.749463012131386
-172.265 116.30485718978335 116.98302804228334 42.24947233824402 42.749463012131386
-173.265 116.98302804228334 117.66119889473333 42.24947233824402 42.749463012131386
-174.265 117.66119889473333 118.33936974718334 42.24947233824402 42.749463012131386
-175.265 118.33936974718334 119.01754059963334 42.24947233824402 42.749463012131386
-176.265 119.01754059963334 119.69571145208334 42.24947233824402 42.749463012131386
-177.265 119.69571145208334 120.37388230453334 42.24947233824402 42.749463012131386
-178.265 120.37388230453334 121.05205315698333 42.24947233824402 42.749463012131386
-179.265 121.05205315698333 121.73022400943334 42.24947233824402 42.749463012131386
-180.265 121.73022400943334 122.40839486188334 42.24947233824402 42.749463012131386
-181.265 122.40839486188334 123.08656571433335 42.24947233824402 42.749463012131386
-182.265 123.08656571433335 123.76473656678334 42.24947233824402 42.749463012131386
-183.265 123.76473656678334 124.44290741928333 42.24947233824402 42.749463012131386
-184.265 124.44290741928333 125.12107827173334 42.24947233824402 42.749463012131386
-185.265 125.12107827173334 125.79924912418335 42.24947233824402 42.749463012131386
-186.265 125.79924912418335 126.47741997663334 42.24947233824402 42.749463012131386
-187.265 126.47741997663334 127.15559082908334 42.24947233824402 42.749463012131386
-188.265 127.15559082908334 127.83376168153335 42.24947233824402 42.749463012131386
-189.265 127.83376168153335 128.51193253398333 42.24947233824402 42.749463012131386
-190.265 128.51193253398333 129.19010338643335 42.24947233824402 42.749463012131386
-191.265 129.19010338643335 129.86827423888332 42.24947233824402 42.749463012131386
-192.265 129.86827423888332 130.54644509133334 42.24947233824402 42.749463012131386
-193.265 130.54644509133334 131.22461594378336 42.24947233824402 42.749463012131386
-194.265 131.22461594378336 131.90278679628335 42.24947233824402 42.749463012131386
-195.265 131.90278679628335 132.58095764873332 42.24947233824402 42.749463012131386
-196.265 132.58095764873332 133.25912850118334 42.24947233824402 42.749463012131386
-197.265 133.25912850118334 133.93729935363336 42.24947233824402 42.749463012131386
-198.265 133.93729935363336 134.61547020608333 42.24947233824402 42.749463012131386
-199.265 134.61547020608333 135.29364105853335 42.24947233824402 42.749463012131386
-200.265 135.29364105853335 135.97181191098332 42.24947233824402 42.749463012131386
-201.265 135.97181191098332 136.64998276343334 42.24947233824402 42.749463012131386
-202.265 136.64998276343334 137.32815361588337 42.24947233824402 42.749463012131386
-203.265 137.32815361588337 138.00632446833336 42.24947233824402 42.749463012131386
-204.265 138.00632446833336 138.68449532078336 42.24947233824402 42.749463012131386
-205.265 138.68449532078336 139.36266617328334 42.24947233824402 42.749463012131386
-206.265 139.36266617328334 140.04083702573334 42.24947233824402 42.749463012131386
-207.265 140.04083702573334 140.71900787818333 42.24947233824402 42.749463012131386
-208.265 140.71900787818333 141.39717873063336 42.24947233824402 42.749463012131386
-209.265 141.39717873063336 142.07534958308332 42.24947233824402 42.749463012131386
-210.265 142.07534958308332 142.75352043553335 42.24947233824402 42.749463012131386
-211.265 142.75352043553335 143.43169128798334 42.24947233824402 42.749463012131386
-212.265 143.43169128798334 144.10986214043334 42.24947233824402 42.749463012131386
-213.265 144.10986214043334 144.78803299288336 42.24947233824402 42.749463012131386
-214.265 144.78803299288336 145.46620384533333 42.24947233824402 42.749463012131386
-215.265 145.46620384533333 146.14437469778335 42.24947233824402 42.749463012131386
-216.265 146.14437469778335 146.82254555028334 42.24947233824402 42.749463012131386
-217.265 146.82254555028334 147.50071640273336 42.24947233824402 42.749463012131386
-218.265 147.50071640273336 148.17888725518335 42.24947233824402 42.749463012131386
-219.265 148.17888725518335 148.85705810763335 42.24947233824402 42.749463012131386
-220.265 148.85705810763335 149.53522896008332 42.24947233824402 42.749463012131386
-221.265 149.53522896008332 150.21339981253334 42.24947233824402 42.749463012131386
-222.265 150.21339981253334 150.89157066498336 42.24947233824402 42.749463012131386
-223.265 150.89157066498336 151.56974151743333 42.24947233824402 42.749463012131386
-224.265 151.56974151743333 152.24791236988335 42.24947233824402 42.749463012131386
-225.265 152.24791236988335 152.92608322233332 42.24947233824402 42.749463012131386
-226.265 152.92608322233332 153.60425407478334 42.24947233824402 42.749463012131386
-227.265 153.60425407478334 154.28242492728333 42.24947233824402 42.749463012131386
-228.265 154.28242492728333 154.96059577973335 42.24947233824402 42.749463012131386
-229.265 154.96059577973335 155.63876663218332 42.24947233824402 42.749463012131386
-230.265 155.63876663218332 156.31693748463334 42.24947233824402 42.749463012131386
-231.265 156.31693748463334 156.99510833708337 42.24947233824402 42.749463012131386
-232.265 156.99510833708337 157.6732791895334 42.24947233824402 42.749463012131386
-233.265 157.6732791895334 158.35145004198336 42.24947233824402 42.749463012131386
-234.265 158.35145004198336 159.02962089443332 42.24947233824402 42.749463012131386
-235.265 159.02962089443332 159.70779174688334 42.24947233824402 42.749463012131386
-236.265 159.70779174688334 160.38596259933337 42.24947233824402 42.749463012131386
-237.265 160.38596259933337 161.06413345178333 42.24947233824402 42.749463012131386
-238.265 161.06413345178333 161.74230430428332 42.24947233824402 42.749463012131386
-239.265 161.74230430428332 162.42047515673335 42.24947233824402 42.749463012131386
-240.265 162.42047515673335 163.09864600918334 42.24947233824402 42.749463012131386
-241.265 163.09864600918334 163.77681686163336 42.24947233824402 42.749463012131386
-242.265 163.77681686163336 164.45498771408336 42.24947233824402 42.749463012131386
-243.265 164.45498771408336 165.13315856653333 42.24947233824402 42.749463012131386
-244.265 165.13315856653333 165.81132941898335 42.24947233824402 42.749463012131386
-245.265 165.81132941898335 166.48950027143331 42.24947233824402 42.749463012131386
-246.265 166.48950027143331 167.16767112388334 42.24947233824402 42.749463012131386
-247.265 167.16767112388334 167.84584197633336 42.24947233824402 42.749463012131386
-248.265 167.84584197633336 168.52401282878336 42.24947233824402 42.749463012131386
-249.265 168.52401282878336 169.20218368128332 42.24947233824402 42.749463012131386
-250.265 169.20218368128332 169.88035453373334 42.24947233824402 42.749463012131386
-251.265 169.88035453373334 170.55852538618336 42.24947233824402 42.749463012131386
-252.265 170.55852538618336 171.23669623863333 42.24947233824402 42.749463012131386
-253.265 171.23669623863333 171.91486709108335 42.24947233824402 42.749463012131386
-254.265 171.91486709108335 172.59303794353332 42.24947233824402 42.749463012131386
-255.265 172.59303794353332 173.27120879598334 42.24947233824402 42.749463012131386
-256.265 173.27120879598334 173.94937964843336 42.24947233824402 42.749463012131386
-257.265 173.94937964843336 174.62755050088333 42.24947233824402 42.749463012131386
-258.265 174.62755050088333 175.30572135333335 42.24947233824402 42.749463012131386
-259.265 175.30572135333335 175.98389220578332 42.24947233824402 42.749463012131386
-260.265 175.98389220578332 176.66206305828337 42.24947233824402 42.749463012131386
-261.265 176.66206305828337 177.3402339107334 42.24947233824402 42.749463012131386
-262.265 177.3402339107334 178.01840476318336 42.24947233824402 42.749463012131386
-263.265 178.01840476318336 178.69657561563332 42.24947233824402 42.749463012131386
-264.265 178.69657561563332 179.37474646808334 42.24947233824402 42.749463012131386
-265.265 179.37474646808334 180.05291732053334 42.24947233824402 42.749463012131386
-266.265 180.05291732053334 180.73108817298333 42.24947233824402 42.749463012131386
-267.265 180.73108817298333 181.40925902543333 42.24947233824402 42.749463012131386
-268.265 181.40925902543333 182.08742987788332 42.24947233824402 42.749463012131386
-269.265 182.08742987788332 182.7656007303333 42.24947233824402 42.749463012131386
-270.265 182.7656007303333 183.4437715827833 42.24947233824402 42.749463012131386
-271.265 183.4437715827833 184.12194243528333 42.24947233824402 42.749463012131386
-272.265 184.12194243528333 184.80011328773332 42.24947233824402 42.749463012131386
-273.265 184.80011328773332 185.47828414018332 42.24947233824402 42.749463012131386
-274.265 185.47828414018332 186.15645499263331 42.24947233824402 42.749463012131386
-275.265 186.15645499263331 186.83462584508334 42.24947233824402 42.749463012131386
-276.265 186.83462584508334 187.51279669753336 42.24947233824402 42.749463012131386
-277.265 187.51279669753336 188.19096754998333 42.24947233824402 42.749463012131386
-278.265 188.19096754998333 188.8691384024333 42.24947233824402 42.749463012131386
-279.265 188.8691384024333 189.54730925488332 42.24947233824402 42.749463012131386
-280.265 189.54730925488332 190.2254801073833 42.24947233824402 42.749463012131386
-281.265 190.2254801073833 190.90365095983333 42.24947233824402 42.749463012131386
-282.265 190.90365095983333 191.58182181228332 42.24947233824402 42.749463012131386
-283.265 191.58182181228332 192.25999266473332 42.24947233824402 42.749463012131386
-284.265 192.25999266473332 192.93816351718334 42.24947233824402 42.749463012131386
-285.265 192.93816351718334 193.61633436963334 42.24947233824402 42.749463012131386
-286.265 193.61633436963334 194.29450522208333 42.24947233824402 42.749463012131386
-287.265 194.29450522208333 194.97267607453333 42.24947233824402 42.749463012131386
-288.265 194.97267607453333 195.65084692698332 42.24947233824402 42.749463012131386
-289.265 195.65084692698332 196.32901777943334 42.24947233824402 42.749463012131386
-290.265 196.32901777943334 197.00718863188334 42.24947233824402 42.749463012131386
-291.265 197.00718863188334 197.69622773798753 42.24947233824402 42.749463012131386
-371.265 251.24998857467915 251.93902768073332 42.24947233824402 42.749463012131386
-372.265 251.93902768073332 252.6171985331833 42.24947233824402 42.749463012131386
-373.265 252.6171985331833 253.2953693856333 42.24947233824402 42.749463012131386
-374.265 253.2953693856333 253.97354023808333 42.24947233824402 42.749463012131386
-375.265 253.97354023808333 254.65171109053333 42.24947233824402 42.749463012131386
-376.265 254.65171109053333 255.32988194298332 42.24947233824402 42.749463012131386
-377.265 255.32988194298332 256.00805279543334 42.24947233824402 42.749463012131386
-378.265 256.00805279543334 256.68622364788337 42.24947233824402 42.749463012131386
-379.265 256.68622364788337 257.36439450038336 42.24947233824402 42.749463012131386
-380.265 257.36439450038336 258.0425653528333 42.24947233824402 42.749463012131386
-381.265 258.0425653528333 258.7207362052833 42.24947233824402 42.749463012131386
-382.265 258.7207362052833 259.3989070577333 42.24947233824402 42.749463012131386
-383.265 259.3989070577333 260.07707791018333 42.24947233824402 42.749463012131386
-384.265 260.07707791018333 260.7552487626333 42.24947233824402 42.749463012131386
-385.265 260.7552487626333 261.4442878686875 42.24947233824402 42.749463012131386
-392.265 265.49157647617915 266.1806155822833 42.24947233824402 42.749463012131386
-393.265 266.1806155822833 266.85878643473336 42.24947233824402 42.749463012131386
-394.265 266.85878643473336 267.54782554078747 42.24947233824402 42.749463012131386
-397.265 268.8824307384791 269.57146984453334 42.24947233824402 42.749463012131386
-398.265 269.57146984453334 270.2496406969833 42.24947233824402 42.749463012131386
-399.265 270.2496406969833 270.9278115494833 42.24947233824402 42.749463012131386
-400.265 270.9278115494833 271.6059824019333 42.24947233824402 42.749463012131386
-401.265 271.6059824019333 272.28415325438334 42.24947233824402 42.749463012131386
-402.265 272.28415325438334 272.9623241068333 42.24947233824402 42.749463012131386
-403.265 272.9623241068333 273.64049495928333 42.24947233824402 42.749463012131386
-404.265 273.64049495928333 274.3295340653875 42.24947233824402 42.749463012131386
-162.266 110.39925464740229 111.09387480219928 42.749463012131386 43.249453534331224
-163.266 111.09387480219928 111.77753853274928 42.749463012131386 43.249453534331224
-164.266 111.77753853274928 112.46120226329927 42.749463012131386 43.249453534331224
-165.266 112.46120226329927 113.14486599384927 42.749463012131386 43.249453534331224
-166.266 113.14486599384927 113.82852972439926 42.749463012131386 43.249453534331224
-167.266 113.82852972439926 114.51219345494927 42.749463012131386 43.249453534331224
-168.266 114.51219345494927 115.19585718549926 42.749463012131386 43.249453534331224
-169.266 115.19585718549926 115.87952091604927 42.749463012131386 43.249453534331224
-170.266 115.87952091604927 116.56318464659927 42.749463012131386 43.249453534331224
-171.266 116.56318464659927 117.24684837714926 42.749463012131386 43.249453534331224
-172.266 117.24684837714926 117.93051210769929 42.749463012131386 43.249453534331224
-173.266 117.93051210769929 118.61417583824928 42.749463012131386 43.249453534331224
-174.266 118.61417583824928 119.29783956879928 42.749463012131386 43.249453534331224
-175.266 119.29783956879928 119.98150329934927 42.749463012131386 43.249453534331224
-176.266 119.98150329934927 120.6651670298993 42.749463012131386 43.249453534331224
-177.266 120.6651670298993 121.34883076044929 42.749463012131386 43.249453534331224
-178.266 121.34883076044929 122.03249449099928 42.749463012131386 43.249453534331224
-179.266 122.03249449099928 122.71615822154928 42.749463012131386 43.249453534331224
-180.266 122.71615822154928 123.39982195209927 42.749463012131386 43.249453534331224
-181.266 123.39982195209927 124.08348568264927 42.749463012131386 43.249453534331224
-182.266 124.08348568264927 124.76714941319928 42.749463012131386 43.249453534331224
-183.266 124.76714941319928 125.45081314374929 42.749463012131386 43.249453534331224
-184.266 125.45081314374929 126.13447687429928 42.749463012131386 43.249453534331224
-185.266 126.13447687429928 126.81814060484926 42.749463012131386 43.249453534331224
-186.266 126.81814060484926 127.50180433539927 42.749463012131386 43.249453534331224
-187.266 127.50180433539927 128.18546806594924 42.749463012131386 43.249453534331224
-188.266 128.18546806594924 128.8691317964993 42.749463012131386 43.249453534331224
-189.266 128.8691317964993 129.55279552704928 42.749463012131386 43.249453534331224
-190.266 129.55279552704928 130.23645925759928 42.749463012131386 43.249453534331224
-191.266 130.23645925759928 130.92012298814927 42.749463012131386 43.249453534331224
-192.266 130.92012298814927 131.60378671869927 42.749463012131386 43.249453534331224
-193.266 131.60378671869927 132.28745044924926 42.749463012131386 43.249453534331224
-194.266 132.28745044924926 132.9711141797993 42.749463012131386 43.249453534331224
-195.266 132.9711141797993 133.65477791034925 42.749463012131386 43.249453534331224
-196.266 133.65477791034925 134.33844164089925 42.749463012131386 43.249453534331224
-197.266 134.33844164089925 135.02210537144927 42.749463012131386 43.249453534331224
-198.266 135.02210537144927 135.70576910199927 42.749463012131386 43.249453534331224
-199.266 135.70576910199927 136.38943283254926 42.749463012131386 43.249453534331224
-200.266 136.38943283254926 137.07309656309928 42.749463012131386 43.249453534331224
-201.266 137.07309656309928 137.75676029364928 42.749463012131386 43.249453534331224
-202.266 137.75676029364928 138.44042402419927 42.749463012131386 43.249453534331224
-203.266 138.44042402419927 139.12408775474927 42.749463012131386 43.249453534331224
-204.266 139.12408775474927 139.80775148529926 42.749463012131386 43.249453534331224
-205.266 139.80775148529926 140.49141521584926 42.749463012131386 43.249453534331224
-206.266 140.49141521584926 141.17507894639925 42.749463012131386 43.249453534331224
-207.266 141.17507894639925 141.8587426769493 42.749463012131386 43.249453534331224
-208.266 141.8587426769493 142.5424064074993 42.749463012131386 43.249453534331224
-209.266 142.5424064074993 143.22607013804927 42.749463012131386 43.249453534331224
-210.266 143.22607013804927 143.9097338685993 42.749463012131386 43.249453534331224
-211.266 143.9097338685993 144.59339759914926 42.749463012131386 43.249453534331224
-212.266 144.59339759914926 145.27706132969928 42.749463012131386 43.249453534331224
-213.266 145.27706132969928 145.96072506019928 42.749463012131386 43.249453534331224
-214.266 145.96072506019928 146.64438879074928 42.749463012131386 43.249453534331224
-215.266 146.64438879074928 147.32805252129927 42.749463012131386 43.249453534331224
-216.266 147.32805252129927 148.0117162518493 42.749463012131386 43.249453534331224
-217.266 148.0117162518493 148.6953799823993 42.749463012131386 43.249453534331224
-218.266 148.6953799823993 149.37904371294928 42.749463012131386 43.249453534331224
-219.266 149.37904371294928 150.06270744349928 42.749463012131386 43.249453534331224
-220.266 150.06270744349928 150.74637117404927 42.749463012131386 43.249453534331224
-221.266 150.74637117404927 151.43003490459924 42.749463012131386 43.249453534331224
-222.266 151.43003490459924 152.11369863514926 42.749463012131386 43.249453534331224
-223.266 152.11369863514926 152.79736236569929 42.749463012131386 43.249453534331224
-224.266 152.79736236569929 153.48102609624925 42.749463012131386 43.249453534331224
-225.266 153.48102609624925 154.16468982679928 42.749463012131386 43.249453534331224
-226.266 154.16468982679928 154.84835355734927 42.749463012131386 43.249453534331224
-227.266 154.84835355734927 155.53201728789927 42.749463012131386 43.249453534331224
-228.266 155.53201728789927 156.2156810184493 42.749463012131386 43.249453534331224
-229.266 156.2156810184493 156.89934474899928 42.749463012131386 43.249453534331224
-230.266 156.89934474899928 157.58300847954928 42.749463012131386 43.249453534331224
-231.266 157.58300847954928 158.26667221009927 42.749463012131386 43.249453534331224
-232.266 158.26667221009927 158.95033594064927 42.749463012131386 43.249453534331224
-233.266 158.95033594064927 159.63399967119926 42.749463012131386 43.249453534331224
-234.266 159.63399967119926 160.32861982599624 42.749463012131386 43.249453534331224
-247.266 168.5106717441023 169.2052918988993 42.749463012131386 43.249453534331224
-248.266 169.2052918988993 169.88895562944927 42.749463012131386 43.249453534331224
-249.266 169.88895562944927 170.57261935999924 42.749463012131386 43.249453534331224
-250.266 170.57261935999924 171.25628309054926 42.749463012131386 43.249453534331224
-251.266 171.25628309054926 171.93994682109928 42.749463012131386 43.249453534331224
-252.266 171.93994682109928 172.62361055164928 42.749463012131386 43.249453534331224
-253.266 172.62361055164928 173.30727428219927 42.749463012131386 43.249453534331224
-254.266 173.30727428219927 173.99093801274927 42.749463012131386 43.249453534331224
-255.266 173.99093801274927 174.67460174329926 42.749463012131386 43.249453534331224
-256.266 174.67460174329926 175.35826547384926 42.749463012131386 43.249453534331224
-257.266 175.35826547384926 176.04192920439928 42.749463012131386 43.249453534331224
-258.266 176.04192920439928 176.72559293494928 42.749463012131386 43.249453534331224
-259.266 176.72559293494928 177.40925666549927 42.749463012131386 43.249453534331224
-260.266 177.40925666549927 178.0929203960493 42.749463012131386 43.249453534331224
-261.266 178.0929203960493 178.7765841265993 42.749463012131386 43.249453534331224
-262.266 178.7765841265993 179.46024785714928 42.749463012131386 43.249453534331224
-263.266 179.46024785714928 180.14391158769925 42.749463012131386 43.249453534331224
-264.266 180.14391158769925 180.82757531824925 42.749463012131386 43.249453534331224
-265.266 180.82757531824925 181.51123904879924 42.749463012131386 43.249453534331224
-266.266 181.51123904879924 182.19490277934926 42.749463012131386 43.249453534331224
-267.266 182.19490277934926 182.87856650989926 42.749463012131386 43.249453534331224
-268.266 182.87856650989926 183.56223024044925 42.749463012131386 43.249453534331224
-269.266 183.56223024044925 184.24589397099925 42.749463012131386 43.249453534331224
-270.266 184.24589397099925 184.92955770154927 42.749463012131386 43.249453534331224
-271.266 184.92955770154927 185.61322143209924 42.749463012131386 43.249453534331224
-272.266 185.61322143209924 186.29688516264926 42.749463012131386 43.249453534331224
-273.266 186.29688516264926 186.98054889319926 42.749463012131386 43.249453534331224
-274.266 186.98054889319926 187.66421262374925 42.749463012131386 43.249453534331224
-275.266 187.66421262374925 188.34787635429925 42.749463012131386 43.249453534331224
-276.266 188.34787635429925 189.03154008484927 42.749463012131386 43.249453534331224
-277.266 189.03154008484927 189.71520381539926 42.749463012131386 43.249453534331224
-278.266 189.71520381539926 190.39886754594926 42.749463012131386 43.249453534331224
-279.266 190.39886754594926 191.08253127649925 42.749463012131386 43.249453534331224
-280.266 191.08253127649925 191.76619500704925 42.749463012131386 43.249453534331224
-281.266 191.76619500704925 192.44985873759924 42.749463012131386 43.249453534331224
-282.266 192.44985873759924 193.13352246814924 42.749463012131386 43.249453534331224
-283.266 193.13352246814924 193.81718619869926 42.749463012131386 43.249453534331224
-284.266 193.81718619869926 194.50084992919926 42.749463012131386 43.249453534331224
-285.266 194.50084992919926 195.18451365974926 42.749463012131386 43.249453534331224
-286.266 195.18451365974926 195.86817739029925 42.749463012131386 43.249453534331224
-287.266 195.86817739029925 196.55184112084925 42.749463012131386 43.249453534331224
-288.266 196.55184112084925 197.23550485139924 42.749463012131386 43.249453534331224
-289.266 197.23550485139924 197.93012500619625 42.749463012131386 43.249453534331224
-368.266 251.23398314050223 251.92860329534926 42.749463012131386 43.249453534331224
-369.266 251.92860329534926 252.61226702589926 42.749463012131386 43.249453534331224
-370.266 252.61226702589926 253.29593075644925 42.749463012131386 43.249453534331224
-371.266 253.29593075644925 253.97959448699925 42.749463012131386 43.249453534331224
-372.266 253.97959448699925 254.66325821754924 42.749463012131386 43.249453534331224
-373.266 254.66325821754924 255.34692194809924 42.749463012131386 43.249453534331224
-374.266 255.34692194809924 256.03058567864923 42.749463012131386 43.249453534331224
-375.266 256.03058567864923 256.7142494091993 42.749463012131386 43.249453534331224
-376.266 256.7142494091993 257.3979131397492 42.749463012131386 43.249453534331224
-377.266 257.3979131397492 258.0815768702993 42.749463012131386 43.249453534331224
-378.266 258.0815768702993 258.76524060084927 42.749463012131386 43.249453534331224
-379.266 258.76524060084927 259.44890433139926 42.749463012131386 43.249453534331224
-380.266 259.44890433139926 260.13256806194926 42.749463012131386 43.249453534331224
-381.266 260.13256806194926 260.81623179249925 42.749463012131386 43.249453534331224
-382.266 260.81623179249925 261.51085194729626 42.749463012131386 43.249453534331224
-394.266 269.0092401348023 269.70386028964924 42.749463012131386 43.249453534331224
-395.266 269.70386028964924 270.3875240201993 42.749463012131386 43.249453534331224
-396.266 270.3875240201993 271.07118775074923 42.749463012131386 43.249453534331224
-397.266 271.07118775074923 271.7548514812993 42.749463012131386 43.249453534331224
-398.266 271.7548514812993 272.4385152118492 42.749463012131386 43.249453534331224
-399.266 272.4385152118492 273.1221789423993 42.749463012131386 43.249453534331224
-400.266 273.1221789423993 273.80584267294927 42.749463012131386 43.249453534331224
-401.266 273.80584267294927 274.48950640349926 42.749463012131386 43.249453534331224
-402.266 274.48950640349926 275.18412655829627 42.749463012131386 43.249453534331224
-160.267 109.93066133753636 110.63100746184648 43.249453534331224 43.74944389963306
-161.267 110.63100746184648 111.32030669819648 43.249453534331224 43.74944389963306
-162.267 111.32030669819648 112.00960593454649 43.249453534331224 43.74944389963306
-163.267 112.00960593454649 112.6989051708965 43.249453534331224 43.74944389963306
-164.267 112.6989051708965 113.3882044071965 43.249453534331224 43.74944389963306
-165.267 113.3882044071965 114.07750364354649 43.249453534331224 43.74944389963306
-166.267 114.07750364354649 114.76680287989649 43.249453534331224 43.74944389963306
-167.267 114.76680287989649 115.45610211624648 43.249453534331224 43.74944389963306
-168.267 115.45610211624648 116.1454013525965 43.249453534331224 43.74944389963306
-169.267 116.1454013525965 116.8347005888965 43.249453534331224 43.74944389963306
-170.267 116.8347005888965 117.52399982524649 43.249453534331224 43.74944389963306
-171.267 117.52399982524649 118.21329906159649 43.249453534331224 43.74944389963306
-172.267 118.21329906159649 118.9025982979465 43.249453534331224 43.74944389963306
-173.267 118.9025982979465 119.59189753429649 43.249453534331224 43.74944389963306
-174.267 119.59189753429649 120.28119677064649 43.249453534331224 43.74944389963306
-175.267 120.28119677064649 120.97049600699648 43.249453534331224 43.74944389963306
-176.267 120.97049600699648 121.65979524329649 43.249453534331224 43.74944389963306
-177.267 121.65979524329649 122.34909447964648 43.249453534331224 43.74944389963306
-178.267 122.34909447964648 123.03839371599648 43.249453534331224 43.74944389963306
-179.267 123.03839371599648 123.72769295234649 43.249453534331224 43.74944389963306
-180.267 123.72769295234649 124.4169921886965 43.249453534331224 43.74944389963306
-181.267 124.4169921886965 125.10629142499648 43.249453534331224 43.74944389963306
-182.267 125.10629142499648 125.7955906613465 43.249453534331224 43.74944389963306
-183.267 125.7955906613465 126.48488989769649 43.249453534331224 43.74944389963306
-184.267 126.48488989769649 127.17418913404649 43.249453534331224 43.74944389963306
-185.267 127.17418913404649 127.86348837039648 43.249453534331224 43.74944389963306
-186.267 127.86348837039648 128.55278760669648 43.249453534331224 43.74944389963306
-187.267 128.55278760669648 129.24208684304648 43.249453534331224 43.74944389963306
-188.267 129.24208684304648 129.93138607939647 43.249453534331224 43.74944389963306
-189.267 129.93138607939647 130.62068531574647 43.249453534331224 43.74944389963306
-190.267 130.62068531574647 131.3099845520965 43.249453534331224 43.74944389963306
-191.267 131.3099845520965 131.9992837883965 43.249453534331224 43.74944389963306
-192.267 131.9992837883965 132.6885830247465 43.249453534331224 43.74944389963306
-193.267 132.6885830247465 133.3778822610965 43.249453534331224 43.74944389963306
-194.267 133.3778822610965 134.06718149744648 43.249453534331224 43.74944389963306
-195.267 134.06718149744648 134.75648073379648 43.249453534331224 43.74944389963306
-196.267 134.75648073379648 135.44577997009648 43.249453534331224 43.74944389963306
-197.267 135.44577997009648 136.1350792064465 43.249453534331224 43.74944389963306
-198.267 136.1350792064465 136.82437844279647 43.249453534331224 43.74944389963306
-199.267 136.82437844279647 137.5136776791465 43.249453534331224 43.74944389963306
-200.267 137.5136776791465 138.2029769154965 43.249453534331224 43.74944389963306
-201.267 138.2029769154965 138.8922761518465 43.249453534331224 43.74944389963306
-202.267 138.8922761518465 139.58157538819648 43.249453534331224 43.74944389963306
-203.267 139.58157538819648 140.2708746244965 43.249453534331224 43.74944389963306
-204.267 140.2708746244965 140.9601738608465 43.249453534331224 43.74944389963306
-205.267 140.9601738608465 141.64947309719648 43.249453534331224 43.74944389963306
-206.267 141.64947309719648 142.3387723335465 43.249453534331224 43.74944389963306
-207.267 142.3387723335465 143.02807156989647 43.249453534331224 43.74944389963306
-208.267 143.02807156989647 143.71737080619647 43.249453534331224 43.74944389963306
-209.267 143.71737080619647 144.40667004254647 43.249453534331224 43.74944389963306
-210.267 144.40667004254647 145.0959692788965 43.249453534331224 43.74944389963306
-211.267 145.0959692788965 145.78526851524649 43.249453534331224 43.74944389963306
-212.267 145.78526851524649 146.4745677515965 43.249453534331224 43.74944389963306
-213.267 146.4745677515965 147.16386698789648 43.249453534331224 43.74944389963306
-214.267 147.16386698789648 147.85316622424648 43.249453534331224 43.74944389963306
-215.267 147.85316622424648 148.5424654605965 43.249453534331224 43.74944389963306
-216.267 148.5424654605965 149.23176469694647 43.249453534331224 43.74944389963306
-217.267 149.23176469694647 149.92106393329647 43.249453534331224 43.74944389963306
-218.267 149.92106393329647 150.61036316959647 43.249453534331224 43.74944389963306
-219.267 150.61036316959647 151.2996624059465 43.249453534331224 43.74944389963306
-220.267 151.2996624059465 151.9889616422965 43.249453534331224 43.74944389963306
-221.267 151.9889616422965 152.67826087864648 43.249453534331224 43.74944389963306
-222.267 152.67826087864648 153.36756011499648 43.249453534331224 43.74944389963306
-223.267 153.36756011499648 154.05685935134647 43.249453534331224 43.74944389963306
-224.267 154.05685935134647 154.7461585876965 43.249453534331224 43.74944389963306
-225.267 154.7461585876965 155.4354578239965 43.249453534331224 43.74944389963306
-226.267 155.4354578239965 156.1247570603465 43.249453534331224 43.74944389963306
-227.267 156.1247570603465 156.8140562966965 43.249453534331224 43.74944389963306
-228.267 156.8140562966965 157.5033555330465 43.249453534331224 43.74944389963306
-229.267 157.5033555330465 158.19265476939648 43.249453534331224 43.74944389963306
-230.267 158.19265476939648 158.88195400569649 43.249453534331224 43.74944389963306
-231.267 158.88195400569649 159.57125324204648 43.249453534331224 43.74944389963306
-232.267 159.57125324204648 160.26055247839648 43.249453534331224 43.74944389963306
-233.267 160.26055247839648 160.96089860265658 43.249453534331224 43.74944389963306
-245.267 168.52109642653636 169.22144255084646 43.249453534331224 43.74944389963306
-246.267 169.22144255084646 169.9107417871965 43.249453534331224 43.74944389963306
-247.267 169.9107417871965 170.6000410234965 43.249453534331224 43.74944389963306
-248.267 170.6000410234965 171.28934025984648 43.249453534331224 43.74944389963306
-249.267 171.28934025984648 171.97863949619648 43.249453534331224 43.74944389963306
-250.267 171.97863949619648 172.66793873254647 43.249453534331224 43.74944389963306
-251.267 172.66793873254647 173.35723796889647 43.249453534331224 43.74944389963306
-252.267 173.35723796889647 174.04653720519647 43.249453534331224 43.74944389963306
-253.267 174.04653720519647 174.7358364415465 43.249453534331224 43.74944389963306
-254.267 174.7358364415465 175.4251356778965 43.249453534331224 43.74944389963306
-255.267 175.4251356778965 176.1144349142465 43.249453534331224 43.74944389963306
-256.267 176.1144349142465 176.80373415059648 43.249453534331224 43.74944389963306
-257.267 176.80373415059648 177.49303338689649 43.249453534331224 43.74944389963306
-258.267 177.49303338689649 178.1823326232465 43.249453534331224 43.74944389963306
-259.267 178.1823326232465 178.8716318595965 43.249453534331224 43.74944389963306
-260.267 178.8716318595965 179.56093109594647 43.249453534331224 43.74944389963306
-261.267 179.56093109594647 180.25023033229647 43.249453534331224 43.74944389963306
-262.267 180.25023033229647 180.93952956859647 43.249453534331224 43.74944389963306
-263.267 180.93952956859647 181.62882880494647 43.249453534331224 43.74944389963306
-264.267 181.62882880494647 182.31812804129646 43.249453534331224 43.74944389963306
-265.267 182.31812804129646 183.00742727764649 43.249453534331224 43.74944389963306
-266.267 183.00742727764649 183.69672651399645 43.249453534331224 43.74944389963306
-267.267 183.69672651399645 184.38602575029648 43.249453534331224 43.74944389963306
-268.267 184.38602575029648 185.07532498664648 43.249453534331224 43.74944389963306
-269.267 185.07532498664648 185.76462422299647 43.249453534331224 43.74944389963306
-270.267 185.76462422299647 186.45392345934647 43.249453534331224 43.74944389963306
-271.267 186.45392345934647 187.14322269569647 43.249453534331224 43.74944389963306
-272.267 187.14322269569647 187.83252193204646 43.249453534331224 43.74944389963306
-273.267 187.83252193204646 188.52182116839646 43.249453534331224 43.74944389963306
-274.267 188.52182116839646 189.2111204046965 43.249453534331224 43.74944389963306
-275.267 189.2111204046965 189.90041964104648 43.249453534331224 43.74944389963306
-276.267 189.90041964104648 190.58971887739645 43.249453534331224 43.74944389963306
-277.267 190.58971887739645 191.27901811374647 43.249453534331224 43.74944389963306
-278.267 191.27901811374647 191.96831735009644 43.249453534331224 43.74944389963306
-279.267 191.96831735009644 192.65761658639644 43.249453534331224 43.74944389963306
-280.267 192.65761658639644 193.3469158227465 43.249453534331224 43.74944389963306
-281.267 193.3469158227465 194.0362150590965 43.249453534331224 43.74944389963306
-282.267 194.0362150590965 194.72551429544646 43.249453534331224 43.74944389963306
-283.267 194.72551429544646 195.41481353179648 43.249453534331224 43.74944389963306
-284.267 195.41481353179648 196.1041127680965 43.249453534331224 43.74944389963306
-285.267 196.1041127680965 196.7934120044465 43.249453534331224 43.74944389963306
-286.267 196.7934120044465 197.48271124079648 43.249453534331224 43.74944389963306
-287.267 197.48271124079648 198.1830573650566 43.249453534331224 43.74944389963306
-366.267 251.9263040238364 252.62665014809647 43.249453534331224 43.74944389963306
-367.267 252.62665014809647 253.31594938439645 43.249453534331224 43.74944389963306
-368.267 253.31594938439645 254.00524862074647 43.249453534331224 43.74944389963306
-369.267 254.00524862074647 254.69454785709647 43.249453534331224 43.74944389963306
-370.267 254.69454785709647 255.38384709344646 43.249453534331224 43.74944389963306
-371.267 255.38384709344646 256.0731463297965 43.249453534331224 43.74944389963306
-372.267 256.0731463297965 256.76244556609646 43.249453534331224 43.74944389963306
-373.267 256.76244556609646 257.45174480244646 43.249453534331224 43.74944389963306
-374.267 257.45174480244646 258.1410440387965 43.249453534331224 43.74944389963306
-375.267 258.1410440387965 258.83034327514645 43.249453534331224 43.74944389963306
-376.267 258.83034327514645 259.5196425114965 43.249453534331224 43.74944389963306
-377.267 259.5196425114965 260.20894174779653 43.249453534331224 43.74944389963306
-378.267 260.20894174779653 260.89824098414647 43.249453534331224 43.74944389963306
-379.267 260.89824098414647 261.5985871084566 43.249453534331224 43.74944389963306
-391.267 269.15878493233635 269.8591310565965 43.249453534331224 43.74944389963306
-392.267 269.8591310565965 270.5484302929465 43.249453534331224 43.74944389963306
-393.267 270.5484302929465 271.2377295292965 43.249453534331224 43.74944389963306
-394.267 271.2377295292965 271.9270287655965 43.249453534331224 43.74944389963306
-395.267 271.9270287655965 272.6163280019465 43.249453534331224 43.74944389963306
-396.267 272.6163280019465 273.30562723829644 43.249453534331224 43.74944389963306
-397.267 273.30562723829644 273.9949264746465 43.249453534331224 43.74944389963306
-398.267 273.9949264746465 274.69527259895654 43.249453534331224 43.74944389963306
-159.268 110.1577651379751 110.86398664946265 43.74944389963306 44.24943410260388
-160.268 110.86398664946265 111.55906844496263 43.74944389963306 44.24943410260388
-161.268 111.55906844496263 112.25415024051264 43.74944389963306 44.24943410260388
-162.268 112.25415024051264 112.94923203606265 43.74944389963306 44.24943410260388
-163.268 112.94923203606265 113.64431383156264 43.74944389963306 44.24943410260388
-164.268 113.64431383156264 114.33939562706266 43.74944389963306 44.24943410260388
-165.268 114.33939562706266 115.03447742256265 43.74944389963306 44.24943410260388
-166.268 115.03447742256265 115.72955921806266 43.74944389963306 44.24943410260388
-167.268 115.72955921806266 116.42464101356265 43.74944389963306 44.24943410260388
-168.268 116.42464101356265 117.11972280906264 43.74944389963306 44.24943410260388
-169.268 117.11972280906264 117.81480460456262 43.74944389963306 44.24943410260388
-170.268 117.81480460456262 118.50988640006265 43.74944389963306 44.24943410260388
-171.268 118.50988640006265 119.20496819556266 43.74944389963306 44.24943410260388
-172.268 119.20496819556266 119.90004999106266 43.74944389963306 44.24943410260388
-173.268 119.90004999106266 120.59513178661265 43.74944389963306 44.24943410260388
-174.268 120.59513178661265 121.29021358216265 43.74944389963306 44.24943410260388
-175.268 121.29021358216265 121.98529537766265 43.74944389963306 44.24943410260388
-176.268 121.98529537766265 122.68037717316264 43.74944389963306 44.24943410260388
-177.268 122.68037717316264 123.37545896866263 43.74944389963306 44.24943410260388
-178.268 123.37545896866263 124.07054076416266 43.74944389963306 44.24943410260388
-179.268 124.07054076416266 124.76562255966266 43.74944389963306 44.24943410260388
-180.268 124.76562255966266 125.46070435516265 43.74944389963306 44.24943410260388
-181.268 125.46070435516265 126.15578615066264 43.74944389963306 44.24943410260388
-182.268 126.15578615066264 126.85086794616262 43.74944389963306 44.24943410260388
-183.268 126.85086794616262 127.54594974166264 43.74944389963306 44.24943410260388
-184.268 127.54594974166264 128.24103153716266 43.74944389963306 44.24943410260388
-185.268 128.24103153716266 128.93611333271264 43.74944389963306 44.24943410260388
-186.268 128.93611333271264 129.63119512826265 43.74944389963306 44.24943410260388
-187.268 129.63119512826265 130.32627692376263 43.74944389963306 44.24943410260388
-188.268 130.32627692376263 131.02135871926265 43.74944389963306 44.24943410260388
-189.268 131.02135871926265 131.71644051476267 43.74944389963306 44.24943410260388
-190.268 131.71644051476267 132.41152231026263 43.74944389963306 44.24943410260388
-191.268 132.41152231026263 133.10660410576264 43.74944389963306 44.24943410260388
-192.268 133.10660410576264 133.80168590126266 43.74944389963306 44.24943410260388
-193.268 133.80168590126266 134.49676769676267 43.74944389963306 44.24943410260388
-194.268 134.49676769676267 135.19184949226263 43.74944389963306 44.24943410260388
-195.268 135.19184949226263 135.88693128776265 43.74944389963306 44.24943410260388
-196.268 135.88693128776265 136.58201308326267 43.74944389963306 44.24943410260388
-197.268 136.58201308326267 137.27709487881265 43.74944389963306 44.24943410260388
-198.268 137.27709487881265 137.97217667436263 43.74944389963306 44.24943410260388
-199.268 137.97217667436263 138.66725846986265 43.74944389963306 44.24943410260388
-200.268 138.66725846986265 139.36234026536266 43.74944389963306 44.24943410260388
-201.268 139.36234026536266 140.05742206086265 43.74944389963306 44.24943410260388
-202.268 140.05742206086265 140.75250385636264 43.74944389963306 44.24943410260388
-203.268 140.75250385636264 141.44758565186265 43.74944389963306 44.24943410260388
-204.268 141.44758565186265 142.14266744736267 43.74944389963306 44.24943410260388
-205.268 142.14266744736267 142.83774924286263 43.74944389963306 44.24943410260388
-206.268 142.83774924286263 143.53283103836264 43.74944389963306 44.24943410260388
-207.268 143.53283103836264 144.22791283386266 43.74944389963306 44.24943410260388
-208.268 144.22791283386266 144.92299462936262 43.74944389963306 44.24943410260388
-209.268 144.92299462936262 145.61807642491266 43.74944389963306 44.24943410260388
-210.268 145.61807642491266 146.31315822046264 43.74944389963306 44.24943410260388
-211.268 146.31315822046264 147.00824001596263 43.74944389963306 44.24943410260388
-212.268 147.00824001596263 147.70332181146264 43.74944389963306 44.24943410260388
-213.268 147.70332181146264 148.39840360696263 43.74944389963306 44.24943410260388
-214.268 148.39840360696263 149.09348540246265 43.74944389963306 44.24943410260388
-215.268 149.09348540246265 149.78856719796266 43.74944389963306 44.24943410260388
-216.268 149.78856719796266 150.48364899346265 43.74944389963306 44.24943410260388
-217.268 150.48364899346265 151.17873078896267 43.74944389963306 44.24943410260388
-218.268 151.17873078896267 151.87381258446266 43.74944389963306 44.24943410260388
-219.268 151.87381258446266 152.56889437996267 43.74944389963306 44.24943410260388
-220.268 152.56889437996267 153.26397617546263 43.74944389963306 44.24943410260388
-221.268 153.26397617546263 153.95905797101264 43.74944389963306 44.24943410260388
-222.268 153.95905797101264 154.65413976656265 43.74944389963306 44.24943410260388
-223.268 154.65413976656265 155.34922156206267 43.74944389963306 44.24943410260388
-224.268 155.34922156206267 156.04430335756265 43.74944389963306 44.24943410260388
-225.268 156.04430335756265 156.73938515306267 43.74944389963306 44.24943410260388
-226.268 156.73938515306267 157.43446694856263 43.74944389963306 44.24943410260388
-227.268 157.43446694856263 158.12954874406265 43.74944389963306 44.24943410260388
-228.268 158.12954874406265 158.82463053956263 43.74944389963306 44.24943410260388
-229.268 158.82463053956263 159.51971233506265 43.74944389963306 44.24943410260388
-230.268 159.51971233506265 160.21479413056267 43.74944389963306 44.24943410260388
-231.268 160.21479413056267 160.90987592606263 43.74944389963306 44.24943410260388
-232.268 160.90987592606263 161.60495772156264 43.74944389963306 44.24943410260388
-233.268 161.60495772156264 162.30003951711262 43.74944389963306 44.24943410260388
-234.268 162.30003951711262 162.99512131266263 43.74944389963306 44.24943410260388
-235.268 162.99512131266263 163.69020310816268 43.74944389963306 44.24943410260388
-236.268 163.69020310816268 164.38528490366264 43.74944389963306 44.24943410260388
-237.268 164.38528490366264 165.08036669916265 43.74944389963306 44.24943410260388
-238.268 165.08036669916265 165.77544849466267 43.74944389963306 44.24943410260388
-239.268 165.77544849466267 166.47053029016263 43.74944389963306 44.24943410260388
-240.268 166.47053029016263 167.16561208566264 43.74944389963306 44.24943410260388
-241.268 167.16561208566264 167.86069388116266 43.74944389963306 44.24943410260388
-242.268 167.86069388116266 168.55577567666265 43.74944389963306 44.24943410260388
-243.268 168.55577567666265 169.25085747216264 43.74944389963306 44.24943410260388
-244.268 169.25085747216264 169.94593926766265 43.74944389963306 44.24943410260388
-245.268 169.94593926766265 170.64102106321263 43.74944389963306 44.24943410260388
-246.268 170.64102106321263 171.33610285876264 43.74944389963306 44.24943410260388
-247.268 171.33610285876264 172.03118465426263 43.74944389963306 44.24943410260388
-248.268 172.03118465426263 172.72626644976265 43.74944389963306 44.24943410260388
-249.268 172.72626644976265 173.42134824526266 43.74944389963306 44.24943410260388
-250.268 173.42134824526266 174.11643004076265 43.74944389963306 44.24943410260388
-251.268 174.11643004076265 174.81151183626264 43.74944389963306 44.24943410260388
-252.268 174.81151183626264 175.50659363176263 43.74944389963306 44.24943410260388
-253.268 175.50659363176263 176.20167542726264 43.74944389963306 44.24943410260388
-254.268 176.20167542726264 176.89675722276263 43.74944389963306 44.24943410260388
-255.268 176.89675722276263 177.59183901826265 43.74944389963306 44.24943410260388
-256.268 177.59183901826265 178.28692081376263 43.74944389963306 44.24943410260388
-257.268 178.28692081376263 178.98200260931264 43.74944389963306 44.24943410260388
-258.268 178.98200260931264 179.67708440486265 43.74944389963306 44.24943410260388
-259.268 179.67708440486265 180.37216620036264 43.74944389963306 44.24943410260388
-260.268 180.37216620036264 181.0672479958626 43.74944389963306 44.24943410260388
-261.268 181.0672479958626 181.76232979136262 43.74944389963306 44.24943410260388
-262.268 181.76232979136262 182.45741158686263 43.74944389963306 44.24943410260388
-263.268 182.45741158686263 183.15249338236265 43.74944389963306 44.24943410260388
-264.268 183.15249338236265 183.84757517786264 43.74944389963306 44.24943410260388
-265.268 183.84757517786264 184.54265697336263 43.74944389963306 44.24943410260388
-266.268 184.54265697336263 185.23773876886264 43.74944389963306 44.24943410260388
-267.268 185.23773876886264 185.93282056436263 43.74944389963306 44.24943410260388
-268.268 185.93282056436263 186.62790235986262 43.74944389963306 44.24943410260388
-269.268 186.62790235986262 187.32298415541266 43.74944389963306 44.24943410260388
-270.268 187.32298415541266 188.01806595096264 43.74944389963306 44.24943410260388
-271.268 188.01806595096264 188.71314774646265 43.74944389963306 44.24943410260388
-272.268 188.71314774646265 189.40822954196264 43.74944389963306 44.24943410260388
-273.268 189.40822954196264 190.10331133746263 43.74944389963306 44.24943410260388
-274.268 190.10331133746263 190.79839313296264 43.74944389963306 44.24943410260388
-275.268 190.79839313296264 191.49347492846263 43.74944389963306 44.24943410260388
-276.268 191.49347492846263 192.18855672396262 43.74944389963306 44.24943410260388
-277.268 192.18855672396262 192.88363851946264 43.74944389963306 44.24943410260388
-278.268 192.88363851946264 193.57872031496265 43.74944389963306 44.24943410260388
-279.268 193.57872031496265 194.27380211046264 43.74944389963306 44.24943410260388
-280.268 194.27380211046264 194.96888390596263 43.74944389963306 44.24943410260388
-281.268 194.96888390596263 195.6639657015126 43.74944389963306 44.24943410260388
-282.268 195.6639657015126 196.35904749706265 43.74944389963306 44.24943410260388
-283.268 196.35904749706265 197.05412929256264 43.74944389963306 44.24943410260388
-284.268 197.05412929256264 197.74921108806262 43.74944389963306 44.24943410260388
-285.268 197.74921108806262 198.4554325995502 43.74944389963306 44.24943410260388
-374.268 259.6003511722751 260.3065726837626 43.74944389963306 44.24943410260388
-375.268 260.3065726837626 261.00165447926264 43.74944389963306 44.24943410260388
-376.268 261.00165447926264 261.69673627476266 43.74944389963306 44.24943410260388
-377.268 261.69673627476266 262.39181807031264 43.74944389963306 44.24943410260388
-378.268 262.39181807031264 263.0868998658626 43.74944389963306 44.24943410260388
-379.268 263.0868998658626 263.78198166136264 43.74944389963306 44.24943410260388
-380.268 263.78198166136264 264.47706345686265 43.74944389963306 44.24943410260388
-381.268 264.47706345686265 265.17214525236267 43.74944389963306 44.24943410260388
-382.268 265.17214525236267 265.8672270478627 43.74944389963306 44.24943410260388
-383.268 265.8672270478627 266.56230884336264 43.74944389963306 44.24943410260388
-384.268 266.56230884336264 267.25739063886266 43.74944389963306 44.24943410260388
-385.268 267.25739063886266 267.9524724343626 43.74944389963306 44.24943410260388
-386.268 267.9524724343626 268.64755422986264 43.74944389963306 44.24943410260388
-387.268 268.64755422986264 269.34263602536265 43.74944389963306 44.24943410260388
-388.268 269.34263602536265 270.03771782086267 43.74944389963306 44.24943410260388
-389.268 270.03771782086267 270.73279961641265 43.74944389963306 44.24943410260388
-390.268 270.73279961641265 271.42788141196263 43.74944389963306 44.24943410260388
-391.268 271.42788141196263 272.12296320746265 43.74944389963306 44.24943410260388
-392.268 272.12296320746265 272.81804500296266 43.74944389963306 44.24943410260388
-393.268 272.81804500296266 273.5131267984626 43.74944389963306 44.24943410260388
-394.268 273.5131267984626 274.20820859396264 43.74944389963306 44.24943410260388
-395.268 274.20820859396264 274.91443010545015 43.74944389963306 44.24943410260388
-158.269 110.39718936981822 111.10944038520867 44.24943410260388 44.74942413757573
-159.269 111.10944038520867 111.81045641760868 44.24943410260388 44.74942413757573
-160.269 111.81045641760868 112.51147245005868 44.24943410260388 44.74942413757573
-161.269 112.51147245005868 113.21248848250868 44.24943410260388 44.74942413757573
-162.269 113.21248848250868 113.91350451490868 44.24943410260388 44.74942413757573
-163.269 113.91350451490868 114.6145205473587 44.24943410260388 44.74942413757573
-164.269 114.6145205473587 115.31553657980868 44.24943410260388 44.74942413757573
-165.269 115.31553657980868 116.01655261220868 44.24943410260388 44.74942413757573
-166.269 116.01655261220868 116.71756864465868 44.24943410260388 44.74942413757573
-167.269 116.71756864465868 117.41858467710868 44.24943410260388 44.74942413757573
-168.269 117.41858467710868 118.11960070955868 44.24943410260388 44.74942413757573
-169.269 118.11960070955868 118.82061674200868 44.24943410260388 44.74942413757573
-170.269 118.82061674200868 119.52163277440867 44.24943410260388 44.74942413757573
-171.269 119.52163277440867 120.22264880685867 44.24943410260388 44.74942413757573
-172.269 120.22264880685867 120.92366483930867 44.24943410260388 44.74942413757573
-173.269 120.92366483930867 121.62468087170868 44.24943410260388 44.74942413757573
-174.269 121.62468087170868 122.32569690415869 44.24943410260388 44.74942413757573
-175.269 122.32569690415869 123.02671293660867 44.24943410260388 44.74942413757573
-176.269 123.02671293660867 123.72772896905869 44.24943410260388 44.74942413757573
-177.269 123.72772896905869 124.42874500150869 44.24943410260388 44.74942413757573
-178.269 124.42874500150869 125.12976103390868 44.24943410260388 44.74942413757573
-179.269 125.12976103390868 125.83077706635868 44.24943410260388 44.74942413757573
-180.269 125.83077706635868 126.53179309880866 44.24943410260388 44.74942413757573
-181.269 126.53179309880866 127.23280913120867 44.24943410260388 44.74942413757573
-182.269 127.23280913120867 127.93382516365867 44.24943410260388 44.74942413757573
-183.269 127.93382516365867 128.63484119610868 44.24943410260388 44.74942413757573
-184.269 128.63484119610868 129.33585722855867 44.24943410260388 44.74942413757573
-185.269 129.33585722855867 130.03687326100868 44.24943410260388 44.74942413757573
-186.269 130.03687326100868 130.73788929340867 44.24943410260388 44.74942413757573
-187.269 130.73788929340867 131.43890532585868 44.24943410260388 44.74942413757573
-188.269 131.43890532585868 132.1399213583087 44.24943410260388 44.74942413757573
-189.269 132.1399213583087 132.8409373907087 44.24943410260388 44.74942413757573
-190.269 132.8409373907087 133.54195342315867 44.24943410260388 44.74942413757573
-191.269 133.54195342315867 134.2429694556087 44.24943410260388 44.74942413757573
-192.269 134.2429694556087 134.94398548800868 44.24943410260388 44.74942413757573
-193.269 134.94398548800868 135.64500152045866 44.24943410260388 44.74942413757573
-194.269 135.64500152045866 136.34601755290868 44.24943410260388 44.74942413757573
-195.269 136.34601755290868 137.0470335853587 44.24943410260388 44.74942413757573
-196.269 137.0470335853587 137.7480496178087 44.24943410260388 44.74942413757573
-197.269 137.7480496178087 138.4490656502087 44.24943410260388 44.74942413757573
-198.269 138.4490656502087 139.15008168265868 44.24943410260388 44.74942413757573
-199.269 139.15008168265868 139.85109771510866 44.24943410260388 44.74942413757573
-200.269 139.85109771510866 140.55211374750868 44.24943410260388 44.74942413757573
-201.269 140.55211374750868 141.25312977995867 44.24943410260388 44.74942413757573
-202.269 141.25312977995867 141.95414581240868 44.24943410260388 44.74942413757573
-203.269 141.95414581240868 142.6551618448587 44.24943410260388 44.74942413757573
-204.269 142.6551618448587 143.35617787730868 44.24943410260388 44.74942413757573
-205.269 143.35617787730868 144.0571939097087 44.24943410260388 44.74942413757573
-206.269 144.0571939097087 144.75820994215871 44.24943410260388 44.74942413757573
-207.269 144.75820994215871 145.45922597460867 44.24943410260388 44.74942413757573
-208.269 145.45922597460867 146.16024200700866 44.24943410260388 44.74942413757573
-209.269 146.16024200700866 146.86125803945868 44.24943410260388 44.74942413757573
-210.269 146.86125803945868 147.5622740719087 44.24943410260388 44.74942413757573
-211.269 147.5622740719087 148.26329010435865 44.24943410260388 44.74942413757573
-212.269 148.26329010435865 148.96430613680866 44.24943410260388 44.74942413757573
-213.269 148.96430613680866 149.66532216920868 44.24943410260388 44.74942413757573
-214.269 149.66532216920868 150.36633820165866 44.24943410260388 44.74942413757573
-215.269 150.36633820165866 151.06735423410868 44.24943410260388 44.74942413757573
-216.269 151.06735423410868 151.76837026650867 44.24943410260388 44.74942413757573
-217.269 151.76837026650867 152.46938629895868 44.24943410260388 44.74942413757573
-218.269 152.46938629895868 153.1704023314087 44.24943410260388 44.74942413757573
-219.269 153.1704023314087 153.8714183638087 44.24943410260388 44.74942413757573
-220.269 153.8714183638087 154.57243439625867 44.24943410260388 44.74942413757573
-221.269 154.57243439625867 155.27345042870866 44.24943410260388 44.74942413757573
-222.269 155.27345042870866 155.97446646115867 44.24943410260388 44.74942413757573
-223.269 155.97446646115867 156.67548249360868 44.24943410260388 44.74942413757573
-224.269 156.67548249360868 157.37649852600867 44.24943410260388 44.74942413757573
-225.269 157.37649852600867 158.0775145584587 44.24943410260388 44.74942413757573
-226.269 158.0775145584587 158.7785305909087 44.24943410260388 44.74942413757573
-227.269 158.7785305909087 159.4795466233087 44.24943410260388 44.74942413757573
-228.269 159.4795466233087 160.18056265575868 44.24943410260388 44.74942413757573
-229.269 160.18056265575868 160.88157868820866 44.24943410260388 44.74942413757573
-230.269 160.88157868820866 161.58259472065868 44.24943410260388 44.74942413757573
-231.269 161.58259472065868 162.2836107531087 44.24943410260388 44.74942413757573
-232.269 162.2836107531087 162.98462678550868 44.24943410260388 44.74942413757573
-233.269 162.98462678550868 163.6856428179587 44.24943410260388 44.74942413757573
-234.269 163.6856428179587 164.38665885040868 44.24943410260388 44.74942413757573
-235.269 164.38665885040868 165.0876748828087 44.24943410260388 44.74942413757573
-236.269 165.0876748828087 165.7886909152587 44.24943410260388 44.74942413757573
-237.269 165.7886909152587 166.48970694770867 44.24943410260388 44.74942413757573
-238.269 166.48970694770867 167.19072298015868 44.24943410260388 44.74942413757573
-239.269 167.19072298015868 167.8917390126087 44.24943410260388 44.74942413757573
-240.269 167.8917390126087 168.5927550450087 44.24943410260388 44.74942413757573
-241.269 168.5927550450087 169.2937710774587 44.24943410260388 44.74942413757573
-242.269 169.2937710774587 169.99478710990866 44.24943410260388 44.74942413757573
-243.269 169.99478710990866 170.69580314230868 44.24943410260388 44.74942413757573
-244.269 170.69580314230868 171.39681917475866 44.24943410260388 44.74942413757573
-245.269 171.39681917475866 172.09783520720868 44.24943410260388 44.74942413757573
-246.269 172.09783520720868 172.79885123960867 44.24943410260388 44.74942413757573
-247.269 172.79885123960867 173.49986727205868 44.24943410260388 44.74942413757573
-248.269 173.49986727205868 174.2008833045087 44.24943410260388 44.74942413757573
-249.269 174.2008833045087 174.90189933695868 44.24943410260388 44.74942413757573
-250.269 174.90189933695868 175.60291536940866 44.24943410260388 44.74942413757573
-251.269 175.60291536940866 176.30393140180865 44.24943410260388 44.74942413757573
-252.269 176.30393140180865 177.00494743425867 44.24943410260388 44.74942413757573
-253.269 177.00494743425867 177.70596346670868 44.24943410260388 44.74942413757573
-254.269 177.70596346670868 178.40697949910867 44.24943410260388 44.74942413757573
-255.269 178.40697949910867 179.1079955315587 44.24943410260388 44.74942413757573
-256.269 179.1079955315587 179.8090115640087 44.24943410260388 44.74942413757573
-257.269 179.8090115640087 180.51002759645866 44.24943410260388 44.74942413757573
-258.269 180.51002759645866 181.21104362890867 44.24943410260388 44.74942413757573
-259.269 181.21104362890867 181.91205966130866 44.24943410260388 44.74942413757573
-260.269 181.91205966130866 182.61307569375865 44.24943410260388 44.74942413757573
-261.269 182.61307569375865 183.31409172620866 44.24943410260388 44.74942413757573
-262.269 183.31409172620866 184.01510775860865 44.24943410260388 44.74942413757573
-263.269 184.01510775860865 184.71612379105864 44.24943410260388 44.74942413757573
-264.269 184.71612379105864 185.41713982350865 44.24943410260388 44.74942413757573
-265.269 185.41713982350865 186.11815585595866 44.24943410260388 44.74942413757573
-266.269 186.11815585595866 186.81917188840868 44.24943410260388 44.74942413757573
-267.269 186.81917188840868 187.52018792080867 44.24943410260388 44.74942413757573
-268.269 187.52018792080867 188.22120395325865 44.24943410260388 44.74942413757573
-269.269 188.22120395325865 188.92221998570864 44.24943410260388 44.74942413757573
-270.269 188.92221998570864 189.62323601810866 44.24943410260388 44.74942413757573
-271.269 189.62323601810866 190.32425205055864 44.24943410260388 44.74942413757573
-272.269 190.32425205055864 191.02526808300865 44.24943410260388 44.74942413757573
-273.269 191.02526808300865 191.72628411540865 44.24943410260388 44.74942413757573
-274.269 191.72628411540865 192.42730014785866 44.24943410260388 44.74942413757573
-275.269 192.42730014785866 193.12831618030867 44.24943410260388 44.74942413757573
-276.269 193.12831618030867 193.8293322127587 44.24943410260388 44.74942413757573
-277.269 193.8293322127587 194.53034824520867 44.24943410260388 44.74942413757573
-278.269 194.53034824520867 195.23136427760863 44.24943410260388 44.74942413757573
-279.269 195.23136427760863 195.93238031005865 44.24943410260388 44.74942413757573
-280.269 195.93238031005865 196.63339634250866 44.24943410260388 44.74942413757573
-281.269 196.63339634250866 197.33441237490865 44.24943410260388 44.74942413757573
-282.269 197.33441237490865 198.03542840735867 44.24943410260388 44.74942413757573
-283.269 198.03542840735867 198.7476794227991 44.24943410260388 44.74942413757573
-365.269 255.50750808421827 256.2197590996587 44.24943410260388 44.74942413757573
-366.269 256.2197590996587 256.9207751321087 44.24943410260388 44.74942413757573
-367.269 256.9207751321087 257.6217911645087 44.24943410260388 44.74942413757573
-368.269 257.6217911645087 258.3228071969587 44.24943410260388 44.74942413757573
-369.269 258.3228071969587 259.02382322940866 44.24943410260388 44.74942413757573
-370.269 259.02382322940866 259.7248392618086 44.24943410260388 44.74942413757573
-371.269 259.7248392618086 260.42585529425867 44.24943410260388 44.74942413757573
-372.269 260.42585529425867 261.1268713267087 44.24943410260388 44.74942413757573
-373.269 261.1268713267087 261.8278873591587 44.24943410260388 44.74942413757573
-374.269 261.8278873591587 262.52890339160865 44.24943410260388 44.74942413757573
-375.269 262.52890339160865 263.2299194240087 44.24943410260388 44.74942413757573
-376.269 263.2299194240087 263.93093545645866 44.24943410260388 44.74942413757573
-377.269 263.93093545645866 264.6319514889087 44.24943410260388 44.74942413757573
-378.269 264.6319514889087 265.33296752130866 44.24943410260388 44.74942413757573
-379.269 265.33296752130866 266.0339835537586 44.24943410260388 44.74942413757573
-380.269 266.0339835537586 266.7349995862087 44.24943410260388 44.74942413757573
-381.269 266.7349995862087 267.4360156186087 44.24943410260388 44.74942413757573
-382.269 267.4360156186087 268.1370316510587 44.24943410260388 44.74942413757573
-383.269 268.1370316510587 268.83804768350865 44.24943410260388 44.74942413757573
-384.269 268.83804768350865 269.5390637159587 44.24943410260388 44.74942413757573
-385.269 269.5390637159587 270.2400797484087 44.24943410260388 44.74942413757573
-386.269 270.2400797484087 270.9410957808087 44.24943410260388 44.74942413757573
-387.269 270.9410957808087 271.6421118132587 44.24943410260388 44.74942413757573
-388.269 271.6421118132587 272.34312784570864 44.24943410260388 44.74942413757573
-389.269 272.34312784570864 273.0441438781087 44.24943410260388 44.74942413757573
-390.269 273.0441438781087 273.74515991055864 44.24943410260388 44.74942413757573
-391.269 273.74515991055864 274.4461759430086 44.24943410260388 44.74942413757573
-392.269 274.4461759430086 275.15842695839905 44.24943410260388 44.74942413757573
-156.270 109.94212861341957 110.6605681614788 44.74942413757573 45.249413998632505
-157.270 110.6605681614788 111.3676749426788 44.74942413757573 45.249413998632505
-158.270 111.3676749426788 112.07478172387883 44.74942413757573 45.249413998632505
-159.270 112.07478172387883 112.7818885050288 44.74942413757573 45.249413998632505
-160.270 112.7818885050288 113.4889952861788 44.74942413757573 45.249413998632505
-161.270 113.4889952861788 114.1961020673788 44.74942413757573 45.249413998632505
-162.270 114.1961020673788 114.90320884857881 44.74942413757573 45.249413998632505
-163.270 114.90320884857881 115.6103156297788 44.74942413757573 45.249413998632505
-164.270 115.6103156297788 116.31742241097882 44.74942413757573 45.249413998632505
-165.270 116.31742241097882 117.02452919217882 44.74942413757573 45.249413998632505
-166.270 117.02452919217882 117.73163597337883 44.74942413757573 45.249413998632505
-167.270 117.73163597337883 118.43874275452882 44.74942413757573 45.249413998632505
-168.270 118.43874275452882 119.14584953567883 44.74942413757573 45.249413998632505
-169.270 119.14584953567883 119.85295631687882 44.74942413757573 45.249413998632505
-170.270 119.85295631687882 120.56006309807883 44.74942413757573 45.249413998632505
-171.270 120.56006309807883 121.26716987927884 44.74942413757573 45.249413998632505
-172.270 121.26716987927884 121.97427666047884 44.74942413757573 45.249413998632505
-173.270 121.97427666047884 122.6813834416788 44.74942413757573 45.249413998632505
-174.270 122.6813834416788 123.38849022282884 44.74942413757573 45.249413998632505
-175.270 123.38849022282884 124.09559700397884 44.74942413757573 45.249413998632505
-176.270 124.09559700397884 124.80270378517884 44.74942413757573 45.249413998632505
-177.270 124.80270378517884 125.50981056637882 44.74942413757573 45.249413998632505
-178.270 125.50981056637882 126.21691734757883 44.74942413757573 45.249413998632505
-179.270 126.21691734757883 126.92402412877883 44.74942413757573 45.249413998632505
-180.270 126.92402412877883 127.63113090997882 44.74942413757573 45.249413998632505
-181.270 127.63113090997882 128.33823769117882 44.74942413757573 45.249413998632505
-182.270 128.33823769117882 129.04534447232882 44.74942413757573 45.249413998632505
-183.270 129.04534447232882 129.7524512534788 44.74942413757573 45.249413998632505
-184.270 129.7524512534788 130.45955803467882 44.74942413757573 45.249413998632505
-185.270 130.45955803467882 131.16666481587885 44.74942413757573 45.249413998632505
-186.270 131.16666481587885 131.87377159707881 44.74942413757573 45.249413998632505
-187.270 131.87377159707881 132.58087837827884 44.74942413757573 45.249413998632505
-188.270 132.58087837827884 133.28798515947884 44.74942413757573 45.249413998632505
-189.270 133.28798515947884 133.9950919406288 44.74942413757573 45.249413998632505
-190.270 133.9950919406288 134.7021987217788 44.74942413757573 45.249413998632505
-191.270 134.7021987217788 135.4093055029788 44.74942413757573 45.249413998632505
-192.270 135.4093055029788 136.1164122841788 44.74942413757573 45.249413998632505
-193.270 136.1164122841788 136.82351906537883 44.74942413757573 45.249413998632505
-194.270 136.82351906537883 137.5306258465788 44.74942413757573 45.249413998632505
-195.270 137.5306258465788 138.23773262777883 44.74942413757573 45.249413998632505
-196.270 138.23773262777883 138.9448394089788 44.74942413757573 45.249413998632505
-197.270 138.9448394089788 139.6519461901288 44.74942413757573 45.249413998632505
-198.270 139.6519461901288 140.3590529712788 44.74942413757573 45.249413998632505
-199.270 140.3590529712788 141.06615975247882 44.74942413757573 45.249413998632505
-200.270 141.06615975247882 141.7732665336788 44.74942413757573 45.249413998632505
-201.270 141.7732665336788 142.48037331487882 44.74942413757573 45.249413998632505
-202.270 142.48037331487882 143.18748009607884 44.74942413757573 45.249413998632505
-203.270 143.18748009607884 143.8945868772788 44.74942413757573 45.249413998632505
-204.270 143.8945868772788 144.60169365842881 44.74942413757573 45.249413998632505
-205.270 144.60169365842881 145.30880043957885 44.74942413757573 45.249413998632505
-206.270 145.30880043957885 146.01590722077884 44.74942413757573 45.249413998632505
-207.270 146.01590722077884 146.7230140019788 44.74942413757573 45.249413998632505
-208.270 146.7230140019788 147.43012078317884 44.74942413757573 45.249413998632505
-209.270 147.43012078317884 148.1372275643788 44.74942413757573 45.249413998632505
-210.270 148.1372275643788 148.84433434557883 44.74942413757573 45.249413998632505
-211.270 148.84433434557883 149.5514411267288 44.74942413757573 45.249413998632505
-212.270 149.5514411267288 150.25854790787884 44.74942413757573 45.249413998632505
-213.270 150.25854790787884 150.9656546890788 44.74942413757573 45.249413998632505
-214.270 150.9656546890788 151.6727614702788 44.74942413757573 45.249413998632505
-215.270 151.6727614702788 152.37986825147883 44.74942413757573 45.249413998632505
-216.270 152.37986825147883 153.08697503267882 44.74942413757573 45.249413998632505
-217.270 153.08697503267882 153.79408181387882 44.74942413757573 45.249413998632505
-218.270 153.79408181387882 154.50118859507882 44.74942413757573 45.249413998632505
-219.270 154.50118859507882 155.20829537622882 44.74942413757573 45.249413998632505
-220.270 155.20829537622882 155.91540215737882 44.74942413757573 45.249413998632505
-221.270 155.91540215737882 156.62250893857882 44.74942413757573 45.249413998632505
-222.270 156.62250893857882 157.32961571977881 44.74942413757573 45.249413998632505
-223.270 157.32961571977881 158.03672250097884 44.74942413757573 45.249413998632505
-224.270 158.03672250097884 158.74382928217884 44.74942413757573 45.249413998632505
-225.270 158.74382928217884 159.45093606337883 44.74942413757573 45.249413998632505
-226.270 159.45093606337883 160.15804284452884 44.74942413757573 45.249413998632505
-227.270 160.15804284452884 160.86514962567884 44.74942413757573 45.249413998632505
-228.270 160.86514962567884 161.57225640687884 44.74942413757573 45.249413998632505
-229.270 161.57225640687884 162.2793631880788 44.74942413757573 45.249413998632505
-230.270 162.2793631880788 162.9864699692788 44.74942413757573 45.249413998632505
-231.270 162.9864699692788 163.69357675047883 44.74942413757573 45.249413998632505
-232.270 163.69357675047883 164.4006835316788 44.74942413757573 45.249413998632505
-233.270 164.4006835316788 165.10779031287882 44.74942413757573 45.249413998632505
-234.270 165.10779031287882 165.81489709402882 44.74942413757573 45.249413998632505
-235.270 165.81489709402882 166.52200387517883 44.74942413757573 45.249413998632505
-236.270 166.52200387517883 167.2291106563788 44.74942413757573 45.249413998632505
-237.270 167.2291106563788 167.93621743757882 44.74942413757573 45.249413998632505
-238.270 167.93621743757882 168.64332421877884 44.74942413757573 45.249413998632505
-239.270 168.64332421877884 169.3504309999788 44.74942413757573 45.249413998632505
-240.270 169.3504309999788 170.05753778117884 44.74942413757573 45.249413998632505
-241.270 170.05753778117884 170.77597732923806 44.74942413757573 45.249413998632505
-266.270 187.72387454391955 188.4423140919788 44.74942413757573 45.249413998632505
-267.270 188.4423140919788 189.14942087317877 44.74942413757573 45.249413998632505
-268.270 189.14942087317877 189.8565276543788 44.74942413757573 45.249413998632505
-269.270 189.8565276543788 190.56363443557882 44.74942413757573 45.249413998632505
-270.270 190.56363443557882 191.2707412167788 44.74942413757573 45.249413998632505
-271.270 191.2707412167788 191.9778479979288 44.74942413757573 45.249413998632505
-272.270 191.9778479979288 192.6849547790788 44.74942413757573 45.249413998632505
-273.270 192.6849547790788 193.39206156027882 44.74942413757573 45.249413998632505
-274.270 193.39206156027882 194.0991683414788 44.74942413757573 45.249413998632505
-275.270 194.0991683414788 194.8062751226788 44.74942413757573 45.249413998632505
-276.270 194.8062751226788 195.51338190387878 44.74942413757573 45.249413998632505
-277.270 195.51338190387878 196.2204886850788 44.74942413757573 45.249413998632505
-278.270 196.2204886850788 196.9275954662288 44.74942413757573 45.249413998632505
-279.270 196.9275954662288 197.6347022473788 44.74942413757573 45.249413998632505
-280.270 197.6347022473788 198.35314179543803 44.74942413757573 45.249413998632505
-361.270 254.89901875661954 255.6174583046788 44.74942413757573 45.249413998632505
-362.270 255.6174583046788 256.3245650858788 44.74942413757573 45.249413998632505
-363.270 256.3245650858788 257.0316718670788 44.74942413757573 45.249413998632505
-364.270 257.0316718670788 257.73877864827875 44.74942413757573 45.249413998632505
-365.270 257.73877864827875 258.44588542947884 44.74942413757573 45.249413998632505
-366.270 258.44588542947884 259.1529922106788 44.74942413757573 45.249413998632505
-367.270 259.1529922106788 259.8600989918788 44.74942413757573 45.249413998632505
-368.270 259.8600989918788 260.56720577302883 44.74942413757573 45.249413998632505
-369.270 260.56720577302883 261.27431255417883 44.74942413757573 45.249413998632505
-370.270 261.27431255417883 261.98141933537886 44.74942413757573 45.249413998632505
-371.270 261.98141933537886 262.6885261165788 44.74942413757573 45.249413998632505
-372.270 262.6885261165788 263.3956328977788 44.74942413757573 45.249413998632505
-373.270 263.3956328977788 264.10273967897876 44.74942413757573 45.249413998632505
-374.270 264.10273967897876 264.8098464601788 44.74942413757573 45.249413998632505
-375.270 264.8098464601788 265.5169532413288 44.74942413757573 45.249413998632505
-376.270 265.5169532413288 266.22406002247885 44.74942413757573 45.249413998632505
-377.270 266.22406002247885 266.9311668036788 44.74942413757573 45.249413998632505
-378.270 266.9311668036788 267.6382735848788 44.74942413757573 45.249413998632505
-379.270 267.6382735848788 268.34538036607876 44.74942413757573 45.249413998632505
-380.270 268.34538036607876 269.0524871472788 44.74942413757573 45.249413998632505
-381.270 269.0524871472788 269.7595939284788 44.74942413757573 45.249413998632505
-382.270 269.7595939284788 270.46670070962875 44.74942413757573 45.249413998632505
-383.270 270.46670070962875 271.1738074907788 44.74942413757573 45.249413998632505
-384.270 271.1738074907788 271.8809142719788 44.74942413757573 45.249413998632505
-385.270 271.8809142719788 272.5880210531788 44.74942413757573 45.249413998632505
-386.270 272.5880210531788 273.29512783437883 44.74942413757573 45.249413998632505
-387.270 273.29512783437883 274.0022346155788 44.74942413757573 45.249413998632505
-388.270 274.0022346155788 274.70934139677877 44.74942413757573 45.249413998632505
-389.270 274.70934139677877 275.4164481779788 44.74942413757573 45.249413998632505
-390.270 275.4164481779788 276.134887726038 44.74942413757573 45.249413998632505
-154.271 109.48750146193713 110.21229370834565 45.249413998632505 45.74940367959586
-155.271 110.21229370834565 110.92565280554567 45.249413998632505 45.74940367959586
-156.271 110.92565280554567 111.63901190274566 45.249413998632505 45.74940367959586
-157.271 111.63901190274566 112.35237099994566 45.249413998632505 45.74940367959586
-158.271 112.35237099994566 113.06573009714566 45.249413998632505 45.74940367959586
-159.271 113.06573009714566 113.77908919434566 45.249413998632505 45.74940367959586
-160.271 113.77908919434566 114.49244829154567 45.249413998632505 45.74940367959586
-161.271 114.49244829154567 115.20580738874565 45.249413998632505 45.74940367959586
-162.271 115.20580738874565 115.91916648594565 45.249413998632505 45.74940367959586
-163.271 115.91916648594565 116.63252558314565 45.249413998632505 45.74940367959586
-164.271 116.63252558314565 117.34588468034565 45.249413998632505 45.74940367959586
-165.271 117.34588468034565 118.05924377754565 45.249413998632505 45.74940367959586
-166.271 118.05924377754565 118.77260287474564 45.249413998632505 45.74940367959586
-167.271 118.77260287474564 119.48596197194567 45.249413998632505 45.74940367959586
-168.271 119.48596197194567 120.19932106914565 45.249413998632505 45.74940367959586
-169.271 120.19932106914565 120.91268016634565 45.249413998632505 45.74940367959586
-170.271 120.91268016634565 121.62603926354565 45.249413998632505 45.74940367959586
-171.271 121.62603926354565 122.33939836074565 45.249413998632505 45.74940367959586
-172.271 122.33939836074565 123.05275745794566 45.249413998632505 45.74940367959586
-173.271 123.05275745794566 123.76611655514566 45.249413998632505 45.74940367959586
-174.271 123.76611655514566 124.47947565234566 45.249413998632505 45.74940367959586
-175.271 124.47947565234566 125.19283474954565 45.249413998632505 45.74940367959586
-176.271 125.19283474954565 125.90619384674565 45.249413998632505 45.74940367959586
-177.271 125.90619384674565 126.61955294394565 45.249413998632505 45.74940367959586
-178.271 126.61955294394565 127.33291204114565 45.249413998632505 45.74940367959586
-179.271 127.33291204114565 128.04627113834565 45.249413998632505 45.74940367959586
-180.271 128.04627113834565 128.75963023554561 45.249413998632505 45.74940367959586
-181.271 128.75963023554561 129.4729893327456 45.249413998632505 45.74940367959586
-182.271 129.4729893327456 130.1863484299456 45.249413998632505 45.74940367959586
-183.271 130.1863484299456 130.89970752714567 45.249413998632505 45.74940367959586
-184.271 130.89970752714567 131.61306662434566 45.249413998632505 45.74940367959586
-185.271 131.61306662434566 132.32642572154566 45.249413998632505 45.74940367959586
-186.271 132.32642572154566 133.03978481874566 45.249413998632505 45.74940367959586
-187.271 133.03978481874566 133.75314391594566 45.249413998632505 45.74940367959586
-188.271 133.75314391594566 134.46650301314565 45.249413998632505 45.74940367959586
-189.271 134.46650301314565 135.17986211034565 45.249413998632505 45.74940367959586
-190.271 135.17986211034565 135.89322120754565 45.249413998632505 45.74940367959586
-191.271 135.89322120754565 136.60658030474565 45.249413998632505 45.74940367959586
-192.271 136.60658030474565 137.31993940194565 45.249413998632505 45.74940367959586
-193.271 137.31993940194565 138.03329849914564 45.249413998632505 45.74940367959586
-194.271 138.03329849914564 138.74665759634564 45.249413998632505 45.74940367959586
-195.271 138.74665759634564 139.46001669354564 45.249413998632505 45.74940367959586
-196.271 139.46001669354564 140.17337579074564 45.249413998632505 45.74940367959586
-197.271 140.17337579074564 140.88673488794566 45.249413998632505 45.74940367959586
-198.271 140.88673488794566 141.6000939851457 45.249413998632505 45.74940367959586
-199.271 141.6000939851457 142.3134530823457 45.249413998632505 45.74940367959586
-200.271 142.3134530823457 143.0268121795457 45.249413998632505 45.74940367959586
-201.271 143.0268121795457 143.74017127674568 45.249413998632505 45.74940367959586
-202.271 143.74017127674568 144.45353037394568 45.249413998632505 45.74940367959586
-203.271 144.45353037394568 145.16688947114568 45.249413998632505 45.74940367959586
-204.271 145.16688947114568 145.88024856834568 45.249413998632505 45.74940367959586
-205.271 145.88024856834568 146.59360766554565 45.249413998632505 45.74940367959586
-206.271 146.59360766554565 147.30696676274565 45.249413998632505 45.74940367959586
-207.271 147.30696676274565 148.02032585994564 45.249413998632505 45.74940367959586
-208.271 148.02032585994564 148.73368495714564 45.249413998632505 45.74940367959586
-209.271 148.73368495714564 149.44704405434564 45.249413998632505 45.74940367959586
-210.271 149.44704405434564 150.16040315154564 45.249413998632505 45.74940367959586
-211.271 150.16040315154564 150.87376224874566 45.249413998632505 45.74940367959586
-212.271 150.87376224874566 151.58712134594566 45.249413998632505 45.74940367959586
-213.271 151.58712134594566 152.30048044314566 45.249413998632505 45.74940367959586
-214.271 152.30048044314566 153.01383954034566 45.249413998632505 45.74940367959586
-215.271 153.01383954034566 153.72719863754565 45.249413998632505 45.74940367959586
-216.271 153.72719863754565 154.44055773474565 45.249413998632505 45.74940367959586
-217.271 154.44055773474565 155.15391683194565 45.249413998632505 45.74940367959586
-218.271 155.15391683194565 155.86727592914565 45.249413998632505 45.74940367959586
-219.271 155.86727592914565 156.58063502634565 45.249413998632505 45.74940367959586
-220.271 156.58063502634565 157.29399412354564 45.249413998632505 45.74940367959586
-221.271 157.29399412354564 158.00735322074564 45.249413998632505 45.74940367959586
-222.271 158.00735322074564 158.72071231794564 45.249413998632505 45.74940367959586
-223.271 158.72071231794564 159.43407141514564 45.249413998632505 45.74940367959586
-224.271 159.43407141514564 160.14743051234564 45.249413998632505 45.74940367959586
-225.271 160.14743051234564 160.86078960954563 45.249413998632505 45.74940367959586
-226.271 160.86078960954563 161.57414870674566 45.249413998632505 45.74940367959586
-227.271 161.57414870674566 162.2875078039457 45.249413998632505 45.74940367959586
-228.271 162.2875078039457 163.00086690114568 45.249413998632505 45.74940367959586
-229.271 163.00086690114568 163.71422599834568 45.249413998632505 45.74940367959586
-230.271 163.71422599834568 164.42758509554568 45.249413998632505 45.74940367959586
-231.271 164.42758509554568 165.14094419274568 45.249413998632505 45.74940367959586
-232.271 165.14094419274568 165.85430328994568 45.249413998632505 45.74940367959586
-233.271 165.85430328994568 166.56766238714567 45.249413998632505 45.74940367959586
-234.271 166.56766238714567 167.28102148434567 45.249413998632505 45.74940367959586
-235.271 167.28102148434567 167.99438058154564 45.249413998632505 45.74940367959586
-236.271 167.99438058154564 168.70773967874564 45.249413998632505 45.74940367959586
-237.271 168.70773967874564 169.42109877594567 45.249413998632505 45.74940367959586
-238.271 169.42109877594567 170.1458910223542 45.249413998632505 45.74940367959586
-264.271 187.9570021539371 188.68179440034567 45.249413998632505 45.74940367959586
-265.271 188.68179440034567 189.39515349754566 45.249413998632505 45.74940367959586
-266.271 189.39515349754566 190.10851259474566 45.249413998632505 45.74940367959586
-267.271 190.10851259474566 190.82187169194566 45.249413998632505 45.74940367959586
-268.271 190.82187169194566 191.53523078914566 45.249413998632505 45.74940367959586
-269.271 191.53523078914566 192.24858988634566 45.249413998632505 45.74940367959586
-270.271 192.24858988634566 192.96194898354565 45.249413998632505 45.74940367959586
-271.271 192.96194898354565 193.67530808074565 45.249413998632505 45.74940367959586
-272.271 193.67530808074565 194.38866717794565 45.249413998632505 45.74940367959586
-273.271 194.38866717794565 195.10202627514565 45.249413998632505 45.74940367959586
-274.271 195.10202627514565 195.81538537234565 45.249413998632505 45.74940367959586
-275.271 195.81538537234565 196.52874446954564 45.249413998632505 45.74940367959586
-276.271 196.52874446954564 197.24210356674564 45.249413998632505 45.74940367959586
-277.271 197.24210356674564 197.95546266394564 45.249413998632505 45.74940367959586
-278.271 197.95546266394564 198.6802549103542 45.249413998632505 45.74940367959586
-357.271 254.29939819353712 255.02419043994564 45.249413998632505 45.74940367959586
-358.271 255.02419043994564 255.73754953714564 45.249413998632505 45.74940367959586
-359.271 255.73754953714564 256.45090863434564 45.249413998632505 45.74940367959586
-360.271 256.45090863434564 257.16426773154564 45.249413998632505 45.74940367959586
-361.271 257.16426773154564 257.87762682874563 45.249413998632505 45.74940367959586
-362.271 257.87762682874563 258.59098592594563 45.249413998632505 45.74940367959586
-363.271 258.59098592594563 259.30434502314563 45.249413998632505 45.74940367959586
-364.271 259.30434502314563 260.0177041203456 45.249413998632505 45.74940367959586
-365.271 260.0177041203456 260.7310632175456 45.249413998632505 45.74940367959586
-366.271 260.7310632175456 261.4444223147457 45.249413998632505 45.74940367959586
-367.271 261.4444223147457 262.1577814119457 45.249413998632505 45.74940367959586
-368.271 262.1577814119457 262.8711405091457 45.249413998632505 45.74940367959586
-369.271 262.8711405091457 263.5844996063457 45.249413998632505 45.74940367959586
-370.271 263.5844996063457 264.29785870354567 45.249413998632505 45.74940367959586
-371.271 264.29785870354567 265.01121780074567 45.249413998632505 45.74940367959586
-372.271 265.01121780074567 265.72457689794567 45.249413998632505 45.74940367959586
-373.271 265.72457689794567 266.43793599514566 45.249413998632505 45.74940367959586
-374.271 266.43793599514566 267.15129509234566 45.249413998632505 45.74940367959586
-375.271 267.15129509234566 267.86465418954566 45.249413998632505 45.74940367959586
-376.271 267.86465418954566 268.57801328674566 45.249413998632505 45.74940367959586
-377.271 268.57801328674566 269.29137238394566 45.249413998632505 45.74940367959586
-378.271 269.29137238394566 270.00473148114565 45.249413998632505 45.74940367959586
-379.271 270.00473148114565 270.71809057834565 45.249413998632505 45.74940367959586
-380.271 270.71809057834565 271.43144967554565 45.249413998632505 45.74940367959586
-381.271 271.43144967554565 272.14480877274565 45.249413998632505 45.74940367959586
-382.271 272.14480877274565 272.85816786994565 45.249413998632505 45.74940367959586
-383.271 272.85816786994565 273.5715269671457 45.249413998632505 45.74940367959586
-384.271 273.5715269671457 274.28488606434564 45.249413998632505 45.74940367959586
-385.271 274.28488606434564 274.99824516154564 45.249413998632505 45.74940367959586
-386.271 274.99824516154564 275.71160425874564 45.249413998632505 45.74940367959586
-387.271 275.71160425874564 276.4363965051542 45.249413998632505 45.74940367959586
-153.272 109.75291796655388 110.48423245168883 45.74940367959586 46.24939317401014
-154.272 110.48423245168883 111.20401072148883 45.74940367959586 46.24939317401014
-155.272 111.20401072148883 111.92378899128883 45.74940367959586 46.24939317401014
-156.272 111.92378899128883 112.64356726108883 45.74940367959586 46.24939317401014
-157.272 112.64356726108883 113.36334553088882 45.74940367959586 46.24939317401014
-158.272 113.36334553088882 114.08312380068882 45.74940367959586 46.24939317401014
-159.272 114.08312380068882 114.80290207053883 45.74940367959586 46.24939317401014
-160.272 114.80290207053883 115.52268034038883 45.74940367959586 46.24939317401014
-161.272 115.52268034038883 116.24245861018882 45.74940367959586 46.24939317401014
-162.272 116.24245861018882 116.96223687998884 45.74940367959586 46.24939317401014
-163.272 116.96223687998884 117.68201514978884 45.74940367959586 46.24939317401014
-164.272 117.68201514978884 118.40179341958883 45.74940367959586 46.24939317401014
-165.272 118.40179341958883 119.12157168938883 45.74940367959586 46.24939317401014
-166.272 119.12157168938883 119.84134995918882 45.74940367959586 46.24939317401014
-167.272 119.84134995918882 120.56112822903883 45.74940367959586 46.24939317401014
-168.272 120.56112822903883 121.28090649888883 45.74940367959586 46.24939317401014
-169.272 121.28090649888883 122.00068476868884 45.74940367959586 46.24939317401014
-170.272 122.00068476868884 122.72046303848883 45.74940367959586 46.24939317401014
-171.272 122.72046303848883 123.44024130828883 45.74940367959586 46.24939317401014
-172.272 123.44024130828883 124.16001957808882 45.74940367959586 46.24939317401014
-173.272 124.16001957808882 124.87979784788884 45.74940367959586 46.24939317401014
-174.272 124.87979784788884 125.59957611773882 45.74940367959586 46.24939317401014
-175.272 125.59957611773882 126.31935438758883 45.74940367959586 46.24939317401014
-176.272 126.31935438758883 127.03913265738883 45.74940367959586 46.24939317401014
-177.272 127.03913265738883 127.75891092718884 45.74940367959586 46.24939317401014
-178.272 127.75891092718884 128.47868919698885 45.74940367959586 46.24939317401014
-179.272 128.47868919698885 129.19846746678886 45.74940367959586 46.24939317401014
-180.272 129.19846746678886 129.91824573658883 45.74940367959586 46.24939317401014
-181.272 129.91824573658883 130.63802400638883 45.74940367959586 46.24939317401014
-182.272 130.63802400638883 131.35780227623883 45.74940367959586 46.24939317401014
-183.272 131.35780227623883 132.07758054608883 45.74940367959586 46.24939317401014
-184.272 132.07758054608883 132.79735881588886 45.74940367959586 46.24939317401014
-185.272 132.79735881588886 133.51713708568886 45.74940367959586 46.24939317401014
-186.272 133.51713708568886 134.2369153554888 45.74940367959586 46.24939317401014
-187.272 134.2369153554888 134.95669362528884 45.74940367959586 46.24939317401014
-188.272 134.95669362528884 135.67647189508884 45.74940367959586 46.24939317401014
-189.272 135.67647189508884 136.3962501648888 45.74940367959586 46.24939317401014
-190.272 136.3962501648888 137.11602843473884 45.74940367959586 46.24939317401014
-191.272 137.11602843473884 137.83580670458883 45.74940367959586 46.24939317401014
-192.272 137.83580670458883 138.5555849743888 45.74940367959586 46.24939317401014
-193.272 138.5555849743888 139.27536324418884 45.74940367959586 46.24939317401014
-194.272 139.27536324418884 139.99514151398884 45.74940367959586 46.24939317401014
-195.272 139.99514151398884 140.71491978378884 45.74940367959586 46.24939317401014
-196.272 140.71491978378884 141.43469805358882 45.74940367959586 46.24939317401014
-197.272 141.43469805358882 142.15447632338885 45.74940367959586 46.24939317401014
-198.272 142.15447632338885 142.87425459323885 45.74940367959586 46.24939317401014
-199.272 142.87425459323885 143.59403286308884 45.74940367959586 46.24939317401014
-200.272 143.59403286308884 144.31381113288884 45.74940367959586 46.24939317401014
-201.272 144.31381113288884 145.03358940268882 45.74940367959586 46.24939317401014
-202.272 145.03358940268882 145.75336767248882 45.74940367959586 46.24939317401014
-203.272 145.75336767248882 146.47314594228885 45.74940367959586 46.24939317401014
-204.272 146.47314594228885 147.19292421208883 45.74940367959586 46.24939317401014
-205.272 147.19292421208883 147.91270248188883 45.74940367959586 46.24939317401014
-206.272 147.91270248188883 148.63248075173885 45.74940367959586 46.24939317401014
-207.272 148.63248075173885 149.35225902158885 45.74940367959586 46.24939317401014
-208.272 149.35225902158885 150.07203729138882 45.74940367959586 46.24939317401014
-209.272 150.07203729138882 150.79181556118886 45.74940367959586 46.24939317401014
-210.272 150.79181556118886 151.51159383098883 45.74940367959586 46.24939317401014
-211.272 151.51159383098883 152.2313721007888 45.74940367959586 46.24939317401014
-212.272 152.2313721007888 152.95115037058883 45.74940367959586 46.24939317401014
-213.272 152.95115037058883 153.67092864043883 45.74940367959586 46.24939317401014
-214.272 153.67092864043883 154.39070691028883 45.74940367959586 46.24939317401014
-215.272 154.39070691028883 155.11048518008886 45.74940367959586 46.24939317401014
-216.272 155.11048518008886 155.83026344988883 45.74940367959586 46.24939317401014
-217.272 155.83026344988883 156.5500417196888 45.74940367959586 46.24939317401014
-218.272 156.5500417196888 157.26981998948884 45.74940367959586 46.24939317401014
-219.272 157.26981998948884 157.9895982592888 45.74940367959586 46.24939317401014
-220.272 157.9895982592888 158.70937652908881 45.74940367959586 46.24939317401014
-221.272 158.70937652908881 159.42915479893884 45.74940367959586 46.24939317401014
-222.272 159.42915479893884 160.14893306878884 45.74940367959586 46.24939317401014
-223.272 160.14893306878884 160.8687113385888 45.74940367959586 46.24939317401014
-224.272 160.8687113385888 161.58848960838884 45.74940367959586 46.24939317401014
-225.272 161.58848960838884 162.30826787818881 45.74940367959586 46.24939317401014
-226.272 162.30826787818881 163.0280461479888 45.74940367959586 46.24939317401014
-227.272 163.0280461479888 163.74782441778882 45.74940367959586 46.24939317401014
-228.272 163.74782441778882 164.46760268758885 45.74940367959586 46.24939317401014
-229.272 164.46760268758885 165.18738095743882 45.74940367959586 46.24939317401014
-230.272 165.18738095743882 165.90715922728884 45.74940367959586 46.24939317401014
-231.272 165.90715922728884 166.62693749708882 45.74940367959586 46.24939317401014
-232.272 166.62693749708882 167.3467157668888 45.74940367959586 46.24939317401014
-233.272 167.3467157668888 168.06649403668882 45.74940367959586 46.24939317401014
-234.272 168.06649403668882 168.78627230648885 45.74940367959586 46.24939317401014
-235.272 168.78627230648885 169.50605057628883 45.74940367959586 46.24939317401014
-236.272 169.50605057628883 170.23736506142376 45.74940367959586 46.24939317401014
-261.272 187.48897110635386 188.22028559148882 45.74940367959586 46.24939317401014
-262.272 188.22028559148882 188.94006386128882 45.74940367959586 46.24939317401014
-263.272 188.94006386128882 189.6598421310888 45.74940367959586 46.24939317401014
-264.272 189.6598421310888 190.37962040088883 45.74940367959586 46.24939317401014
-265.272 190.37962040088883 191.09939867068883 45.74940367959586 46.24939317401014
-266.272 191.09939867068883 191.81917694048883 45.74940367959586 46.24939317401014
-267.272 191.81917694048883 192.5389552102888 45.74940367959586 46.24939317401014
-268.272 192.5389552102888 193.2587334801388 45.74940367959586 46.24939317401014
-269.272 193.2587334801388 193.97851174998883 45.74940367959586 46.24939317401014
-270.272 193.97851174998883 194.69829001978883 45.74940367959586 46.24939317401014
-271.272 194.69829001978883 195.41806828958883 45.74940367959586 46.24939317401014
-272.272 195.41806828958883 196.13784655938883 45.74940367959586 46.24939317401014
-273.272 196.13784655938883 196.8576248291888 45.74940367959586 46.24939317401014
-274.272 196.8576248291888 197.5774030989888 45.74940367959586 46.24939317401014
-275.272 197.5774030989888 198.2971813687888 45.74940367959586 46.24939317401014
-276.272 198.2971813687888 199.0169596386388 45.74940367959586 46.24939317401014
-277.272 199.0169596386388 199.74827412382376 45.74940367959586 46.24939317401014
-355.272 255.14812846875387 255.87944295388883 45.74940367959586 46.24939317401014
-356.272 255.87944295388883 256.5992212236888 45.74940367959586 46.24939317401014
-357.272 256.5992212236888 257.31899949348883 45.74940367959586 46.24939317401014
-358.272 257.31899949348883 258.0387777632888 45.74940367959586 46.24939317401014
-359.272 258.0387777632888 258.75855603308884 45.74940367959586 46.24939317401014
-360.272 258.75855603308884 259.4783343028888 45.74940367959586 46.24939317401014
-361.272 259.4783343028888 260.1981125727388 45.74940367959586 46.24939317401014
-362.272 260.1981125727388 260.9178908425888 45.74940367959586 46.24939317401014
-363.272 260.9178908425888 261.63766911238883 45.74940367959586 46.24939317401014
-364.272 261.63766911238883 262.35744738218887 45.74940367959586 46.24939317401014
-365.272 262.35744738218887 263.07722565198884 45.74940367959586 46.24939317401014
-366.272 263.07722565198884 263.7970039217888 45.74940367959586 46.24939317401014
-367.272 263.7970039217888 264.51678219158885 45.74940367959586 46.24939317401014
-368.272 264.51678219158885 265.2365604613888 45.74940367959586 46.24939317401014
-369.272 265.2365604613888 265.9563387312388 45.74940367959586 46.24939317401014
-370.272 265.9563387312388 266.67611700108887 45.74940367959586 46.24939317401014
-371.272 266.67611700108887 267.39589527088884 45.74940367959586 46.24939317401014
-372.272 267.39589527088884 268.1156735406888 45.74940367959586 46.24939317401014
-373.272 268.1156735406888 268.8354518104888 45.74940367959586 46.24939317401014
-374.272 268.8354518104888 269.55523008028877 45.74940367959586 46.24939317401014
-375.272 269.55523008028877 270.2750083500888 45.74940367959586 46.24939317401014
-376.272 270.2750083500888 270.9947866198888 45.74940367959586 46.24939317401014
-377.272 270.9947866198888 271.7145648897388 45.74940367959586 46.24939317401014
-378.272 271.7145648897388 272.4343431595888 45.74940367959586 46.24939317401014
-379.272 272.4343431595888 273.1541214293888 45.74940367959586 46.24939317401014
-380.272 273.1541214293888 273.87389969918877 45.74940367959586 46.24939317401014
-381.272 273.87389969918877 274.5936779689888 45.74940367959586 46.24939317401014
-382.272 274.5936779689888 275.31345623878883 45.74940367959586 46.24939317401014
-383.272 275.31345623878883 276.03323450858886 45.74940367959586 46.24939317401014
-384.272 276.03323450858886 276.7645489937238 45.74940367959586 46.24939317401014
-152.273 110.03160941443437 110.76962130460572 46.24939317401014 46.74938247512624
-153.273 110.76962130460572 111.4959911402057 46.24939317401014 46.74938247512624
-154.273 111.4959911402057 112.22236097580571 46.24939317401014 46.74938247512624
-155.273 112.22236097580571 112.94873081145572 46.24939317401014 46.74938247512624
-156.273 112.94873081145572 113.67510064710571 46.24939317401014 46.74938247512624
-157.273 113.67510064710571 114.4014704827057 46.24939317401014 46.74938247512624
-158.273 114.4014704827057 115.12784031830572 46.24939317401014 46.74938247512624
-159.273 115.12784031830572 115.8542101539557 46.24939317401014 46.74938247512624
-160.273 115.8542101539557 116.58057998960572 46.24939317401014 46.74938247512624
-161.273 116.58057998960572 117.30694982520572 46.24939317401014 46.74938247512624
-162.273 117.30694982520572 118.03331966085568 46.24939317401014 46.74938247512624
-163.273 118.03331966085568 118.7596894965057 46.24939317401014 46.74938247512624
-164.273 118.7596894965057 119.48605933210573 46.24939317401014 46.74938247512624
-165.273 119.48605933210573 120.2124291677057 46.24939317401014 46.74938247512624
-166.273 120.2124291677057 120.93879900335571 46.24939317401014 46.74938247512624
-167.273 120.93879900335571 121.6651688390057 46.24939317401014 46.74938247512624
-168.273 121.6651688390057 122.39153867460573 46.24939317401014 46.74938247512624
-169.273 122.39153867460573 123.11790851020572 46.24939317401014 46.74938247512624
-170.273 123.11790851020572 123.84427834585571 46.24939317401014 46.74938247512624
-171.273 123.84427834585571 124.5706481815057 46.24939317401014 46.74938247512624
-172.273 124.5706481815057 125.29701801710573 46.24939317401014 46.74938247512624
-173.273 125.29701801710573 126.02338785275572 46.24939317401014 46.74938247512624
-174.273 126.02338785275572 126.74975768840571 46.24939317401014 46.74938247512624
-175.273 126.74975768840571 127.4761275240057 46.24939317401014 46.74938247512624
-176.273 127.4761275240057 128.20249735960573 46.24939317401014 46.74938247512624
-177.273 128.20249735960573 128.9288671952557 46.24939317401014 46.74938247512624
-178.273 128.9288671952557 129.6552370309057 46.24939317401014 46.74938247512624
-179.273 129.6552370309057 130.3816068665057 46.24939317401014 46.74938247512624
-180.273 130.3816068665057 131.10797670210573 46.24939317401014 46.74938247512624
-181.273 131.10797670210573 131.83434653775572 46.24939317401014 46.74938247512624
-182.273 131.83434653775572 132.56071637340568 46.24939317401014 46.74938247512624
-183.273 132.56071637340568 133.28708620900568 46.24939317401014 46.74938247512624
-184.273 133.28708620900568 134.0134560446557 46.24939317401014 46.74938247512624
-185.273 134.0134560446557 134.73982588030572 46.24939317401014 46.74938247512624
-186.273 134.73982588030572 135.4661957159057 46.24939317401014 46.74938247512624
-187.273 135.4661957159057 136.1925655515057 46.24939317401014 46.74938247512624
-188.273 136.1925655515057 136.91893538715573 46.24939317401014 46.74938247512624
-189.273 136.91893538715573 137.64530522280572 46.24939317401014 46.74938247512624
-190.273 137.64530522280572 138.37167505840569 46.24939317401014 46.74938247512624
-191.273 138.37167505840569 139.09804489400568 46.24939317401014 46.74938247512624
-192.273 139.09804489400568 139.8244147296557 46.24939317401014 46.74938247512624
-193.273 139.8244147296557 140.55078456530572 46.24939317401014 46.74938247512624
-194.273 140.55078456530572 141.27715440090572 46.24939317401014 46.74938247512624
-195.273 141.27715440090572 142.0035242365557 46.24939317401014 46.74938247512624
-196.273 142.0035242365557 142.7298940722057 46.24939317401014 46.74938247512624
-197.273 142.7298940722057 143.4562639078057 46.24939317401014 46.74938247512624
-198.273 143.4562639078057 144.1826337434057 46.24939317401014 46.74938247512624
-199.273 144.1826337434057 144.9090035790557 46.24939317401014 46.74938247512624
-200.273 144.9090035790557 145.63537341470573 46.24939317401014 46.74938247512624
-201.273 145.63537341470573 146.36174325030572 46.24939317401014 46.74938247512624
-202.273 146.36174325030572 147.08811308590572 46.24939317401014 46.74938247512624
-203.273 147.08811308590572 147.8144829215557 46.24939317401014 46.74938247512624
-204.273 147.8144829215557 148.54085275720573 46.24939317401014 46.74938247512624
-205.273 148.54085275720573 149.26722259280572 46.24939317401014 46.74938247512624
-206.273 149.26722259280572 149.9935924284557 46.24939317401014 46.74938247512624
-207.273 149.9935924284557 150.71996226410573 46.24939317401014 46.74938247512624
-208.273 150.71996226410573 151.44633209970573 46.24939317401014 46.74938247512624
-209.273 151.44633209970573 152.17270193530572 46.24939317401014 46.74938247512624
-210.273 152.17270193530572 152.8990717709557 46.24939317401014 46.74938247512624
-211.273 152.8990717709557 153.6254416066057 46.24939317401014 46.74938247512624
-212.273 153.6254416066057 154.3518114422057 46.24939317401014 46.74938247512624
-213.273 154.3518114422057 155.07818127785572 46.24939317401014 46.74938247512624
-214.273 155.07818127785572 155.8045511135057 46.24939317401014 46.74938247512624
-215.273 155.8045511135057 156.53092094910573 46.24939317401014 46.74938247512624
-216.273 156.53092094910573 157.25729078470573 46.24939317401014 46.74938247512624
-217.273 157.25729078470573 157.98366062035572 46.24939317401014 46.74938247512624
-218.273 157.98366062035572 158.7100304560057 46.24939317401014 46.74938247512624
-219.273 158.7100304560057 159.4364002916057 46.24939317401014 46.74938247512624
-220.273 159.4364002916057 160.1627701272057 46.24939317401014 46.74938247512624
-221.273 160.1627701272057 160.88913996285572 46.24939317401014 46.74938247512624
-222.273 160.88913996285572 161.6155097985057 46.24939317401014 46.74938247512624
-223.273 161.6155097985057 162.34187963410568 46.24939317401014 46.74938247512624
-224.273 162.34187963410568 163.0682494697557 46.24939317401014 46.74938247512624
-225.273 163.0682494697557 163.79461930540572 46.24939317401014 46.74938247512624
-226.273 163.79461930540572 164.5209891410057 46.24939317401014 46.74938247512624
-227.273 164.5209891410057 165.2473589766057 46.24939317401014 46.74938247512624
-228.273 165.2473589766057 165.97372881225573 46.24939317401014 46.74938247512624
-229.273 165.97372881225573 166.7000986479057 46.24939317401014 46.74938247512624
-230.273 166.7000986479057 167.4264684835057 46.24939317401014 46.74938247512624
-231.273 167.4264684835057 168.1528383191057 46.24939317401014 46.74938247512624
-232.273 168.1528383191057 168.8792081547557 46.24939317401014 46.74938247512624
-233.273 168.8792081547557 169.60557799040572 46.24939317401014 46.74938247512624
-234.273 169.60557799040572 170.34358988057707 46.24939317401014 46.74938247512624
-259.273 187.75318182653433 188.49119371670568 46.24939317401014 46.74938247512624
-260.273 188.49119371670568 189.2175635523057 46.24939317401014 46.74938247512624
-261.273 189.2175635523057 189.9439333879557 46.24939317401014 46.74938247512624
-262.273 189.9439333879557 190.67030322360569 46.24939317401014 46.74938247512624
-263.273 190.67030322360569 191.39667305920568 46.24939317401014 46.74938247512624
-264.273 191.39667305920568 192.12304289480568 46.24939317401014 46.74938247512624
-265.273 192.12304289480568 192.8494127304557 46.24939317401014 46.74938247512624
-266.273 192.8494127304557 193.5757825661057 46.24939317401014 46.74938247512624
-267.273 193.5757825661057 194.30215240170568 46.24939317401014 46.74938247512624
-268.273 194.30215240170568 195.02852223735567 46.24939317401014 46.74938247512624
-269.273 195.02852223735567 195.7548920730057 46.24939317401014 46.74938247512624
-270.273 195.7548920730057 196.4812619086057 46.24939317401014 46.74938247512624
-271.273 196.4812619086057 197.20763174420568 46.24939317401014 46.74938247512624
-272.273 197.20763174420568 197.9340015798557 46.24939317401014 46.74938247512624
-273.273 197.9340015798557 198.6603714155057 46.24939317401014 46.74938247512624
-274.273 198.6603714155057 199.39838330567704 46.24939317401014 46.74938247512624
-344.273 249.49461785483436 250.23262974500568 46.24939317401014 46.74938247512624
-345.273 250.23262974500568 250.9589995806557 46.24939317401014 46.74938247512624
-346.273 250.9589995806557 251.6853694163057 46.24939317401014 46.74938247512624
-347.273 251.6853694163057 252.4117392519057 46.24939317401014 46.74938247512624
-348.273 252.4117392519057 253.1381090875057 46.24939317401014 46.74938247512624
-349.273 253.1381090875057 253.86447892315567 46.24939317401014 46.74938247512624
-350.273 253.86447892315567 254.5908487588057 46.24939317401014 46.74938247512624
-351.273 254.5908487588057 255.31721859440572 46.24939317401014 46.74938247512624
-352.273 255.31721859440572 256.0435884300557 46.24939317401014 46.74938247512624
-353.273 256.0435884300557 256.7699582657057 46.24939317401014 46.74938247512624
-354.273 256.7699582657057 257.4963281013057 46.24939317401014 46.74938247512624
-355.273 257.4963281013057 258.2226979369057 46.24939317401014 46.74938247512624
-356.273 258.2226979369057 258.9490677725557 46.24939317401014 46.74938247512624
-357.273 258.9490677725557 259.6754376082057 46.24939317401014 46.74938247512624
-358.273 259.6754376082057 260.40180744380564 46.24939317401014 46.74938247512624
-359.273 260.40180744380564 261.1281772794057 46.24939317401014 46.74938247512624
-360.273 261.1281772794057 261.8545471150557 46.24939317401014 46.74938247512624
-361.273 261.8545471150557 262.5809169507057 46.24939317401014 46.74938247512624
-362.273 262.5809169507057 263.30728678630567 46.24939317401014 46.74938247512624
-363.273 263.30728678630567 264.0336566219557 46.24939317401014 46.74938247512624
-364.273 264.0336566219557 264.7600264576057 46.24939317401014 46.74938247512624
-365.273 264.7600264576057 265.48639629320564 46.24939317401014 46.74938247512624
-366.273 265.48639629320564 266.2127661288057 46.24939317401014 46.74938247512624
-367.273 266.2127661288057 266.93913596445566 46.24939317401014 46.74938247512624
-368.273 266.93913596445566 267.66550580010573 46.24939317401014 46.74938247512624
-369.273 267.66550580010573 268.3918756357057 46.24939317401014 46.74938247512624
-370.273 268.3918756357057 269.1182454713057 46.24939317401014 46.74938247512624
-371.273 269.1182454713057 269.8446153069557 46.24939317401014 46.74938247512624
-372.273 269.8446153069557 270.5709851426057 46.24939317401014 46.74938247512624
-373.273 270.5709851426057 271.2973549782057 46.24939317401014 46.74938247512624
-374.273 271.2973549782057 272.02372481385567 46.24939317401014 46.74938247512624
-375.273 272.02372481385567 272.75009464950574 46.24939317401014 46.74938247512624
-376.273 272.75009464950574 273.4764644851057 46.24939317401014 46.74938247512624
-377.273 273.4764644851057 274.20283432070573 46.24939317401014 46.74938247512624
-378.273 274.20283432070573 274.9292041563557 46.24939317401014 46.74938247512624
-379.273 274.9292041563557 275.65557399200566 46.24939317401014 46.74938247512624
-380.273 275.65557399200566 276.39358588217704 46.24939317401014 46.74938247512624
-151.274 110.32393108627903 111.06882143955266 46.74938247512624 47.24937157588444
-152.274 111.06882143955266 111.80196103235265 46.74938247512624 47.24937157588444
-153.274 111.80196103235265 112.53510062520263 46.74938247512624 47.24937157588444
-154.274 112.53510062520263 113.26824021805263 46.74938247512624 47.24937157588444
-155.274 113.26824021805263 114.00137981085264 46.74938247512624 47.24937157588444
-156.274 114.00137981085264 114.73451940365263 46.74938247512624 47.24937157588444
-157.274 114.73451940365263 115.46765899645263 46.74938247512624 47.24937157588444
-158.274 115.46765899645263 116.20079858930264 46.74938247512624 47.24937157588444
-159.274 116.20079858930264 116.93393818215264 46.74938247512624 47.24937157588444
-160.274 116.93393818215264 117.66707777495265 46.74938247512624 47.24937157588444
-161.274 117.66707777495265 118.40021736775266 46.74938247512624 47.24937157588444
-162.274 118.40021736775266 119.13335696055265 46.74938247512624 47.24937157588444
-163.274 119.13335696055265 119.86649655335265 46.74938247512624 47.24937157588444
-164.274 119.86649655335265 120.59963614620266 46.74938247512624 47.24937157588444
-165.274 120.59963614620266 121.33277573905266 46.74938247512624 47.24937157588444
-166.274 121.33277573905266 122.06591533185264 46.74938247512624 47.24937157588444
-167.274 122.06591533185264 122.79905492465264 46.74938247512624 47.24937157588444
-168.274 122.79905492465264 123.53219451745264 46.74938247512624 47.24937157588444
-169.274 123.53219451745264 124.26533411030263 46.74938247512624 47.24937157588444
-170.274 124.26533411030263 124.99847370315263 46.74938247512624 47.24937157588444
-171.274 124.99847370315263 125.73161329595263 46.74938247512624 47.24937157588444
-172.274 125.73161329595263 126.46475288875266 46.74938247512624 47.24937157588444
-173.274 126.46475288875266 127.19789248155266 46.74938247512624 47.24937157588444
-174.274 127.19789248155266 127.93103207440264 46.74938247512624 47.24937157588444
-175.274 127.93103207440264 128.66417166725262 46.74938247512624 47.24937157588444
-176.274 128.66417166725262 129.39731126005262 46.74938247512624 47.24937157588444
-177.274 129.39731126005262 130.13045085285262 46.74938247512624 47.24937157588444
-178.274 130.13045085285262 130.86359044565262 46.74938247512624 47.24937157588444
-179.274 130.86359044565262 131.59673003850264 46.74938247512624 47.24937157588444
-180.274 131.59673003850264 132.32986963135266 46.74938247512624 47.24937157588444
-181.274 132.32986963135266 133.06300922415267 46.74938247512624 47.24937157588444
-182.274 133.06300922415267 133.79614881695267 46.74938247512624 47.24937157588444
-183.274 133.79614881695267 134.52928840975267 46.74938247512624 47.24937157588444
-184.274 134.52928840975267 135.26242800260263 46.74938247512624 47.24937157588444
-185.274 135.26242800260263 135.99556759545266 46.74938247512624 47.24937157588444
-186.274 135.99556759545266 136.72870718825266 46.74938247512624 47.24937157588444
-187.274 136.72870718825266 137.46184678105266 46.74938247512624 47.24937157588444
-188.274 137.46184678105266 138.19498637385266 46.74938247512624 47.24937157588444
-189.274 138.19498637385266 138.92812596670262 46.74938247512624 47.24937157588444
-190.274 138.92812596670262 139.66126555955262 46.74938247512624 47.24937157588444
-191.274 139.66126555955262 140.39440515235262 46.74938247512624 47.24937157588444
-192.274 140.39440515235262 141.12754474515262 46.74938247512624 47.24937157588444
-193.274 141.12754474515262 141.86068433795262 46.74938247512624 47.24937157588444
-194.274 141.86068433795262 142.59382393080264 46.74938247512624 47.24937157588444
-195.274 142.59382393080264 143.32696352365264 46.74938247512624 47.24937157588444
-196.274 143.32696352365264 144.06010311645264 46.74938247512624 47.24937157588444
-197.274 144.06010311645264 144.79324270925264 46.74938247512624 47.24937157588444
-198.274 144.79324270925264 145.52638230205264 46.74938247512624 47.24937157588444
-199.274 145.52638230205264 146.25952189490266 46.74938247512624 47.24937157588444
-200.274 146.25952189490266 146.99266148775263 46.74938247512624 47.24937157588444
-201.274 146.99266148775263 147.72580108055263 46.74938247512624 47.24937157588444
-202.274 147.72580108055263 148.45894067335263 46.74938247512624 47.24937157588444
-203.274 148.45894067335263 149.19208026615263 46.74938247512624 47.24937157588444
-204.274 149.19208026615263 149.92521985900265 46.74938247512624 47.24937157588444
-205.274 149.92521985900265 150.65835945185265 46.74938247512624 47.24937157588444
-206.274 150.65835945185265 151.39149904465265 46.74938247512624 47.24937157588444
-207.274 151.39149904465265 152.12463863745265 46.74938247512624 47.24937157588444
-208.274 152.12463863745265 152.85777823025265 46.74938247512624 47.24937157588444
-209.274 152.85777823025265 153.59091782310264 46.74938247512624 47.24937157588444
-210.274 153.59091782310264 154.32405741595267 46.74938247512624 47.24937157588444
-211.274 154.32405741595267 155.05719700875267 46.74938247512624 47.24937157588444
-212.274 155.05719700875267 155.79033660155267 46.74938247512624 47.24937157588444
-213.274 155.79033660155267 156.52347619435267 46.74938247512624 47.24937157588444
-214.274 156.52347619435267 157.25661578720266 46.74938247512624 47.24937157588444
-215.274 157.25661578720266 157.98975538005266 46.74938247512624 47.24937157588444
-216.274 157.98975538005266 158.72289497285266 46.74938247512624 47.24937157588444
-217.274 158.72289497285266 159.45603456565266 46.74938247512624 47.24937157588444
-218.274 159.45603456565266 160.18917415845266 46.74938247512624 47.24937157588444
-219.274 160.18917415845266 160.92231375130262 46.74938247512624 47.24937157588444
-220.274 160.92231375130262 161.65545334415265 46.74938247512624 47.24937157588444
-221.274 161.65545334415265 162.38859293695265 46.74938247512624 47.24937157588444
-222.274 162.38859293695265 163.12173252975265 46.74938247512624 47.24937157588444
-223.274 163.12173252975265 163.85487212255265 46.74938247512624 47.24937157588444
-224.274 163.85487212255265 164.58801171540264 46.74938247512624 47.24937157588444
-225.274 164.58801171540264 165.32115130825267 46.74938247512624 47.24937157588444
-226.274 165.32115130825267 166.05429090105267 46.74938247512624 47.24937157588444
-227.274 166.05429090105267 166.78743049385267 46.74938247512624 47.24937157588444
-228.274 166.78743049385267 167.52057008665267 46.74938247512624 47.24937157588444
-229.274 167.52057008665267 168.25370967950266 46.74938247512624 47.24937157588444
-230.274 168.25370967950266 168.98684927235263 46.74938247512624 47.24937157588444
-231.274 168.98684927235263 169.71998886515263 46.74938247512624 47.24937157588444
-232.274 169.71998886515263 170.4648792184263 46.74938247512624 47.24937157588444
-257.274 188.03672792517904 188.78161827845264 46.74938247512624 47.24937157588444
-258.274 188.78161827845264 189.51475787125264 46.74938247512624 47.24937157588444
-259.274 189.51475787125264 190.2478974641026 46.74938247512624 47.24937157588444
-260.274 190.2478974641026 190.98103705695263 46.74938247512624 47.24937157588444
-261.274 190.98103705695263 191.71417664975263 46.74938247512624 47.24937157588444
-262.274 191.71417664975263 192.44731624255263 46.74938247512624 47.24937157588444
-263.274 192.44731624255263 193.18045583535263 46.74938247512624 47.24937157588444
-264.274 193.18045583535263 193.91359542815263 46.74938247512624 47.24937157588444
-265.274 193.91359542815263 194.6467350210026 46.74938247512624 47.24937157588444
-266.274 194.6467350210026 195.37987461385262 46.74938247512624 47.24937157588444
-267.274 195.37987461385262 196.11301420665262 46.74938247512624 47.24937157588444
-268.274 196.11301420665262 196.84615379945262 46.74938247512624 47.24937157588444
-269.274 196.84615379945262 197.57929339225262 46.74938247512624 47.24937157588444
-270.274 197.57929339225262 198.31243298510265 46.74938247512624 47.24937157588444
-271.274 198.31243298510265 199.04557257795267 46.74938247512624 47.24937157588444
-272.274 199.04557257795267 199.77871217075267 46.74938247512624 47.24937157588444
-273.274 199.77871217075267 200.52360252402627 46.74938247512624 47.24937157588444
-340.274 248.88731412917903 249.63220448250263 46.74938247512624 47.24937157588444
-341.274 249.63220448250263 250.3653440753526 46.74938247512624 47.24937157588444
-342.274 250.3653440753526 251.0984836681526 46.74938247512624 47.24937157588444
-343.274 251.0984836681526 251.8316232609526 46.74938247512624 47.24937157588444
-344.274 251.8316232609526 252.56476285375265 46.74938247512624 47.24937157588444
-345.274 252.56476285375265 253.29790244660268 46.74938247512624 47.24937157588444
-346.274 253.29790244660268 254.03104203945264 46.74938247512624 47.24937157588444
-347.274 254.03104203945264 254.76418163225264 46.74938247512624 47.24937157588444
-348.274 254.76418163225264 255.49732122505262 46.74938247512624 47.24937157588444
-349.274 255.49732122505262 256.23046081785265 46.74938247512624 47.24937157588444
-350.274 256.23046081785265 256.9636004107026 46.74938247512624 47.24937157588444
-351.274 256.9636004107026 257.6967400035526 46.74938247512624 47.24937157588444
-352.274 257.6967400035526 258.42987959635263 46.74938247512624 47.24937157588444
-353.274 258.42987959635263 259.1630191891526 46.74938247512624 47.24937157588444
-354.274 259.1630191891526 259.89615878195264 46.74938247512624 47.24937157588444
-355.274 259.89615878195264 260.6292983748026 46.74938247512624 47.24937157588444
-356.274 260.6292983748026 261.3624379676527 46.74938247512624 47.24937157588444
-357.274 261.3624379676527 262.0955775604526 46.74938247512624 47.24937157588444
-358.274 262.0955775604526 262.8287171532527 46.74938247512624 47.24937157588444
-359.274 262.8287171532527 263.5618567460526 46.74938247512624 47.24937157588444
-360.274 263.5618567460526 264.29499633890265 46.74938247512624 47.24937157588444
-361.274 264.29499633890265 265.0281359317527 46.74938247512624 47.24937157588444
-362.274 265.0281359317527 265.7612755245526 46.74938247512624 47.24937157588444
-363.274 265.7612755245526 266.4944151173527 46.74938247512624 47.24937157588444
-364.274 266.4944151173527 267.2275547101526 46.74938247512624 47.24937157588444
-365.274 267.2275547101526 267.96069430300264 46.74938247512624 47.24937157588444
-366.274 267.96069430300264 268.69383389585266 46.74938247512624 47.24937157588444
-367.274 268.69383389585266 269.4269734886526 46.74938247512624 47.24937157588444
-368.274 269.4269734886526 270.16011308145266 46.74938247512624 47.24937157588444
-369.274 270.16011308145266 270.8932526742526 46.74938247512624 47.24937157588444
-370.274 270.8932526742526 271.6263922671027 46.74938247512624 47.24937157588444
-371.274 271.6263922671027 272.35953185995265 46.74938247512624 47.24937157588444
-372.274 272.35953185995265 273.09267145275265 46.74938247512624 47.24937157588444
-373.274 273.09267145275265 273.82581104555265 46.74938247512624 47.24937157588444
-374.274 273.82581104555265 274.55895063835266 46.74938247512624 47.24937157588444
-375.274 274.55895063835266 275.29209023115266 46.74938247512624 47.24937157588444
-376.274 275.29209023115266 276.03698058442626 46.74938247512624 47.24937157588444
-149.275 109.89016284073479 110.64211888831471 47.24937157588444 47.74936046889584
-150.275 110.64211888831471 111.38221250476471 47.24937157588444 47.74936046889584
-151.275 111.38221250476471 112.12230612121469 47.24937157588444 47.74936046889584
-152.275 112.12230612121469 112.8623997377147 47.24937157588444 47.74936046889584
-153.275 112.8623997377147 113.6024933541647 47.24937157588444 47.74936046889584
-154.275 113.6024933541647 114.34258697061469 47.24937157588444 47.74936046889584
-155.275 114.34258697061469 115.08268058706469 47.24937157588444 47.74936046889584
-156.275 115.08268058706469 115.8227742035147 47.24937157588444 47.74936046889584
-157.275 115.8227742035147 116.5628678200147 47.24937157588444 47.74936046889584
-158.275 116.5628678200147 117.3029614364647 47.24937157588444 47.74936046889584
-159.275 117.3029614364647 118.0430550529147 47.24937157588444 47.74936046889584
-160.275 118.0430550529147 118.78314866936469 47.24937157588444 47.74936046889584
-161.275 118.78314866936469 119.52324228581469 47.24937157588444 47.74936046889584
-162.275 119.52324228581469 120.2633359023147 47.24937157588444 47.74936046889584
-163.275 120.2633359023147 121.00342951876469 47.24937157588444 47.74936046889584
-164.275 121.00342951876469 121.7435231352147 47.24937157588444 47.74936046889584
-165.275 121.7435231352147 122.4836167516647 47.24937157588444 47.74936046889584
-166.275 122.4836167516647 123.2237103681147 47.24937157588444 47.74936046889584
-167.275 123.2237103681147 123.96380398461469 47.24937157588444 47.74936046889584
-168.275 123.96380398461469 124.70389760106468 47.24937157588444 47.74936046889584
-169.275 124.70389760106468 125.44399121751468 47.24937157588444 47.74936046889584
-170.275 125.44399121751468 126.1840848340147 47.24937157588444 47.74936046889584
-171.275 126.1840848340147 126.9241784504647 47.24937157588444 47.74936046889584
-172.275 126.9241784504647 127.66427206691469 47.24937157588444 47.74936046889584
-173.275 127.66427206691469 128.4043656833647 47.24937157588444 47.74936046889584
-174.275 128.4043656833647 129.14445929981468 47.24937157588444 47.74936046889584
-175.275 129.14445929981468 129.8845529163147 47.24937157588444 47.74936046889584
-176.275 129.8845529163147 130.6246465327647 47.24937157588444 47.74936046889584
-177.275 130.6246465327647 131.3647401492147 47.24937157588444 47.74936046889584
-178.275 131.3647401492147 132.1048337656647 47.24937157588444 47.74936046889584
-179.275 132.1048337656647 132.8449273821147 47.24937157588444 47.74936046889584
-180.275 132.8449273821147 133.5850209986147 47.24937157588444 47.74936046889584
-181.275 133.5850209986147 134.3251146150647 47.24937157588444 47.74936046889584
-182.275 134.3251146150647 135.0652082315147 47.24937157588444 47.74936046889584
-183.275 135.0652082315147 135.8053018479647 47.24937157588444 47.74936046889584
-184.275 135.8053018479647 136.5453954644147 47.24937157588444 47.74936046889584
-185.275 136.5453954644147 137.2854890809147 47.24937157588444 47.74936046889584
-186.275 137.2854890809147 138.0255826973647 47.24937157588444 47.74936046889584
-187.275 138.0255826973647 138.76567631381468 47.24937157588444 47.74936046889584
-188.275 138.76567631381468 139.50576993031467 47.24937157588444 47.74936046889584
-189.275 139.50576993031467 140.2458635467647 47.24937157588444 47.74936046889584
-190.275 140.2458635467647 140.98595716321466 47.24937157588444 47.74936046889584
-191.275 140.98595716321466 141.7260507796647 47.24937157588444 47.74936046889584
-192.275 141.7260507796647 142.46614439611466 47.24937157588444 47.74936046889584
-193.275 142.46614439611466 143.2062380126147 47.24937157588444 47.74936046889584
-194.275 143.2062380126147 143.94633162906467 47.24937157588444 47.74936046889584
-195.275 143.94633162906467 144.68642524551467 47.24937157588444 47.74936046889584
-196.275 144.68642524551467 145.42651886196467 47.24937157588444 47.74936046889584
-197.275 145.42651886196467 146.16661247841466 47.24937157588444 47.74936046889584
-198.275 146.16661247841466 146.90670609491468 47.24937157588444 47.74936046889584
-199.275 146.90670609491468 147.64679971136474 47.24937157588444 47.74936046889584
-200.275 147.64679971136474 148.38689332781473 47.24937157588444 47.74936046889584
-201.275 148.38689332781473 149.12698694426467 47.24937157588444 47.74936046889584
-202.275 149.12698694426467 149.8670805607147 47.24937157588444 47.74936046889584
-203.275 149.8670805607147 150.6071741772147 47.24937157588444 47.74936046889584
-204.275 150.6071741772147 151.34726779366468 47.24937157588444 47.74936046889584
-205.275 151.34726779366468 152.08736141011468 47.24937157588444 47.74936046889584
-206.275 152.08736141011468 152.82745502661467 47.24937157588444 47.74936046889584
-207.275 152.82745502661467 153.56754864306467 47.24937157588444 47.74936046889584
-208.275 153.56754864306467 154.3076422595147 47.24937157588444 47.74936046889584
-209.275 154.3076422595147 155.0477358759647 47.24937157588444 47.74936046889584
-210.275 155.0477358759647 155.7878294924147 47.24937157588444 47.74936046889584
-211.275 155.7878294924147 156.5279231089147 47.24937157588444 47.74936046889584
-212.275 156.5279231089147 157.2680167253647 47.24937157588444 47.74936046889584
-213.275 157.2680167253647 158.0081103418147 47.24937157588444 47.74936046889584
-214.275 158.0081103418147 158.7482039582647 47.24937157588444 47.74936046889584
-215.275 158.7482039582647 159.4882975747147 47.24937157588444 47.74936046889584
-216.275 159.4882975747147 160.22839119121468 47.24937157588444 47.74936046889584
-217.275 160.22839119121468 160.9684848076647 47.24937157588444 47.74936046889584
-218.275 160.9684848076647 161.7085784241147 47.24937157588444 47.74936046889584
-219.275 161.7085784241147 162.4486720405647 47.24937157588444 47.74936046889584
-220.275 162.4486720405647 163.1887656570147 47.24937157588444 47.74936046889584
-221.275 163.1887656570147 163.92885927351472 47.24937157588444 47.74936046889584
-222.275 163.92885927351472 164.6689528899647 47.24937157588444 47.74936046889584
-223.275 164.6689528899647 165.40904650641468 47.24937157588444 47.74936046889584
-224.275 165.40904650641468 166.14914012291467 47.24937157588444 47.74936046889584
-225.275 166.14914012291467 166.88923373936467 47.24937157588444 47.74936046889584
-226.275 166.88923373936467 167.62932735581467 47.24937157588444 47.74936046889584
-227.275 167.62932735581467 168.36942097226466 47.24937157588444 47.74936046889584
-228.275 168.36942097226466 169.1095145887147 47.24937157588444 47.74936046889584
-229.275 169.1095145887147 169.84960820521468 47.24937157588444 47.74936046889584
-230.275 169.84960820521468 170.5897018216647 47.24937157588444 47.74936046889584
-231.275 170.5897018216647 171.3416578691946 47.24937157588444 47.74936046889584
-256.275 189.0801798020348 189.8321358496147 47.24937157588444 47.74936046889584
-257.275 189.8321358496147 190.57222946611466 47.24937157588444 47.74936046889584
-258.275 190.57222946611466 191.31232308256466 47.24937157588444 47.74936046889584
-259.275 191.31232308256466 192.05241669901469 47.24937157588444 47.74936046889584
-260.275 192.05241669901469 192.79251031551468 47.24937157588444 47.74936046889584
-261.275 192.79251031551468 193.53260393196467 47.24937157588444 47.74936046889584
-262.275 193.53260393196467 194.27269754841467 47.24937157588444 47.74936046889584
-263.275 194.27269754841467 195.01279116486467 47.24937157588444 47.74936046889584
-264.275 195.01279116486467 195.7528847813147 47.24937157588444 47.74936046889584
-265.275 195.7528847813147 196.49297839781468 47.24937157588444 47.74936046889584
-266.275 196.49297839781468 197.23307201426468 47.24937157588444 47.74936046889584
-267.275 197.23307201426468 197.97316563071467 47.24937157588444 47.74936046889584
-268.275 197.97316563071467 198.71325924716467 47.24937157588444 47.74936046889584
-269.275 198.71325924716467 199.45335286361467 47.24937157588444 47.74936046889584
-270.275 199.45335286361467 200.1934464801147 47.24937157588444 47.74936046889584
-271.275 200.1934464801147 200.9335400965647 47.24937157588444 47.74936046889584
-272.275 200.9335400965647 201.6736337130147 47.24937157588444 47.74936046889584
-273.275 201.6736337130147 202.41372732946468 47.24937157588444 47.74936046889584
-274.275 202.41372732946468 203.15382094591467 47.24937157588444 47.74936046889584
-275.275 203.15382094591467 203.8939145624147 47.24937157588444 47.74936046889584
-276.275 203.8939145624147 204.6340081788647 47.24937157588444 47.74936046889584
-277.275 204.6340081788647 205.3741017953147 47.24937157588444 47.74936046889584
-278.275 205.3741017953147 206.11419541181468 47.24937157588444 47.74936046889584
-279.275 206.11419541181468 206.8542890282647 47.24937157588444 47.74936046889584
-280.275 206.8542890282647 207.59438264471467 47.24937157588444 47.74936046889584
-281.275 207.59438264471467 208.3344762611647 47.24937157588444 47.74936046889584
-282.275 208.3344762611647 209.0745698776147 47.24937157588444 47.74936046889584
-283.275 209.0745698776147 209.81466349411468 47.24937157588444 47.74936046889584
-284.275 209.81466349411468 210.5547571105647 47.24937157588444 47.74936046889584
-285.275 210.5547571105647 211.3067131580946 47.24937157588444 47.74936046889584
-337.275 249.02776273543475 249.7797187830147 47.24937157588444 47.74936046889584
-338.275 249.7797187830147 250.5198123994647 47.24937157588444 47.74936046889584
-339.275 250.5198123994647 251.25990601591468 47.24937157588444 47.74936046889584
-340.275 251.25990601591468 251.99999963236468 47.24937157588444 47.74936046889584
-341.275 251.99999963236468 252.74009324881473 47.24937157588444 47.74936046889584
-342.275 252.74009324881473 253.4801868653147 47.24937157588444 47.74936046889584
-343.275 253.4801868653147 254.2202804817647 47.24937157588444 47.74936046889584
-344.275 254.2202804817647 254.9603740982147 47.24937157588444 47.74936046889584
-345.275 254.9603740982147 255.70046771471473 47.24937157588444 47.74936046889584
-346.275 255.70046771471473 256.4405613311647 47.24937157588444 47.74936046889584
-347.275 256.4405613311647 257.1806549476147 47.24937157588444 47.74936046889584
-348.275 257.1806549476147 257.9207485640647 47.24937157588444 47.74936046889584
-349.275 257.9207485640647 258.6608421805147 47.24937157588444 47.74936046889584
-350.275 258.6608421805147 259.40093579701465 47.24937157588444 47.74936046889584
-351.275 259.40093579701465 260.1410294134647 47.24937157588444 47.74936046889584
-352.275 260.1410294134647 260.8811230299147 47.24937157588444 47.74936046889584
-353.275 260.8811230299147 261.6212166463647 47.24937157588444 47.74936046889584
-354.275 261.6212166463647 262.36131026281464 47.24937157588444 47.74936046889584
-355.275 262.36131026281464 263.1014038793147 47.24937157588444 47.74936046889584
-356.275 263.1014038793147 263.8414974957647 47.24937157588444 47.74936046889584
-357.275 263.8414974957647 264.5815911122147 47.24937157588444 47.74936046889584
-358.275 264.5815911122147 265.32168472866465 47.24937157588444 47.74936046889584
-359.275 265.32168472866465 266.0617783451147 47.24937157588444 47.74936046889584
-360.275 266.0617783451147 266.80187196161467 47.24937157588444 47.74936046889584
-361.275 266.80187196161467 267.5419655780647 47.24937157588444 47.74936046889584
-362.275 267.5419655780647 268.2820591945147 47.24937157588444 47.74936046889584
-363.275 268.2820591945147 269.02215281101473 47.24937157588444 47.74936046889584
-364.275 269.02215281101473 269.7622464274647 47.24937157588444 47.74936046889584
-365.275 269.7622464274647 270.50234004391467 47.24937157588444 47.74936046889584
-366.275 270.50234004391467 271.24243366036467 47.24937157588444 47.74936046889584
-367.275 271.24243366036467 271.9825272768147 47.24937157588444 47.74936046889584
-368.275 271.9825272768147 272.7226208933147 47.24937157588444 47.74936046889584
-369.275 272.7226208933147 273.4627145097647 47.24937157588444 47.74936046889584
-370.275 273.4627145097647 274.2028081262147 47.24937157588444 47.74936046889584
-371.275 274.2028081262147 274.9429017426647 47.24937157588444 47.74936046889584
-372.275 274.9429017426647 275.69485779019453 47.24937157588444 47.74936046889584
-147.276 109.45650169931629 110.2157171435519 47.74936046889584 48.249349146422695
-148.276 110.2157171435519 110.9629554185019 47.74936046889584 48.249349146422695
-149.276 110.9629554185019 111.71019369340189 47.74936046889584 48.249349146422695
-150.276 111.71019369340189 112.4574319683519 47.74936046889584 48.249349146422695
-151.276 112.4574319683519 113.2046702433019 47.74936046889584 48.249349146422695
-152.276 113.2046702433019 113.95190851820189 47.74936046889584 48.249349146422695
-153.276 113.95190851820189 114.6991467931519 47.74936046889584 48.249349146422695
-154.276 114.6991467931519 115.4463850681019 47.74936046889584 48.249349146422695
-155.276 115.4463850681019 116.1936233430019 47.74936046889584 48.249349146422695
-156.276 116.1936233430019 116.9408616179519 47.74936046889584 48.249349146422695
-157.276 116.9408616179519 117.68809989290189 47.74936046889584 48.249349146422695
-158.276 117.68809989290189 118.43533816780187 47.74936046889584 48.249349146422695
-159.276 118.43533816780187 119.1825764427519 47.74936046889584 48.249349146422695
-160.276 119.1825764427519 119.92981471770189 47.74936046889584 48.249349146422695
-161.276 119.92981471770189 120.6770529926019 47.74936046889584 48.249349146422695
-162.276 120.6770529926019 121.4242912675519 47.74936046889584 48.249349146422695
-163.276 121.4242912675519 122.17152954250189 47.74936046889584 48.249349146422695
-164.276 122.17152954250189 122.91876781740189 47.74936046889584 48.249349146422695
-165.276 122.91876781740189 123.66600609235189 47.74936046889584 48.249349146422695
-166.276 123.66600609235189 124.41324436730189 47.74936046889584 48.249349146422695
-167.276 124.41324436730189 125.16048264220188 47.74936046889584 48.249349146422695
-168.276 125.16048264220188 125.90772091715189 47.74936046889584 48.249349146422695
-169.276 125.90772091715189 126.65495919210187 47.74936046889584 48.249349146422695
-170.276 126.65495919210187 127.40219746700187 47.74936046889584 48.249349146422695
-171.276 127.40219746700187 128.1494357419519 47.74936046889584 48.249349146422695
-172.276 128.1494357419519 128.8966740169019 47.74936046889584 48.249349146422695
-173.276 128.8966740169019 129.64391229180188 47.74936046889584 48.249349146422695
-174.276 129.64391229180188 130.3911505667519 47.74936046889584 48.249349146422695
-175.276 130.3911505667519 131.1383888417019 47.74936046889584 48.249349146422695
-176.276 131.1383888417019 131.88562711660188 47.74936046889584 48.249349146422695
-177.276 131.88562711660188 132.63286539150187 47.74936046889584 48.249349146422695
-178.276 132.63286539150187 133.3801036664519 47.74936046889584 48.249349146422695
-179.276 133.3801036664519 134.12734194140188 47.74936046889584 48.249349146422695
-180.276 134.12734194140188 134.8745802163019 47.74936046889584 48.249349146422695
-181.276 134.8745802163019 135.62181849125193 47.74936046889584 48.249349146422695
-182.276 135.62181849125193 136.36905676620188 47.74936046889584 48.249349146422695
-183.276 136.36905676620188 137.11629504110186 47.74936046889584 48.249349146422695
-184.276 137.11629504110186 137.86353331605187 47.74936046889584 48.249349146422695
-185.276 137.86353331605187 138.61077159100188 47.74936046889584 48.249349146422695
-186.276 138.61077159100188 139.3580098659019 47.74936046889584 48.249349146422695
-187.276 139.3580098659019 140.10524814085193 47.74936046889584 48.249349146422695
-188.276 140.10524814085193 140.85248641580188 47.74936046889584 48.249349146422695
-189.276 140.85248641580188 141.59972469070186 47.74936046889584 48.249349146422695
-190.276 141.59972469070186 142.34696296565187 47.74936046889584 48.249349146422695
-191.276 142.34696296565187 143.09420124060188 47.74936046889584 48.249349146422695
-192.276 143.09420124060188 143.84143951550192 47.74936046889584 48.249349146422695
-193.276 143.84143951550192 144.5886777904519 47.74936046889584 48.249349146422695
-194.276 144.5886777904519 145.3359160654019 47.74936046889584 48.249349146422695
-195.276 145.3359160654019 146.0831543403019 47.74936046889584 48.249349146422695
-196.276 146.0831543403019 146.83039261525187 47.74936046889584 48.249349146422695
-197.276 146.83039261525187 147.57763089020187 47.74936046889584 48.249349146422695
-198.276 147.57763089020187 148.32486916510192 47.74936046889584 48.249349146422695
-199.276 148.32486916510192 149.07210744005187 47.74936046889584 48.249349146422695
-200.276 149.07210744005187 149.81934571500193 47.74936046889584 48.249349146422695
-201.276 149.81934571500193 150.5665839899019 47.74936046889584 48.249349146422695
-202.276 150.5665839899019 151.3138222648519 47.74936046889584 48.249349146422695
-203.276 151.3138222648519 152.06106053980187 47.74936046889584 48.249349146422695
-204.276 152.06106053980187 152.8082988147019 47.74936046889584 48.249349146422695
-205.276 152.8082988147019 153.5555370896519 47.74936046889584 48.249349146422695
-206.276 153.5555370896519 154.3027753646019 47.74936046889584 48.249349146422695
-207.276 154.3027753646019 155.05001363950188 47.74936046889584 48.249349146422695
-208.276 155.05001363950188 155.7972519144519 47.74936046889584 48.249349146422695
-209.276 155.7972519144519 156.54449018940187 47.74936046889584 48.249349146422695
-210.276 156.54449018940187 157.2917284643019 47.74936046889584 48.249349146422695
-211.276 157.2917284643019 158.0389667392019 47.74936046889584 48.249349146422695
-212.276 158.0389667392019 158.7862050141519 47.74936046889584 48.249349146422695
-213.276 158.7862050141519 159.53344328910188 47.74936046889584 48.249349146422695
-214.276 159.53344328910188 160.2806815640019 47.74936046889584 48.249349146422695
-215.276 160.2806815640019 161.0279198389519 47.74936046889584 48.249349146422695
-216.276 161.0279198389519 161.7751581139019 47.74936046889584 48.249349146422695
-217.276 161.7751581139019 162.5223963888019 47.74936046889584 48.249349146422695
-218.276 162.5223963888019 163.2696346637519 47.74936046889584 48.249349146422695
-219.276 163.2696346637519 164.01687293870188 47.74936046889584 48.249349146422695
-220.276 164.01687293870188 164.7641112136019 47.74936046889584 48.249349146422695
-221.276 164.7641112136019 165.5113494885519 47.74936046889584 48.249349146422695
-222.276 165.5113494885519 166.2585877635019 47.74936046889584 48.249349146422695
-223.276 166.2585877635019 167.0058260384019 47.74936046889584 48.249349146422695
-224.276 167.0058260384019 167.7530643133519 47.74936046889584 48.249349146422695
-225.276 167.7530643133519 168.50030258830188 47.74936046889584 48.249349146422695
-226.276 168.50030258830188 169.2475408632019 47.74936046889584 48.249349146422695
-227.276 169.2475408632019 169.9947791381519 47.74936046889584 48.249349146422695
-228.276 169.9947791381519 170.7420174131019 47.74936046889584 48.249349146422695
-229.276 170.7420174131019 171.50123285728748 47.74936046889584 48.249349146422695
-254.276 189.4109971171163 190.17021256130187 47.74936046889584 48.249349146422695
-255.276 190.17021256130187 190.9174508362519 47.74936046889584 48.249349146422695
-256.276 190.9174508362519 191.66468911120188 47.74936046889584 48.249349146422695
-257.276 191.66468911120188 192.4119273861019 47.74936046889584 48.249349146422695
-258.276 192.4119273861019 193.15916566105187 47.74936046889584 48.249349146422695
-259.276 193.15916566105187 193.90640393600188 47.74936046889584 48.249349146422695
-260.276 193.90640393600188 194.65364221090186 47.74936046889584 48.249349146422695
-261.276 194.65364221090186 195.4008804858519 47.74936046889584 48.249349146422695
-262.276 195.4008804858519 196.14811876080188 47.74936046889584 48.249349146422695
-263.276 196.14811876080188 196.89535703570186 47.74936046889584 48.249349146422695
-264.276 196.89535703570186 197.64259531065187 47.74936046889584 48.249349146422695
-265.276 197.64259531065187 198.38983358560188 47.74936046889584 48.249349146422695
-266.276 198.38983358560188 199.13707186050186 47.74936046889584 48.249349146422695
-267.276 199.13707186050186 199.8843101354519 47.74936046889584 48.249349146422695
-268.276 199.8843101354519 200.63154841040188 47.74936046889584 48.249349146422695
-269.276 200.63154841040188 201.37878668530186 47.74936046889584 48.249349146422695
-270.276 201.37878668530186 202.12602496025187 47.74936046889584 48.249349146422695
-271.276 202.12602496025187 202.8732632352019 47.74936046889584 48.249349146422695
-272.276 202.8732632352019 203.6205015101019 47.74936046889584 48.249349146422695
-273.276 203.6205015101019 204.3677397850519 47.74936046889584 48.249349146422695
-274.276 204.3677397850519 205.11497806000187 47.74936046889584 48.249349146422695
-275.276 205.11497806000187 205.8622163349019 47.74936046889584 48.249349146422695
-276.276 205.8622163349019 206.6094546098019 47.74936046889584 48.249349146422695
-277.276 206.6094546098019 207.3566928847519 47.74936046889584 48.249349146422695
-278.276 207.3566928847519 208.1039311597019 47.74936046889584 48.249349146422695
-279.276 208.1039311597019 208.8511694346019 47.74936046889584 48.249349146422695
-280.276 208.8511694346019 209.59840770955188 47.74936046889584 48.249349146422695
-281.276 209.59840770955188 210.3456459845019 47.74936046889584 48.249349146422695
-282.276 210.3456459845019 211.0928842594019 47.74936046889584 48.249349146422695
-283.276 211.0928842594019 211.8520997035875 47.74936046889584 48.249349146422695
-334.276 249.19005911171627 249.94927455590187 47.74936046889584 48.249349146422695
-335.276 249.94927455590187 250.69651283085187 47.74936046889584 48.249349146422695
-336.276 250.69651283085187 251.44375110580188 47.74936046889584 48.249349146422695
-337.276 251.44375110580188 252.19098938070186 47.74936046889584 48.249349146422695
-338.276 252.19098938070186 252.93822765565187 47.74936046889584 48.249349146422695
-339.276 252.93822765565187 253.68546593060188 47.74936046889584 48.249349146422695
-340.276 253.68546593060188 254.4327042055019 47.74936046889584 48.249349146422695
-341.276 254.4327042055019 255.17994248040188 47.74936046889584 48.249349146422695
-342.276 255.17994248040188 255.92718075535186 47.74936046889584 48.249349146422695
-343.276 255.92718075535186 256.6744190303019 47.74936046889584 48.249349146422695
-344.276 256.6744190303019 257.42165730520185 47.74936046889584 48.249349146422695
-345.276 257.42165730520185 258.1688955801519 47.74936046889584 48.249349146422695
-346.276 258.1688955801519 258.91613385510186 47.74936046889584 48.249349146422695
-347.276 258.91613385510186 259.6633721300019 47.74936046889584 48.249349146422695
-348.276 259.6633721300019 260.4106104049519 47.74936046889584 48.249349146422695
-349.276 260.4106104049519 261.1578486799019 47.74936046889584 48.249349146422695
-350.276 261.1578486799019 261.90508695480185 47.74936046889584 48.249349146422695
-351.276 261.90508695480185 262.6523252297519 47.74936046889584 48.249349146422695
-352.276 262.6523252297519 263.3995635047019 47.74936046889584 48.249349146422695
-353.276 263.3995635047019 264.1468017796019 47.74936046889584 48.249349146422695
-354.276 264.1468017796019 264.89404005455185 47.74936046889584 48.249349146422695
-355.276 264.89404005455185 265.6412783295019 47.74936046889584 48.249349146422695
-356.276 265.6412783295019 266.3885166044019 47.74936046889584 48.249349146422695
-357.276 266.3885166044019 267.1357548793519 47.74936046889584 48.249349146422695
-358.276 267.1357548793519 267.88299315430186 47.74936046889584 48.249349146422695
-359.276 267.88299315430186 268.6302314292019 47.74936046889584 48.249349146422695
-360.276 268.6302314292019 269.37746970415185 47.74936046889584 48.249349146422695
-361.276 269.37746970415185 270.1247079791019 47.74936046889584 48.249349146422695
-362.276 270.1247079791019 270.87194625400184 47.74936046889584 48.249349146422695
-363.276 270.87194625400184 271.6191845289519 47.74936046889584 48.249349146422695
-364.276 271.6191845289519 272.3664228039019 47.74936046889584 48.249349146422695
-365.276 272.3664228039019 273.1136610788019 47.74936046889584 48.249349146422695
-366.276 273.1136610788019 273.86089935375185 47.74936046889584 48.249349146422695
-367.276 273.86089935375185 274.6081376287019 47.74936046889584 48.249349146422695
-368.276 274.6081376287019 275.35537590360184 47.74936046889584 48.249349146422695
-369.276 275.35537590360184 276.1145913477875 47.74936046889584 48.249349146422695
-145.277 109.02276881818783 109.78944414856977 48.249349146422695 48.749337600357094
-146.277 109.78944414856977 110.5440243961198 48.249349146422695 48.749337600357094
-147.277 110.5440243961198 111.29860464361978 48.249349146422695 48.749337600357094
-148.277 111.29860464361978 112.05318489116976 48.249349146422695 48.749337600357094
-149.277 112.05318489116976 112.80776513871976 48.249349146422695 48.749337600357094
-150.277 112.80776513871976 113.56234538621977 48.249349146422695 48.749337600357094
-151.277 113.56234538621977 114.31692563371979 48.249349146422695 48.749337600357094
-152.277 114.31692563371979 115.07150588126977 48.249349146422695 48.749337600357094
-153.277 115.07150588126977 115.82608612881977 48.249349146422695 48.749337600357094
-154.277 115.82608612881977 116.58066637631977 48.249349146422695 48.749337600357094
-155.277 116.58066637631977 117.33524662386976 48.249349146422695 48.749337600357094
-156.277 117.33524662386976 118.08982687141976 48.249349146422695 48.749337600357094
-157.277 118.08982687141976 118.84440711891976 48.249349146422695 48.749337600357094
-158.277 118.84440711891976 119.59898736641976 48.249349146422695 48.749337600357094
-159.277 119.59898736641976 120.35356761396977 48.249349146422695 48.749337600357094
-160.277 120.35356761396977 121.10814786151978 48.249349146422695 48.749337600357094
-161.277 121.10814786151978 121.86272810901978 48.249349146422695 48.749337600357094
-162.277 121.86272810901978 122.61730835656978 48.249349146422695 48.749337600357094
-163.277 122.61730835656978 123.37188860411977 48.249349146422695 48.749337600357094
-164.277 123.37188860411977 124.12646885161978 48.249349146422695 48.749337600357094
-165.277 124.12646885161978 124.88104909911978 48.249349146422695 48.749337600357094
-166.277 124.88104909911978 125.63562934666977 48.249349146422695 48.749337600357094
-167.277 125.63562934666977 126.39020959421978 48.249349146422695 48.749337600357094
-168.277 126.39020959421978 127.14478984171977 48.249349146422695 48.749337600357094
-169.277 127.14478984171977 127.89937008926978 48.249349146422695 48.749337600357094
-170.277 127.89937008926978 128.65395033681978 48.249349146422695 48.749337600357094
-171.277 128.65395033681978 129.4085305843198 48.249349146422695 48.749337600357094
-172.277 129.4085305843198 130.16311083181978 48.249349146422695 48.749337600357094
-173.277 130.16311083181978 130.91769107936977 48.249349146422695 48.749337600357094
-174.277 130.91769107936977 131.67227132691977 48.249349146422695 48.749337600357094
-175.277 131.67227132691977 132.4268515744198 48.249349146422695 48.749337600357094
-176.277 132.4268515744198 133.1814318219698 48.249349146422695 48.749337600357094
-177.277 133.1814318219698 133.9360120695198 48.249349146422695 48.749337600357094
-178.277 133.9360120695198 134.69059231701976 48.249349146422695 48.749337600357094
-179.277 134.69059231701976 135.4451725645198 48.249349146422695 48.749337600357094
-180.277 135.4451725645198 136.1997528120698 48.249349146422695 48.749337600357094
-181.277 136.1997528120698 136.95433305961978 48.249349146422695 48.749337600357094
-182.277 136.95433305961978 137.70891330711976 48.249349146422695 48.749337600357094
-183.277 137.70891330711976 138.46349355466978 48.249349146422695 48.749337600357094
-184.277 138.46349355466978 139.2180738022198 48.249349146422695 48.749337600357094
-185.277 139.2180738022198 139.97265404971978 48.249349146422695 48.749337600357094
-186.277 139.97265404971978 140.72723429721975 48.249349146422695 48.749337600357094
-187.277 140.72723429721975 141.48181454476978 48.249349146422695 48.749337600357094
-188.277 141.48181454476978 142.2363947923198 48.249349146422695 48.749337600357094
-189.277 142.2363947923198 142.99097503981977 48.249349146422695 48.749337600357094
-190.277 142.99097503981977 143.74555528736977 48.249349146422695 48.749337600357094
-191.277 143.74555528736977 144.50013553491976 48.249349146422695 48.749337600357094
-192.277 144.50013553491976 145.2547157824198 48.249349146422695 48.749337600357094
-193.277 145.2547157824198 146.00929602991977 48.249349146422695 48.749337600357094
-194.277 146.00929602991977 146.76387627746976 48.249349146422695 48.749337600357094
-195.277 146.76387627746976 147.51845652501976 48.249349146422695 48.749337600357094
-196.277 147.51845652501976 148.2730367725198 48.249349146422695 48.749337600357094
-197.277 148.2730367725198 149.02761702006978 48.249349146422695 48.749337600357094
-198.277 149.02761702006978 149.78219726761978 48.249349146422695 48.749337600357094
-199.277 149.78219726761978 150.53677751511975 48.249349146422695 48.749337600357094
-200.277 150.53677751511975 151.29135776261975 48.249349146422695 48.749337600357094
-201.277 151.29135776261975 152.04593801016978 48.249349146422695 48.749337600357094
-202.277 152.04593801016978 152.80051825771977 48.249349146422695 48.749337600357094
-203.277 152.80051825771977 153.5550985052198 48.249349146422695 48.749337600357094
-204.277 153.5550985052198 154.30967875271978 48.249349146422695 48.749337600357094
-205.277 154.30967875271978 155.06425900026977 48.249349146422695 48.749337600357094
-206.277 155.06425900026977 155.81883924781977 48.249349146422695 48.749337600357094
-207.277 155.81883924781977 156.5734194953198 48.249349146422695 48.749337600357094
-208.277 156.5734194953198 157.3279997428698 48.249349146422695 48.749337600357094
-209.277 157.3279997428698 158.0825799904198 48.249349146422695 48.749337600357094
-210.277 158.0825799904198 158.83716023791976 48.249349146422695 48.749337600357094
-211.277 158.83716023791976 159.59174048541976 48.249349146422695 48.749337600357094
-212.277 159.59174048541976 160.3463207329698 48.249349146422695 48.749337600357094
-213.277 160.3463207329698 161.10090098051978 48.249349146422695 48.749337600357094
-214.277 161.10090098051978 161.85548122801976 48.249349146422695 48.749337600357094
-215.277 161.85548122801976 162.61006147556975 48.249349146422695 48.749337600357094
-216.277 162.61006147556975 163.3646417231198 48.249349146422695 48.749337600357094
-217.277 163.3646417231198 164.11922197061978 48.249349146422695 48.749337600357094
-218.277 164.11922197061978 164.8738022181198 48.249349146422695 48.749337600357094
-219.277 164.8738022181198 165.6283824656698 48.249349146422695 48.749337600357094
-220.277 165.6283824656698 166.3829627132198 48.249349146422695 48.749337600357094
-221.277 166.3829627132198 167.13754296071977 48.249349146422695 48.749337600357094
-222.277 167.13754296071977 167.89212320826977 48.249349146422695 48.749337600357094
-223.277 167.89212320826977 168.64670345581976 48.249349146422695 48.749337600357094
-224.277 168.64670345581976 169.4012837033198 48.249349146422695 48.749337600357094
-225.277 169.4012837033198 170.15586395081976 48.249349146422695 48.749337600357094
-226.277 170.15586395081976 170.91044419836976 48.249349146422695 48.749337600357094
-227.277 170.91044419836976 171.67711952875172 48.249349146422695 48.749337600357094
-252.277 189.76285530378783 190.5295306341198 48.249349146422695 48.749337600357094
-253.277 190.5295306341198 191.28411088161977 48.249349146422695 48.749337600357094
-254.277 191.28411088161977 192.03869112916976 48.249349146422695 48.749337600357094
-255.277 192.03869112916976 192.79327137671976 48.249349146422695 48.749337600357094
-256.277 192.79327137671976 193.5478516242198 48.249349146422695 48.749337600357094
-257.277 193.5478516242198 194.30243187176978 48.249349146422695 48.749337600357094
-258.277 194.30243187176978 195.05701211931978 48.249349146422695 48.749337600357094
-259.277 195.05701211931978 195.81159236681975 48.249349146422695 48.749337600357094
-260.277 195.81159236681975 196.56617261431978 48.249349146422695 48.749337600357094
-261.277 196.56617261431978 197.32075286186978 48.249349146422695 48.749337600357094
-262.277 197.32075286186978 198.07533310941977 48.249349146422695 48.749337600357094
-263.277 198.07533310941977 198.8299133569198 48.249349146422695 48.749337600357094
-264.277 198.8299133569198 199.5844936044698 48.249349146422695 48.749337600357094
-265.277 199.5844936044698 200.3390738520198 48.249349146422695 48.749337600357094
-266.277 200.3390738520198 201.09365409951977 48.249349146422695 48.749337600357094
-267.277 201.09365409951977 201.84823434701977 48.249349146422695 48.749337600357094
-268.277 201.84823434701977 202.6028145945698 48.249349146422695 48.749337600357094
-269.277 202.6028145945698 203.35739484211976 48.249349146422695 48.749337600357094
-270.277 203.35739484211976 204.11197508961976 48.249349146422695 48.749337600357094
-271.277 204.11197508961976 204.86655533716976 48.249349146422695 48.749337600357094
-272.277 204.86655533716976 205.62113558471975 48.249349146422695 48.749337600357094
-273.277 205.62113558471975 206.37571583221978 48.249349146422695 48.749337600357094
-274.277 206.37571583221978 207.13029607971976 48.249349146422695 48.749337600357094
-275.277 207.13029607971976 207.88487632726978 48.249349146422695 48.749337600357094
-276.277 207.88487632726978 208.63945657481977 48.249349146422695 48.749337600357094
-277.277 208.63945657481977 209.39403682231978 48.249349146422695 48.749337600357094
-278.277 209.39403682231978 210.14861706986977 48.249349146422695 48.749337600357094
-279.277 210.14861706986977 210.90319731741977 48.249349146422695 48.749337600357094
-280.277 210.90319731741977 211.6577775649198 48.249349146422695 48.749337600357094
-281.277 211.6577775649198 212.41235781241977 48.249349146422695 48.749337600357094
-282.277 212.41235781241977 213.16693805996977 48.249349146422695 48.749337600357094
-283.277 213.16693805996977 213.92151830751976 48.249349146422695 48.749337600357094
-284.277 213.92151830751976 214.67609855501976 48.249349146422695 48.749337600357094
-285.277 214.67609855501976 215.43067880256976 48.249349146422695 48.749337600357094
-286.277 215.43067880256976 216.18525905011973 48.249349146422695 48.749337600357094
-287.277 216.18525905011973 216.93983929761976 48.249349146422695 48.749337600357094
-288.277 216.93983929761976 217.69441954511976 48.249349146422695 48.749337600357094
-289.277 217.69441954511976 218.44899979266978 48.249349146422695 48.749337600357094
-290.277 218.44899979266978 219.20358004021978 48.249349146422695 48.749337600357094
-291.277 219.20358004021978 219.95816028771978 48.249349146422695 48.749337600357094
-292.277 219.95816028771978 220.71274053526977 48.249349146422695 48.749337600357094
-293.277 220.71274053526977 221.4673207828198 48.249349146422695 48.749337600357094
-294.277 221.4673207828198 222.22190103031977 48.249349146422695 48.749337600357094
-295.277 222.22190103031977 222.97648127781974 48.249349146422695 48.749337600357094
-296.277 222.97648127781974 223.7310615253698 48.249349146422695 48.749337600357094
-297.277 223.7310615253698 224.48564177291976 48.249349146422695 48.749337600357094
-298.277 224.48564177291976 225.24022202041976 48.249349146422695 48.749337600357094
-299.277 225.24022202041976 225.99480226796976 48.249349146422695 48.749337600357094
-300.277 225.99480226796976 226.74938251551976 48.249349146422695 48.749337600357094
-301.277 226.74938251551976 227.50396276301976 48.249349146422695 48.749337600357094
-302.277 227.50396276301976 228.25854301051976 48.249349146422695 48.749337600357094
-303.277 228.25854301051976 229.01312325806975 48.249349146422695 48.749337600357094
-304.277 229.01312325806975 229.76770350561975 48.249349146422695 48.749337600357094
-305.277 229.76770350561975 230.52228375311978 48.249349146422695 48.749337600357094
-306.277 230.52228375311978 231.27686400066978 48.249349146422695 48.749337600357094
-307.277 231.27686400066978 232.03144424821977 48.249349146422695 48.749337600357094
-308.277 232.03144424821977 232.78602449571974 48.249349146422695 48.749337600357094
-309.277 232.78602449571974 233.5526998260517 48.249349146422695 48.749337600357094
-332.277 250.12927510608785 250.89595043641975 48.249349146422695 48.749337600357094
-333.277 250.89595043641975 251.65053068391975 48.249349146422695 48.749337600357094
-334.277 251.65053068391975 252.40511093146978 48.249349146422695 48.749337600357094
-335.277 252.40511093146978 253.15969117901977 48.249349146422695 48.749337600357094
-336.277 253.15969117901977 253.91427142651978 48.249349146422695 48.749337600357094
-337.277 253.91427142651978 254.66885167401978 48.249349146422695 48.749337600357094
-338.277 254.66885167401978 255.42343192156977 48.249349146422695 48.749337600357094
-339.277 255.42343192156977 256.17801216911977 48.249349146422695 48.749337600357094
-340.277 256.17801216911977 256.93259241661974 48.249349146422695 48.749337600357094
-341.277 256.93259241661974 257.6871726641698 48.249349146422695 48.749337600357094
-342.277 257.6871726641698 258.4417529117198 48.249349146422695 48.749337600357094
-343.277 258.4417529117198 259.19633315921976 48.249349146422695 48.749337600357094
-344.277 259.19633315921976 259.9509134067198 48.249349146422695 48.749337600357094
-345.277 259.9509134067198 260.7054936542698 48.249349146422695 48.749337600357094
-346.277 260.7054936542698 261.4600739018198 48.249349146422695 48.749337600357094
-347.277 261.4600739018198 262.2146541493198 48.249349146422695 48.749337600357094
-348.277 262.2146541493198 262.9692343968698 48.249349146422695 48.749337600357094
-349.277 262.9692343968698 263.7238146444198 48.249349146422695 48.749337600357094
-350.277 263.7238146444198 264.4783948919198 48.249349146422695 48.749337600357094
-351.277 264.4783948919198 265.23297513941975 48.249349146422695 48.749337600357094
-352.277 265.23297513941975 265.9875553869698 48.249349146422695 48.749337600357094
-353.277 265.9875553869698 266.74213563451974 48.249349146422695 48.749337600357094
-354.277 266.74213563451974 267.49671588201977 48.249349146422695 48.749337600357094
-355.277 267.49671588201977 268.25129612956977 48.249349146422695 48.749337600357094
-356.277 268.25129612956977 269.00587637711976 48.249349146422695 48.749337600357094
-357.277 269.00587637711976 269.7604566246198 48.249349146422695 48.749337600357094
-358.277 269.7604566246198 270.51503687211977 48.249349146422695 48.749337600357094
-359.277 270.51503687211977 271.26961711966976 48.249349146422695 48.749337600357094
-360.277 271.26961711966976 272.0241973672198 48.249349146422695 48.749337600357094
-361.277 272.0241973672198 272.7787776147198 48.249349146422695 48.749337600357094
-362.277 272.7787776147198 273.5333578622698 48.249349146422695 48.749337600357094
-363.277 273.5333578622698 274.28793810981983 48.249349146422695 48.749337600357094
-364.277 274.28793810981983 275.04251835731975 48.249349146422695 48.749337600357094
-365.277 275.04251835731975 275.7970986048198 48.249349146422695 48.749337600357094
-366.277 275.7970986048198 276.56377393515174 48.249349146422695 48.749337600357094
-143.278 108.58877890615099 109.3631217344116 48.749337600357094 49.249325822198244
-144.278 109.3631217344116 110.12524827776161 48.749337600357094 49.249325822198244
-145.278 110.12524827776161 110.88737482111162 48.749337600357094 49.249325822198244
-146.278 110.88737482111162 111.64950136446163 48.749337600357094 49.249325822198244
-147.278 111.64950136446163 112.4116279078116 48.749337600357094 49.249325822198244
-148.278 112.4116279078116 113.17375445116163 48.749337600357094 49.249325822198244
-149.278 113.17375445116163 113.93588099451162 48.749337600357094 49.249325822198244
-150.278 113.93588099451162 114.69800753786161 48.749337600357094 49.249325822198244
-151.278 114.69800753786161 115.46013408121163 48.749337600357094 49.249325822198244
-152.278 115.46013408121163 116.22226062456163 48.749337600357094 49.249325822198244
-153.278 116.22226062456163 116.98438716791162 48.749337600357094 49.249325822198244
-154.278 116.98438716791162 117.74651371126163 48.749337600357094 49.249325822198244
-155.278 117.74651371126163 118.50864025466161 48.749337600357094 49.249325822198244
-156.278 118.50864025466161 119.2707667980116 48.749337600357094 49.249325822198244
-157.278 119.2707667980116 120.03289334136161 48.749337600357094 49.249325822198244
-158.278 120.03289334136161 120.79501988471162 48.749337600357094 49.249325822198244
-159.278 120.79501988471162 121.55714642806163 48.749337600357094 49.249325822198244
-160.278 121.55714642806163 122.31927297141162 48.749337600357094 49.249325822198244
-161.278 122.31927297141162 123.08139951476161 48.749337600357094 49.249325822198244
-162.278 123.08139951476161 123.84352605811162 48.749337600357094 49.249325822198244
-163.278 123.84352605811162 124.60565260146163 48.749337600357094 49.249325822198244
-164.278 124.60565260146163 125.36777914481164 48.749337600357094 49.249325822198244
-165.278 125.36777914481164 126.12990568816163 48.749337600357094 49.249325822198244
-166.278 126.12990568816163 126.89203223151162 48.749337600357094 49.249325822198244
-167.278 126.89203223151162 127.65415877486161 48.749337600357094 49.249325822198244
-168.278 127.65415877486161 128.4162853182116 48.749337600357094 49.249325822198244
-169.278 128.4162853182116 129.17841186156164 48.749337600357094 49.249325822198244
-170.278 129.17841186156164 129.94053840491162 48.749337600357094 49.249325822198244
-171.278 129.94053840491162 130.7026649482616 48.749337600357094 49.249325822198244
-172.278 130.7026649482616 131.46479149166163 48.749337600357094 49.249325822198244
-173.278 131.46479149166163 132.22691803501164 48.749337600357094 49.249325822198244
-174.278 132.22691803501164 132.98904457836164 48.749337600357094 49.249325822198244
-175.278 132.98904457836164 133.75117112171162 48.749337600357094 49.249325822198244
-176.278 133.75117112171162 134.5132976650616 48.749337600357094 49.249325822198244
-177.278 134.5132976650616 135.2754242084116 48.749337600357094 49.249325822198244
-178.278 135.2754242084116 136.03755075176161 48.749337600357094 49.249325822198244
-179.278 136.03755075176161 136.79967729511162 48.749337600357094 49.249325822198244
-180.278 136.79967729511162 137.56180383846163 48.749337600357094 49.249325822198244
-181.278 137.56180383846163 138.32393038181164 48.749337600357094 49.249325822198244
-182.278 138.32393038181164 139.08605692516164 48.749337600357094 49.249325822198244
-183.278 139.08605692516164 139.8481834685116 48.749337600357094 49.249325822198244
-184.278 139.8481834685116 140.6103100118616 48.749337600357094 49.249325822198244
-185.278 140.6103100118616 141.3724365552116 48.749337600357094 49.249325822198244
-186.278 141.3724365552116 142.1345630985616 48.749337600357094 49.249325822198244
-187.278 142.1345630985616 142.89668964191162 48.749337600357094 49.249325822198244
-188.278 142.89668964191162 143.6588161852616 48.749337600357094 49.249325822198244
-189.278 143.6588161852616 144.4209427286616 48.749337600357094 49.249325822198244
-190.278 144.4209427286616 145.1830692720116 48.749337600357094 49.249325822198244
-191.278 145.1830692720116 145.94519581536161 48.749337600357094 49.249325822198244
-192.278 145.94519581536161 146.70732235871162 48.749337600357094 49.249325822198244
-193.278 146.70732235871162 147.4694489020616 48.749337600357094 49.249325822198244
-194.278 147.4694489020616 148.23157544541164 48.749337600357094 49.249325822198244
-195.278 148.23157544541164 148.99370198876161 48.749337600357094 49.249325822198244
-196.278 148.99370198876161 149.75582853211162 48.749337600357094 49.249325822198244
-197.278 149.75582853211162 150.51795507546163 48.749337600357094 49.249325822198244
-198.278 150.51795507546163 151.2800816188116 48.749337600357094 49.249325822198244
-199.278 151.2800816188116 152.04220816216161 48.749337600357094 49.249325822198244
-200.278 152.04220816216161 152.80433470551162 48.749337600357094 49.249325822198244
-201.278 152.80433470551162 153.56646124886163 48.749337600357094 49.249325822198244
-202.278 153.56646124886163 154.32858779221164 48.749337600357094 49.249325822198244
-203.278 154.32858779221164 155.09071433556161 48.749337600357094 49.249325822198244
-204.278 155.09071433556161 155.85284087891162 48.749337600357094 49.249325822198244
-205.278 155.85284087891162 156.6149674222616 48.749337600357094 49.249325822198244
-206.278 156.6149674222616 157.3770939656616 48.749337600357094 49.249325822198244
-207.278 157.3770939656616 158.1392205090116 48.749337600357094 49.249325822198244
-208.278 158.1392205090116 158.90134705236161 48.749337600357094 49.249325822198244
-209.278 158.90134705236161 159.66347359571162 48.749337600357094 49.249325822198244
-210.278 159.66347359571162 160.4256001390616 48.749337600357094 49.249325822198244
-211.278 160.4256001390616 161.1877266824116 48.749337600357094 49.249325822198244
-212.278 161.1877266824116 161.94985322576164 48.749337600357094 49.249325822198244
-213.278 161.94985322576164 162.71197976911162 48.749337600357094 49.249325822198244
-214.278 162.71197976911162 163.47410631246163 48.749337600357094 49.249325822198244
-215.278 163.47410631246163 164.23623285581164 48.749337600357094 49.249325822198244
-216.278 164.23623285581164 164.99835939916164 48.749337600357094 49.249325822198244
-217.278 164.99835939916164 165.76048594251162 48.749337600357094 49.249325822198244
-218.278 165.76048594251162 166.5226124858616 48.749337600357094 49.249325822198244
-219.278 166.5226124858616 167.2847390292116 48.749337600357094 49.249325822198244
-220.278 167.2847390292116 168.04686557256161 48.749337600357094 49.249325822198244
-221.278 168.04686557256161 168.80899211591162 48.749337600357094 49.249325822198244
-222.278 168.80899211591162 169.5711186592616 48.749337600357094 49.249325822198244
-223.278 169.5711186592616 170.3332452026616 48.749337600357094 49.249325822198244
-224.278 170.3332452026616 171.0953717460116 48.749337600357094 49.249325822198244
-225.278 171.0953717460116 171.86971457427225 48.749337600357094 49.249325822198244
-250.278 190.13631904485098 190.9106618731616 48.749337600357094 49.249325822198244
-251.278 190.9106618731616 191.6727884165116 48.749337600357094 49.249325822198244
-252.278 191.6727884165116 192.4349149598616 48.749337600357094 49.249325822198244
-253.278 192.4349149598616 193.1970415032116 48.749337600357094 49.249325822198244
-254.278 193.1970415032116 193.95916804656162 48.749337600357094 49.249325822198244
-255.278 193.95916804656162 194.7212945899116 48.749337600357094 49.249325822198244
-256.278 194.7212945899116 195.4834211332616 48.749337600357094 49.249325822198244
-257.278 195.4834211332616 196.24554767661158 48.749337600357094 49.249325822198244
-258.278 196.24554767661158 197.0076742199616 48.749337600357094 49.249325822198244
-259.278 197.0076742199616 197.76980076336162 48.749337600357094 49.249325822198244
-260.278 197.76980076336162 198.5319273067116 48.749337600357094 49.249325822198244
-261.278 198.5319273067116 199.29405385006157 48.749337600357094 49.249325822198244
-262.278 199.29405385006157 200.05618039341158 48.749337600357094 49.249325822198244
-263.278 200.05618039341158 200.8183069367616 48.749337600357094 49.249325822198244
-264.278 200.8183069367616 201.5804334801116 48.749337600357094 49.249325822198244
-265.278 201.5804334801116 202.3425600234616 48.749337600357094 49.249325822198244
-266.278 202.3425600234616 203.1046865668116 48.749337600357094 49.249325822198244
-267.278 203.1046865668116 203.86681311016162 48.749337600357094 49.249325822198244
-268.278 203.86681311016162 204.6289396535116 48.749337600357094 49.249325822198244
-269.278 204.6289396535116 205.3910661968616 48.749337600357094 49.249325822198244
-270.278 205.3910661968616 206.15319274021158 48.749337600357094 49.249325822198244
-271.278 206.15319274021158 206.91531928356162 48.749337600357094 49.249325822198244
-272.278 206.91531928356162 207.6774458269116 48.749337600357094 49.249325822198244
-273.278 207.6774458269116 208.4395723702616 48.749337600357094 49.249325822198244
-274.278 208.4395723702616 209.2016989136116 48.749337600357094 49.249325822198244
-275.278 209.2016989136116 209.96382545696162 48.749337600357094 49.249325822198244
-276.278 209.96382545696162 210.72595200036162 48.749337600357094 49.249325822198244
-277.278 210.72595200036162 211.4880785437116 48.749337600357094 49.249325822198244
-278.278 211.4880785437116 212.2502050870616 48.749337600357094 49.249325822198244
-279.278 212.2502050870616 213.0123316304116 48.749337600357094 49.249325822198244
-280.278 213.0123316304116 213.7744581737616 48.749337600357094 49.249325822198244
-281.278 213.7744581737616 214.5365847171116 48.749337600357094 49.249325822198244
-282.278 214.5365847171116 215.29871126046157 48.749337600357094 49.249325822198244
-283.278 215.29871126046157 216.06083780381164 48.749337600357094 49.249325822198244
-284.278 216.06083780381164 216.82296434716162 48.749337600357094 49.249325822198244
-285.278 216.82296434716162 217.5850908905116 48.749337600357094 49.249325822198244
-286.278 217.5850908905116 218.3472174338616 48.749337600357094 49.249325822198244
-287.278 218.3472174338616 219.1093439772116 48.749337600357094 49.249325822198244
-288.278 219.1093439772116 219.87147052056162 48.749337600357094 49.249325822198244
-289.278 219.87147052056162 220.6335970639116 48.749337600357094 49.249325822198244
-290.278 220.6335970639116 221.39572360726157 48.749337600357094 49.249325822198244
-291.278 221.39572360726157 222.1578501506116 48.749337600357094 49.249325822198244
-292.278 222.1578501506116 222.9199766939616 48.749337600357094 49.249325822198244
-293.278 222.9199766939616 223.68210323736162 48.749337600357094 49.249325822198244
-294.278 223.68210323736162 224.44422978071162 48.749337600357094 49.249325822198244
-295.278 224.44422978071162 225.20635632406157 48.749337600357094 49.249325822198244
-296.278 225.20635632406157 225.96848286741158 48.749337600357094 49.249325822198244
-297.278 225.96848286741158 226.7306094107616 48.749337600357094 49.249325822198244
-298.278 226.7306094107616 227.4927359541116 48.749337600357094 49.249325822198244
-299.278 227.4927359541116 228.2548624974616 48.749337600357094 49.249325822198244
-300.278 228.2548624974616 229.0169890408116 48.749337600357094 49.249325822198244
-301.278 229.0169890408116 229.77911558416162 48.749337600357094 49.249325822198244
-302.278 229.77911558416162 230.5412421275116 48.749337600357094 49.249325822198244
-303.278 230.5412421275116 231.30336867086157 48.749337600357094 49.249325822198244
-304.278 231.30336867086157 232.06549521421158 48.749337600357094 49.249325822198244
-305.278 232.06549521421158 232.8276217575616 48.749337600357094 49.249325822198244
-306.278 232.8276217575616 233.5897483009116 48.749337600357094 49.249325822198244
-307.278 233.5897483009116 234.3640911291722 48.749337600357094 49.249325822198244
-320.278 243.48517707955097 244.2595199078616 48.749337600357094 49.249325822198244
-321.278 244.2595199078616 245.0216464512116 48.749337600357094 49.249325822198244
-322.278 245.0216464512116 245.78377299456162 48.749337600357094 49.249325822198244
-323.278 245.78377299456162 246.54589953791162 48.749337600357094 49.249325822198244
-324.278 246.54589953791162 247.30802608126163 48.749337600357094 49.249325822198244
-325.278 247.30802608126163 248.0701526246116 48.749337600357094 49.249325822198244
-326.278 248.0701526246116 248.8322791679616 48.749337600357094 49.249325822198244
-327.278 248.8322791679616 249.59440571136162 48.749337600357094 49.249325822198244
-328.278 249.59440571136162 250.35653225471162 48.749337600357094 49.249325822198244
-329.278 250.35653225471162 251.11865879806163 48.749337600357094 49.249325822198244
-330.278 251.11865879806163 251.8807853414116 48.749337600357094 49.249325822198244
-331.278 251.8807853414116 252.6429118847616 48.749337600357094 49.249325822198244
-332.278 252.6429118847616 253.4050384281116 48.749337600357094 49.249325822198244
-333.278 253.4050384281116 254.1671649714616 48.749337600357094 49.249325822198244
-334.278 254.1671649714616 254.9292915148116 48.749337600357094 49.249325822198244
-335.278 254.9292915148116 255.69141805816162 48.749337600357094 49.249325822198244
-336.278 255.69141805816162 256.4535446015116 48.749337600357094 49.249325822198244
-337.278 256.4535446015116 257.21567114486163 48.749337600357094 49.249325822198244
-338.278 257.21567114486163 257.9777976882116 48.749337600357094 49.249325822198244
-339.278 257.9777976882116 258.7399242315616 48.749337600357094 49.249325822198244
-340.278 258.7399242315616 259.5020507749116 48.749337600357094 49.249325822198244
-341.278 259.5020507749116 260.2641773182616 48.749337600357094 49.249325822198244
-342.278 260.2641773182616 261.0263038616116 48.749337600357094 49.249325822198244
-343.278 261.0263038616116 261.78843040496156 48.749337600357094 49.249325822198244
-344.278 261.78843040496156 262.5505569483616 48.749337600357094 49.249325822198244
-345.278 262.5505569483616 263.3126834917116 48.749337600357094 49.249325822198244
-346.278 263.3126834917116 264.0748100350616 48.749337600357094 49.249325822198244
-347.278 264.0748100350616 264.8369365784116 48.749337600357094 49.249325822198244
-348.278 264.8369365784116 265.59906312176156 48.749337600357094 49.249325822198244
-349.278 265.59906312176156 266.3611896651116 48.749337600357094 49.249325822198244
-350.278 266.3611896651116 267.1233162084616 48.749337600357094 49.249325822198244
-351.278 267.1233162084616 267.8854427518116 48.749337600357094 49.249325822198244
-352.278 267.8854427518116 268.6475692951616 48.749337600357094 49.249325822198244
-353.278 268.6475692951616 269.4096958385116 48.749337600357094 49.249325822198244
-354.278 269.4096958385116 270.1718223818616 48.749337600357094 49.249325822198244
-355.278 270.1718223818616 270.9339489252116 48.749337600357094 49.249325822198244
-356.278 270.9339489252116 271.6960754685616 48.749337600357094 49.249325822198244
-357.278 271.6960754685616 272.45820201191157 48.749337600357094 49.249325822198244
-358.278 272.45820201191157 273.22032855526163 48.749337600357094 49.249325822198244
-359.278 273.22032855526163 273.9824550986116 48.749337600357094 49.249325822198244
-360.278 273.9824550986116 274.7445816419616 48.749337600357094 49.249325822198244
-361.278 274.7445816419616 275.5067081853616 48.749337600357094 49.249325822198244
-362.278 275.5067081853616 276.2688347287116 48.749337600357094 49.249325822198244
-363.278 276.2688347287116 277.04317755697224 48.749337600357094 49.249325822198244
-141.279 108.15433977717773 108.93656519326953 49.249325822198244 49.74931380302792
-142.279 108.93656519326953 109.70644971486954 49.249325822198244 49.74931380302792
-143.279 109.70644971486954 110.47633423646954 49.249325822198244 49.74931380302792
-144.279 110.47633423646954 111.24621875806953 49.249325822198244 49.74931380302792
-145.279 111.24621875806953 112.01610327966954 49.249325822198244 49.74931380302792
-146.279 112.01610327966954 112.78598780126953 49.249325822198244 49.74931380302792
-147.279 112.78598780126953 113.55587232291953 49.249325822198244 49.74931380302792
-148.279 113.55587232291953 114.32575684456953 49.249325822198244 49.74931380302792
-149.279 114.32575684456953 115.09564136616953 49.249325822198244 49.74931380302792
-150.279 115.09564136616953 115.86552588776954 49.249325822198244 49.74931380302792
-151.279 115.86552588776954 116.63541040936954 49.249325822198244 49.74931380302792
-152.279 116.63541040936954 117.40529493096953 49.249325822198244 49.74931380302792
-153.279 117.40529493096953 118.17517945256954 49.249325822198244 49.74931380302792
-154.279 118.17517945256954 118.94506397416953 49.249325822198244 49.74931380302792
-155.279 118.94506397416953 119.71494849576953 49.249325822198244 49.74931380302792
-156.279 119.71494849576953 120.48483301741953 49.249325822198244 49.74931380302792
-157.279 120.48483301741953 121.25471753906955 49.249325822198244 49.74931380302792
-158.279 121.25471753906955 122.02460206066955 49.249325822198244 49.74931380302792
-159.279 122.02460206066955 122.79448658226954 49.249325822198244 49.74931380302792
-160.279 122.79448658226954 123.56437110386955 49.249325822198244 49.74931380302792
-161.279 123.56437110386955 124.33425562546952 49.249325822198244 49.74931380302792
-162.279 124.33425562546952 125.10414014706953 49.249325822198244 49.74931380302792
-163.279 125.10414014706953 125.87402466866953 49.249325822198244 49.74931380302792
-164.279 125.87402466866953 126.64390919026954 49.249325822198244 49.74931380302792
-165.279 126.64390919026954 127.41379371191954 49.249325822198244 49.74931380302792
-166.279 127.41379371191954 128.18367823356954 49.249325822198244 49.74931380302792
-167.279 128.18367823356954 128.95356275516957 49.249325822198244 49.74931380302792
-168.279 128.95356275516957 129.72344727676955 49.249325822198244 49.74931380302792
-169.279 129.72344727676955 130.49333179836952 49.249325822198244 49.74931380302792
-170.279 130.49333179836952 131.26321631996956 49.249325822198244 49.74931380302792
-171.279 131.26321631996956 132.03310084156954 49.249325822198244 49.74931380302792
-172.279 132.03310084156954 132.80298536316954 49.249325822198244 49.74931380302792
-173.279 132.80298536316954 133.57286988476955 49.249325822198244 49.74931380302792
-174.279 133.57286988476955 134.34275440641954 49.249325822198244 49.74931380302792
-175.279 134.34275440641954 135.11263892806954 49.249325822198244 49.74931380302792
-176.279 135.11263892806954 135.88252344966955 49.249325822198244 49.74931380302792
-177.279 135.88252344966955 136.65240797126955 49.249325822198244 49.74931380302792
-178.279 136.65240797126955 137.42229249286953 49.249325822198244 49.74931380302792
-179.279 137.42229249286953 138.19217701446954 49.249325822198244 49.74931380302792
-180.279 138.19217701446954 138.96206153606954 49.249325822198244 49.74931380302792
-181.279 138.96206153606954 139.73194605766952 49.249325822198244 49.74931380302792
-182.279 139.73194605766952 140.50183057926952 49.249325822198244 49.74931380302792
-183.279 140.50183057926952 141.27171510091955 49.249325822198244 49.74931380302792
-184.279 141.27171510091955 142.04159962256955 49.249325822198244 49.74931380302792
-185.279 142.04159962256955 142.81148414416953 49.249325822198244 49.74931380302792
-186.279 142.81148414416953 143.58136866576956 49.249325822198244 49.74931380302792
-187.279 143.58136866576956 144.35125318736954 49.249325822198244 49.74931380302792
-188.279 144.35125318736954 145.12113770896954 49.249325822198244 49.74931380302792
-189.279 145.12113770896954 145.89102223056955 49.249325822198244 49.74931380302792
-190.279 145.89102223056955 146.66090675216952 49.249325822198244 49.74931380302792
-191.279 146.66090675216952 147.43079127376953 49.249325822198244 49.74931380302792
-192.279 147.43079127376953 148.20067579541956 49.249325822198244 49.74931380302792
-193.279 148.20067579541956 148.97056031706956 49.249325822198244 49.74931380302792
-194.279 148.97056031706956 149.74044483866953 49.249325822198244 49.74931380302792
-195.279 149.74044483866953 150.51032936026954 49.249325822198244 49.74931380302792
-196.279 150.51032936026954 151.28021388186954 49.249325822198244 49.74931380302792
-197.279 151.28021388186954 152.05009840346952 49.249325822198244 49.74931380302792
-198.279 152.05009840346952 152.81998292506952 49.249325822198244 49.74931380302792
-199.279 152.81998292506952 153.58986744666953 49.249325822198244 49.74931380302792
-200.279 153.58986744666953 154.3597519682695 49.249325822198244 49.74931380302792
-201.279 154.3597519682695 155.12963648991953 49.249325822198244 49.74931380302792
-202.279 155.12963648991953 155.89952101156953 49.249325822198244 49.74931380302792
-203.279 155.89952101156953 156.66940553316954 49.249325822198244 49.74931380302792
-204.279 156.66940553316954 157.43929005476954 49.249325822198244 49.74931380302792
-205.279 157.43929005476954 158.20917457636955 49.249325822198244 49.74931380302792
-206.279 158.20917457636955 158.97905909796953 49.249325822198244 49.74931380302792
-207.279 158.97905909796953 159.7489436195695 49.249325822198244 49.74931380302792
-208.279 159.7489436195695 160.51882814116954 49.249325822198244 49.74931380302792
-209.279 160.51882814116954 161.2887126627695 49.249325822198244 49.74931380302792
-210.279 161.2887126627695 162.05859718441954 49.249325822198244 49.74931380302792
-211.279 162.05859718441954 162.82848170606954 49.249325822198244 49.74931380302792
-212.279 162.82848170606954 163.59836622766954 49.249325822198244 49.74931380302792
-213.279 163.59836622766954 164.36825074926952 49.249325822198244 49.74931380302792
-214.279 164.36825074926952 165.1381352708695 49.249325822198244 49.74931380302792
-215.279 165.1381352708695 165.90801979246953 49.249325822198244 49.74931380302792
-216.279 165.90801979246953 166.6779043140695 49.249325822198244 49.74931380302792
-217.279 166.6779043140695 167.44778883566954 49.249325822198244 49.74931380302792
-218.279 167.44778883566954 168.21767335726952 49.249325822198244 49.74931380302792
-219.279 168.21767335726952 168.98755787891952 49.249325822198244 49.74931380302792
-220.279 168.98755787891952 169.75744240056952 49.249325822198244 49.74931380302792
-221.279 169.75744240056952 170.5273269221695 49.249325822198244 49.74931380302792
-222.279 170.5273269221695 171.3095523382613 49.249325822198244 49.74931380302792
-248.279 190.53198358957772 191.31420900566957 49.249325822198244 49.74931380302792
-249.279 191.31420900566957 192.08409352726954 49.249325822198244 49.74931380302792
-250.279 192.08409352726954 192.85397804886952 49.249325822198244 49.74931380302792
-251.279 192.85397804886952 193.62386257046956 49.249325822198244 49.74931380302792
-252.279 193.62386257046956 194.39374709206953 49.249325822198244 49.74931380302792
-253.279 194.39374709206953 195.16363161366954 49.249325822198244 49.74931380302792
-254.279 195.16363161366954 195.93351613531954 49.249325822198244 49.74931380302792
-255.279 195.93351613531954 196.70340065696954 49.249325822198244 49.74931380302792
-256.279 196.70340065696954 197.47328517856954 49.249325822198244 49.74931380302792
-257.279 197.47328517856954 198.24316970016955 49.249325822198244 49.74931380302792
-258.279 198.24316970016955 199.01305422176952 49.249325822198244 49.74931380302792
-259.279 199.01305422176952 199.78293874336953 49.249325822198244 49.74931380302792
-260.279 199.78293874336953 200.55282326496953 49.249325822198244 49.74931380302792
-261.279 200.55282326496953 201.32270778656954 49.249325822198244 49.74931380302792
-262.279 201.32270778656954 202.09259230816957 49.249325822198244 49.74931380302792
-263.279 202.09259230816957 202.86247682981954 49.249325822198244 49.74931380302792
-264.279 202.86247682981954 203.63236135146954 49.249325822198244 49.74931380302792
-265.279 203.63236135146954 204.40224587306955 49.249325822198244 49.74931380302792
-266.279 204.40224587306955 205.17213039466952 49.249325822198244 49.74931380302792
-267.279 205.17213039466952 205.94201491626956 49.249325822198244 49.74931380302792
-268.279 205.94201491626956 206.71189943786953 49.249325822198244 49.74931380302792
-269.279 206.71189943786953 207.48178395946957 49.249325822198244 49.74931380302792
-270.279 207.48178395946957 208.25166848106954 49.249325822198244 49.74931380302792
-271.279 208.25166848106954 209.02155300266952 49.249325822198244 49.74931380302792
-272.279 209.02155300266952 209.79143752431952 49.249325822198244 49.74931380302792
-273.279 209.79143752431952 210.56132204596955 49.249325822198244 49.74931380302792
-274.279 210.56132204596955 211.33120656756955 49.249325822198244 49.74931380302792
-275.279 211.33120656756955 212.10109108916953 49.249325822198244 49.74931380302792
-276.279 212.10109108916953 212.87097561076956 49.249325822198244 49.74931380302792
-277.279 212.87097561076956 213.64086013236954 49.249325822198244 49.74931380302792
-278.279 213.64086013236954 214.41074465396954 49.249325822198244 49.74931380302792
-279.279 214.41074465396954 215.18062917556952 49.249325822198244 49.74931380302792
-280.279 215.18062917556952 215.95051369716953 49.249325822198244 49.74931380302792
-281.279 215.95051369716953 216.72039821881953 49.249325822198244 49.74931380302792
-282.279 216.72039821881953 217.49028274046952 49.249325822198244 49.74931380302792
-283.279 217.49028274046952 218.26016726206953 49.249325822198244 49.74931380302792
-284.279 218.26016726206953 219.03005178366953 49.249325822198244 49.74931380302792
-285.279 219.03005178366953 219.79993630526957 49.249325822198244 49.74931380302792
-286.279 219.79993630526957 220.56982082686952 49.249325822198244 49.74931380302792
-287.279 220.56982082686952 221.33970534846952 49.249325822198244 49.74931380302792
-288.279 221.33970534846952 222.1095898700695 49.249325822198244 49.74931380302792
-289.279 222.1095898700695 222.87947439166953 49.249325822198244 49.74931380302792
-290.279 222.87947439166953 223.64935891331953 49.249325822198244 49.74931380302792
-291.279 223.64935891331953 224.41924343496953 49.249325822198244 49.74931380302792
-292.279 224.41924343496953 225.18912795656954 49.249325822198244 49.74931380302792
-293.279 225.18912795656954 225.95901247816954 49.249325822198244 49.74931380302792
-294.279 225.95901247816954 226.72889699976952 49.249325822198244 49.74931380302792
-295.279 226.72889699976952 227.4987815213695 49.249325822198244 49.74931380302792
-296.279 227.4987815213695 228.26866604296953 49.249325822198244 49.74931380302792
-297.279 228.26866604296953 229.03855056456953 49.249325822198244 49.74931380302792
-298.279 229.03855056456953 229.80843508616954 49.249325822198244 49.74931380302792
-299.279 229.80843508616954 230.5783196078195 49.249325822198244 49.74931380302792
-300.279 230.5783196078195 231.34820412946954 49.249325822198244 49.74931380302792
-301.279 231.34820412946954 232.11808865106957 49.249325822198244 49.74931380302792
-302.279 232.11808865106957 232.88797317266958 49.249325822198244 49.74931380302792
-303.279 232.88797317266958 233.65785769426952 49.249325822198244 49.74931380302792
-304.279 233.65785769426952 234.44008311036134 49.249325822198244 49.74931380302792
-316.279 242.88413105907767 243.66635647516955 49.249325822198244 49.74931380302792
-317.279 243.66635647516955 244.43624099681955 49.249325822198244 49.74931380302792
-318.279 244.43624099681955 245.20612551846955 49.249325822198244 49.74931380302792
-319.279 245.20612551846955 245.97601004006953 49.249325822198244 49.74931380302792
-320.279 245.97601004006953 246.74589456166956 49.249325822198244 49.74931380302792
-321.279 246.74589456166956 247.51577908326954 49.249325822198244 49.74931380302792
-322.279 247.51577908326954 248.28566360486954 49.249325822198244 49.74931380302792
-323.279 248.28566360486954 249.05554812646955 49.249325822198244 49.74931380302792
-324.279 249.05554812646955 249.82543264806952 49.249325822198244 49.74931380302792
-325.279 249.82543264806952 250.5953171696695 49.249325822198244 49.74931380302792
-326.279 250.5953171696695 251.36520169131953 49.249325822198244 49.74931380302792
-327.279 251.36520169131953 252.13508621296955 49.249325822198244 49.74931380302792
-328.279 252.13508621296955 252.90497073456953 49.249325822198244 49.74931380302792
-329.279 252.90497073456953 253.67485525616954 49.249325822198244 49.74931380302792
-330.279 253.67485525616954 254.44473977776954 49.249325822198244 49.74931380302792
-331.279 254.44473977776954 255.21462429936952 49.249325822198244 49.74931380302792
-332.279 255.21462429936952 255.98450882096952 49.249325822198244 49.74931380302792
-333.279 255.98450882096952 256.75439334256953 49.249325822198244 49.74931380302792
-334.279 256.75439334256953 257.52427786416956 49.249325822198244 49.74931380302792
-335.279 257.52427786416956 258.29416238581956 49.249325822198244 49.74931380302792
-336.279 258.29416238581956 259.06404690746956 49.249325822198244 49.74931380302792
-337.279 259.06404690746956 259.83393142906954 49.249325822198244 49.74931380302792
-338.279 259.83393142906954 260.6038159506695 49.249325822198244 49.74931380302792
-339.279 260.6038159506695 261.37370047226955 49.249325822198244 49.74931380302792
-340.279 261.37370047226955 262.1435849938696 49.249325822198244 49.74931380302792
-341.279 262.1435849938696 262.91346951546956 49.249325822198244 49.74931380302792
-342.279 262.91346951546956 263.68335403706953 49.249325822198244 49.74931380302792
-343.279 263.68335403706953 264.45323855866957 49.249325822198244 49.74931380302792
-344.279 264.45323855866957 265.2231230803195 49.249325822198244 49.74931380302792
-345.279 265.2231230803195 265.99300760196957 49.249325822198244 49.74931380302792
-346.279 265.99300760196957 266.76289212356954 49.249325822198244 49.74931380302792
-347.279 266.76289212356954 267.5327766451695 49.249325822198244 49.74931380302792
-348.279 267.5327766451695 268.30266116676955 49.249325822198244 49.74931380302792
-349.279 268.30266116676955 269.0725456883696 49.249325822198244 49.74931380302792
-350.279 269.0725456883696 269.8424302099695 49.249325822198244 49.74931380302792
-351.279 269.8424302099695 270.61231473156954 49.249325822198244 49.74931380302792
-352.279 270.61231473156954 271.3821992531696 49.249325822198244 49.74931380302792
-353.279 271.3821992531696 272.1520837748195 49.249325822198244 49.74931380302792
-354.279 272.1520837748195 272.9219682964696 49.249325822198244 49.74931380302792
-355.279 272.9219682964696 273.69185281806955 49.249325822198244 49.74931380302792
-356.279 273.69185281806955 274.4617373396695 49.249325822198244 49.74931380302792
-357.279 274.4617373396695 275.23162186126956 49.249325822198244 49.74931380302792
-358.279 275.23162186126956 276.00150638286954 49.249325822198244 49.74931380302792
-359.279 276.00150638286954 276.7713909044695 49.249325822198244 49.74931380302792
-360.279 276.7713909044695 277.55361632056133 49.249325822198244 49.74931380302792
-140.280 108.49711378422252 109.28744473406144 49.74931380302792 50.24930153348423
-141.280 109.28744473406144 110.06530664751143 49.74931380302792 50.24930153348423
-142.280 110.06530664751143 110.84316856091144 49.74931380302792 50.24930153348423
-143.280 110.84316856091144 111.62103047431142 49.74931380302792 50.24930153348423
-144.280 111.62103047431142 112.39889238776144 49.74931380302792 50.24930153348423
-145.280 112.39889238776144 113.17675430121143 49.74931380302792 50.24930153348423
-146.280 113.17675430121143 113.95461621461143 49.74931380302792 50.24930153348423
-147.280 113.95461621461143 114.73247812806144 49.74931380302792 50.24930153348423
-148.280 114.73247812806144 115.51034004151144 49.74931380302792 50.24930153348423
-149.280 115.51034004151144 116.28820195491144 49.74931380302792 50.24930153348423
-150.280 116.28820195491144 117.06606386836143 49.74931380302792 50.24930153348423
-151.280 117.06606386836143 117.84392578181144 49.74931380302792 50.24930153348423
-152.280 117.84392578181144 118.62178769521144 49.74931380302792 50.24930153348423
-153.280 118.62178769521144 119.39964960866143 49.74931380302792 50.24930153348423
-154.280 119.39964960866143 120.17751152211144 49.74931380302792 50.24930153348423
-155.280 120.17751152211144 120.95537343551143 49.74931380302792 50.24930153348423
-156.280 120.95537343551143 121.73323534891144 49.74931380302792 50.24930153348423
-157.280 121.73323534891144 122.51109726236143 49.74931380302792 50.24930153348423
-158.280 122.51109726236143 123.28895917581144 49.74931380302792 50.24930153348423
-159.280 123.28895917581144 124.06682108921144 49.74931380302792 50.24930153348423
-160.280 124.06682108921144 124.84468300266144 49.74931380302792 50.24930153348423
-161.280 124.84468300266144 125.62254491611142 49.74931380302792 50.24930153348423
-162.280 125.62254491611142 126.40040682951144 49.74931380302792 50.24930153348423
-163.280 126.40040682951144 127.17826874296145 49.74931380302792 50.24930153348423
-164.280 127.17826874296145 127.95613065641143 49.74931380302792 50.24930153348423
-165.280 127.95613065641143 128.73399256981145 49.74931380302792 50.24930153348423
-166.280 128.73399256981145 129.51185448321144 49.74931380302792 50.24930153348423
-167.280 129.51185448321144 130.28971639666145 49.74931380302792 50.24930153348423
-168.280 130.28971639666145 131.06757831011143 49.74931380302792 50.24930153348423
-169.280 131.06757831011143 131.85790925990034 49.74931380302792 50.24930153348423
-194.280 150.50165710952248 151.29198805931145 49.74931380302792 50.24930153348423
-195.280 151.29198805931145 152.06984997271144 49.74931380302792 50.24930153348423
-196.280 152.06984997271144 152.84771188616142 49.74931380302792 50.24930153348423
-197.280 152.84771188616142 153.62557379961143 49.74931380302792 50.24930153348423
-198.280 153.62557379961143 154.40343571301145 49.74931380302792 50.24930153348423
-199.280 154.40343571301145 155.18129762641144 49.74931380302792 50.24930153348423
-200.280 155.18129762641144 155.95915953986142 49.74931380302792 50.24930153348423
-201.280 155.95915953986142 156.73702145331143 49.74931380302792 50.24930153348423
-202.280 156.73702145331143 157.51488336671144 49.74931380302792 50.24930153348423
-203.280 157.51488336671144 158.29274528016145 49.74931380302792 50.24930153348423
-204.280 158.29274528016145 159.0706071936114 49.74931380302792 50.24930153348423
-205.280 159.0706071936114 159.84846910701143 49.74931380302792 50.24930153348423
-206.280 159.84846910701143 160.62633102046144 49.74931380302792 50.24930153348423
-207.280 160.62633102046144 161.41666197030037 49.74931380302792 50.24930153348423
-246.280 190.95047660782248 191.7408075576614 49.74931380302792 50.24930153348423
-247.280 191.7408075576614 192.51866947111142 49.74931380302792 50.24930153348423
-248.280 192.51866947111142 193.29653138451144 49.74931380302792 50.24930153348423
-249.280 193.29653138451144 194.07439329796142 49.74931380302792 50.24930153348423
-250.280 194.07439329796142 194.85225521141143 49.74931380302792 50.24930153348423
-251.280 194.85225521141143 195.63011712481142 49.74931380302792 50.24930153348423
-252.280 195.63011712481142 196.40797903821144 49.74931380302792 50.24930153348423
-253.280 196.40797903821144 197.18584095166142 49.74931380302792 50.24930153348423
-254.280 197.18584095166142 197.96370286511143 49.74931380302792 50.24930153348423
-255.280 197.96370286511143 198.74156477851142 49.74931380302792 50.24930153348423
-256.280 198.74156477851142 199.51942669196146 49.74931380302792 50.24930153348423
-257.280 199.51942669196146 200.29728860541144 49.74931380302792 50.24930153348423
-258.280 200.29728860541144 201.07515051881143 49.74931380302792 50.24930153348423
-259.280 201.07515051881143 201.8530124322614 49.74931380302792 50.24930153348423
-260.280 201.8530124322614 202.63087434571145 49.74931380302792 50.24930153348423
-261.280 202.63087434571145 203.40873625911144 49.74931380302792 50.24930153348423
-262.280 203.40873625911144 204.18659817251142 49.74931380302792 50.24930153348423
-263.280 204.18659817251142 204.9644600859614 49.74931380302792 50.24930153348423
-264.280 204.9644600859614 205.74232199941142 49.74931380302792 50.24930153348423
-265.280 205.74232199941142 206.52018391281143 49.74931380302792 50.24930153348423
-266.280 206.52018391281143 207.2980458262614 49.74931380302792 50.24930153348423
-267.280 207.2980458262614 208.0759077397114 49.74931380302792 50.24930153348423
-268.280 208.0759077397114 208.85376965311139 49.74931380302792 50.24930153348423
-269.280 208.85376965311139 209.63163156656142 49.74931380302792 50.24930153348423
-270.280 209.63163156656142 210.4094934800114 49.74931380302792 50.24930153348423
-271.280 210.4094934800114 211.18735539341142 49.74931380302792 50.24930153348423
-272.280 211.18735539341142 211.96521730681144 49.74931380302792 50.24930153348423
-273.280 211.96521730681144 212.74307922026142 49.74931380302792 50.24930153348423
-274.280 212.74307922026142 213.5209411337114 49.74931380302792 50.24930153348423
-275.280 213.5209411337114 214.29880304711145 49.74931380302792 50.24930153348423
-276.280 214.29880304711145 215.07666496056143 49.74931380302792 50.24930153348423
-277.280 215.07666496056143 215.8545268740114 49.74931380302792 50.24930153348423
-278.280 215.8545268740114 216.6323887874114 49.74931380302792 50.24930153348423
-279.280 216.6323887874114 217.4102507008614 49.74931380302792 50.24930153348423
-280.280 217.4102507008614 218.18811261431142 49.74931380302792 50.24930153348423
-281.280 218.18811261431142 218.9659745277114 49.74931380302792 50.24930153348423
-282.280 218.9659745277114 219.7438364411114 49.74931380302792 50.24930153348423
-283.280 219.7438364411114 220.5216983545614 49.74931380302792 50.24930153348423
-284.280 220.5216983545614 221.29956026801142 49.74931380302792 50.24930153348423
-285.280 221.29956026801142 222.07742218141144 49.74931380302792 50.24930153348423
-286.280 222.07742218141144 222.85528409486142 49.74931380302792 50.24930153348423
-287.280 222.85528409486142 223.6331460083114 49.74931380302792 50.24930153348423
-288.280 223.6331460083114 224.41100792171142 49.74931380302792 50.24930153348423
-289.280 224.41100792171142 225.18886983516143 49.74931380302792 50.24930153348423
-290.280 225.18886983516143 225.9667317486114 49.74931380302792 50.24930153348423
-291.280 225.9667317486114 226.74459366201143 49.74931380302792 50.24930153348423
-292.280 226.74459366201143 227.5224555754114 49.74931380302792 50.24930153348423
-293.280 227.5224555754114 228.30031748886142 49.74931380302792 50.24930153348423
-294.280 228.30031748886142 229.0781794023114 49.74931380302792 50.24930153348423
-295.280 229.0781794023114 229.85604131571142 49.74931380302792 50.24930153348423
-296.280 229.85604131571142 230.63390322916143 49.74931380302792 50.24930153348423
-297.280 230.63390322916143 231.41176514261142 49.74931380302792 50.24930153348423
-298.280 231.41176514261142 232.18962705601143 49.74931380302792 50.24930153348423
-299.280 232.18962705601143 232.96748896946139 49.74931380302792 50.24930153348423
-300.280 232.96748896946139 233.7453508829114 49.74931380302792 50.24930153348423
-301.280 233.7453508829114 234.5232127963114 49.74931380302792 50.24930153348423
-302.280 234.5232127963114 235.31354374610035 49.74931380302792 50.24930153348423
-313.280 243.06722480772248 243.8575557575114 49.74931380302792 50.24930153348423
-314.280 243.8575557575114 244.6354176709114 49.74931380302792 50.24930153348423
-315.280 244.6354176709114 245.4132795843114 49.74931380302792 50.24930153348423
-316.280 245.4132795843114 246.1911414977614 49.74931380302792 50.24930153348423
-317.280 246.1911414977614 246.96900341121142 49.74931380302792 50.24930153348423
-318.280 246.96900341121142 247.7468653246114 49.74931380302792 50.24930153348423
-319.280 247.7468653246114 248.52472723806142 49.74931380302792 50.24930153348423
-320.280 248.52472723806142 249.3025891515114 49.74931380302792 50.24930153348423
-321.280 249.3025891515114 250.08045106491141 49.74931380302792 50.24930153348423
-322.280 250.08045106491141 250.85831297836143 49.74931380302792 50.24930153348423
-323.280 250.85831297836143 251.6361748918114 49.74931380302792 50.24930153348423
-324.280 251.6361748918114 252.41403680521142 49.74931380302792 50.24930153348423
-325.280 252.41403680521142 253.19189871861144 49.74931380302792 50.24930153348423
-326.280 253.19189871861144 253.96976063206142 49.74931380302792 50.24930153348423
-327.280 253.96976063206142 254.74762254551143 49.74931380302792 50.24930153348423
-328.280 254.74762254551143 255.52548445891142 49.74931380302792 50.24930153348423
-329.280 255.52548445891142 256.30334637236143 49.74931380302792 50.24930153348423
-330.280 256.30334637236143 257.0812082858114 49.74931380302792 50.24930153348423
-331.280 257.0812082858114 257.85907019921143 49.74931380302792 50.24930153348423
-332.280 257.85907019921143 258.63693211266144 49.74931380302792 50.24930153348423
-333.280 258.63693211266144 259.4147940261114 49.74931380302792 50.24930153348423
-334.280 259.4147940261114 260.1926559395114 49.74931380302792 50.24930153348423
-335.280 260.1926559395114 260.9705178529114 49.74931380302792 50.24930153348423
-336.280 260.9705178529114 261.74837976636144 49.74931380302792 50.24930153348423
-337.280 261.74837976636144 262.52624167981145 49.74931380302792 50.24930153348423
-338.280 262.52624167981145 263.30410359321144 49.74931380302792 50.24930153348423
-339.280 263.30410359321144 264.0819655066614 49.74931380302792 50.24930153348423
-340.280 264.0819655066614 264.8598274201114 49.74931380302792 50.24930153348423
-341.280 264.8598274201114 265.6376893335114 49.74931380302792 50.24930153348423
-342.280 265.6376893335114 266.4155512469614 49.74931380302792 50.24930153348423
-343.280 266.4155512469614 267.1934131604114 49.74931380302792 50.24930153348423
-344.280 267.1934131604114 267.9712750738114 49.74931380302792 50.24930153348423
-345.280 267.9712750738114 268.7491369872614 49.74931380302792 50.24930153348423
-346.280 268.7491369872614 269.5269989007114 49.74931380302792 50.24930153348423
-347.280 269.5269989007114 270.3048608141114 49.74931380302792 50.24930153348423
-348.280 270.3048608141114 271.08272272751145 49.74931380302792 50.24930153348423
-349.280 271.08272272751145 271.8605846409614 49.74931380302792 50.24930153348423
-350.280 271.8605846409614 272.6384465544114 49.74931380302792 50.24930153348423
-351.280 272.6384465544114 273.4163084678114 49.74931380302792 50.24930153348423
-352.280 273.4163084678114 274.1941703812614 49.74931380302792 50.24930153348423
-353.280 274.1941703812614 274.9720322947114 49.74931380302792 50.24930153348423
-354.280 274.9720322947114 275.7498942081114 49.74931380302792 50.24930153348423
-355.280 275.7498942081114 276.5277561215614 49.74931380302792 50.24930153348423
-356.280 276.5277561215614 277.30561803501143 49.74931380302792 50.24930153348423
-357.280 277.30561803501143 278.0959489848004 49.74931380302792 50.24930153348423
-138.281 108.06937458184004 108.86804226912014 50.24930153348423 50.74928900373321
-139.281 108.86804226912014 109.65410911447015 50.24930153348423 50.74928900373321
-140.281 109.65410911447015 110.44017595977014 50.24930153348423 50.74928900373321
-141.281 110.44017595977014 111.22624280512015 50.24930153348423 50.74928900373321
-142.281 111.22624280512015 112.01230965047016 50.24930153348423 50.74928900373321
-143.281 112.01230965047016 112.79837649577016 50.24930153348423 50.74928900373321
-144.281 112.79837649577016 113.58444334112016 50.24930153348423 50.74928900373321
-145.281 113.58444334112016 114.37051018647017 50.24930153348423 50.74928900373321
-146.281 114.37051018647017 115.15657703177015 50.24930153348423 50.74928900373321
-147.281 115.15657703177015 115.94264387712016 50.24930153348423 50.74928900373321
-148.281 115.94264387712016 116.72871072247017 50.24930153348423 50.74928900373321
-149.281 116.72871072247017 117.51477756777015 50.24930153348423 50.74928900373321
-150.281 117.51477756777015 118.30084441312015 50.24930153348423 50.74928900373321
-151.281 118.30084441312015 119.08691125847015 50.24930153348423 50.74928900373321
-152.281 119.08691125847015 119.87297810377015 50.24930153348423 50.74928900373321
-153.281 119.87297810377015 120.65904494912016 50.24930153348423 50.74928900373321
-154.281 120.65904494912016 121.44511179447015 50.24930153348423 50.74928900373321
-155.281 121.44511179447015 122.23117863977015 50.24930153348423 50.74928900373321
-156.281 122.23117863977015 123.01724548512016 50.24930153348423 50.74928900373321
-157.281 123.01724548512016 123.80331233047016 50.24930153348423 50.74928900373321
-158.281 123.80331233047016 124.58937917582016 50.24930153348423 50.74928900373321
-159.281 124.58937917582016 125.37544602117015 50.24930153348423 50.74928900373321
-160.281 125.37544602117015 126.16151286647013 50.24930153348423 50.74928900373321
-161.281 126.16151286647013 126.94757971182014 50.24930153348423 50.74928900373321
-162.281 126.94757971182014 127.73364655717015 50.24930153348423 50.74928900373321
-163.281 127.73364655717015 128.51971340247016 50.24930153348423 50.74928900373321
-164.281 128.51971340247016 129.30578024782017 50.24930153348423 50.74928900373321
-165.281 129.30578024782017 130.09184709317014 50.24930153348423 50.74928900373321
-166.281 130.09184709317014 130.87791393847016 50.24930153348423 50.74928900373321
-167.281 130.87791393847016 131.66398078382014 50.24930153348423 50.74928900373321
-168.281 131.66398078382014 132.46264847110027 50.24930153348423 50.74928900373321
-193.281 151.30305107524003 152.1017187625202 50.24930153348423 50.74928900373321
-194.281 152.1017187625202 152.88778560787017 50.24930153348423 50.74928900373321
-195.281 152.88778560787017 153.67385245317013 50.24930153348423 50.74928900373321
-196.281 153.67385245317013 154.45991929852016 50.24930153348423 50.74928900373321
-197.281 154.45991929852016 155.24598614387014 50.24930153348423 50.74928900373321
-198.281 155.24598614387014 156.03205298922012 50.24930153348423 50.74928900373321
-199.281 156.03205298922012 156.81811983457015 50.24930153348423 50.74928900373321
-200.281 156.81811983457015 157.60418667987017 50.24930153348423 50.74928900373321
-201.281 157.60418667987017 158.39025352522015 50.24930153348423 50.74928900373321
-202.281 158.39025352522015 159.17632037057015 50.24930153348423 50.74928900373321
-203.281 159.17632037057015 159.96238721587014 50.24930153348423 50.74928900373321
-204.281 159.96238721587014 160.74845406122017 50.24930153348423 50.74928900373321
-205.281 160.74845406122017 161.54712174850027 50.24930153348423 50.74928900373321
-252.281 197.68099495004003 198.4796626372701 50.24930153348423 50.74928900373321
-253.281 198.4796626372701 199.26572948262012 50.24930153348423 50.74928900373321
-254.281 199.26572948262012 200.06439716990022 50.24930153348423 50.74928900373321
-256.281 200.82526233134004 201.62393001862017 50.24930153348423 50.74928900373321
-257.281 201.62393001862017 202.40999686397015 50.24930153348423 50.74928900373321
-258.281 202.40999686397015 203.19606370927016 50.24930153348423 50.74928900373321
-259.281 203.19606370927016 203.98213055462014 50.24930153348423 50.74928900373321
-260.281 203.98213055462014 204.76819739997012 50.24930153348423 50.74928900373321
-261.281 204.76819739997012 205.5542642453201 50.24930153348423 50.74928900373321
-262.281 205.5542642453201 206.34033109067013 50.24930153348423 50.74928900373321
-263.281 206.34033109067013 207.12639793597015 50.24930153348423 50.74928900373321
-264.281 207.12639793597015 207.91246478132015 50.24930153348423 50.74928900373321
-265.281 207.91246478132015 208.69853162667016 50.24930153348423 50.74928900373321
-266.281 208.69853162667016 209.48459847197014 50.24930153348423 50.74928900373321
-267.281 209.48459847197014 210.27066531732012 50.24930153348423 50.74928900373321
-268.281 210.27066531732012 211.05673216267013 50.24930153348423 50.74928900373321
-269.281 211.05673216267013 211.84279900797014 50.24930153348423 50.74928900373321
-270.281 211.84279900797014 212.62886585332012 50.24930153348423 50.74928900373321
-271.281 212.62886585332012 213.41493269867016 50.24930153348423 50.74928900373321
-272.281 213.41493269867016 214.20099954397014 50.24930153348423 50.74928900373321
-273.281 214.20099954397014 214.98706638932015 50.24930153348423 50.74928900373321
-274.281 214.98706638932015 215.77313323467013 50.24930153348423 50.74928900373321
-275.281 215.77313323467013 216.55920007997014 50.24930153348423 50.74928900373321
-276.281 216.55920007997014 217.34526692532012 50.24930153348423 50.74928900373321
-277.281 217.34526692532012 218.13133377067012 50.24930153348423 50.74928900373321
-278.281 218.13133377067012 218.91740061597017 50.24930153348423 50.74928900373321
-279.281 218.91740061597017 219.70346746132014 50.24930153348423 50.74928900373321
-280.281 219.70346746132014 220.48953430667012 50.24930153348423 50.74928900373321
-281.281 220.48953430667012 221.27560115202016 50.24930153348423 50.74928900373321
-282.281 221.27560115202016 222.06166799737014 50.24930153348423 50.74928900373321
-283.281 222.06166799737014 222.84773484267015 50.24930153348423 50.74928900373321
-284.281 222.84773484267015 223.63380168802013 50.24930153348423 50.74928900373321
-285.281 223.63380168802013 224.41986853337013 50.24930153348423 50.74928900373321
-286.281 224.41986853337013 225.20593537867015 50.24930153348423 50.74928900373321
-287.281 225.20593537867015 225.99200222402015 50.24930153348423 50.74928900373321
-288.281 225.99200222402015 226.77806906937013 50.24930153348423 50.74928900373321
-289.281 226.77806906937013 227.56413591467015 50.24930153348423 50.74928900373321
-290.281 227.56413591467015 228.35020276002012 50.24930153348423 50.74928900373321
-291.281 228.35020276002012 229.13626960537016 50.24930153348423 50.74928900373321
-292.281 229.13626960537016 229.92233645067014 50.24930153348423 50.74928900373321
-293.281 229.92233645067014 230.70840329602015 50.24930153348423 50.74928900373321
-294.281 230.70840329602015 231.49447014137016 50.24930153348423 50.74928900373321
-295.281 231.49447014137016 232.28053698667014 50.24930153348423 50.74928900373321
-296.281 232.28053698667014 233.06660383202012 50.24930153348423 50.74928900373321
-297.281 233.06660383202012 233.85267067737016 50.24930153348423 50.74928900373321
-298.281 233.85267067737016 234.63873752267017 50.24930153348423 50.74928900373321
-299.281 234.63873752267017 235.42480436802015 50.24930153348423 50.74928900373321
-300.281 235.42480436802015 236.22347205530025 50.24930153348423 50.74928900373321
-310.281 243.27287197944 244.07153966672013 50.24930153348423 50.74928900373321
-311.281 244.07153966672013 244.85760651207013 50.24930153348423 50.74928900373321
-312.281 244.85760651207013 245.64367335737012 50.24930153348423 50.74928900373321
-313.281 245.64367335737012 246.42974020272015 50.24930153348423 50.74928900373321
-314.281 246.42974020272015 247.21580704807013 50.24930153348423 50.74928900373321
-315.281 247.21580704807013 248.00187389337015 50.24930153348423 50.74928900373321
-316.281 248.00187389337015 248.78794073872012 50.24930153348423 50.74928900373321
-317.281 248.78794073872012 249.57400758407016 50.24930153348423 50.74928900373321
-318.281 249.57400758407016 250.36007442937012 50.24930153348423 50.74928900373321
-319.281 250.36007442937012 251.1461412747201 50.24930153348423 50.74928900373321
-320.281 251.1461412747201 251.93220812007013 50.24930153348423 50.74928900373321
-321.281 251.93220812007013 252.7182749653701 50.24930153348423 50.74928900373321
-322.281 252.7182749653701 253.50434181072012 50.24930153348423 50.74928900373321
-323.281 253.50434181072012 254.29040865607013 50.24930153348423 50.74928900373321
-324.281 254.29040865607013 255.07647550142013 50.24930153348423 50.74928900373321
-325.281 255.07647550142013 255.86254234677014 50.24930153348423 50.74928900373321
-326.281 255.86254234677014 256.6486091920701 50.24930153348423 50.74928900373321
-327.281 256.6486091920701 257.43467603742016 50.24930153348423 50.74928900373321
-328.281 257.43467603742016 258.22074288277014 50.24930153348423 50.74928900373321
-329.281 258.22074288277014 259.00680972807015 50.24930153348423 50.74928900373321
-330.281 259.00680972807015 259.79287657342013 50.24930153348423 50.74928900373321
-331.281 259.79287657342013 260.5789434187701 50.24930153348423 50.74928900373321
-332.281 260.5789434187701 261.3650102640701 50.24930153348423 50.74928900373321
-333.281 261.3650102640701 262.1510771094201 50.24930153348423 50.74928900373321
-334.281 262.1510771094201 262.93714395477014 50.24930153348423 50.74928900373321
-335.281 262.93714395477014 263.7232108000702 50.24930153348423 50.74928900373321
-336.281 263.7232108000702 264.5092776454202 50.24930153348423 50.74928900373321
-337.281 264.5092776454202 265.29534449077016 50.24930153348423 50.74928900373321
-338.281 265.29534449077016 266.0814113360701 50.24930153348423 50.74928900373321
-339.281 266.0814113360701 266.86747818142015 50.24930153348423 50.74928900373321
-340.281 266.86747818142015 267.6535450267702 50.24930153348423 50.74928900373321
-341.281 267.6535450267702 268.43961187207015 50.24930153348423 50.74928900373321
-342.281 268.43961187207015 269.2256787174202 50.24930153348423 50.74928900373321
-343.281 269.2256787174202 270.01174556277016 50.24930153348423 50.74928900373321
-344.281 270.01174556277016 270.79781240812014 50.24930153348423 50.74928900373321
-345.281 270.79781240812014 271.5838792534701 50.24930153348423 50.74928900373321
-346.281 271.5838792534701 272.36994609877013 50.24930153348423 50.74928900373321
-347.281 272.36994609877013 273.1560129441201 50.24930153348423 50.74928900373321
-348.281 273.1560129441201 273.94207978947014 50.24930153348423 50.74928900373321
-349.281 273.94207978947014 274.7281466347701 50.24930153348423 50.74928900373321
-350.281 274.7281466347701 275.5142134801201 50.24930153348423 50.74928900373321
-351.281 275.5142134801201 276.3002803254701 50.24930153348423 50.74928900373321
-352.281 276.3002803254701 277.0863471707702 50.24930153348423 50.74928900373321
-353.281 277.0863471707702 277.88501485800026 50.24930153348423 50.74928900373321
-136.282 107.64079934402825 108.44804365779106 50.74928900373321 51.24927620343834
-137.282 108.44804365779106 109.24255152229108 50.74928900373321 51.24927620343834
-138.282 109.24255152229108 110.0370593868411 50.74928900373321 51.24927620343834
-139.282 110.0370593868411 110.83156725139108 50.74928900373321 51.24927620343834
-140.282 110.83156725139108 111.62607511589108 50.74928900373321 51.24927620343834
-141.282 111.62607511589108 112.42058298044108 50.74928900373321 51.24927620343834
-142.282 112.42058298044108 113.21509084499107 50.74928900373321 51.24927620343834
-143.282 113.21509084499107 114.00959870949109 50.74928900373321 51.24927620343834
-144.282 114.00959870949109 114.80410657404107 50.74928900373321 51.24927620343834
-145.282 114.80410657404107 115.59861443859107 50.74928900373321 51.24927620343834
-146.282 115.59861443859107 116.39312230309108 50.74928900373321 51.24927620343834
-147.282 116.39312230309108 117.18763016764109 50.74928900373321 51.24927620343834
-148.282 117.18763016764109 117.98213803219109 50.74928900373321 51.24927620343834
-149.282 117.98213803219109 118.77664589669108 50.74928900373321 51.24927620343834
-150.282 118.77664589669108 119.57115376124108 50.74928900373321 51.24927620343834
-151.282 119.57115376124108 120.36566162579108 50.74928900373321 51.24927620343834
-152.282 120.36566162579108 121.16016949029108 50.74928900373321 51.24927620343834
-153.282 121.16016949029108 121.95467735484108 50.74928900373321 51.24927620343834
-154.282 121.95467735484108 122.74918521939108 50.74928900373321 51.24927620343834
-155.282 122.74918521939108 123.54369308389109 50.74928900373321 51.24927620343834
-156.282 123.54369308389109 124.33820094844108 50.74928900373321 51.24927620343834
-157.282 124.33820094844108 125.13270881299108 50.74928900373321 51.24927620343834
-158.282 125.13270881299108 125.92721667749107 50.74928900373321 51.24927620343834
-159.282 125.92721667749107 126.72172454204107 50.74928900373321 51.24927620343834
-160.282 126.72172454204107 127.51623240659109 50.74928900373321 51.24927620343834
-161.282 127.51623240659109 128.31074027109105 50.74928900373321 51.24927620343834
-162.282 128.31074027109105 129.10524813564106 50.74928900373321 51.24927620343834
-163.282 129.10524813564106 129.89975600019108 50.74928900373321 51.24927620343834
-164.282 129.89975600019108 130.69426386469107 50.74928900373321 51.24927620343834
-165.282 130.69426386469107 131.48877172924108 50.74928900373321 51.24927620343834
-166.282 131.48877172924108 132.2960160430539 50.74928900373321 51.24927620343834
-191.282 151.33873189332826 152.14597620709108 50.74928900373321 51.24927620343834
-192.282 152.14597620709108 152.94048407159107 50.74928900373321 51.24927620343834
-193.282 152.94048407159107 153.73499193614106 50.74928900373321 51.24927620343834
-194.282 153.73499193614106 154.52949980069107 50.74928900373321 51.24927620343834
-195.282 154.52949980069107 155.3240076651911 50.74928900373321 51.24927620343834
-196.282 155.3240076651911 156.1185155297411 50.74928900373321 51.24927620343834
-197.282 156.1185155297411 156.9130233942911 50.74928900373321 51.24927620343834
-198.282 156.9130233942911 157.70753125879108 50.74928900373321 51.24927620343834
-199.282 157.70753125879108 158.5020391233411 50.74928900373321 51.24927620343834
-200.282 158.5020391233411 159.29654698789108 50.74928900373321 51.24927620343834
-201.282 159.29654698789108 160.0910548523911 50.74928900373321 51.24927620343834
-202.282 160.0910548523911 160.88556271694108 50.74928900373321 51.24927620343834
-203.282 160.88556271694108 161.69280703075393 50.74928900373321 51.24927620343834
-243.282 192.65314084902826 193.46038516279108 50.74928900373321 51.24927620343834
-244.282 193.46038516279108 194.2548930273411 50.74928900373321 51.24927620343834
-245.282 194.2548930273411 195.04940089189108 50.74928900373321 51.24927620343834
-246.282 195.04940089189108 195.8439087563911 50.74928900373321 51.24927620343834
-247.282 195.8439087563911 196.6384166209411 50.74928900373321 51.24927620343834
-248.282 196.6384166209411 197.43292448549107 50.74928900373321 51.24927620343834
-249.282 197.43292448549107 198.2274323499911 50.74928900373321 51.24927620343834
-250.282 198.2274323499911 199.02194021454108 50.74928900373321 51.24927620343834
-251.282 199.02194021454108 199.8164480790911 50.74928900373321 51.24927620343834
-252.282 199.8164480790911 200.61095594359108 50.74928900373321 51.24927620343834
-253.282 200.61095594359108 201.40546380814106 50.74928900373321 51.24927620343834
-254.282 201.40546380814106 202.19997167269108 50.74928900373321 51.24927620343834
-255.282 202.19997167269108 202.99447953719107 50.74928900373321 51.24927620343834
-256.282 202.99447953719107 203.7889874016911 50.74928900373321 51.24927620343834
-257.282 203.7889874016911 204.58349526624107 50.74928900373321 51.24927620343834
-258.282 204.58349526624107 205.3780031307911 50.74928900373321 51.24927620343834
-259.282 205.3780031307911 206.17251099529108 50.74928900373321 51.24927620343834
-260.282 206.17251099529108 206.96701885984106 50.74928900373321 51.24927620343834
-261.282 206.96701885984106 207.7615267243911 50.74928900373321 51.24927620343834
-262.282 207.7615267243911 208.55603458889107 50.74928900373321 51.24927620343834
-263.282 208.55603458889107 209.35054245344105 50.74928900373321 51.24927620343834
-264.282 209.35054245344105 210.1450503179911 50.74928900373321 51.24927620343834
-265.282 210.1450503179911 210.93955818249108 50.74928900373321 51.24927620343834
-266.282 210.93955818249108 211.7340660470411 50.74928900373321 51.24927620343834
-267.282 211.7340660470411 212.52857391159108 50.74928900373321 51.24927620343834
-268.282 212.52857391159108 213.32308177609107 50.74928900373321 51.24927620343834
-269.282 213.32308177609107 214.11758964064106 50.74928900373321 51.24927620343834
-270.282 214.11758964064106 214.91209750519107 50.74928900373321 51.24927620343834
-271.282 214.91209750519107 215.70660536969106 50.74928900373321 51.24927620343834
-272.282 215.70660536969106 216.50111323424107 50.74928900373321 51.24927620343834
-273.282 216.50111323424107 217.2956210987911 50.74928900373321 51.24927620343834
-274.282 217.2956210987911 218.09012896329108 50.74928900373321 51.24927620343834
-275.282 218.09012896329108 218.88463682784106 50.74928900373321 51.24927620343834
-276.282 218.88463682784106 219.67914469239108 50.74928900373321 51.24927620343834
-277.282 219.67914469239108 220.47365255689107 50.74928900373321 51.24927620343834
-278.282 220.47365255689107 221.26816042144108 50.74928900373321 51.24927620343834
-279.282 221.26816042144108 222.0626682859911 50.74928900373321 51.24927620343834
-280.282 222.0626682859911 222.85717615049106 50.74928900373321 51.24927620343834
-281.282 222.85717615049106 223.65168401504107 50.74928900373321 51.24927620343834
-282.282 223.65168401504107 224.44619187959108 50.74928900373321 51.24927620343834
-283.282 224.44619187959108 225.2406997440911 50.74928900373321 51.24927620343834
-284.282 225.2406997440911 226.0352076086411 50.74928900373321 51.24927620343834
-285.282 226.0352076086411 226.82971547319107 50.74928900373321 51.24927620343834
-286.282 226.82971547319107 227.6242233376911 50.74928900373321 51.24927620343834
-287.282 227.6242233376911 228.41873120224108 50.74928900373321 51.24927620343834
-288.282 228.41873120224108 229.21323906679112 50.74928900373321 51.24927620343834
-289.282 229.21323906679112 230.00774693129108 50.74928900373321 51.24927620343834
-290.282 230.00774693129108 230.80225479584107 50.74928900373321 51.24927620343834
-291.282 230.80225479584107 231.59676266039108 50.74928900373321 51.24927620343834
-292.282 231.59676266039108 232.3912705248911 50.74928900373321 51.24927620343834
-293.282 232.3912705248911 233.18577838944108 50.74928900373321 51.24927620343834
-294.282 233.18577838944108 233.98028625399107 50.74928900373321 51.24927620343834
-295.282 233.98028625399107 234.77479411849106 50.74928900373321 51.24927620343834
-296.282 234.77479411849106 235.56930198304107 50.74928900373321 51.24927620343834
-297.282 235.56930198304107 236.37654629685392 50.74928900373321 51.24927620343834
-308.282 244.29615204362824 245.10339635744106 50.74928900373321 51.24927620343834
-309.282 245.10339635744106 245.89790422199107 50.74928900373321 51.24927620343834
-310.282 245.89790422199107 246.6924120864911 50.74928900373321 51.24927620343834
-311.282 246.6924120864911 247.48691995104107 50.74928900373321 51.24927620343834
-312.282 247.48691995104107 248.28142781559106 50.74928900373321 51.24927620343834
-313.282 248.28142781559106 249.07593568009105 50.74928900373321 51.24927620343834
-314.282 249.07593568009105 249.87044354464106 50.74928900373321 51.24927620343834
-315.282 249.87044354464106 250.66495140919108 50.74928900373321 51.24927620343834
-316.282 250.66495140919108 251.4594592736911 50.74928900373321 51.24927620343834
-317.282 251.4594592736911 252.25396713824108 50.74928900373321 51.24927620343834
-318.282 252.25396713824108 253.0484750027911 50.74928900373321 51.24927620343834
-319.282 253.0484750027911 253.84298286729108 50.74928900373321 51.24927620343834
-320.282 253.84298286729108 254.63749073184107 50.74928900373321 51.24927620343834
-321.282 254.63749073184107 255.43199859639105 50.74928900373321 51.24927620343834
-322.282 255.43199859639105 256.2265064608911 50.74928900373321 51.24927620343834
-323.282 256.2265064608911 257.0210143254411 50.74928900373321 51.24927620343834
-324.282 257.0210143254411 257.8155221899911 50.74928900373321 51.24927620343834
-325.282 257.8155221899911 258.61003005449106 50.74928900373321 51.24927620343834
-326.282 258.61003005449106 259.40453791904105 50.74928900373321 51.24927620343834
-327.282 259.40453791904105 260.1990457835911 50.74928900373321 51.24927620343834
-328.282 260.1990457835911 260.99355364809105 50.74928900373321 51.24927620343834
-329.282 260.99355364809105 261.78806151259107 50.74928900373321 51.24927620343834
-330.282 261.78806151259107 262.58256937714106 50.74928900373321 51.24927620343834
-331.282 262.58256937714106 263.37707724169104 50.74928900373321 51.24927620343834
-332.282 263.37707724169104 264.17158510619106 50.74928900373321 51.24927620343834
-333.282 264.17158510619106 264.9660929707411 50.74928900373321 51.24927620343834
-334.282 264.9660929707411 265.76060083529103 50.74928900373321 51.24927620343834
-335.282 265.76060083529103 266.55510869979105 50.74928900373321 51.24927620343834
-336.282 266.55510869979105 267.34961656434103 50.74928900373321 51.24927620343834
-337.282 267.34961656434103 268.1441244288911 50.74928900373321 51.24927620343834
-338.282 268.1441244288911 268.93863229339104 50.74928900373321 51.24927620343834
-339.282 268.93863229339104 269.7331401579411 50.74928900373321 51.24927620343834
-340.282 269.7331401579411 270.52764802249106 50.74928900373321 51.24927620343834
-341.282 270.52764802249106 271.32215588699114 50.74928900373321 51.24927620343834
-342.282 271.32215588699114 272.11666375154107 50.74928900373321 51.24927620343834
-343.282 272.11666375154107 272.9111716160911 50.74928900373321 51.24927620343834
-344.282 272.9111716160911 273.705679480591 50.74928900373321 51.24927620343834
-345.282 273.705679480591 274.50018734514106 50.74928900373321 51.24927620343834
-346.282 274.50018734514106 275.29469520969104 50.74928900373321 51.24927620343834
-347.282 275.29469520969104 276.08920307419106 50.74928900373321 51.24927620343834
-348.282 276.08920307419106 276.88371093874105 50.74928900373321 51.24927620343834
-349.282 276.88371093874105 277.6909552525539 50.74928900373321 51.24927620343834
-134.283 107.21117213040696 108.02724210038377 51.24927620343834 51.74926312172762
-135.283 108.02724210038377 108.83043606658379 51.24927620343834 51.74926312172762
-136.283 108.83043606658379 109.63363003273378 51.24927620343834 51.74926312172762
-137.283 109.63363003273378 110.4368239988838 51.24927620343834 51.74926312172762
-138.283 110.4368239988838 111.24001796508378 51.24927620343834 51.74926312172762
-139.283 111.24001796508378 112.04321193123378 51.24927620343834 51.74926312172762
-140.283 112.04321193123378 112.84640589738379 51.24927620343834 51.74926312172762
-141.283 112.84640589738379 113.64959986358377 51.24927620343834 51.74926312172762
-142.283 113.64959986358377 114.45279382973379 51.24927620343834 51.74926312172762
-143.283 114.45279382973379 115.25598779588378 51.24927620343834 51.74926312172762
-144.283 115.25598779588378 116.05918176208377 51.24927620343834 51.74926312172762
-145.283 116.05918176208377 116.86237572828378 51.24927620343834 51.74926312172762
-146.283 116.86237572828378 117.66556969443377 51.24927620343834 51.74926312172762
-147.283 117.66556969443377 118.46876366058379 51.24927620343834 51.74926312172762
-148.283 118.46876366058379 119.27195762678377 51.24927620343834 51.74926312172762
-149.283 119.27195762678377 120.07515159293379 51.24927620343834 51.74926312172762
-150.283 120.07515159293379 120.87834555908378 51.24927620343834 51.74926312172762
-151.283 120.87834555908378 121.6815395252838 51.24927620343834 51.74926312172762
-152.283 121.6815395252838 122.48473349143379 51.24927620343834 51.74926312172762
-153.283 122.48473349143379 123.2879274575838 51.24927620343834 51.74926312172762
-154.283 123.2879274575838 124.09112142378379 51.24927620343834 51.74926312172762
-155.283 124.09112142378379 124.89431538998377 51.24927620343834 51.74926312172762
-156.283 124.89431538998377 125.69750935613376 51.24927620343834 51.74926312172762
-157.283 125.69750935613376 126.50070332228378 51.24927620343834 51.74926312172762
-158.283 126.50070332228378 127.3038972884838 51.24927620343834 51.74926312172762
-159.283 127.3038972884838 128.1070912546338 51.24927620343834 51.74926312172762
-160.283 128.1070912546338 128.91028522078378 51.24927620343834 51.74926312172762
-161.283 128.91028522078378 129.7134791869838 51.24927620343834 51.74926312172762
-162.283 129.7134791869838 130.5166731531338 51.24927620343834 51.74926312172762
-163.283 130.5166731531338 131.3198671192838 51.24927620343834 51.74926312172762
-164.283 131.3198671192838 132.1359370892606 51.24927620343834 51.74926312172762
-188.283 150.58364630360697 151.39971627358378 51.24927620343834 51.74926312172762
-189.283 151.39971627358378 152.20291023973377 51.24927620343834 51.74926312172762
-190.283 152.20291023973377 153.0061042058838 51.24927620343834 51.74926312172762
-191.283 153.0061042058838 153.8092981720838 51.24927620343834 51.74926312172762
-192.283 153.8092981720838 154.61249213828378 51.24927620343834 51.74926312172762
-193.283 154.61249213828378 155.41568610443377 51.24927620343834 51.74926312172762
-194.283 155.41568610443377 156.2188800705838 51.24927620343834 51.74926312172762
-195.283 156.2188800705838 157.02207403678378 51.24927620343834 51.74926312172762
-196.283 157.02207403678378 157.8252680029338 51.24927620343834 51.74926312172762
-197.283 157.8252680029338 158.6284619690838 51.24927620343834 51.74926312172762
-198.283 158.6284619690838 159.4316559352838 51.24927620343834 51.74926312172762
-199.283 159.4316559352838 160.23484990143376 51.24927620343834 51.74926312172762
-200.283 160.23484990143376 161.03804386758378 51.24927620343834 51.74926312172762
-201.283 161.03804386758378 161.85411383756062 51.24927620343834 51.74926312172762
-240.283 192.34973254450694 193.16580251443378 51.24927620343834 51.74926312172762
-241.283 193.16580251443378 193.96899648058377 51.24927620343834 51.74926312172762
-242.283 193.96899648058377 194.77219044678375 51.24927620343834 51.74926312172762
-243.283 194.77219044678375 195.57538441293377 51.24927620343834 51.74926312172762
-244.283 195.57538441293377 196.37857837908376 51.24927620343834 51.74926312172762
-245.283 196.37857837908376 197.18177234528378 51.24927620343834 51.74926312172762
-246.283 197.18177234528378 197.9849663114838 51.24927620343834 51.74926312172762
-247.283 197.9849663114838 198.78816027763378 51.24927620343834 51.74926312172762
-248.283 198.78816027763378 199.59135424378377 51.24927620343834 51.74926312172762
-249.283 199.59135424378377 200.39454820998375 51.24927620343834 51.74926312172762
-250.283 200.39454820998375 201.19774217613377 51.24927620343834 51.74926312172762
-251.283 201.19774217613377 202.00093614228376 51.24927620343834 51.74926312172762
-252.283 202.00093614228376 202.80413010848378 51.24927620343834 51.74926312172762
-253.283 202.80413010848378 203.60732407463377 51.24927620343834 51.74926312172762
-254.283 203.60732407463377 204.41051804078376 51.24927620343834 51.74926312172762
-255.283 204.41051804078376 205.21371200698377 51.24927620343834 51.74926312172762
-256.283 205.21371200698377 206.01690597318378 51.24927620343834 51.74926312172762
-257.283 206.01690597318378 206.82009993933377 51.24927620343834 51.74926312172762
-258.283 206.82009993933377 207.62329390548376 51.24927620343834 51.74926312172762
-259.283 207.62329390548376 208.42648787168378 51.24927620343834 51.74926312172762
-260.283 208.42648787168378 209.22968183783377 51.24927620343834 51.74926312172762
-261.283 209.22968183783377 210.03287580398376 51.24927620343834 51.74926312172762
-262.283 210.03287580398376 210.83606977018377 51.24927620343834 51.74926312172762
-263.283 210.83606977018377 211.63926373633376 51.24927620343834 51.74926312172762
-264.283 211.63926373633376 212.44245770248375 51.24927620343834 51.74926312172762
-265.283 212.44245770248375 213.24565166868376 51.24927620343834 51.74926312172762
-266.283 213.24565166868376 214.04884563488378 51.24927620343834 51.74926312172762
-267.283 214.04884563488378 214.85203960103377 51.24927620343834 51.74926312172762
-268.283 214.85203960103377 215.65523356718376 51.24927620343834 51.74926312172762
-269.283 215.65523356718376 216.45842753338377 51.24927620343834 51.74926312172762
-270.283 216.45842753338377 217.26162149953376 51.24927620343834 51.74926312172762
-271.283 217.26162149953376 218.06481546568375 51.24927620343834 51.74926312172762
-272.283 218.06481546568375 218.8680094318838 51.24927620343834 51.74926312172762
-273.283 218.8680094318838 219.67120339803378 51.24927620343834 51.74926312172762
-274.283 219.67120339803378 220.47439736418374 51.24927620343834 51.74926312172762
-275.283 220.47439736418374 221.27759133038376 51.24927620343834 51.74926312172762
-276.283 221.27759133038376 222.08078529658377 51.24927620343834 51.74926312172762
-277.283 222.08078529658377 222.88397926273376 51.24927620343834 51.74926312172762
-278.283 222.88397926273376 223.68717322888375 51.24927620343834 51.74926312172762
-279.283 223.68717322888375 224.49036719508376 51.24927620343834 51.74926312172762
-280.283 224.49036719508376 225.29356116123375 51.24927620343834 51.74926312172762
-281.283 225.29356116123375 226.09675512738377 51.24927620343834 51.74926312172762
-282.283 226.09675512738377 226.89994909358376 51.24927620343834 51.74926312172762
-283.283 226.89994909358376 227.70314305978377 51.24927620343834 51.74926312172762
-284.283 227.70314305978377 228.50633702593376 51.24927620343834 51.74926312172762
-285.283 228.50633702593376 229.30953099208375 51.24927620343834 51.74926312172762
-286.283 229.30953099208375 230.11272495828376 51.24927620343834 51.74926312172762
-287.283 230.11272495828376 230.91591892443375 51.24927620343834 51.74926312172762
-288.283 230.91591892443375 231.71911289058374 51.24927620343834 51.74926312172762
-289.283 231.71911289058374 232.52230685678376 51.24927620343834 51.74926312172762
-290.283 232.52230685678376 233.32550082293375 51.24927620343834 51.74926312172762
-291.283 233.32550082293375 234.12869478908377 51.24927620343834 51.74926312172762
-292.283 234.12869478908377 234.93188875528378 51.24927620343834 51.74926312172762
-293.283 234.93188875528378 235.74795872526062 51.24927620343834 51.74926312172762
-306.283 245.3605343117069 246.17660428168375 51.24927620343834 51.74926312172762
-307.283 246.17660428168375 246.9797982478338 51.24927620343834 51.74926312172762
-308.283 246.9797982478338 247.78299221398376 51.24927620343834 51.74926312172762
-309.283 247.78299221398376 248.58618618018377 51.24927620343834 51.74926312172762
-310.283 248.58618618018377 249.38938014633376 51.24927620343834 51.74926312172762
-311.283 249.38938014633376 250.19257411248378 51.24927620343834 51.74926312172762
-312.283 250.19257411248378 250.9957680786838 51.24927620343834 51.74926312172762
-313.283 250.9957680786838 251.79896204488378 51.24927620343834 51.74926312172762
-314.283 251.79896204488378 252.60215601103377 51.24927620343834 51.74926312172762
-315.283 252.60215601103377 253.4053499771838 51.24927620343834 51.74926312172762
-316.283 253.4053499771838 254.2085439433838 51.24927620343834 51.74926312172762
-317.283 254.2085439433838 255.0117379095338 51.24927620343834 51.74926312172762
-318.283 255.0117379095338 255.81493187568378 51.24927620343834 51.74926312172762
-319.283 255.81493187568378 256.6181258418838 51.24927620343834 51.74926312172762
-320.283 256.6181258418838 257.42131980808375 51.24927620343834 51.74926312172762
-321.283 257.42131980808375 258.22451377423374 51.24927620343834 51.74926312172762
-322.283 258.22451377423374 259.0277077403838 51.24927620343834 51.74926312172762
-323.283 259.0277077403838 259.8309017065838 51.24927620343834 51.74926312172762
-324.283 259.8309017065838 260.6340956727338 51.24927620343834 51.74926312172762
-325.283 260.6340956727338 261.4372896388837 51.24927620343834 51.74926312172762
-326.283 261.4372896388837 262.2404836050838 51.24927620343834 51.74926312172762
-327.283 262.2404836050838 263.0436775712338 51.24927620343834 51.74926312172762
-328.283 263.0436775712338 263.8468715373838 51.24927620343834 51.74926312172762
-329.283 263.8468715373838 264.65006550358373 51.24927620343834 51.74926312172762
-330.283 264.65006550358373 265.4532594697838 51.24927620343834 51.74926312172762
-331.283 265.4532594697838 266.2564534359338 51.24927620343834 51.74926312172762
-332.283 266.2564534359338 267.0596474020838 51.24927620343834 51.74926312172762
-333.283 267.0596474020838 267.86284136828374 51.24927620343834 51.74926312172762
-334.283 267.86284136828374 268.6660353344338 51.24927620343834 51.74926312172762
-335.283 268.6660353344338 269.4692293005838 51.24927620343834 51.74926312172762
-336.283 269.4692293005838 270.2724232667838 51.24927620343834 51.74926312172762
-337.283 270.2724232667838 271.0756172329337 51.24927620343834 51.74926312172762
-338.283 271.0756172329337 271.87881119908377 51.24927620343834 51.74926312172762
-339.283 271.87881119908377 272.6820051652838 51.24927620343834 51.74926312172762
-340.283 272.6820051652838 273.4851991314838 51.24927620343834 51.74926312172762
-341.283 273.4851991314838 274.28839309763373 51.24927620343834 51.74926312172762
-342.283 274.28839309763373 275.0915870637838 51.24927620343834 51.74926312172762
-343.283 275.0915870637838 275.8947810299838 51.24927620343834 51.74926312172762
-344.283 275.8947810299838 276.6979749961338 51.24927620343834 51.74926312172762
-345.283 276.6979749961338 277.5011689622837 51.24927620343834 51.74926312172762
-346.283 277.5011689622837 278.3172389322606 51.24927620343834 51.74926312172762
-133.284 107.59240241783372 108.41755669927277 51.74926312172762 52.249249747158004
-134.284 108.41755669927277 109.22969132202276 51.74926312172762 52.249249747158004
-135.284 109.22969132202276 110.04182594477275 51.74926312172762 52.249249747158004
-136.284 110.04182594477275 110.85396056752276 51.74926312172762 52.249249747158004
-137.284 110.85396056752276 111.66609519027276 51.74926312172762 52.249249747158004
-138.284 111.66609519027276 112.47822981302276 51.74926312172762 52.249249747158004
-139.284 112.47822981302276 113.29036443577277 51.74926312172762 52.249249747158004
-140.284 113.29036443577277 114.10249905847277 51.74926312172762 52.249249747158004
-141.284 114.10249905847277 114.91463368122277 51.74926312172762 52.249249747158004
-142.284 114.91463368122277 115.72676830397276 51.74926312172762 52.249249747158004
-143.284 115.72676830397276 116.53890292672277 51.74926312172762 52.249249747158004
-144.284 116.53890292672277 117.35103754947278 51.74926312172762 52.249249747158004
-145.284 117.35103754947278 118.16317217217278 51.74926312172762 52.249249747158004
-146.284 118.16317217217278 118.97530679492277 51.74926312172762 52.249249747158004
-147.284 118.97530679492277 119.78744141767277 51.74926312172762 52.249249747158004
-148.284 119.78744141767277 120.59957604042276 51.74926312172762 52.249249747158004
-149.284 120.59957604042276 121.41171066317276 51.74926312172762 52.249249747158004
-150.284 121.41171066317276 122.22384528587276 51.74926312172762 52.249249747158004
-151.284 122.22384528587276 123.03597990862276 51.74926312172762 52.249249747158004
-152.284 123.03597990862276 123.84811453137277 51.74926312172762 52.249249747158004
-153.284 123.84811453137277 124.66024915412277 51.74926312172762 52.249249747158004
-154.284 124.66024915412277 125.47238377687276 51.74926312172762 52.249249747158004
-155.284 125.47238377687276 126.28451839962278 51.74926312172762 52.249249747158004
-156.284 126.28451839962278 127.09665302237276 51.74926312172762 52.249249747158004
-157.284 127.09665302237276 127.90878764507275 51.74926312172762 52.249249747158004
-158.284 127.90878764507275 128.72092226782274 51.74926312172762 52.249249747158004
-159.284 128.72092226782274 129.53305689057277 51.74926312172762 52.249249747158004
-160.284 129.53305689057277 130.34519151332276 51.74926312172762 52.249249747158004
-161.284 130.34519151332276 131.15732613607275 51.74926312172762 52.249249747158004
-162.284 131.15732613607275 131.98248041751182 51.74926312172762 52.249249747158004
-187.284 151.4476720458337 152.27282632732278 51.74926312172762 52.249249747158004
-188.284 152.27282632732278 153.0849609500728 51.74926312172762 52.249249747158004
-189.284 153.0849609500728 153.89709557282276 51.74926312172762 52.249249747158004
-190.284 153.89709557282276 154.70923019557276 51.74926312172762 52.249249747158004
-191.284 154.70923019557276 155.52136481827276 51.74926312172762 52.249249747158004
-192.284 155.52136481827276 156.33349944102275 51.74926312172762 52.249249747158004
-193.284 156.33349944102275 157.14563406377277 51.74926312172762 52.249249747158004
-194.284 157.14563406377277 157.95776868652274 51.74926312172762 52.249249747158004
-195.284 157.95776868652274 158.76990330927276 51.74926312172762 52.249249747158004
-196.284 158.76990330927276 159.58203793202276 51.74926312172762 52.249249747158004
-197.284 159.58203793202276 160.39417255477275 51.74926312172762 52.249249747158004
-198.284 160.39417255477275 161.20630717747275 51.74926312172762 52.249249747158004
-199.284 161.20630717747275 162.0314614589118 51.74926312172762 52.249249747158004
-237.284 192.0544031829337 192.87955746437274 51.74926312172762 52.249249747158004
-238.284 192.87955746437274 193.69169208712276 51.74926312172762 52.249249747158004
-239.284 193.69169208712276 194.50382670987273 51.74926312172762 52.249249747158004
-240.284 194.50382670987273 195.31596133262275 51.74926312172762 52.249249747158004
-241.284 195.31596133262275 196.12809595537277 51.74926312172762 52.249249747158004
-242.284 196.12809595537277 196.94023057812274 51.74926312172762 52.249249747158004
-243.284 196.94023057812274 197.75236520087273 51.74926312172762 52.249249747158004
-244.284 197.75236520087273 198.56449982357273 51.74926312172762 52.249249747158004
-245.284 198.56449982357273 199.37663444632273 51.74926312172762 52.249249747158004
-246.284 199.37663444632273 200.18876906907275 51.74926312172762 52.249249747158004
-247.284 200.18876906907275 201.0009036918227 51.74926312172762 52.249249747158004
-248.284 201.0009036918227 201.81303831457274 51.74926312172762 52.249249747158004
-249.284 201.81303831457274 202.62517293727274 51.74926312172762 52.249249747158004
-250.284 202.62517293727274 203.43730756002276 51.74926312172762 52.249249747158004
-251.284 203.43730756002276 204.24944218277273 51.74926312172762 52.249249747158004
-252.284 204.24944218277273 205.06157680552275 51.74926312172762 52.249249747158004
-253.284 205.06157680552275 205.87371142827277 51.74926312172762 52.249249747158004
-254.284 205.87371142827277 206.68584605102276 51.74926312172762 52.249249747158004
-255.284 206.68584605102276 207.49798067377273 51.74926312172762 52.249249747158004
-256.284 207.49798067377273 208.31011529647273 51.74926312172762 52.249249747158004
-257.284 208.31011529647273 209.12224991922275 51.74926312172762 52.249249747158004
-258.284 209.12224991922275 209.93438454197272 51.74926312172762 52.249249747158004
-259.284 209.93438454197272 210.74651916472274 51.74926312172762 52.249249747158004
-260.284 210.74651916472274 211.55865378747276 51.74926312172762 52.249249747158004
-261.284 211.55865378747276 212.37078841017276 51.74926312172762 52.249249747158004
-262.284 212.37078841017276 213.18292303292276 51.74926312172762 52.249249747158004
-263.284 213.18292303292276 213.99505765567272 51.74926312172762 52.249249747158004
-264.284 213.99505765567272 214.80719227842275 51.74926312172762 52.249249747158004
-265.284 214.80719227842275 215.61932690117277 51.74926312172762 52.249249747158004
-266.284 215.61932690117277 216.43146152387277 51.74926312172762 52.249249747158004
-267.284 216.43146152387277 217.24359614662274 51.74926312172762 52.249249747158004
-268.284 217.24359614662274 218.05573076937276 51.74926312172762 52.249249747158004
-269.284 218.05573076937276 218.86786539212275 51.74926312172762 52.249249747158004
-270.284 218.86786539212275 219.68000001487275 51.74926312172762 52.249249747158004
-271.284 219.68000001487275 220.49213463762277 51.74926312172762 52.249249747158004
-272.284 220.49213463762277 221.30426926037276 51.74926312172762 52.249249747158004
-273.284 221.30426926037276 222.11640388307273 51.74926312172762 52.249249747158004
-274.284 222.11640388307273 222.92853850582276 51.74926312172762 52.249249747158004
-275.284 222.92853850582276 223.74067312857275 51.74926312172762 52.249249747158004
-276.284 223.74067312857275 224.55280775132277 51.74926312172762 52.249249747158004
-277.284 224.55280775132277 225.36494237407277 51.74926312172762 52.249249747158004
-278.284 225.36494237407277 226.17707699677277 51.74926312172762 52.249249747158004
-279.284 226.17707699677277 227.00223127821178 51.74926312172762 52.249249747158004
-304.284 246.46742290663371 247.29257718807276 51.74926312172762 52.249249747158004
-305.284 247.29257718807276 248.10471181082275 51.74926312172762 52.249249747158004
-306.284 248.10471181082275 248.91684643357274 51.74926312172762 52.249249747158004
-307.284 248.91684643357274 249.72898105627274 51.74926312172762 52.249249747158004
-308.284 249.72898105627274 250.54111567902277 51.74926312172762 52.249249747158004
-309.284 250.54111567902277 251.35325030177276 51.74926312172762 52.249249747158004
-310.284 251.35325030177276 252.16538492452275 51.74926312172762 52.249249747158004
-311.284 252.16538492452275 252.97751954727275 51.74926312172762 52.249249747158004
-312.284 252.97751954727275 253.78965417002274 51.74926312172762 52.249249747158004
-313.284 253.78965417002274 254.60178879277274 51.74926312172762 52.249249747158004
-314.284 254.60178879277274 255.41392341547277 51.74926312172762 52.249249747158004
-315.284 255.41392341547277 256.22605803822273 51.74926312172762 52.249249747158004
-316.284 256.22605803822273 257.03819266097275 51.74926312172762 52.249249747158004
-317.284 257.03819266097275 257.8503272837228 51.74926312172762 52.249249747158004
-318.284 257.8503272837228 258.66246190647274 51.74926312172762 52.249249747158004
-319.284 258.66246190647274 259.4745965291728 51.74926312172762 52.249249747158004
-320.284 259.4745965291728 260.28673115192277 51.74926312172762 52.249249747158004
-321.284 260.28673115192277 261.09886577467273 51.74926312172762 52.249249747158004
-322.284 261.09886577467273 261.91100039742275 51.74926312172762 52.249249747158004
-323.284 261.91100039742275 262.7231350201728 51.74926312172762 52.249249747158004
-324.284 262.7231350201728 263.5352696428728 51.74926312172762 52.249249747158004
-325.284 263.5352696428728 264.34740426562274 51.74926312172762 52.249249747158004
-326.284 264.34740426562274 265.1595388883727 51.74926312172762 52.249249747158004
-327.284 265.1595388883727 265.97167351112273 51.74926312172762 52.249249747158004
-328.284 265.97167351112273 266.78380813387275 51.74926312172762 52.249249747158004
-329.284 266.78380813387275 267.5959427566228 51.74926312172762 52.249249747158004
-330.284 267.5959427566228 268.4080773793728 51.74926312172762 52.249249747158004
-331.284 268.4080773793728 269.2202120020728 51.74926312172762 52.249249747158004
-332.284 269.2202120020728 270.03234662482276 51.74926312172762 52.249249747158004
-333.284 270.03234662482276 270.84448124757273 51.74926312172762 52.249249747158004
-334.284 270.84448124757273 271.65661587032275 51.74926312172762 52.249249747158004
-335.284 271.65661587032275 272.4687504930728 51.74926312172762 52.249249747158004
-336.284 272.4687504930728 273.2808851157728 51.74926312172762 52.249249747158004
-337.284 273.2808851157728 274.09301973852274 51.74926312172762 52.249249747158004
-338.284 274.09301973852274 274.9051543612727 51.74926312172762 52.249249747158004
-339.284 274.9051543612727 275.71728898402273 51.74926312172762 52.249249747158004
-340.284 275.71728898402273 276.52942360677275 51.74926312172762 52.249249747158004
-341.284 276.52942360677275 277.3415582295228 51.74926312172762 52.249249747158004
-342.284 277.3415582295228 278.1536928522728 51.74926312172762 52.249249747158004
-343.284 278.1536928522728 278.97884713371184 51.74926312172762 52.249249747158004
-130.285 106.34785132494758 107.18235871629201 52.249249747158004 52.74923606767706
-131.285 107.18235871629201 108.00369853214201 52.249249747158004 52.74923606767706
-132.285 108.00369853214201 108.825038347992 52.249249747158004 52.74923606767706
-133.285 108.825038347992 109.646378163842 52.249249747158004 52.74923606767706
-134.285 109.646378163842 110.467717979692 52.249249747158004 52.74923606767706
-135.285 110.467717979692 111.28905779554202 52.249249747158004 52.74923606767706
-136.285 111.28905779554202 112.11039761139202 52.249249747158004 52.74923606767706
-137.285 112.11039761139202 112.931737427242 52.249249747158004 52.74923606767706
-138.285 112.931737427242 113.75307724309201 52.249249747158004 52.74923606767706
-139.285 113.75307724309201 114.574417058942 52.249249747158004 52.74923606767706
-140.285 114.574417058942 115.39575687479203 52.249249747158004 52.74923606767706
-141.285 115.39575687479203 116.21709669064202 52.249249747158004 52.74923606767706
-142.285 116.21709669064202 117.038436506492 52.249249747158004 52.74923606767706
-143.285 117.038436506492 117.85977632234199 52.249249747158004 52.74923606767706
-144.285 117.85977632234199 118.68111613819201 52.249249747158004 52.74923606767706
-145.285 118.68111613819201 119.502455954042 52.249249747158004 52.74923606767706
-146.285 119.502455954042 120.32379576989202 52.249249747158004 52.74923606767706
-147.285 120.32379576989202 121.14513558574203 52.249249747158004 52.74923606767706
-148.285 121.14513558574203 121.96647540159202 52.249249747158004 52.74923606767706
-149.285 121.96647540159202 122.78781521744202 52.249249747158004 52.74923606767706
-150.285 122.78781521744202 123.609155033292 52.249249747158004 52.74923606767706
-151.285 123.609155033292 124.43049484914201 52.249249747158004 52.74923606767706
-152.285 124.43049484914201 125.251834664992 52.249249747158004 52.74923606767706
-153.285 125.251834664992 126.073174480892 52.249249747158004 52.74923606767706
-154.285 126.073174480892 126.89451429674202 52.249249747158004 52.74923606767706
-155.285 126.89451429674202 127.71585411259201 52.249249747158004 52.74923606767706
-156.285 127.71585411259201 128.537193928442 52.249249747158004 52.74923606767706
-157.285 128.537193928442 129.358533744292 52.249249747158004 52.74923606767706
-158.285 129.358533744292 130.179873560142 52.249249747158004 52.74923606767706
-159.285 130.179873560142 131.00121337599202 52.249249747158004 52.74923606767706
-160.285 131.00121337599202 131.822553191842 52.249249747158004 52.74923606767706
-161.285 131.822553191842 132.65706058313643 52.249249747158004 52.74923606767706
-186.285 152.3428810126476 153.177388403992 52.249249747158004 52.74923606767706
-187.285 153.177388403992 153.998728219842 52.249249747158004 52.74923606767706
-188.285 153.998728219842 154.82006803569203 52.249249747158004 52.74923606767706
-189.285 154.82006803569203 155.641407851542 52.249249747158004 52.74923606767706
-190.285 155.641407851542 156.46274766739202 52.249249747158004 52.74923606767706
-191.285 156.46274766739202 157.284087483242 52.249249747158004 52.74923606767706
-192.285 157.284087483242 158.105427299092 52.249249747158004 52.74923606767706
-193.285 158.105427299092 158.92676711494204 52.249249747158004 52.74923606767706
-194.285 158.92676711494204 159.748106930792 52.249249747158004 52.74923606767706
-195.285 159.748106930792 160.56944674664203 52.249249747158004 52.74923606767706
-196.285 160.56944674664203 161.40395413793644 52.249249747158004 52.74923606767706
-235.285 192.58853198944757 193.423039380742 52.249249747158004 52.74923606767706
-236.285 193.423039380742 194.24437919659198 52.249249747158004 52.74923606767706
-237.285 194.24437919659198 195.065719012442 52.249249747158004 52.74923606767706
-238.285 195.065719012442 195.88705882829197 52.249249747158004 52.74923606767706
-239.285 195.88705882829197 196.708398644192 52.249249747158004 52.74923606767706
-240.285 196.708398644192 197.52973846004198 52.249249747158004 52.74923606767706
-241.285 197.52973846004198 198.351078275892 52.249249747158004 52.74923606767706
-242.285 198.351078275892 199.17241809174197 52.249249747158004 52.74923606767706
-243.285 199.17241809174197 199.993757907592 52.249249747158004 52.74923606767706
-244.285 199.993757907592 200.81509772344197 52.249249747158004 52.74923606767706
-245.285 200.81509772344197 201.636437539292 52.249249747158004 52.74923606767706
-246.285 201.636437539292 202.457777355142 52.249249747158004 52.74923606767706
-247.285 202.457777355142 203.27911717099198 52.249249747158004 52.74923606767706
-248.285 203.27911717099198 204.100456986842 52.249249747158004 52.74923606767706
-249.285 204.100456986842 204.92179680269197 52.249249747158004 52.74923606767706
-250.285 204.92179680269197 205.743136618542 52.249249747158004 52.74923606767706
-251.285 205.743136618542 206.564476434392 52.249249747158004 52.74923606767706
-252.285 206.564476434392 207.385816250242 52.249249747158004 52.74923606767706
-253.285 207.385816250242 208.207156066092 52.249249747158004 52.74923606767706
-254.285 208.207156066092 209.02849588194198 52.249249747158004 52.74923606767706
-255.285 209.02849588194198 209.849835697792 52.249249747158004 52.74923606767706
-256.285 209.849835697792 210.67117551364197 52.249249747158004 52.74923606767706
-257.285 210.67117551364197 211.492515329492 52.249249747158004 52.74923606767706
-258.285 211.492515329492 212.313855145342 52.249249747158004 52.74923606767706
-259.285 212.313855145342 213.13519496119198 52.249249747158004 52.74923606767706
-260.285 213.13519496119198 213.956534777042 52.249249747158004 52.74923606767706
-261.285 213.956534777042 214.77787459289198 52.249249747158004 52.74923606767706
-262.285 214.77787459289198 215.599214408792 52.249249747158004 52.74923606767706
-263.285 215.599214408792 216.420554224642 52.249249747158004 52.74923606767706
-264.285 216.420554224642 217.24189404049199 52.249249747158004 52.74923606767706
-265.285 217.24189404049199 218.06323385634198 52.249249747158004 52.74923606767706
-266.285 218.06323385634198 218.884573672192 52.249249747158004 52.74923606767706
-267.285 218.884573672192 219.70591348804197 52.249249747158004 52.74923606767706
-268.285 219.70591348804197 220.527253303892 52.249249747158004 52.74923606767706
-269.285 220.527253303892 221.34859311974196 52.249249747158004 52.74923606767706
-270.285 221.34859311974196 222.169932935592 52.249249747158004 52.74923606767706
-271.285 222.169932935592 222.991272751442 52.249249747158004 52.74923606767706
-272.285 222.991272751442 223.81261256729198 52.249249747158004 52.74923606767706
-273.285 223.81261256729198 224.633952383142 52.249249747158004 52.74923606767706
-274.285 224.633952383142 225.45529219899197 52.249249747158004 52.74923606767706
-275.285 225.45529219899197 226.276632014842 52.249249747158004 52.74923606767706
-276.285 226.276632014842 227.097971830692 52.249249747158004 52.74923606767706
-277.285 227.097971830692 227.93247922203642 52.249249747158004 52.74923606767706
-302.285 247.61829965154757 248.45280704284198 52.249249747158004 52.74923606767706
-303.285 248.45280704284198 249.27414685869198 52.249249747158004 52.74923606767706
-304.285 249.27414685869198 250.09548667459197 52.249249747158004 52.74923606767706
-305.285 250.09548667459197 250.91682649044196 52.249249747158004 52.74923606767706
-306.285 250.91682649044196 251.738166306292 52.249249747158004 52.74923606767706
-307.285 251.738166306292 252.559506122142 52.249249747158004 52.74923606767706
-308.285 252.559506122142 253.380845937992 52.249249747158004 52.74923606767706
-309.285 253.380845937992 254.202185753842 52.249249747158004 52.74923606767706
-310.285 254.202185753842 255.02352556969197 52.249249747158004 52.74923606767706
-311.285 255.02352556969197 255.844865385542 52.249249747158004 52.74923606767706
-312.285 255.844865385542 256.666205201392 52.249249747158004 52.74923606767706
-313.285 256.666205201392 257.487545017242 52.249249747158004 52.74923606767706
-314.285 257.487545017242 258.30888483309195 52.249249747158004 52.74923606767706
-315.285 258.30888483309195 259.130224648942 52.249249747158004 52.74923606767706
-316.285 259.130224648942 259.951564464792 52.249249747158004 52.74923606767706
-317.285 259.951564464792 260.772904280642 52.249249747158004 52.74923606767706
-318.285 260.772904280642 261.59424409649193 52.249249747158004 52.74923606767706
-319.285 261.59424409649193 262.41558391234196 52.249249747158004 52.74923606767706
-320.285 262.41558391234196 263.236923728192 52.249249747158004 52.74923606767706
-321.285 263.236923728192 264.05826354404195 52.249249747158004 52.74923606767706
-322.285 264.05826354404195 264.87960335989203 52.249249747158004 52.74923606767706
-323.285 264.87960335989203 265.700943175742 52.249249747158004 52.74923606767706
-324.285 265.700943175742 266.52228299159196 52.249249747158004 52.74923606767706
-325.285 266.52228299159196 267.343622807442 52.249249747158004 52.74923606767706
-326.285 267.343622807442 268.164962623292 52.249249747158004 52.74923606767706
-327.285 268.164962623292 268.986302439192 52.249249747158004 52.74923606767706
-328.285 268.986302439192 269.80764225504197 52.249249747158004 52.74923606767706
-329.285 269.80764225504197 270.628982070892 52.249249747158004 52.74923606767706
-330.285 270.628982070892 271.45032188674196 52.249249747158004 52.74923606767706
-331.285 271.45032188674196 272.271661702592 52.249249747158004 52.74923606767706
-332.285 272.271661702592 273.09300151844195 52.249249747158004 52.74923606767706
-333.285 273.09300151844195 273.914341334292 52.249249747158004 52.74923606767706
-334.285 273.914341334292 274.735681150142 52.249249747158004 52.74923606767706
-335.285 274.735681150142 275.557020965992 52.249249747158004 52.74923606767706
-336.285 275.557020965992 276.37836078184205 52.249249747158004 52.74923606767706
-337.285 276.37836078184205 277.199700597692 52.249249747158004 52.74923606767706
-338.285 277.199700597692 278.021040413542 52.249249747158004 52.74923606767706
-339.285 278.021040413542 278.8555478048364 52.249249747158004 52.74923606767706
-128.286 105.91367712581973 106.75781712071708 52.74923606767706 53.249222070581396
-129.286 106.75781712071708 107.58863719131708 52.74923606767706 53.249222070581396
-130.286 107.58863719131708 108.41945726186707 52.74923606767706 53.249222070581396
-131.286 108.41945726186707 109.25027733241707 52.74923606767706 53.249222070581396
-132.286 109.25027733241707 110.08109740296707 52.74923606767706 53.249222070581396
-133.286 110.08109740296707 110.91191747351708 52.74923606767706 53.249222070581396
-134.286 110.91191747351708 111.74273754411709 52.74923606767706 53.249222070581396
-135.286 111.74273754411709 112.57355761466705 52.74923606767706 53.249222070581396
-136.286 112.57355761466705 113.40437768521706 52.74923606767706 53.249222070581396
-137.286 113.40437768521706 114.23519775581707 52.74923606767706 53.249222070581396
-138.286 114.23519775581707 115.06601782636707 52.74923606767706 53.249222070581396
-139.286 115.06601782636707 115.89683789691708 52.74923606767706 53.249222070581396
-140.286 115.89683789691708 116.72765796746705 52.74923606767706 53.249222070581396
-141.286 116.72765796746705 117.55847803801706 52.74923606767706 53.249222070581396
-142.286 117.55847803801706 118.38929810861706 52.74923606767706 53.249222070581396
-143.286 118.38929810861706 119.22011817916706 52.74923606767706 53.249222070581396
-144.286 119.22011817916706 120.05093824971706 52.74923606767706 53.249222070581396
-145.286 120.05093824971706 120.88175832026707 52.74923606767706 53.249222070581396
-146.286 120.88175832026707 121.71257839081706 52.74923606767706 53.249222070581396
-147.286 121.71257839081706 122.54339846141707 52.74923606767706 53.249222070581396
-148.286 122.54339846141707 123.37421853196707 52.74923606767706 53.249222070581396
-149.286 123.37421853196707 124.20503860251708 52.74923606767706 53.249222070581396
-150.286 124.20503860251708 125.03585867306705 52.74923606767706 53.249222070581396
-151.286 125.03585867306705 125.86667874361706 52.74923606767706 53.249222070581396
-152.286 125.86667874361706 126.69749881421706 52.74923606767706 53.249222070581396
-153.286 126.69749881421706 127.52831888476706 52.74923606767706 53.249222070581396
-154.286 127.52831888476706 128.35913895531706 52.74923606767706 53.249222070581396
-155.286 128.35913895531706 129.18995902591706 52.74923606767706 53.249222070581396
-156.286 129.18995902591706 130.0207790964671 52.74923606767706 53.249222070581396
-157.286 130.0207790964671 130.85159916701707 52.74923606767706 53.249222070581396
-158.286 130.85159916701707 131.68241923756705 52.74923606767706 53.249222070581396
-159.286 131.68241923756705 132.52655923241437 52.74923606767706 53.249222070581396
-232.286 192.3189644642197 193.16310445911705 52.74923606767706 53.249222070581396
-233.286 193.16310445911705 193.99392452966705 52.74923606767706 53.249222070581396
-234.286 193.99392452966705 194.82474460021706 52.74923606767706 53.249222070581396
-235.286 194.82474460021706 195.65556467081706 52.74923606767706 53.249222070581396
-236.286 195.65556467081706 196.4863847413671 52.74923606767706 53.249222070581396
-237.286 196.4863847413671 197.31720481191707 52.74923606767706 53.249222070581396
-238.286 197.31720481191707 198.14802488246707 52.74923606767706 53.249222070581396
-239.286 198.14802488246707 198.97884495301707 52.74923606767706 53.249222070581396
-240.286 198.97884495301707 199.80966502361707 52.74923606767706 53.249222070581396
-241.286 199.80966502361707 200.64048509416705 52.74923606767706 53.249222070581396
-242.286 200.64048509416705 201.47130516471708 52.74923606767706 53.249222070581396
-243.286 201.47130516471708 202.30212523526706 52.74923606767706 53.249222070581396
-244.286 202.30212523526706 203.13294530581706 52.74923606767706 53.249222070581396
-245.286 203.13294530581706 203.96376537641706 52.74923606767706 53.249222070581396
-246.286 203.96376537641706 204.79458544696706 52.74923606767706 53.249222070581396
-247.286 204.79458544696706 205.6254055175171 52.74923606767706 53.249222070581396
-248.286 205.6254055175171 206.45622558806707 52.74923606767706 53.249222070581396
-249.286 206.45622558806707 207.28704565861705 52.74923606767706 53.249222070581396
-250.286 207.28704565861705 208.11786572921707 52.74923606767706 53.249222070581396
-251.286 208.11786572921707 208.94868579976705 52.74923606767706 53.249222070581396
-252.286 208.94868579976705 209.77950587031705 52.74923606767706 53.249222070581396
-253.286 209.77950587031705 210.61032594091705 52.74923606767706 53.249222070581396
-254.286 210.61032594091705 211.44114601146708 52.74923606767706 53.249222070581396
-255.286 211.44114601146708 212.27196608201706 52.74923606767706 53.249222070581396
-256.286 212.27196608201706 213.10278615256706 52.74923606767706 53.249222070581396
-257.286 213.10278615256706 213.93360622311707 52.74923606767706 53.249222070581396
-258.286 213.93360622311707 214.76442629371707 52.74923606767706 53.249222070581396
-259.286 214.76442629371707 215.59524636426704 52.74923606767706 53.249222070581396
-260.286 215.59524636426704 216.42606643481705 52.74923606767706 53.249222070581396
-261.286 216.42606643481705 217.25688650536705 52.74923606767706 53.249222070581396
-262.286 217.25688650536705 218.08770657591705 52.74923606767706 53.249222070581396
-263.286 218.08770657591705 218.91852664651708 52.74923606767706 53.249222070581396
-264.286 218.91852664651708 219.74934671706706 52.74923606767706 53.249222070581396
-265.286 219.74934671706706 220.5801667876171 52.74923606767706 53.249222070581396
-266.286 220.5801667876171 221.4109868582171 52.74923606767706 53.249222070581396
-267.286 221.4109868582171 222.24180692876706 52.74923606767706 53.249222070581396
-268.286 222.24180692876706 223.0726269993171 52.74923606767706 53.249222070581396
-269.286 223.0726269993171 223.90344706986707 52.74923606767706 53.249222070581396
-270.286 223.90344706986707 224.73426714041705 52.74923606767706 53.249222070581396
-271.286 224.73426714041705 225.56508721101707 52.74923606767706 53.249222070581396
-272.286 225.56508721101707 226.39590728156708 52.74923606767706 53.249222070581396
-273.286 226.39590728156708 227.22672735211705 52.74923606767706 53.249222070581396
-274.286 227.22672735211705 228.05754742266706 52.74923606767706 53.249222070581396
-275.286 228.05754742266706 228.9016874175144 52.74923606767706 53.249222070581396
-288.286 238.84488841561972 239.68902841051704 52.74923606767706 53.249222070581396
-289.286 239.68902841051704 240.5198484811171 52.74923606767706 53.249222070581396
-290.286 240.5198484811171 241.35066855166707 52.74923606767706 53.249222070581396
-291.286 241.35066855166707 242.18148862221705 52.74923606767706 53.249222070581396
-292.286 242.18148862221705 243.01230869276708 52.74923606767706 53.249222070581396
-293.286 243.01230869276708 243.84312876331705 52.74923606767706 53.249222070581396
-294.286 243.84312876331705 244.67394883391705 52.74923606767706 53.249222070581396
-295.286 244.67394883391705 245.50476890446706 52.74923606767706 53.249222070581396
-296.286 245.50476890446706 246.33558897501706 52.74923606767706 53.249222070581396
-297.286 246.33558897501706 247.16640904556704 52.74923606767706 53.249222070581396
-298.286 247.16640904556704 247.99722911611707 52.74923606767706 53.249222070581396
-299.286 247.99722911611707 248.82804918671707 52.74923606767706 53.249222070581396
-300.286 248.82804918671707 249.65886925726704 52.74923606767706 53.249222070581396
-301.286 249.65886925726704 250.48968932781708 52.74923606767706 53.249222070581396
-302.286 250.48968932781708 251.32050939841707 52.74923606767706 53.249222070581396
-303.286 251.32050939841707 252.15132946896708 52.74923606767706 53.249222070581396
-304.286 252.15132946896708 252.98214953951705 52.74923606767706 53.249222070581396
-305.286 252.98214953951705 253.81296961006706 52.74923606767706 53.249222070581396
-306.286 253.81296961006706 254.64378968061706 52.74923606767706 53.249222070581396
-307.286 254.64378968061706 255.47460975121706 52.74923606767706 53.249222070581396
-308.286 255.47460975121706 256.30542982176706 52.74923606767706 53.249222070581396
-309.286 256.30542982176706 257.1362498923171 52.74923606767706 53.249222070581396
-310.286 257.1362498923171 257.9670699628671 52.74923606767706 53.249222070581396
-311.286 257.9670699628671 258.79789003341705 52.74923606767706 53.249222070581396
-312.286 258.79789003341705 259.6287101040171 52.74923606767706 53.249222070581396
-313.286 259.6287101040171 260.45953017456713 52.74923606767706 53.249222070581396
-314.286 260.45953017456713 261.2903502451171 52.74923606767706 53.249222070581396
-315.286 261.2903502451171 262.1211703157171 52.74923606767706 53.249222070581396
-316.286 262.1211703157171 262.9519903862671 52.74923606767706 53.249222070581396
-317.286 262.9519903862671 263.78281045681706 52.74923606767706 53.249222070581396
-318.286 263.78281045681706 264.61363052736704 52.74923606767706 53.249222070581396
-319.286 264.61363052736704 265.444450597917 52.74923606767706 53.249222070581396
-320.286 265.444450597917 266.275270668517 52.74923606767706 53.249222070581396
-321.286 266.275270668517 267.10609073906704 52.74923606767706 53.249222070581396
-322.286 267.10609073906704 267.9369108096171 52.74923606767706 53.249222070581396
-323.286 267.9369108096171 268.76773088016705 52.74923606767706 53.249222070581396
-324.286 268.76773088016705 269.598550950717 52.74923606767706 53.249222070581396
-325.286 269.598550950717 270.429371021317 52.74923606767706 53.249222070581396
-326.286 270.429371021317 271.26019109186706 52.74923606767706 53.249222070581396
-327.286 271.26019109186706 272.0910111624171 52.74923606767706 53.249222070581396
-328.286 272.0910111624171 272.92183123296707 52.74923606767706 53.249222070581396
-329.286 272.92183123296707 273.75265130351704 52.74923606767706 53.249222070581396
-330.286 273.75265130351704 274.58347137411704 52.74923606767706 53.249222070581396
-331.286 274.58347137411704 275.41429144466707 52.74923606767706 53.249222070581396
-332.286 275.41429144466707 276.2451115152171 52.74923606767706 53.249222070581396
-333.286 276.2451115152171 277.0759315858171 52.74923606767706 53.249222070581396
-334.286 277.0759315858171 277.9067516563671 52.74923606767706 53.249222070581396
-335.286 277.9067516563671 278.75089165121443 52.74923606767706 53.249222070581396
-127.287 106.31807474347619 107.17213812097788 53.249222070581396 53.749207742471775
-128.287 107.17213812097788 108.0127246135279 53.249222070581396 53.749207742471775
-129.287 108.0127246135279 108.85331110607788 53.249222070581396 53.749207742471775
-130.287 108.85331110607788 109.69389759857788 53.249222070581396 53.749207742471775
-131.287 109.69389759857788 110.5344840911279 53.249222070581396 53.749207742471775
-132.287 110.5344840911279 111.37507058367788 53.249222070581396 53.749207742471775
-133.287 111.37507058367788 112.21565707622787 53.249222070581396 53.749207742471775
-134.287 112.21565707622787 113.05624356877787 53.249222070581396 53.749207742471775
-135.287 113.05624356877787 113.89683006132788 53.249222070581396 53.749207742471775
-136.287 113.89683006132788 114.73741655387786 53.249222070581396 53.749207742471775
-137.287 114.73741655387786 115.57800304637789 53.249222070581396 53.749207742471775
-138.287 115.57800304637789 116.41858953892788 53.249222070581396 53.749207742471775
-139.287 116.41858953892788 117.25917603147789 53.249222070581396 53.749207742471775
-140.287 117.25917603147789 118.0997625240279 53.249222070581396 53.749207742471775
-141.287 118.0997625240279 118.9403490165779 53.249222070581396 53.749207742471775
-142.287 118.9403490165779 119.78093550912789 53.249222070581396 53.749207742471775
-143.287 119.78093550912789 120.62152200167789 53.249222070581396 53.749207742471775
-144.287 120.62152200167789 121.4621084941779 53.249222070581396 53.749207742471775
-145.287 121.4621084941779 122.30269498672789 53.249222070581396 53.749207742471775
-146.287 122.30269498672789 123.14328147927787 53.249222070581396 53.749207742471775
-147.287 123.14328147927787 123.98386797182789 53.249222070581396 53.749207742471775
-148.287 123.98386797182789 124.8244544643779 53.249222070581396 53.749207742471775
-149.287 124.8244544643779 125.6650409569279 53.249222070581396 53.749207742471775
-150.287 125.6650409569279 126.50562744947788 53.249222070581396 53.749207742471775
-151.287 126.50562744947788 127.34621394197788 53.249222070581396 53.749207742471775
-152.287 127.34621394197788 128.1868004345279 53.249222070581396 53.749207742471775
-153.287 128.1868004345279 129.02738692707788 53.249222070581396 53.749207742471775
-154.287 129.02738692707788 129.8679734196279 53.249222070581396 53.749207742471775
-155.287 129.8679734196279 130.7085599121779 53.249222070581396 53.749207742471775
-156.287 130.7085599121779 131.54914640472788 53.249222070581396 53.749207742471775
-157.287 131.54914640472788 132.40320978227956 53.249222070581396 53.749207742471775
-230.287 192.89848347537617 193.75254685287786 53.249222070581396 53.749207742471775
-231.287 193.75254685287786 194.59313334542787 53.249222070581396 53.749207742471775
-232.287 194.59313334542787 195.4337198379779 53.249222070581396 53.749207742471775
-233.287 195.4337198379779 196.27430633052785 53.249222070581396 53.749207742471775
-234.287 196.27430633052785 197.11489282307787 53.249222070581396 53.749207742471775
-235.287 197.11489282307787 197.95547931562785 53.249222070581396 53.749207742471775
-236.287 197.95547931562785 198.79606580817784 53.249222070581396 53.749207742471775
-237.287 198.79606580817784 199.6366523006779 53.249222070581396 53.749207742471775
-238.287 199.6366523006779 200.47723879322788 53.249222070581396 53.749207742471775
-239.287 200.47723879322788 201.31782528577787 53.249222070581396 53.749207742471775
-240.287 201.31782528577787 202.15841177832783 53.249222070581396 53.749207742471775
-241.287 202.15841177832783 202.99899827087788 53.249222070581396 53.749207742471775
-242.287 202.99899827087788 203.83958476342787 53.249222070581396 53.749207742471775
-243.287 203.83958476342787 204.68017125597788 53.249222070581396 53.749207742471775
-244.287 204.68017125597788 205.52075774847788 53.249222070581396 53.749207742471775
-245.287 205.52075774847788 206.36134424102784 53.249222070581396 53.749207742471775
-246.287 206.36134424102784 207.20193073357785 53.249222070581396 53.749207742471775
-247.287 207.20193073357785 208.04251722612787 53.249222070581396 53.749207742471775
-248.287 208.04251722612787 208.8831037186779 53.249222070581396 53.749207742471775
-249.287 208.8831037186779 209.72369021122788 53.249222070581396 53.749207742471775
-250.287 209.72369021122788 210.56427670377786 53.249222070581396 53.749207742471775
-251.287 210.56427670377786 211.40486319632788 53.249222070581396 53.749207742471775
-252.287 211.40486319632788 212.24544968887787 53.249222070581396 53.749207742471775
-253.287 212.24544968887787 213.0860361813779 53.249222070581396 53.749207742471775
-254.287 213.0860361813779 213.92662267392785 53.249222070581396 53.749207742471775
-255.287 213.92662267392785 214.76720916647787 53.249222070581396 53.749207742471775
-256.287 214.76720916647787 215.6077956590279 53.249222070581396 53.749207742471775
-257.287 215.6077956590279 216.44838215157785 53.249222070581396 53.749207742471775
-258.287 216.44838215157785 217.28896864412786 53.249222070581396 53.749207742471775
-259.287 217.28896864412786 218.12955513667785 53.249222070581396 53.749207742471775
-260.287 218.12955513667785 218.97014162917787 53.249222070581396 53.749207742471775
-261.287 218.97014162917787 219.8107281217279 53.249222070581396 53.749207742471775
-262.287 219.8107281217279 220.65131461427785 53.249222070581396 53.749207742471775
-263.287 220.65131461427785 221.49190110682787 53.249222070581396 53.749207742471775
-264.287 221.49190110682787 222.33248759937786 53.249222070581396 53.749207742471775
-265.287 222.33248759937786 223.17307409192787 53.249222070581396 53.749207742471775
-266.287 223.17307409192787 224.01366058447786 53.249222070581396 53.749207742471775
-267.287 224.01366058447786 224.85424707697786 53.249222070581396 53.749207742471775
-268.287 224.85424707697786 225.69483356952787 53.249222070581396 53.749207742471775
-269.287 225.69483356952787 226.53542006207786 53.249222070581396 53.749207742471775
-270.287 226.53542006207786 227.37600655462785 53.249222070581396 53.749207742471775
-271.287 227.37600655462785 228.21659304717787 53.249222070581396 53.749207742471775
-272.287 228.21659304717787 229.05717953972788 53.249222070581396 53.749207742471775
-273.287 229.05717953972788 229.91124291727954 53.249222070581396 53.749207742471775
-284.287 238.29015407267622 239.14421745022787 53.249222070581396 53.749207742471775
-285.287 239.14421745022787 239.9848039427779 53.249222070581396 53.749207742471775
-286.287 239.9848039427779 240.8253904353279 53.249222070581396 53.749207742471775
-287.287 240.8253904353279 241.66597692787786 53.249222070581396 53.749207742471775
-288.287 241.66597692787786 242.5065634203779 53.249222070581396 53.749207742471775
-289.287 242.5065634203779 243.34714991292788 53.249222070581396 53.749207742471775
-290.287 243.34714991292788 244.1877364054779 53.249222070581396 53.749207742471775
-291.287 244.1877364054779 245.02832289802785 53.249222070581396 53.749207742471775
-292.287 245.02832289802785 245.86890939057787 53.249222070581396 53.749207742471775
-293.287 245.86890939057787 246.7094958831279 53.249222070581396 53.749207742471775
-294.287 246.7094958831279 247.55008237567785 53.249222070581396 53.749207742471775
-295.287 247.55008237567785 248.39066886817787 53.249222070581396 53.749207742471775
-296.287 248.39066886817787 249.23125536072789 53.249222070581396 53.749207742471775
-297.287 249.23125536072789 250.07184185327787 53.249222070581396 53.749207742471775
-298.287 250.07184185327787 250.9124283458279 53.249222070581396 53.749207742471775
-299.287 250.9124283458279 251.75301483837785 53.249222070581396 53.749207742471775
-300.287 251.75301483837785 252.59360133092787 53.249222070581396 53.749207742471775
-301.287 252.59360133092787 253.43418782347788 53.249222070581396 53.749207742471775
-302.287 253.43418782347788 254.27477431597788 53.249222070581396 53.749207742471775
-303.287 254.27477431597788 255.1153608085279 53.249222070581396 53.749207742471775
-304.287 255.1153608085279 255.95594730107788 53.249222070581396 53.749207742471775
-305.287 255.95594730107788 256.7965337936279 53.249222070581396 53.749207742471775
-306.287 256.7965337936279 257.6371202861779 53.249222070581396 53.749207742471775
-307.287 257.6371202861779 258.4777067787279 53.249222070581396 53.749207742471775
-308.287 258.4777067787279 259.31829327127787 53.249222070581396 53.749207742471775
-309.287 259.31829327127787 260.15887976377786 53.249222070581396 53.749207742471775
-310.287 260.15887976377786 260.9994662563279 53.249222070581396 53.749207742471775
-311.287 260.9994662563279 261.8400527488779 53.249222070581396 53.749207742471775
-312.287 261.8400527488779 262.6806392414279 53.249222070581396 53.749207742471775
-313.287 262.6806392414279 263.5212257339779 53.249222070581396 53.749207742471775
-314.287 263.5212257339779 264.3618122265279 53.249222070581396 53.749207742471775
-315.287 264.3618122265279 265.2023987190779 53.249222070581396 53.749207742471775
-316.287 265.2023987190779 266.0429852115779 53.249222070581396 53.749207742471775
-317.287 266.0429852115779 266.8835717041279 53.249222070581396 53.749207742471775
-318.287 266.8835717041279 267.7241581966779 53.249222070581396 53.749207742471775
-319.287 267.7241581966779 268.56474468922784 53.249222070581396 53.749207742471775
-320.287 268.56474468922784 269.40533118177785 53.249222070581396 53.749207742471775
-321.287 269.40533118177785 270.24591767432787 53.249222070581396 53.749207742471775
-322.287 270.24591767432787 271.0865041668779 53.249222070581396 53.749207742471775
-323.287 271.0865041668779 271.9270906594279 53.249222070581396 53.749207742471775
-324.287 271.9270906594279 272.76767715197786 53.249222070581396 53.749207742471775
-325.287 272.76767715197786 273.60826364447786 53.249222070581396 53.749207742471775
-326.287 273.60826364447786 274.4488501370279 53.249222070581396 53.749207742471775
-327.287 274.4488501370279 275.2894366295779 53.249222070581396 53.749207742471775
-328.287 275.2894366295779 276.1300231221279 53.249222070581396 53.749207742471775
-329.287 276.1300231221279 276.97060961467787 53.249222070581396 53.749207742471775
-330.287 276.97060961467787 277.8111961072279 53.249222070581396 53.749207742471775
-331.287 277.8111961072279 278.66525948477954 53.249222070581396 53.749207742471775
-126.288 106.74031718184338 107.6046066374445 53.749207742471775 54.24919306920428
-127.288 107.6046066374445 108.4552574457945 53.749207742471775 54.24919306920428
-128.288 108.4552574457945 109.3059082541445 53.749207742471775 54.24919306920428
-129.288 109.3059082541445 110.15655906249452 53.749207742471775 54.24919306920428
-130.288 110.15655906249452 111.00720987084452 53.749207742471775 54.24919306920428
-131.288 111.00720987084452 111.8578606791945 53.749207742471775 54.24919306920428
-132.288 111.8578606791945 112.7085114875445 53.749207742471775 54.24919306920428
-133.288 112.7085114875445 113.55916229589451 53.749207742471775 54.24919306920428
-134.288 113.55916229589451 114.4098131042445 53.749207742471775 54.24919306920428
-135.288 114.4098131042445 115.2604639125945 53.749207742471775 54.24919306920428
-136.288 115.2604639125945 116.1111147209445 53.749207742471775 54.24919306920428
-137.288 116.1111147209445 116.9617655292945 53.749207742471775 54.24919306920428
-138.288 116.9617655292945 117.81241633764449 53.749207742471775 54.24919306920428
-139.288 117.81241633764449 118.66306714599449 53.749207742471775 54.24919306920428
-140.288 118.66306714599449 119.51371795434451 53.749207742471775 54.24919306920428
-141.288 119.51371795434451 120.3643687626945 53.749207742471775 54.24919306920428
-142.288 120.3643687626945 121.21501957104451 53.749207742471775 54.24919306920428
-143.288 121.21501957104451 122.06567037939449 53.749207742471775 54.24919306920428
-144.288 122.06567037939449 122.9163211877445 53.749207742471775 54.24919306920428
-145.288 122.9163211877445 123.7669719960945 53.749207742471775 54.24919306920428
-146.288 123.7669719960945 124.61762280449449 53.749207742471775 54.24919306920428
-147.288 124.61762280449449 125.46827361284448 53.749207742471775 54.24919306920428
-148.288 125.46827361284448 126.3189244211945 53.749207742471775 54.24919306920428
-149.288 126.3189244211945 127.16957522954448 53.749207742471775 54.24919306920428
-150.288 127.16957522954448 128.02022603789447 53.749207742471775 54.24919306920428
-151.288 128.02022603789447 128.87087684624447 53.749207742471775 54.24919306920428
-152.288 128.87087684624447 129.7215276545945 53.749207742471775 54.24919306920428
-153.288 129.7215276545945 130.5721784629445 53.749207742471775 54.24919306920428
-154.288 130.5721784629445 131.42282927129452 53.749207742471775 54.24919306920428
-155.288 131.42282927129452 132.28711872694564 53.749207742471775 54.24919306920428
-187.288 158.63001649124337 159.49430594689449 53.749207742471775 54.24919306920428
-188.288 159.49430594689449 160.34495675524448 53.749207742471775 54.24919306920428
-189.288 160.34495675524448 161.19560756359448 53.749207742471775 54.24919306920428
-190.288 161.19560756359448 162.04625837194448 53.749207742471775 54.24919306920428
-191.288 162.04625837194448 162.8969091802945 53.749207742471775 54.24919306920428
-192.288 162.8969091802945 163.7475599886445 53.749207742471775 54.24919306920428
-193.288 163.7475599886445 164.59821079699446 53.749207742471775 54.24919306920428
-194.288 164.59821079699446 165.44886160534452 53.749207742471775 54.24919306920428
-195.288 165.44886160534452 166.29951241369452 53.749207742471775 54.24919306920428
-196.288 166.29951241369452 167.15016322209448 53.749207742471775 54.24919306920428
-197.288 167.15016322209448 168.00081403044447 53.749207742471775 54.24919306920428
-198.288 168.00081403044447 168.8514648387945 53.749207742471775 54.24919306920428
-199.288 168.8514648387945 169.70211564714452 53.749207742471775 54.24919306920428
-200.288 169.70211564714452 170.55276645549452 53.749207742471775 54.24919306920428
-201.288 170.55276645549452 171.40341726384452 53.749207742471775 54.24919306920428
-202.288 171.40341726384452 172.2677067194456 53.749207742471775 54.24919306920428
-228.288 193.50669963374335 194.3709890893445 53.749207742471775 54.24919306920428
-229.288 194.3709890893445 195.2216398976945 53.749207742471775 54.24919306920428
-230.288 195.2216398976945 196.0722907060445 53.749207742471775 54.24919306920428
-231.288 196.0722907060445 196.9229415143945 53.749207742471775 54.24919306920428
-232.288 196.9229415143945 197.77359232274452 53.749207742471775 54.24919306920428
-233.288 197.77359232274452 198.6242431310945 53.749207742471775 54.24919306920428
-234.288 198.6242431310945 199.47489393944448 53.749207742471775 54.24919306920428
-235.288 199.47489393944448 200.32554474779448 53.749207742471775 54.24919306920428
-236.288 200.32554474779448 201.17619555614448 53.749207742471775 54.24919306920428
-237.288 201.17619555614448 202.0268463644945 53.749207742471775 54.24919306920428
-238.288 202.0268463644945 202.87749717284447 53.749207742471775 54.24919306920428
-239.288 202.87749717284447 203.72814798119447 53.749207742471775 54.24919306920428
-240.288 203.72814798119447 204.57879878954452 53.749207742471775 54.24919306920428
-241.288 204.57879878954452 205.42944959789452 53.749207742471775 54.24919306920428
-242.288 205.42944959789452 206.28010040624451 53.749207742471775 54.24919306920428
-243.288 206.28010040624451 207.1307512145945 53.749207742471775 54.24919306920428
-244.288 207.1307512145945 207.9814020229945 53.749207742471775 54.24919306920428
-245.288 207.9814020229945 208.8320528313445 53.749207742471775 54.24919306920428
-246.288 208.8320528313445 209.6827036396945 53.749207742471775 54.24919306920428
-247.288 209.6827036396945 210.5333544480445 53.749207742471775 54.24919306920428
-248.288 210.5333544480445 211.38400525639452 53.749207742471775 54.24919306920428
-249.288 211.38400525639452 212.2346560647445 53.749207742471775 54.24919306920428
-250.288 212.2346560647445 213.08530687309448 53.749207742471775 54.24919306920428
-251.288 213.08530687309448 213.9359576814445 53.749207742471775 54.24919306920428
-252.288 213.9359576814445 214.7866084897945 53.749207742471775 54.24919306920428
-253.288 214.7866084897945 215.6372592981445 53.749207742471775 54.24919306920428
-254.288 215.6372592981445 216.4879101064945 53.749207742471775 54.24919306920428
-255.288 216.4879101064945 217.3385609148445 53.749207742471775 54.24919306920428
-256.288 217.3385609148445 218.1892117231945 53.749207742471775 54.24919306920428
-257.288 218.1892117231945 219.0398625315445 53.749207742471775 54.24919306920428
-258.288 219.0398625315445 219.89051333989448 53.749207742471775 54.24919306920428
-259.288 219.89051333989448 220.74116414824448 53.749207742471775 54.24919306920428
-260.288 220.74116414824448 221.59181495659448 53.749207742471775 54.24919306920428
-261.288 221.59181495659448 222.44246576494447 53.749207742471775 54.24919306920428
-262.288 222.44246576494447 223.2931165732945 53.749207742471775 54.24919306920428
-263.288 223.2931165732945 224.14376738164452 53.749207742471775 54.24919306920428
-264.288 224.14376738164452 224.99441818999452 53.749207742471775 54.24919306920428
-265.288 224.99441818999452 225.84506899834452 53.749207742471775 54.24919306920428
-266.288 225.84506899834452 226.6957198066945 53.749207742471775 54.24919306920428
-267.288 226.6957198066945 227.54637061504448 53.749207742471775 54.24919306920428
-268.288 227.54637061504448 228.3970214233945 53.749207742471775 54.24919306920428
-269.288 228.3970214233945 229.2476722317945 53.749207742471775 54.24919306920428
-270.288 229.2476722317945 230.09832304014452 53.749207742471775 54.24919306920428
-271.288 230.09832304014452 230.96261249574567 53.749207742471775 54.24919306920428
-281.288 238.59119247634334 239.45548193199448 53.749207742471775 54.24919306920428
-282.288 239.45548193199448 240.3061327403445 53.749207742471775 54.24919306920428
-283.288 240.3061327403445 241.15678354869448 53.749207742471775 54.24919306920428
-284.288 241.15678354869448 242.0074343570445 53.749207742471775 54.24919306920428
-285.288 242.0074343570445 242.8580851653945 53.749207742471775 54.24919306920428
-286.288 242.8580851653945 243.7087359737445 53.749207742471775 54.24919306920428
-287.288 243.7087359737445 244.55938678209452 53.749207742471775 54.24919306920428
-288.288 244.55938678209452 245.4100375904445 53.749207742471775 54.24919306920428
-289.288 245.4100375904445 246.2606883987945 53.749207742471775 54.24919306920428
-290.288 246.2606883987945 247.1113392071445 53.749207742471775 54.24919306920428
-291.288 247.1113392071445 247.96199001549448 53.749207742471775 54.24919306920428
-292.288 247.96199001549448 248.81264082384448 53.749207742471775 54.24919306920428
-293.288 248.81264082384448 249.6632916321945 53.749207742471775 54.24919306920428
-294.288 249.6632916321945 250.51394244059452 53.749207742471775 54.24919306920428
-295.288 250.51394244059452 251.36459324894452 53.749207742471775 54.24919306920428
-296.288 251.36459324894452 252.21524405729448 53.749207742471775 54.24919306920428
-297.288 252.21524405729448 253.06589486564448 53.749207742471775 54.24919306920428
-298.288 253.06589486564448 253.9165456739945 53.749207742471775 54.24919306920428
-299.288 253.9165456739945 254.76719648234447 53.749207742471775 54.24919306920428
-300.288 254.76719648234447 255.6178472906945 53.749207742471775 54.24919306920428
-301.288 255.6178472906945 256.4684980990445 53.749207742471775 54.24919306920428
-302.288 256.4684980990445 257.3191489073945 53.749207742471775 54.24919306920428
-303.288 257.3191489073945 258.1697997157445 53.749207742471775 54.24919306920428
-304.288 258.1697997157445 259.0204505240945 53.749207742471775 54.24919306920428
-305.288 259.0204505240945 259.8711013324445 53.749207742471775 54.24919306920428
-306.288 259.8711013324445 260.7217521407945 53.749207742471775 54.24919306920428
-307.288 260.7217521407945 261.5724029491445 53.749207742471775 54.24919306920428
-308.288 261.5724029491445 262.4230537574945 53.749207742471775 54.24919306920428
-309.288 262.4230537574945 263.27370456584447 53.749207742471775 54.24919306920428
-310.288 263.27370456584447 264.12435537419447 53.749207742471775 54.24919306920428
-311.288 264.12435537419447 264.97500618254446 53.749207742471775 54.24919306920428
-312.288 264.97500618254446 265.82565699089446 53.749207742471775 54.24919306920428
-313.288 265.82565699089446 266.6763077992445 53.749207742471775 54.24919306920428
-314.288 266.6763077992445 267.5269586075945 53.749207742471775 54.24919306920428
-315.288 267.5269586075945 268.3776094159445 53.749207742471775 54.24919306920428
-316.288 268.3776094159445 269.2282602242945 53.749207742471775 54.24919306920428
-317.288 269.2282602242945 270.07891103264444 53.749207742471775 54.24919306920428
-318.288 270.07891103264444 270.92956184099444 53.749207742471775 54.24919306920428
-319.288 270.92956184099444 271.7802126493945 53.749207742471775 54.24919306920428
-320.288 271.7802126493945 272.6308634577445 53.749207742471775 54.24919306920428
-321.288 272.6308634577445 273.4815142660945 53.749207742471775 54.24919306920428
-322.288 273.4815142660945 274.33216507444445 53.749207742471775 54.24919306920428
-323.288 274.33216507444445 275.18281588279444 53.749207742471775 54.24919306920428
-324.288 275.18281588279444 276.0334666911445 53.749207742471775 54.24919306920428
-325.288 276.0334666911445 276.8841174994945 53.749207742471775 54.24919306920428
-326.288 276.8841174994945 277.7347683078445 53.749207742471775 54.24919306920428
-327.288 277.7347683078445 278.5854191161945 53.749207742471775 54.24919306920428
-328.288 278.5854191161945 279.44970857184563 53.749207742471775 54.24919306920428
-124.289 106.32002765864965 107.19485847957705 54.24919306920428 54.74917803583754
-125.289 107.19485847957705 108.05588388867706 54.24919306920428 54.74917803583754
-126.289 108.05588388867706 108.91690929777707 54.24919306920428 54.74917803583754
-127.289 108.91690929777707 109.77793470682707 54.24919306920428 54.74917803583754
-128.289 109.77793470682707 110.63896011587707 54.24919306920428 54.74917803583754
-129.289 110.63896011587707 111.49998552497706 54.24919306920428 54.74917803583754
-130.289 111.49998552497706 112.36101093407706 54.24919306920428 54.74917803583754
-131.289 112.36101093407706 113.22203634317708 54.24919306920428 54.74917803583754
-132.289 113.22203634317708 114.08306175227708 54.24919306920428 54.74917803583754
-133.289 114.08306175227708 114.94408716137707 54.24919306920428 54.74917803583754
-134.289 114.94408716137707 115.80511257047706 54.24919306920428 54.74917803583754
-135.289 115.80511257047706 116.66613797957706 54.24919306920428 54.74917803583754
-136.289 116.66613797957706 117.52716338862706 54.24919306920428 54.74917803583754
-137.289 117.52716338862706 118.38818879767706 54.24919306920428 54.74917803583754
-138.289 118.38818879767706 119.24921420677708 54.24919306920428 54.74917803583754
-139.289 119.24921420677708 120.11023961587708 54.24919306920428 54.74917803583754
-140.289 120.11023961587708 120.97126502497707 54.24919306920428 54.74917803583754
-141.289 120.97126502497707 121.83229043407707 54.24919306920428 54.74917803583754
-142.289 121.83229043407707 122.69331584317707 54.24919306920428 54.74917803583754
-143.289 122.69331584317707 123.55434125227708 54.24919306920428 54.74917803583754
-144.289 123.55434125227708 124.41536666137706 54.24919306920428 54.74917803583754
-145.289 124.41536666137706 125.27639207042706 54.24919306920428 54.74917803583754
-146.289 125.27639207042706 126.13741747947708 54.24919306920428 54.74917803583754
-147.289 126.13741747947708 126.99844288857707 54.24919306920428 54.74917803583754
-148.289 126.99844288857707 127.85946829767707 54.24919306920428 54.74917803583754
-149.289 127.85946829767707 128.7204937067771 54.24919306920428 54.74917803583754
-150.289 128.7204937067771 129.5815191158771 54.24919306920428 54.74917803583754
-151.289 129.5815191158771 130.44254452497708 54.24919306920428 54.74917803583754
-152.289 130.44254452497708 131.30356993407707 54.24919306920428 54.74917803583754
-153.289 131.30356993407707 132.17840075500447 54.24919306920428 54.74917803583754
-185.289 158.84257761304966 159.71740843397706 54.24919306920428 54.74917803583754
-186.289 159.71740843397706 160.57843384307705 54.24919306920428 54.74917803583754
-187.289 160.57843384307705 161.43945925217707 54.24919306920428 54.74917803583754
-188.289 161.43945925217707 162.30048466127707 54.24919306920428 54.74917803583754
-189.289 162.30048466127707 163.16151007032707 54.24919306920428 54.74917803583754
-190.289 163.16151007032707 164.0225354793771 54.24919306920428 54.74917803583754
-191.289 164.0225354793771 164.8835608884771 54.24919306920428 54.74917803583754
-192.289 164.8835608884771 165.7445862975771 54.24919306920428 54.74917803583754
-193.289 165.7445862975771 166.60561170667708 54.24919306920428 54.74917803583754
-194.289 166.60561170667708 167.46663711577708 54.24919306920428 54.74917803583754
-195.289 167.46663711577708 168.32766252487704 54.24919306920428 54.74917803583754
-196.289 168.32766252487704 169.18868793397706 54.24919306920428 54.74917803583754
-197.289 169.18868793397706 170.0497133430771 54.24919306920428 54.74917803583754
-198.289 170.0497133430771 170.91073875212706 54.24919306920428 54.74917803583754
-199.289 170.91073875212706 171.7717641611771 54.24919306920428 54.74917803583754
-200.289 171.7717641611771 172.6465949821045 54.24919306920428 54.74917803583754
-225.289 193.2835939765496 194.15842479747704 54.24919306920428 54.74917803583754
-226.289 194.15842479747704 195.01945020657706 54.24919306920428 54.74917803583754
-227.289 195.01945020657706 195.88047561567703 54.24919306920428 54.74917803583754
-228.289 195.88047561567703 196.74150102477705 54.24919306920428 54.74917803583754
-229.289 196.74150102477705 197.60252643387702 54.24919306920428 54.74917803583754
-230.289 197.60252643387702 198.46355184297704 54.24919306920428 54.74917803583754
-231.289 198.46355184297704 199.32457725207706 54.24919306920428 54.74917803583754
-232.289 199.32457725207706 200.18560266117703 54.24919306920428 54.74917803583754
-233.289 200.18560266117703 201.04662807022706 54.24919306920428 54.74917803583754
-234.289 201.04662807022706 201.90765347927703 54.24919306920428 54.74917803583754
-235.289 201.90765347927703 202.76867888837705 54.24919306920428 54.74917803583754
-236.289 202.76867888837705 203.62970429747702 54.24919306920428 54.74917803583754
-237.289 203.62970429747702 204.49072970657704 54.24919306920428 54.74917803583754
-238.289 204.49072970657704 205.35175511567704 54.24919306920428 54.74917803583754
-239.289 205.35175511567704 206.21278052477706 54.24919306920428 54.74917803583754
-240.289 206.21278052477706 207.07380593387705 54.24919306920428 54.74917803583754
-241.289 207.07380593387705 207.93483134297705 54.24919306920428 54.74917803583754
-242.289 207.93483134297705 208.79585675202705 54.24919306920428 54.74917803583754
-243.289 208.79585675202705 209.65688216107705 54.24919306920428 54.74917803583754
-244.289 209.65688216107705 210.51790757017704 54.24919306920428 54.74917803583754
-245.289 210.51790757017704 211.37893297927707 54.24919306920428 54.74917803583754
-246.289 211.37893297927707 212.23995838837706 54.24919306920428 54.74917803583754
-247.289 212.23995838837706 213.10098379747706 54.24919306920428 54.74917803583754
-248.289 213.10098379747706 213.96200920657702 54.24919306920428 54.74917803583754
-249.289 213.96200920657702 214.82303461567705 54.24919306920428 54.74917803583754
-250.289 214.82303461567705 215.68406002477704 54.24919306920428 54.74917803583754
-251.289 215.68406002477704 216.54508543382707 54.24919306920428 54.74917803583754
-252.289 216.54508543382707 217.40611084287707 54.24919306920428 54.74917803583754
-253.289 217.40611084287707 218.26713625197706 54.24919306920428 54.74917803583754
-254.289 218.26713625197706 219.12816166107706 54.24919306920428 54.74917803583754
-255.289 219.12816166107706 219.98918707017708 54.24919306920428 54.74917803583754
-256.289 219.98918707017708 220.85021247927705 54.24919306920428 54.74917803583754
-257.289 220.85021247927705 221.71123788837704 54.24919306920428 54.74917803583754
-258.289 221.71123788837704 222.57226329747704 54.24919306920428 54.74917803583754
-259.289 222.57226329747704 223.43328870652704 54.24919306920428 54.74917803583754
-260.289 223.43328870652704 224.29431411557704 54.24919306920428 54.74917803583754
-261.289 224.29431411557704 225.15533952467706 54.24919306920428 54.74917803583754
-262.289 225.15533952467706 226.01636493377706 54.24919306920428 54.74917803583754
-263.289 226.01636493377706 226.87739034287705 54.24919306920428 54.74917803583754
-264.289 226.87739034287705 227.73841575197704 54.24919306920428 54.74917803583754
-265.289 227.73841575197704 228.59944116107704 54.24919306920428 54.74917803583754
-266.289 228.59944116107704 229.46046657017706 54.24919306920428 54.74917803583754
-267.289 229.46046657017706 230.32149197927706 54.24919306920428 54.74917803583754
-268.289 230.32149197927706 231.19632280020446 54.24919306920428 54.74917803583754
-279.289 239.77896606734964 240.65379688827707 54.24919306920428 54.74917803583754
-280.289 240.65379688827707 241.51482229737707 54.24919306920428 54.74917803583754
-281.289 241.51482229737707 242.37584770647706 54.24919306920428 54.74917803583754
-282.289 242.37584770647706 243.23687311557705 54.24919306920428 54.74917803583754
-283.289 243.23687311557705 244.09789852467708 54.24919306920428 54.74917803583754
-284.289 244.09789852467708 244.95892393377704 54.24919306920428 54.74917803583754
-285.289 244.95892393377704 245.81994934287707 54.24919306920428 54.74917803583754
-286.289 245.81994934287707 246.68097475192707 54.24919306920428 54.74917803583754
-287.289 246.68097475192707 247.54200016097707 54.24919306920428 54.74917803583754
-288.289 247.54200016097707 248.4030255700771 54.24919306920428 54.74917803583754
-289.289 248.4030255700771 249.26405097917706 54.24919306920428 54.74917803583754
-290.289 249.26405097917706 250.12507638827708 54.24919306920428 54.74917803583754
-291.289 250.12507638827708 250.98610179737705 54.24919306920428 54.74917803583754
-292.289 250.98610179737705 251.84712720647707 54.24919306920428 54.74917803583754
-293.289 251.84712720647707 252.70815261557706 54.24919306920428 54.74917803583754
-294.289 252.70815261557706 253.56917802467706 54.24919306920428 54.74917803583754
-295.289 253.56917802467706 254.43020343372706 54.24919306920428 54.74917803583754
-296.289 254.43020343372706 255.29122884277706 54.24919306920428 54.74917803583754
-297.289 255.29122884277706 256.1522542518771 54.24919306920428 54.74917803583754
-298.289 256.1522542518771 257.0132796609771 54.24919306920428 54.74917803583754
-299.289 257.0132796609771 257.87430507007707 54.24919306920428 54.74917803583754
-300.289 257.87430507007707 258.73533047917704 54.24919306920428 54.74917803583754
-301.289 258.73533047917704 259.59635588827706 54.24919306920428 54.74917803583754
-302.289 259.59635588827706 260.4573812973771 54.24919306920428 54.74917803583754
-303.289 260.4573812973771 261.3322121183045 54.24919306920428 54.74917803583754
-314.289 269.91485538544964 270.78968620637704 54.24919306920428 54.74917803583754
-315.289 270.78968620637704 271.650711615477 54.24919306920428 54.74917803583754
-316.289 271.650711615477 272.51173702457703 54.24919306920428 54.74917803583754
-317.289 272.51173702457703 273.37276243367705 54.24919306920428 54.74917803583754
-318.289 273.37276243367705 274.233787842777 54.24919306920428 54.74917803583754
-319.289 274.233787842777 275.0948132518771 54.24919306920428 54.74917803583754
-320.289 275.0948132518771 275.95583866097707 54.24919306920428 54.74917803583754
-321.289 275.95583866097707 276.816864070027 54.24919306920428 54.74917803583754
-322.289 276.816864070027 277.67788947907707 54.24919306920428 54.74917803583754
-323.289 277.67788947907707 278.53891488817703 54.24919306920428 54.74917803583754
-324.289 278.53891488817703 279.41374570910443 54.24919306920428 54.74917803583754
-123.290 106.76924596779752 107.65494675648009 54.74917803583754 55.24916262657524
-124.290 107.65494675648009 108.52667015428008 54.74917803583754 55.24916262657524
-125.290 108.52667015428008 109.39839355208008 54.74917803583754 55.24916262657524
-126.290 109.39839355208008 110.27011694988008 54.74917803583754 55.24916262657524
-127.290 110.27011694988008 111.1418403477301 54.74917803583754 55.24916262657524
-128.290 111.1418403477301 112.01356374558009 54.74917803583754 55.24916262657524
-129.290 112.01356374558009 112.88528714338008 54.74917803583754 55.24916262657524
-130.290 112.88528714338008 113.75701054118008 54.74917803583754 55.24916262657524
-131.290 113.75701054118008 114.62873393898009 54.74917803583754 55.24916262657524
-132.290 114.62873393898009 115.50045733678009 54.74917803583754 55.24916262657524
-133.290 115.50045733678009 116.3721807345801 54.74917803583754 55.24916262657524
-134.290 116.3721807345801 117.24390413238008 54.74917803583754 55.24916262657524
-135.290 117.24390413238008 118.11562753018009 54.74917803583754 55.24916262657524
-136.290 118.11562753018009 118.98735092798007 54.74917803583754 55.24916262657524
-137.290 118.98735092798007 119.85907432583011 54.74917803583754 55.24916262657524
-138.290 119.85907432583011 120.73079772368011 54.74917803583754 55.24916262657524
-139.290 120.73079772368011 121.6025211214801 54.74917803583754 55.24916262657524
-140.290 121.6025211214801 122.47424451928009 54.74917803583754 55.24916262657524
-141.290 122.47424451928009 123.34596791708009 54.74917803583754 55.24916262657524
-142.290 123.34596791708009 124.21769131488008 54.74917803583754 55.24916262657524
-143.290 124.21769131488008 125.0894147126801 54.74917803583754 55.24916262657524
-144.290 125.0894147126801 125.96113811048009 54.74917803583754 55.24916262657524
-145.290 125.96113811048009 126.83286150828009 54.74917803583754 55.24916262657524
-146.290 126.83286150828009 127.7045849061301 54.74917803583754 55.24916262657524
-147.290 127.7045849061301 128.5763083039801 54.74917803583754 55.24916262657524
-148.290 128.5763083039801 129.4480317017801 54.74917803583754 55.24916262657524
-149.290 129.4480317017801 130.3197550995801 54.74917803583754 55.24916262657524
-150.290 130.3197550995801 131.19147849738007 54.74917803583754 55.24916262657524
-151.290 131.19147849738007 132.0632018951801 54.74917803583754 55.24916262657524
-152.290 132.0632018951801 132.94890268386268 54.74917803583754 55.24916262657524
-183.290 159.07264983639752 159.95835062508007 54.74917803583754 55.24916262657524
-184.290 159.95835062508007 160.8300740229301 54.74917803583754 55.24916262657524
-185.290 160.8300740229301 161.7017974207801 54.74917803583754 55.24916262657524
-186.290 161.7017974207801 162.57352081858008 54.74917803583754 55.24916262657524
-187.290 162.57352081858008 163.4452442163801 54.74917803583754 55.24916262657524
-188.290 163.4452442163801 164.3169676141801 54.74917803583754 55.24916262657524
-189.290 164.3169676141801 165.18869101198007 54.74917803583754 55.24916262657524
-190.290 165.18869101198007 166.0604144097801 54.74917803583754 55.24916262657524
-191.290 166.0604144097801 166.9321378075801 54.74917803583754 55.24916262657524
-192.290 166.9321378075801 167.8038612053801 54.74917803583754 55.24916262657524
-193.290 167.8038612053801 168.67558460318008 54.74917803583754 55.24916262657524
-194.290 168.67558460318008 169.5473080010301 54.74917803583754 55.24916262657524
-195.290 169.5473080010301 170.4190313988801 54.74917803583754 55.24916262657524
-196.290 170.4190313988801 171.29075479668012 54.74917803583754 55.24916262657524
-197.290 171.29075479668012 172.1764555853627 54.74917803583754 55.24916262657524
-223.290 193.9415857488975 194.82728653758008 54.74917803583754 55.24916262657524
-224.290 194.82728653758008 195.69900993538005 54.74917803583754 55.24916262657524
-225.290 195.69900993538005 196.57073333318007 54.74917803583754 55.24916262657524
-226.290 196.57073333318007 197.44245673098007 54.74917803583754 55.24916262657524
-227.290 197.44245673098007 198.31418012878007 54.74917803583754 55.24916262657524
-228.290 198.31418012878007 199.1859035265801 54.74917803583754 55.24916262657524
-229.290 199.1859035265801 200.0576269243801 54.74917803583754 55.24916262657524
-230.290 200.0576269243801 200.92935032218008 54.74917803583754 55.24916262657524
-231.290 200.92935032218008 201.80107371998008 54.74917803583754 55.24916262657524
-232.290 201.80107371998008 202.6727971178301 54.74917803583754 55.24916262657524
-233.290 202.6727971178301 203.54452051568006 54.74917803583754 55.24916262657524
-234.290 203.54452051568006 204.4162439134801 54.74917803583754 55.24916262657524
-235.290 204.4162439134801 205.28796731128008 54.74917803583754 55.24916262657524
-236.290 205.28796731128008 206.15969070908005 54.74917803583754 55.24916262657524
-237.290 206.15969070908005 207.03141410688008 54.74917803583754 55.24916262657524
-238.290 207.03141410688008 207.90313750468007 54.74917803583754 55.24916262657524
-239.290 207.90313750468007 208.77486090248004 54.74917803583754 55.24916262657524
-240.290 208.77486090248004 209.64658430028007 54.74917803583754 55.24916262657524
-241.290 209.64658430028007 210.5183076981301 54.74917803583754 55.24916262657524
-242.290 210.5183076981301 211.39003109598008 54.74917803583754 55.24916262657524
-243.290 211.39003109598008 212.26175449378007 54.74917803583754 55.24916262657524
-244.290 212.26175449378007 213.13347789158007 54.74917803583754 55.24916262657524
-245.290 213.13347789158007 214.00520128938007 54.74917803583754 55.24916262657524
-246.290 214.00520128938007 214.8769246871801 54.74917803583754 55.24916262657524
-247.290 214.8769246871801 215.7486480849801 54.74917803583754 55.24916262657524
-248.290 215.7486480849801 216.62037148278006 54.74917803583754 55.24916262657524
-249.290 216.62037148278006 217.49209488058005 54.74917803583754 55.24916262657524
-250.290 217.49209488058005 218.36381827838008 54.74917803583754 55.24916262657524
-251.290 218.36381827838008 219.23554167623007 54.74917803583754 55.24916262657524
-252.290 219.23554167623007 220.1072650740801 54.74917803583754 55.24916262657524
-253.290 220.1072650740801 220.9789884718801 54.74917803583754 55.24916262657524
-254.290 220.9789884718801 221.85071186968008 54.74917803583754 55.24916262657524
-255.290 221.85071186968008 222.72243526748008 54.74917803583754 55.24916262657524
-256.290 222.72243526748008 223.59415866528008 54.74917803583754 55.24916262657524
-257.290 223.59415866528008 224.46588206308007 54.74917803583754 55.24916262657524
-258.290 224.46588206308007 225.33760546088007 54.74917803583754 55.24916262657524
-259.290 225.33760546088007 226.20932885868007 54.74917803583754 55.24916262657524
-260.290 226.20932885868007 227.08105225653009 54.74917803583754 55.24916262657524
-261.290 227.08105225653009 227.9527756543801 54.74917803583754 55.24916262657524
-262.290 227.9527756543801 228.82449905218007 54.74917803583754 55.24916262657524
-263.290 228.82449905218007 229.69622244998004 54.74917803583754 55.24916262657524
-264.290 229.69622244998004 230.56794584778007 54.74917803583754 55.24916262657524
-265.290 230.56794584778007 231.4396692455801 54.74917803583754 55.24916262657524
-266.290 231.4396692455801 232.32537003426268 54.74917803583754 55.24916262657524
-277.290 241.0146492305975 241.9003500192801 54.74917803583754 55.24916262657524
-278.290 241.9003500192801 242.7720734170801 54.74917803583754 55.24916262657524
-279.290 242.7720734170801 243.64379681493008 54.74917803583754 55.24916262657524
-280.290 243.64379681493008 244.51552021278007 54.74917803583754 55.24916262657524
-281.290 244.51552021278007 245.38724361058007 54.74917803583754 55.24916262657524
-282.290 245.38724361058007 246.2589670083801 54.74917803583754 55.24916262657524
-283.290 246.2589670083801 247.1306904061801 54.74917803583754 55.24916262657524
-284.290 247.1306904061801 248.00241380398006 54.74917803583754 55.24916262657524
-285.290 248.00241380398006 248.8741372017801 54.74917803583754 55.24916262657524
-286.290 248.8741372017801 249.74586059958008 54.74917803583754 55.24916262657524
-287.290 249.74586059958008 250.61758399738005 54.74917803583754 55.24916262657524
-288.290 250.61758399738005 251.48930739518005 54.74917803583754 55.24916262657524
-289.290 251.48930739518005 252.3610307930301 54.74917803583754 55.24916262657524
-290.290 252.3610307930301 253.2327541908801 54.74917803583754 55.24916262657524
-291.290 253.2327541908801 254.10447758868008 54.74917803583754 55.24916262657524
-292.290 254.10447758868008 254.97620098648008 54.74917803583754 55.24916262657524
-293.290 254.97620098648008 255.84792438428008 54.74917803583754 55.24916262657524
-294.290 255.84792438428008 256.7196477820801 54.74917803583754 55.24916262657524
-295.290 256.7196477820801 257.59137117988007 54.74917803583754 55.24916262657524
-296.290 257.59137117988007 258.46309457768007 54.74917803583754 55.24916262657524
-297.290 258.46309457768007 259.33481797548006 54.74917803583754 55.24916262657524
-298.290 259.33481797548006 260.2065413733301 54.74917803583754 55.24916262657524
-299.290 260.2065413733301 261.09224216206263 54.74917803583754 55.24916262657524
-311.290 270.6532447561975 271.53894554488005 54.74917803583754 55.24916262657524
-312.290 271.53894554488005 272.4106689426801 54.74917803583754 55.24916262657524
-313.290 272.4106689426801 273.2823923404801 54.74917803583754 55.24916262657524
-314.290 273.2823923404801 274.15411573828004 54.74917803583754 55.24916262657524
-315.290 274.15411573828004 275.0258391360801 54.74917803583754 55.24916262657524
-316.290 275.0258391360801 275.8975625338801 54.74917803583754 55.24916262657524
-317.290 275.8975625338801 276.76928593173005 54.74917803583754 55.24916262657524
-318.290 276.76928593173005 277.64100932958013 54.74917803583754 55.24916262657524
-319.290 277.64100932958013 278.5127327273801 54.74917803583754 55.24916262657524
-320.290 278.5127327273801 279.39843351606265 54.74917803583754 55.24916262657524
-121.291 106.35527684649857 107.25219029664993 55.24916262657524 55.74914682470368
-122.291 107.25219029664993 108.13494893769993 55.24916262657524 55.74914682470368
-123.291 108.13494893769993 109.01770757874993 55.24916262657524 55.74914682470368
-124.291 109.01770757874993 109.90046621984992 55.24916262657524 55.74914682470368
-125.291 109.90046621984992 110.78322486089992 55.24916262657524 55.74914682470368
-126.291 110.78322486089992 111.66598350194994 55.24916262657524 55.74914682470368
-127.291 111.66598350194994 112.54874214304992 55.24916262657524 55.74914682470368
-128.291 112.54874214304992 113.43150078409991 55.24916262657524 55.74914682470368
-129.291 113.43150078409991 114.31425942514991 55.24916262657524 55.74914682470368
-130.291 114.31425942514991 115.19701806624992 55.24916262657524 55.74914682470368
-131.291 115.19701806624992 116.07977670729993 55.24916262657524 55.74914682470368
-132.291 116.07977670729993 116.96253534834992 55.24916262657524 55.74914682470368
-133.291 116.96253534834992 117.84529398944991 55.24916262657524 55.74914682470368
-134.291 117.84529398944991 118.72805263049992 55.24916262657524 55.74914682470368
-135.291 118.72805263049992 119.61081127154992 55.24916262657524 55.74914682470368
-136.291 119.61081127154992 120.49356991264992 55.24916262657524 55.74914682470368
-137.291 120.49356991264992 121.37632855369992 55.24916262657524 55.74914682470368
-138.291 121.37632855369992 122.25908719474992 55.24916262657524 55.74914682470368
-139.291 122.25908719474992 123.14184583584992 55.24916262657524 55.74914682470368
-140.291 123.14184583584992 124.02460447689991 55.24916262657524 55.74914682470368
-141.291 124.02460447689991 124.90736311794991 55.24916262657524 55.74914682470368
-142.291 124.90736311794991 125.79012175904992 55.24916262657524 55.74914682470368
-143.291 125.79012175904992 126.67288040009993 55.24916262657524 55.74914682470368
-144.291 126.67288040009993 127.55563904114992 55.24916262657524 55.74914682470368
-145.291 127.55563904114992 128.43839768224993 55.24916262657524 55.74914682470368
-146.291 128.43839768224993 129.3211563232999 55.24916262657524 55.74914682470368
-147.291 129.3211563232999 130.2039149643499 55.24916262657524 55.74914682470368
-148.291 130.2039149643499 131.08667360544993 55.24916262657524 55.74914682470368
-149.291 131.08667360544993 131.96943224649993 55.24916262657524 55.74914682470368
-150.291 131.96943224649993 132.8663456966013 55.24916262657524 55.74914682470368
-180.291 158.4380366694986 159.3349501195999 55.24916262657524 55.74914682470368
-181.291 159.3349501195999 160.2177087606499 55.24916262657524 55.74914682470368
-182.291 160.2177087606499 161.1004674017499 55.24916262657524 55.74914682470368
-183.291 161.1004674017499 161.9832260427999 55.24916262657524 55.74914682470368
-184.291 161.9832260427999 162.86598468384992 55.24916262657524 55.74914682470368
-185.291 162.86598468384992 163.76289813400123 55.24916262657524 55.74914682470368
-221.291 194.63114095319858 195.52805440334993 55.24916262657524 55.74914682470368
-222.291 195.52805440334993 196.41081304444992 55.24916262657524 55.74914682470368
-223.291 196.41081304444992 197.29357168549993 55.24916262657524 55.74914682470368
-224.291 197.29357168549993 198.17633032654993 55.24916262657524 55.74914682470368
-225.291 198.17633032654993 199.05908896764993 55.24916262657524 55.74914682470368
-226.291 199.05908896764993 199.94184760874992 55.24916262657524 55.74914682470368
-227.291 199.94184760874992 200.82460624979996 55.24916262657524 55.74914682470368
-228.291 200.82460624979996 201.70736489084993 55.24916262657524 55.74914682470368
-229.291 201.70736489084993 202.59012353194993 55.24916262657524 55.74914682470368
-230.291 202.59012353194993 203.47288217299993 55.24916262657524 55.74914682470368
-231.291 203.47288217299993 204.35564081404993 55.24916262657524 55.74914682470368
-232.291 204.35564081404993 205.23839945514993 55.24916262657524 55.74914682470368
-233.291 205.23839945514993 206.12115809619993 55.24916262657524 55.74914682470368
-234.291 206.12115809619993 207.0039167372499 55.24916262657524 55.74914682470368
-235.291 207.0039167372499 207.88667537834993 55.24916262657524 55.74914682470368
-236.291 207.88667537834993 208.7694340193999 55.24916262657524 55.74914682470368
-237.291 208.7694340193999 209.6521926604499 55.24916262657524 55.74914682470368
-238.291 209.6521926604499 210.5349513015499 55.24916262657524 55.74914682470368
-239.291 210.5349513015499 211.4177099425999 55.24916262657524 55.74914682470368
-240.291 211.4177099425999 212.30046858364992 55.24916262657524 55.74914682470368
-241.291 212.30046858364992 213.1832272247499 55.24916262657524 55.74914682470368
-242.291 213.1832272247499 214.06598586579992 55.24916262657524 55.74914682470368
-243.291 214.06598586579992 214.94874450684992 55.24916262657524 55.74914682470368
-244.291 214.94874450684992 215.83150314794992 55.24916262657524 55.74914682470368
-245.291 215.83150314794992 216.71426178899992 55.24916262657524 55.74914682470368
-246.291 216.71426178899992 217.59702043004992 55.24916262657524 55.74914682470368
-247.291 217.59702043004992 218.47977907114992 55.24916262657524 55.74914682470368
-248.291 218.47977907114992 219.36253771219992 55.24916262657524 55.74914682470368
-249.291 219.36253771219992 220.2452963532499 55.24916262657524 55.74914682470368
-250.291 220.2452963532499 221.12805499434995 55.24916262657524 55.74914682470368
-251.291 221.12805499434995 222.01081363539993 55.24916262657524 55.74914682470368
-252.291 222.01081363539993 222.89357227644993 55.24916262657524 55.74914682470368
-253.291 222.89357227644993 223.77633091754996 55.24916262657524 55.74914682470368
-254.291 223.77633091754996 224.65908955859993 55.24916262657524 55.74914682470368
-255.291 224.65908955859993 225.5418481996499 55.24916262657524 55.74914682470368
-256.291 225.5418481996499 226.42460684074993 55.24916262657524 55.74914682470368
-257.291 226.42460684074993 227.30736548179993 55.24916262657524 55.74914682470368
-258.291 227.30736548179993 228.1901241228499 55.24916262657524 55.74914682470368
-259.291 228.1901241228499 229.0728827639499 55.24916262657524 55.74914682470368
-260.291 229.0728827639499 229.9556414050499 55.24916262657524 55.74914682470368
-261.291 229.9556414050499 230.83840004609988 55.24916262657524 55.74914682470368
-262.291 230.83840004609988 231.7211586871499 55.24916262657524 55.74914682470368
-263.291 231.7211586871499 232.6039173282499 55.24916262657524 55.74914682470368
-264.291 232.6039173282499 233.50083077840128 55.24916262657524 55.74914682470368
-274.291 241.41734892979855 242.31426237994992 55.24916262657524 55.74914682470368
-275.291 242.31426237994992 243.19702102104995 55.24916262657524 55.74914682470368
-276.291 243.19702102104995 244.07977966209995 55.24916262657524 55.74914682470368
-277.291 244.07977966209995 244.96253830314993 55.24916262657524 55.74914682470368
-278.291 244.96253830314993 245.8452969442499 55.24916262657524 55.74914682470368
-279.291 245.8452969442499 246.7280555852999 55.24916262657524 55.74914682470368
-280.291 246.7280555852999 247.61081422634993 55.24916262657524 55.74914682470368
-281.291 247.61081422634993 248.49357286744996 55.24916262657524 55.74914682470368
-282.291 248.49357286744996 249.3763315084999 55.24916262657524 55.74914682470368
-283.291 249.3763315084999 250.25909014954988 55.24916262657524 55.74914682470368
-284.291 250.25909014954988 251.1418487906499 55.24916262657524 55.74914682470368
-285.291 251.1418487906499 252.0246074316999 55.24916262657524 55.74914682470368
-286.291 252.0246074316999 252.9073660727499 55.24916262657524 55.74914682470368
-287.291 252.9073660727499 253.7901247138499 55.24916262657524 55.74914682470368
-288.291 253.7901247138499 254.6728833548999 55.24916262657524 55.74914682470368
-289.291 254.6728833548999 255.5556419959499 55.24916262657524 55.74914682470368
-290.291 255.5556419959499 256.4384006370499 55.24916262657524 55.74914682470368
-291.291 256.4384006370499 257.3211592780999 55.24916262657524 55.74914682470368
-292.291 257.3211592780999 258.20391791914994 55.24916262657524 55.74914682470368
-293.291 258.20391791914994 259.08667656024994 55.24916262657524 55.74914682470368
-294.291 259.08667656024994 259.96943520134994 55.24916262657524 55.74914682470368
-295.291 259.96943520134994 260.85219384239997 55.24916262657524 55.74914682470368
-296.291 260.85219384239997 261.74910729250126 55.24916262657524 55.74914682470368
-307.291 270.5483840850985 271.44529753519987 55.24916262657524 55.74914682470368
-308.291 271.44529753519987 272.3280561762499 55.24916262657524 55.74914682470368
-309.291 272.3280561762499 273.2108148173499 55.24916262657524 55.74914682470368
-310.291 273.2108148173499 274.0935734583999 55.24916262657524 55.74914682470368
-311.291 274.0935734583999 274.9763320994499 55.24916262657524 55.74914682470368
-312.291 274.9763320994499 275.8590907405499 55.24916262657524 55.74914682470368
-313.291 275.8590907405499 276.7418493815999 55.24916262657524 55.74914682470368
-314.291 276.7418493815999 277.6246080226499 55.24916262657524 55.74914682470368
-315.291 277.6246080226499 278.50736666374996 55.24916262657524 55.74914682470368
-316.291 278.50736666374996 279.4042801139013 55.24916262657524 55.74914682470368
-119.292 105.9388620183398 106.84734574775271 55.74914682470368 56.24913061252374
-120.292 106.84734574775271 107.74149157275272 55.74914682470368 56.24913061252374
-121.292 107.74149157275272 108.63563739775273 55.74914682470368 56.24913061252374
-122.292 108.63563739775273 109.52978322270272 55.74914682470368 56.24913061252374
-123.292 109.52978322270272 110.42392904765272 55.74914682470368 56.24913061252374
-124.292 110.42392904765272 111.31807487265272 55.74914682470368 56.24913061252374
-125.292 111.31807487265272 112.2122206976527 55.74914682470368 56.24913061252374
-126.292 112.2122206976527 113.1063665226527 55.74914682470368 56.24913061252374
-127.292 113.1063665226527 114.00051234765272 55.74914682470368 56.24913061252374
-128.292 114.00051234765272 114.89465817265271 55.74914682470368 56.24913061252374
-129.292 114.89465817265271 115.78880399760271 55.74914682470368 56.24913061252374
-130.292 115.78880399760271 116.68294982255273 55.74914682470368 56.24913061252374
-131.292 116.68294982255273 117.57709564755271 55.74914682470368 56.24913061252374
-132.292 117.57709564755271 118.47124147255269 55.74914682470368 56.24913061252374
-133.292 118.47124147255269 119.3653872975527 55.74914682470368 56.24913061252374
-134.292 119.3653872975527 120.25953312255271 55.74914682470368 56.24913061252374
-135.292 120.25953312255271 121.1536789475527 55.74914682470368 56.24913061252374
-136.292 121.1536789475527 122.04782477250271 55.74914682470368 56.24913061252374
-137.292 122.04782477250271 122.94197059745271 55.74914682470368 56.24913061252374
-138.292 122.94197059745271 123.83611642245272 55.74914682470368 56.24913061252374
-139.292 123.83611642245272 124.73026224745271 55.74914682470368 56.24913061252374
-140.292 124.73026224745271 125.6244080724527 55.74914682470368 56.24913061252374
-141.292 125.6244080724527 126.5185538974527 55.74914682470368 56.24913061252374
-142.292 126.5185538974527 127.41269972245271 55.74914682470368 56.24913061252374
-143.292 127.41269972245271 128.3068455474027 55.74914682470368 56.24913061252374
-144.292 128.3068455474027 129.20099137235272 55.74914682470368 56.24913061252374
-145.292 129.20099137235272 130.0951371973527 55.74914682470368 56.24913061252374
-146.292 130.0951371973527 130.9892830223527 55.74914682470368 56.24913061252374
-147.292 130.9892830223527 131.88342884735272 55.74914682470368 56.24913061252374
-148.292 131.88342884735272 132.7919125767656 55.74914682470368 56.24913061252374
-178.292 158.6934656925398 159.6019494219027 55.74914682470368 56.24913061252374
-179.292 159.6019494219027 160.49609524685272 55.74914682470368 56.24913061252374
-180.292 160.49609524685272 161.3902410718527 55.74914682470368 56.24913061252374
-181.292 161.3902410718527 162.2843868968527 55.74914682470368 56.24913061252374
-182.292 162.2843868968527 163.17853272185272 55.74914682470368 56.24913061252374
-183.292 163.17853272185272 164.07267854685273 55.74914682470368 56.24913061252374
-184.292 164.07267854685273 164.9668243718527 55.74914682470368 56.24913061252374
-185.292 164.9668243718527 165.8609701968027 55.74914682470368 56.24913061252374
-186.292 165.8609701968027 166.7551160217527 55.74914682470368 56.24913061252374
-187.292 166.7551160217527 167.64926184675272 55.74914682470368 56.24913061252374
-188.292 167.64926184675272 168.54340767175273 55.74914682470368 56.24913061252374
-189.292 168.54340767175273 169.4375534967527 55.74914682470368 56.24913061252374
-190.292 169.4375534967527 170.33169932175272 55.74914682470368 56.24913061252374
-191.292 170.33169932175272 171.2258451467527 55.74914682470368 56.24913061252374
-192.292 171.2258451467527 172.11999097170272 55.74914682470368 56.24913061252374
-193.292 172.11999097170272 173.02847470106562 55.74914682470368 56.24913061252374
-218.292 194.4592986919398 195.3677824213527 55.74914682470368 56.24913061252374
-219.292 195.3677824213527 196.26192824635268 55.74914682470368 56.24913061252374
-220.292 196.26192824635268 197.1560740713027 55.74914682470368 56.24913061252374
-221.292 197.1560740713027 198.0502198962527 55.74914682470368 56.24913061252374
-222.292 198.0502198962527 198.9443657212527 55.74914682470368 56.24913061252374
-223.292 198.9443657212527 199.8385115462527 55.74914682470368 56.24913061252374
-224.292 199.8385115462527 200.73265737125269 55.74914682470368 56.24913061252374
-225.292 200.73265737125269 201.6268031962527 55.74914682470368 56.24913061252374
-226.292 201.6268031962527 202.5209490212527 55.74914682470368 56.24913061252374
-227.292 202.5209490212527 203.4150948462027 55.74914682470368 56.24913061252374
-228.292 203.4150948462027 204.30924067115268 55.74914682470368 56.24913061252374
-229.292 204.30924067115268 205.2033864961527 55.74914682470368 56.24913061252374
-230.292 205.2033864961527 206.0975323211527 55.74914682470368 56.24913061252374
-231.292 206.0975323211527 206.99167814615268 55.74914682470368 56.24913061252374
-232.292 206.99167814615268 207.88582397115272 55.74914682470368 56.24913061252374
-233.292 207.88582397115272 208.7799697961527 55.74914682470368 56.24913061252374
-234.292 208.7799697961527 209.67411562110271 55.74914682470368 56.24913061252374
-235.292 209.67411562110271 210.5682614460527 55.74914682470368 56.24913061252374
-236.292 210.5682614460527 211.4624072710527 55.74914682470368 56.24913061252374
-237.292 211.4624072710527 212.35655309605272 55.74914682470368 56.24913061252374
-238.292 212.35655309605272 213.25069892105267 55.74914682470368 56.24913061252374
-239.292 213.25069892105267 214.14484474605268 55.74914682470368 56.24913061252374
-240.292 214.14484474605268 215.0389905710527 55.74914682470368 56.24913061252374
-241.292 215.0389905710527 215.9331363960027 55.74914682470368 56.24913061252374
-242.292 215.9331363960027 216.82728222095272 55.74914682470368 56.24913061252374
-243.292 216.82728222095272 217.7214280459527 55.74914682470368 56.24913061252374
-244.292 217.7214280459527 218.6155738709527 55.74914682470368 56.24913061252374
-245.292 218.6155738709527 219.5097196959527 55.74914682470368 56.24913061252374
-246.292 219.5097196959527 220.4038655209527 55.74914682470368 56.24913061252374
-247.292 220.4038655209527 221.2980113459527 55.74914682470368 56.24913061252374
-248.292 221.2980113459527 222.1921571709027 55.74914682470368 56.24913061252374
-249.292 222.1921571709027 223.0863029958527 55.74914682470368 56.24913061252374
-250.292 223.0863029958527 223.9804488208527 55.74914682470368 56.24913061252374
-251.292 223.9804488208527 224.8745946458527 55.74914682470368 56.24913061252374
-252.292 224.8745946458527 225.76874047085272 55.74914682470368 56.24913061252374
-253.292 225.76874047085272 226.66288629585267 55.74914682470368 56.24913061252374
-254.292 226.66288629585267 227.55703212085268 55.74914682470368 56.24913061252374
-255.292 227.55703212085268 228.4511779458027 55.74914682470368 56.24913061252374
-256.292 228.4511779458027 229.3453237707527 55.74914682470368 56.24913061252374
-257.292 229.3453237707527 230.23946959575272 55.74914682470368 56.24913061252374
-258.292 230.23946959575272 231.13361542075273 55.74914682470368 56.24913061252374
-259.292 231.13361542075273 232.02776124575269 55.74914682470368 56.24913061252374
-260.292 232.02776124575269 232.92190707075272 55.74914682470368 56.24913061252374
-261.292 232.92190707075272 233.83039080016562 55.74914682470368 56.24913061252374
-272.292 242.74317324113977 243.6516569705527 55.74914682470368 56.24913061252374
-273.292 243.6516569705527 244.5458027955527 55.74914682470368 56.24913061252374
-274.292 244.5458027955527 245.4399486205527 55.74914682470368 56.24913061252374
-275.292 245.4399486205527 246.3340944455527 55.74914682470368 56.24913061252374
-276.292 246.3340944455527 247.2282402705027 55.74914682470368 56.24913061252374
-277.292 247.2282402705027 248.1223860954527 55.74914682470368 56.24913061252374
-278.292 248.1223860954527 249.0165319204527 55.74914682470368 56.24913061252374
-279.292 249.0165319204527 249.9106777454527 55.74914682470368 56.24913061252374
-280.292 249.9106777454527 250.8048235704527 55.74914682470368 56.24913061252374
-281.292 250.8048235704527 251.6989693954527 55.74914682470368 56.24913061252374
-282.292 251.6989693954527 252.5931152204527 55.74914682470368 56.24913061252374
-283.292 252.5931152204527 253.48726104540273 55.74914682470368 56.24913061252374
-284.292 253.48726104540273 254.3814068703527 55.74914682470368 56.24913061252374
-285.292 254.3814068703527 255.2755526953527 55.74914682470368 56.24913061252374
-286.292 255.2755526953527 256.16969852035265 55.74914682470368 56.24913061252374
-287.292 256.16969852035265 257.0638443453527 55.74914682470368 56.24913061252374
-288.292 257.0638443453527 257.9579901703527 55.74914682470368 56.24913061252374
-289.292 257.9579901703527 258.8521359953527 55.74914682470368 56.24913061252374
-290.292 258.8521359953527 259.7462818203027 55.74914682470368 56.24913061252374
-291.292 259.7462818203027 260.6404276452527 55.74914682470368 56.24913061252374
-292.292 260.6404276452527 261.5489113746656 55.74914682470368 56.24913061252374
-303.292 270.46169381573975 271.37017754515267 55.74914682470368 56.24913061252374
-304.292 271.37017754515267 272.2643233701027 55.74914682470368 56.24913061252374
-305.292 272.2643233701027 273.1584691950527 55.74914682470368 56.24913061252374
-306.292 273.1584691950527 274.0526150200527 55.74914682470368 56.24913061252374
-307.292 274.0526150200527 274.94676084505267 55.74914682470368 56.24913061252374
-308.292 274.94676084505267 275.84090667005273 55.74914682470368 56.24913061252374
-309.292 275.84090667005273 276.7350524950527 55.74914682470368 56.24913061252374
-310.292 276.7350524950527 277.6291983200527 55.74914682470368 56.24913061252374
-311.292 277.6291983200527 278.52334414500274 55.74914682470368 56.24913061252374
-312.292 278.52334414500274 279.4318278743656 55.74914682470368 56.24913061252374
-117.293 105.51970287712075 106.44013032281848 56.24913061252374 56.74911397127674
-118.293 106.44013032281848 107.34603083921846 56.24913061252374 56.74911397127674
-119.293 107.34603083921846 108.25193135561847 56.24913061252374 56.74911397127674
-120.293 108.25193135561847 109.15783187196845 56.24913061252374 56.74911397127674
-121.293 109.15783187196845 110.06373238831847 56.24913061252374 56.74911397127674
-122.293 110.06373238831847 110.96963290471847 56.24913061252374 56.74911397127674
-123.293 110.96963290471847 111.87553342111846 56.24913061252374 56.74911397127674
-124.293 111.87553342111846 112.78143393746846 56.24913061252374 56.74911397127674
-125.293 112.78143393746846 113.68733445381847 56.24913061252374 56.74911397127674
-126.293 113.68733445381847 114.59323497021846 56.24913061252374 56.74911397127674
-127.293 114.59323497021846 115.49913548656846 56.24913061252374 56.74911397127674
-128.293 115.49913548656846 116.40503600291846 56.24913061252374 56.74911397127674
-129.293 116.40503600291846 117.31093651931846 56.24913061252374 56.74911397127674
-130.293 117.31093651931846 118.21683703571847 56.24913061252374 56.74911397127674
-131.293 118.21683703571847 119.12273755206846 56.24913061252374 56.74911397127674
-132.293 119.12273755206846 120.02863806841847 56.24913061252374 56.74911397127674
-133.293 120.02863806841847 120.93453858481845 56.24913061252374 56.74911397127674
-134.293 120.93453858481845 121.84043910121846 56.24913061252374 56.74911397127674
-135.293 121.84043910121846 122.74633961756845 56.24913061252374 56.74911397127674
-136.293 122.74633961756845 123.65224013391847 56.24913061252374 56.74911397127674
-137.293 123.65224013391847 124.55814065031845 56.24913061252374 56.74911397127674
-138.293 124.55814065031845 125.46404116671846 56.24913061252374 56.74911397127674
-139.293 125.46404116671846 126.36994168306846 56.24913061252374 56.74911397127674
-140.293 126.36994168306846 127.27584219941846 56.24913061252374 56.74911397127674
-141.293 127.27584219941846 128.18174271581847 56.24913061252374 56.74911397127674
-142.293 128.18174271581847 129.08764323221845 56.24913061252374 56.74911397127674
-143.293 129.08764323221845 129.99354374856847 56.24913061252374 56.74911397127674
-144.293 129.99354374856847 130.8994442649185 56.24913061252374 56.74911397127674
-145.293 130.8994442649185 131.80534478131847 56.24913061252374 56.74911397127674
-146.293 131.80534478131847 132.72577222701614 56.24913061252374 56.74911397127674
-175.293 158.0619328268208 158.98236027251846 56.24913061252374 56.74911397127674
-176.293 158.98236027251846 159.88826078891847 56.24913061252374 56.74911397127674
-177.293 159.88826078891847 160.79416130526846 56.24913061252374 56.74911397127674
-178.293 160.79416130526846 161.70006182161848 56.24913061252374 56.74911397127674
-179.293 161.70006182161848 162.60596233801846 56.24913061252374 56.74911397127674
-180.293 162.60596233801846 163.51186285441844 56.24913061252374 56.74911397127674
-181.293 163.51186285441844 164.41776337076845 56.24913061252374 56.74911397127674
-182.293 164.41776337076845 165.32366388711847 56.24913061252374 56.74911397127674
-183.293 165.32366388711847 166.22956440351845 56.24913061252374 56.74911397127674
-184.293 166.22956440351845 167.1354649199185 56.24913061252374 56.74911397127674
-185.293 167.1354649199185 168.04136543626845 56.24913061252374 56.74911397127674
-186.293 168.04136543626845 168.94726595261847 56.24913061252374 56.74911397127674
-187.293 168.94726595261847 169.85316646901848 56.24913061252374 56.74911397127674
-188.293 169.85316646901848 170.75906698541846 56.24913061252374 56.74911397127674
-189.293 170.75906698541846 171.66496750176844 56.24913061252374 56.74911397127674
-190.293 171.66496750176844 172.58539494741615 56.24913061252374 56.74911397127674
-216.293 195.20385399812076 196.12428144381846 56.24913061252374 56.74911397127674
-217.293 196.12428144381846 197.03018196021844 56.24913061252374 56.74911397127674
-218.293 197.03018196021844 197.93608247661845 56.24913061252374 56.74911397127674
-219.293 197.93608247661845 198.84198299296844 56.24913061252374 56.74911397127674
-220.293 198.84198299296844 199.74788350931846 56.24913061252374 56.74911397127674
-221.293 199.74788350931846 200.65378402571847 56.24913061252374 56.74911397127674
-222.293 200.65378402571847 201.55968454211848 56.24913061252374 56.74911397127674
-223.293 201.55968454211848 202.46558505846846 56.24913061252374 56.74911397127674
-224.293 202.46558505846846 203.37148557481845 56.24913061252374 56.74911397127674
-225.293 203.37148557481845 204.27738609121843 56.24913061252374 56.74911397127674
-226.293 204.27738609121843 205.18328660761844 56.24913061252374 56.74911397127674
-227.293 205.18328660761844 206.08918712396846 56.24913061252374 56.74911397127674
-228.293 206.08918712396846 206.99508764031845 56.24913061252374 56.74911397127674
-229.293 206.99508764031845 207.90098815671848 56.24913061252374 56.74911397127674
-230.293 207.90098815671848 208.80688867311846 56.24913061252374 56.74911397127674
-231.293 208.80688867311846 209.71278918946842 56.24913061252374 56.74911397127674
-232.293 209.71278918946842 210.61868970581844 56.24913061252374 56.74911397127674
-233.293 210.61868970581844 211.52459022221845 56.24913061252374 56.74911397127674
-234.293 211.52459022221845 212.43049073856844 56.24913061252374 56.74911397127674
-235.293 212.43049073856844 213.33639125491845 56.24913061252374 56.74911397127674
-236.293 213.33639125491845 214.24229177131843 56.24913061252374 56.74911397127674
-237.293 214.24229177131843 215.14819228771844 56.24913061252374 56.74911397127674
-238.293 215.14819228771844 216.05409280406843 56.24913061252374 56.74911397127674
-239.293 216.05409280406843 216.95999332041845 56.24913061252374 56.74911397127674
-240.293 216.95999332041845 217.86589383681843 56.24913061252374 56.74911397127674
-241.293 217.86589383681843 218.77179435321844 56.24913061252374 56.74911397127674
-242.293 218.77179435321844 219.67769486956846 56.24913061252374 56.74911397127674
-243.293 219.67769486956846 220.58359538591844 56.24913061252374 56.74911397127674
-244.293 220.58359538591844 221.48949590231848 56.24913061252374 56.74911397127674
-245.293 221.48949590231848 222.39539641871846 56.24913061252374 56.74911397127674
-246.293 222.39539641871846 223.30129693506842 56.24913061252374 56.74911397127674
-247.293 223.30129693506842 224.20719745141844 56.24913061252374 56.74911397127674
-248.293 224.20719745141844 225.11309796781842 56.24913061252374 56.74911397127674
-249.293 225.11309796781842 226.01899848421846 56.24913061252374 56.74911397127674
-250.293 226.01899848421846 226.92489900056847 56.24913061252374 56.74911397127674
-251.293 226.92489900056847 227.83079951691846 56.24913061252374 56.74911397127674
-252.293 227.83079951691846 228.73670003331847 56.24913061252374 56.74911397127674
-253.293 228.73670003331847 229.64260054966846 56.24913061252374 56.74911397127674
-254.293 229.64260054966846 230.54850106601845 56.24913061252374 56.74911397127674
-255.293 230.54850106601845 231.45440158241846 56.24913061252374 56.74911397127674
-256.293 231.45440158241846 232.36030209881844 56.24913061252374 56.74911397127674
-257.293 232.36030209881844 233.26620261516842 56.24913061252374 56.74911397127674
-258.293 233.26620261516842 234.17210313151844 56.24913061252374 56.74911397127674
-259.293 234.17210313151844 235.09253057721614 56.24913061252374 56.74911397127674
-269.293 243.21658136602076 244.13700881166847 56.24913061252374 56.74911397127674
-270.293 244.13700881166847 245.04290932801848 56.24913061252374 56.74911397127674
-271.293 245.04290932801848 245.94880984441846 56.24913061252374 56.74911397127674
-272.293 245.94880984441846 246.85471036081844 56.24913061252374 56.74911397127674
-273.293 246.85471036081844 247.76061087716846 56.24913061252374 56.74911397127674
-274.293 247.76061087716846 248.66651139351842 56.24913061252374 56.74911397127674
-275.293 248.66651139351842 249.57241190991846 56.24913061252374 56.74911397127674
-276.293 249.57241190991846 250.47831242626847 56.24913061252374 56.74911397127674
-277.293 250.47831242626847 251.38421294261846 56.24913061252374 56.74911397127674
-278.293 251.38421294261846 252.29011345901844 56.24913061252374 56.74911397127674
-279.293 252.29011345901844 253.19601397541845 56.24913061252374 56.74911397127674
-280.293 253.19601397541845 254.10191449176847 56.24913061252374 56.74911397127674
-281.293 254.10191449176847 255.00781500811843 56.24913061252374 56.74911397127674
-282.293 255.00781500811843 255.91371552451847 56.24913061252374 56.74911397127674
-283.293 255.91371552451847 256.81961604091845 56.24913061252374 56.74911397127674
-284.293 256.81961604091845 257.72551655726846 56.24913061252374 56.74911397127674
-285.293 257.72551655726846 258.6314170736184 56.24913061252374 56.74911397127674
-286.293 258.6314170736184 259.53731759001846 56.24913061252374 56.74911397127674
-287.293 259.53731759001846 260.44321810641844 56.24913061252374 56.74911397127674
-288.293 260.44321810641844 261.3636455521161 56.24913061252374 56.74911397127674
-299.293 270.39359685722076 271.31402430286846 56.24913061252374 56.74911397127674
-300.293 271.31402430286846 272.2199248192185 56.24913061252374 56.74911397127674
-301.293 272.2199248192185 273.12582533561846 56.24913061252374 56.74911397127674
-302.293 273.12582533561846 274.03172585201844 56.24913061252374 56.74911397127674
-303.293 274.03172585201844 274.93762636836846 56.24913061252374 56.74911397127674
-304.293 274.93762636836846 275.8435268847184 56.24913061252374 56.74911397127674
-305.293 275.8435268847184 276.74942740111845 56.24913061252374 56.74911397127674
-306.293 276.74942740111845 277.6553279175185 56.24913061252374 56.74911397127674
-307.293 277.6553279175185 278.56122843386845 56.24913061252374 56.74911397127674
-308.293 278.56122843386845 279.46712895021847 56.24913061252374 56.74911397127674
-309.293 279.46712895021847 280.3875563959162 56.24913061252374 56.74911397127674
-116.294 106.0155239488704 106.94828532983493 56.74911397127674 57.24909688106352
-117.294 106.94828532983493 107.86632455923493 56.74911397127674 57.24909688106352
-118.294 107.86632455923493 108.78436378863492 56.74911397127674 57.24909688106352
-119.294 108.78436378863492 109.70240301803494 56.74911397127674 57.24909688106352
-120.294 109.70240301803494 110.62044224743494 56.74911397127674 57.24909688106352
-121.294 110.62044224743494 111.53848147683493 56.74911397127674 57.24909688106352
-122.294 111.53848147683493 112.45652070623493 56.74911397127674 57.24909688106352
-123.294 112.45652070623493 113.37455993563492 56.74911397127674 57.24909688106352
-124.294 113.37455993563492 114.29259916498494 56.74911397127674 57.24909688106352
-125.294 114.29259916498494 115.21063839433492 56.74911397127674 57.24909688106352
-126.294 115.21063839433492 116.12867762373493 56.74911397127674 57.24909688106352
-127.294 116.12867762373493 117.04671685313492 56.74911397127674 57.24909688106352
-128.294 117.04671685313492 117.96475608253493 56.74911397127674 57.24909688106352
-129.294 117.96475608253493 118.88279531193493 56.74911397127674 57.24909688106352
-130.294 118.88279531193493 119.80083454133492 56.74911397127674 57.24909688106352
-131.294 119.80083454133492 120.71887377073493 56.74911397127674 57.24909688106352
-132.294 120.71887377073493 121.63691300008495 56.74911397127674 57.24909688106352
-133.294 121.63691300008495 122.55495222943493 56.74911397127674 57.24909688106352
-134.294 122.55495222943493 123.47299145883494 56.74911397127674 57.24909688106352
-135.294 123.47299145883494 124.39103068823493 56.74911397127674 57.24909688106352
-136.294 124.39103068823493 125.30906991763493 56.74911397127674 57.24909688106352
-137.294 125.30906991763493 126.22710914703494 56.74911397127674 57.24909688106352
-138.294 126.22710914703494 127.14514837643493 56.74911397127674 57.24909688106352
-139.294 127.14514837643493 128.06318760583494 56.74911397127674 57.24909688106352
-140.294 128.06318760583494 128.98122683523493 56.74911397127674 57.24909688106352
-141.294 128.98122683523493 129.89926606458494 56.74911397127674 57.24909688106352
-142.294 129.89926606458494 130.81730529393494 56.74911397127674 57.24909688106352
-143.294 130.81730529393494 131.73534452333493 56.74911397127674 57.24909688106352
-144.294 131.73534452333493 132.65338375273495 56.74911397127674 57.24909688106352
-145.294 132.65338375273495 133.58614513369946 56.74911397127674 57.24909688106352
-173.294 158.34376002407038 159.27652140503494 56.74911397127674 57.24909688106352
-174.294 159.27652140503494 160.19456063443494 56.74911397127674 57.24909688106352
-175.294 160.19456063443494 161.11259986378494 56.74911397127674 57.24909688106352
-176.294 161.11259986378494 162.03063909313494 56.74911397127674 57.24909688106352
-177.294 162.03063909313494 162.94867832253493 56.74911397127674 57.24909688106352
-178.294 162.94867832253493 163.86671755193493 56.74911397127674 57.24909688106352
-179.294 163.86671755193493 164.78475678133492 56.74911397127674 57.24909688106352
-180.294 164.78475678133492 165.70279601073491 56.74911397127674 57.24909688106352
-181.294 165.70279601073491 166.62083524013494 56.74911397127674 57.24909688106352
-182.294 166.62083524013494 167.53887446953493 56.74911397127674 57.24909688106352
-183.294 167.53887446953493 168.45691369893495 56.74911397127674 57.24909688106352
-184.294 168.45691369893495 169.37495292828493 56.74911397127674 57.24909688106352
-185.294 169.37495292828493 170.29299215763496 56.74911397127674 57.24909688106352
-186.294 170.29299215763496 171.21103138703492 56.74911397127674 57.24909688106352
-187.294 171.21103138703492 172.14379276799946 56.74911397127674 57.24909688106352
-213.294 195.06532919957039 195.99809058053492 56.74911397127674 57.24909688106352
-214.294 195.99809058053492 196.9161298099349 56.74911397127674 57.24909688106352
-215.294 196.9161298099349 197.83416903933494 56.74911397127674 57.24909688106352
-216.294 197.83416903933494 198.75220826873493 56.74911397127674 57.24909688106352
-217.294 198.75220826873493 199.67024749813493 56.74911397127674 57.24909688106352
-218.294 199.67024749813493 200.58828672748493 56.74911397127674 57.24909688106352
-219.294 200.58828672748493 201.50632595683493 56.74911397127674 57.24909688106352
-220.294 201.50632595683493 202.42436518623492 56.74911397127674 57.24909688106352
-221.294 202.42436518623492 203.34240441563492 56.74911397127674 57.24909688106352
-222.294 203.34240441563492 204.2604436450349 56.74911397127674 57.24909688106352
-223.294 204.2604436450349 205.17848287443496 56.74911397127674 57.24909688106352
-224.294 205.17848287443496 206.0965221038349 56.74911397127674 57.24909688106352
-225.294 206.0965221038349 207.0145613332349 56.74911397127674 57.24909688106352
-226.294 207.0145613332349 207.9326005626349 56.74911397127674 57.24909688106352
-227.294 207.9326005626349 208.85063979198492 56.74911397127674 57.24909688106352
-228.294 208.85063979198492 209.76867902133492 56.74911397127674 57.24909688106352
-229.294 209.76867902133492 210.68671825073494 56.74911397127674 57.24909688106352
-230.294 210.68671825073494 211.60475748013494 56.74911397127674 57.24909688106352
-231.294 211.60475748013494 212.52279670953493 56.74911397127674 57.24909688106352
-232.294 212.52279670953493 213.4408359389349 56.74911397127674 57.24909688106352
-233.294 213.4408359389349 214.35887516833492 56.74911397127674 57.24909688106352
-234.294 214.35887516833492 215.2769143977349 56.74911397127674 57.24909688106352
-235.294 215.2769143977349 216.19495362708494 56.74911397127674 57.24909688106352
-236.294 216.19495362708494 217.11299285643494 56.74911397127674 57.24909688106352
-237.294 217.11299285643494 218.0310320858349 56.74911397127674 57.24909688106352
-238.294 218.0310320858349 218.9490713152349 56.74911397127674 57.24909688106352
-239.294 218.9490713152349 219.8671105446349 56.74911397127674 57.24909688106352
-240.294 219.8671105446349 220.78514977403492 56.74911397127674 57.24909688106352
-241.294 220.78514977403492 221.70318900343494 56.74911397127674 57.24909688106352
-242.294 221.70318900343494 222.62122823283494 56.74911397127674 57.24909688106352
-243.294 222.62122823283494 223.53926746223493 56.74911397127674 57.24909688106352
-244.294 223.53926746223493 224.4573066915849 56.74911397127674 57.24909688106352
-245.294 224.4573066915849 225.37534592093493 56.74911397127674 57.24909688106352
-246.294 225.37534592093493 226.29338515033493 56.74911397127674 57.24909688106352
-247.294 226.29338515033493 227.21142437973492 56.74911397127674 57.24909688106352
-248.294 227.21142437973492 228.12946360913492 56.74911397127674 57.24909688106352
-249.294 228.12946360913492 229.0475028385349 56.74911397127674 57.24909688106352
-250.294 229.0475028385349 229.9655420679349 56.74911397127674 57.24909688106352
-251.294 229.9655420679349 230.8835812973349 56.74911397127674 57.24909688106352
-252.294 230.8835812973349 231.80162052668493 56.74911397127674 57.24909688106352
-253.294 231.80162052668493 232.71965975603493 56.74911397127674 57.24909688106352
-254.294 232.71965975603493 233.63769898543492 56.74911397127674 57.24909688106352
-255.294 233.63769898543492 234.55573821483492 56.74911397127674 57.24909688106352
-256.294 234.55573821483492 235.4737774442349 56.74911397127674 57.24909688106352
-257.294 235.4737774442349 236.4065388251995 56.74911397127674 57.24909688106352
-280.294 256.57395756857034 257.5067189495349 56.74911397127674 57.24909688106352
-281.294 257.5067189495349 258.42475817893495 56.74911397127674 57.24909688106352
-282.294 258.42475817893495 259.34279740833495 56.74911397127674 57.24909688106352
-283.294 259.34279740833495 260.26083663773494 56.74911397127674 57.24909688106352
-284.294 260.26083663773494 261.1935980186995 56.74911397127674 57.24909688106352
-295.294 270.3445460094704 271.277307390385 56.74911397127674 57.24909688106352
-296.294 271.277307390385 272.1953466197349 56.74911397127674 57.24909688106352
-297.294 272.1953466197349 273.11338584913494 56.74911397127674 57.24909688106352
-298.294 273.11338584913494 274.03142507853494 56.74911397127674 57.24909688106352
-299.294 274.03142507853494 274.94946430793493 56.74911397127674 57.24909688106352
-300.294 274.94946430793493 275.8675035373349 56.74911397127674 57.24909688106352
-301.294 275.8675035373349 276.7855427667349 56.74911397127674 57.24909688106352
-302.294 276.7855427667349 277.7035819961349 56.74911397127674 57.24909688106352
-303.294 277.7035819961349 278.6216212255349 56.74911397127674 57.24909688106352
-304.294 278.6216212255349 279.5396604548849 56.74911397127674 57.24909688106352
-305.294 279.5396604548849 280.4724218357995 56.74911397127674 57.24909688106352
-114.295 105.60245495891549 106.54795831297263 57.24909688106352 57.74907932075594
-115.295 106.54795831297263 107.47853781132262 57.24909688106352 57.74907932075594
-116.295 107.47853781132262 108.40911730967264 57.24909688106352 57.74907932075594
-117.295 108.40911730967264 109.33969680802264 57.24909688106352 57.74907932075594
-118.295 109.33969680802264 110.27027630637262 57.24909688106352 57.74907932075594
-119.295 110.27027630637262 111.20085580472264 57.24909688106352 57.74907932075594
-120.295 111.20085580472264 112.13143530307264 57.24909688106352 57.74907932075594
-121.295 112.13143530307264 113.06201480142263 57.24909688106352 57.74907932075594
-122.295 113.06201480142263 113.99259429977263 57.24909688106352 57.74907932075594
-123.295 113.99259429977263 114.92317379812263 57.24909688106352 57.74907932075594
-124.295 114.92317379812263 115.85375329647263 57.24909688106352 57.74907932075594
-125.295 115.85375329647263 116.78433279482263 57.24909688106352 57.74907932075594
-126.295 116.78433279482263 117.71491229317263 57.24909688106352 57.74907932075594
-127.295 117.71491229317263 118.64549179152263 57.24909688106352 57.74907932075594
-128.295 118.64549179152263 119.57607128987263 57.24909688106352 57.74907932075594
-129.295 119.57607128987263 120.50665078822263 57.24909688106352 57.74907932075594
-130.295 120.50665078822263 121.43723028657264 57.24909688106352 57.74907932075594
-131.295 121.43723028657264 122.36780978492263 57.24909688106352 57.74907932075594
-132.295 122.36780978492263 123.29838928327263 57.24909688106352 57.74907932075594
-133.295 123.29838928327263 124.22896878162263 57.24909688106352 57.74907932075594
-134.295 124.22896878162263 125.15954827997263 57.24909688106352 57.74907932075594
-135.295 125.15954827997263 126.09012777832262 57.24909688106352 57.74907932075594
-136.295 126.09012777832262 127.02070727667262 57.24909688106352 57.74907932075594
-137.295 127.02070727667262 127.95128677502262 57.24909688106352 57.74907932075594
-138.295 127.95128677502262 128.88186627337262 57.24909688106352 57.74907932075594
-139.295 128.88186627337262 129.81244577177262 57.24909688106352 57.74907932075594
-140.295 129.81244577177262 130.74302527012264 57.24909688106352 57.74907932075594
-141.295 130.74302527012264 131.67360476847261 57.24909688106352 57.74907932075594
-142.295 131.67360476847261 132.60418426682264 57.24909688106352 57.74907932075594
-143.295 132.60418426682264 133.54968762082976 57.24909688106352 57.74907932075594
-211.295 195.8686662990155 196.8141696530726 57.24909688106352 57.74907932075594
-212.295 196.8141696530726 197.74474915142264 57.24909688106352 57.74907932075594
-213.295 197.74474915142264 198.6753286497726 57.24909688106352 57.74907932075594
-214.295 198.6753286497726 199.60590814812264 57.24909688106352 57.74907932075594
-215.295 199.60590814812264 200.5364876464726 57.24909688106352 57.74907932075594
-216.295 200.5364876464726 201.46706714482264 57.24909688106352 57.74907932075594
-217.295 201.46706714482264 202.3976466431726 57.24909688106352 57.74907932075594
-218.295 202.3976466431726 203.32822614152263 57.24909688106352 57.74907932075594
-219.295 203.32822614152263 204.2588056398726 57.24909688106352 57.74907932075594
-220.295 204.2588056398726 205.18938513822263 57.24909688106352 57.74907932075594
-221.295 205.18938513822263 206.1199646365726 57.24909688106352 57.74907932075594
-222.295 206.1199646365726 207.05054413492263 57.24909688106352 57.74907932075594
-223.295 207.05054413492263 207.9811236332726 57.24909688106352 57.74907932075594
-224.295 207.9811236332726 208.9117031316726 57.24909688106352 57.74907932075594
-225.295 208.9117031316726 209.84228263002262 57.24909688106352 57.74907932075594
-226.295 209.84228263002262 210.7728621283726 57.24909688106352 57.74907932075594
-227.295 210.7728621283726 211.70344162672262 57.24909688106352 57.74907932075594
-228.295 211.70344162672262 212.63402112507262 57.24909688106352 57.74907932075594
-229.295 212.63402112507262 213.56460062342262 57.24909688106352 57.74907932075594
-230.295 213.56460062342262 214.49518012177262 57.24909688106352 57.74907932075594
-231.295 214.49518012177262 215.42575962012262 57.24909688106352 57.74907932075594
-232.295 215.42575962012262 216.35633911847262 57.24909688106352 57.74907932075594
-233.295 216.35633911847262 217.28691861682262 57.24909688106352 57.74907932075594
-234.295 217.28691861682262 218.21749811517262 57.24909688106352 57.74907932075594
-235.295 218.21749811517262 219.14807761352262 57.24909688106352 57.74907932075594
-236.295 219.14807761352262 220.07865711187262 57.24909688106352 57.74907932075594
-237.295 220.07865711187262 221.00923661022262 57.24909688106352 57.74907932075594
-238.295 221.00923661022262 221.93981610857264 57.24909688106352 57.74907932075594
-239.295 221.93981610857264 222.8703956069226 57.24909688106352 57.74907932075594
-240.295 222.8703956069226 223.80097510527264 57.24909688106352 57.74907932075594
-241.295 223.80097510527264 224.7315546036226 57.24909688106352 57.74907932075594
-242.295 224.7315546036226 225.66213410197264 57.24909688106352 57.74907932075594
-243.295 225.66213410197264 226.5927136003226 57.24909688106352 57.74907932075594
-244.295 226.5927136003226 227.52329309867264 57.24909688106352 57.74907932075594
-245.295 227.52329309867264 228.4538725970226 57.24909688106352 57.74907932075594
-246.295 228.4538725970226 229.38445209537264 57.24909688106352 57.74907932075594
-247.295 229.38445209537264 230.31503159372264 57.24909688106352 57.74907932075594
-248.295 230.31503159372264 231.24561109207264 57.24909688106352 57.74907932075594
-249.295 231.24561109207264 232.1761905904226 57.24909688106352 57.74907932075594
-250.295 232.1761905904226 233.10677008877263 57.24909688106352 57.74907932075594
-251.295 233.10677008877263 234.0373495871726 57.24909688106352 57.74907932075594
-252.295 234.0373495871726 234.9679290855226 57.24909688106352 57.74907932075594
-253.295 234.9679290855226 235.89850858387263 57.24909688106352 57.74907932075594
-254.295 235.89850858387263 236.8290880822226 57.24909688106352 57.74907932075594
-255.295 236.8290880822226 237.77459143622974 57.24909688106352 57.74907932075594
-268.295 248.9116977051155 249.8572010591226 57.24909688106352 57.74907932075594
-269.295 249.8572010591226 250.78778055747262 57.24909688106352 57.74907932075594
-270.295 250.78778055747262 251.71836005582261 57.24909688106352 57.74907932075594
-271.295 251.71836005582261 252.6489395541726 57.24909688106352 57.74907932075594
-272.295 252.6489395541726 253.5795190525226 57.24909688106352 57.74907932075594
-273.295 253.5795190525226 254.51009855087264 57.24909688106352 57.74907932075594
-274.295 254.51009855087264 255.44067804922264 57.24909688106352 57.74907932075594
-275.295 255.44067804922264 256.3712575475726 57.24909688106352 57.74907932075594
-276.295 256.3712575475726 257.3018370459226 57.24909688106352 57.74907932075594
-277.295 257.3018370459226 258.2324165442726 57.24909688106352 57.74907932075594
-278.295 258.2324165442726 259.1629960426226 57.24909688106352 57.74907932075594
-279.295 259.1629960426226 260.1084993966297 57.24909688106352 57.74907932075594
-292.295 271.24560566551554 272.19110901957265 57.24909688106352 57.74907932075594
-293.295 272.19110901957265 273.1216885179226 57.24909688106352 57.74907932075594
-294.295 273.1216885179226 274.0522680162726 57.24909688106352 57.74907932075594
-295.295 274.0522680162726 274.9828475146227 57.24909688106352 57.74907932075594
-296.295 274.9828475146227 275.91342701297265 57.24909688106352 57.74907932075594
-297.295 275.91342701297265 276.8440065113226 57.24909688106352 57.74907932075594
-298.295 276.8440065113226 277.7745860096726 57.24909688106352 57.74907932075594
-299.295 277.7745860096726 278.7051655080226 57.24909688106352 57.74907932075594
-300.295 278.7051655080226 279.63574500637264 57.24909688106352 57.74907932075594
-301.295 279.63574500637264 280.58124836042975 57.24909688106352 57.74907932075594
-113.296 106.12960414483183 107.0882764463197 57.74907932075594 58.249061267900046
-114.296 107.0882764463197 108.03181640371969 57.74907932075594 58.249061267900046
-115.296 108.03181640371969 108.97535636111971 57.74907932075594 58.249061267900046
-116.296 108.97535636111971 109.9188963185197 57.74907932075594 58.249061267900046
-117.296 109.9188963185197 110.86243627591969 57.74907932075594 58.249061267900046
-118.296 110.86243627591969 111.80597623331968 57.74907932075594 58.249061267900046
-119.296 111.80597623331968 112.7495161907197 57.74907932075594 58.249061267900046
-120.296 112.7495161907197 113.6930561481197 57.74907932075594 58.249061267900046
-121.296 113.6930561481197 114.63659610551969 57.74907932075594 58.249061267900046
-122.296 114.63659610551969 115.58013606291969 57.74907932075594 58.249061267900046
-123.296 115.58013606291969 116.52367602031967 57.74907932075594 58.249061267900046
-124.296 116.52367602031967 117.46721597771969 57.74907932075594 58.249061267900046
-125.296 117.46721597771969 118.4107559351197 57.74907932075594 58.249061267900046
-126.296 118.4107559351197 119.35429589251969 57.74907932075594 58.249061267900046
-127.296 119.35429589251969 120.2978358499197 57.74907932075594 58.249061267900046
-128.296 120.2978358499197 121.24137580731968 57.74907932075594 58.249061267900046
-129.296 121.24137580731968 122.1849157647197 57.74907932075594 58.249061267900046
-130.296 122.1849157647197 123.12845572211971 57.74907932075594 58.249061267900046
-131.296 123.12845572211971 124.0719956795197 57.74907932075594 58.249061267900046
-132.296 124.0719956795197 125.01553563691971 57.74907932075594 58.249061267900046
-133.296 125.01553563691971 125.9590755943197 57.74907932075594 58.249061267900046
-134.296 125.9590755943197 126.90261555171969 57.74907932075594 58.249061267900046
-135.296 126.90261555171969 127.84615550911968 57.74907932075594 58.249061267900046
-136.296 127.84615550911968 128.78969546651967 57.74907932075594 58.249061267900046
-137.296 128.78969546651967 129.7332354239197 57.74907932075594 58.249061267900046
-138.296 129.7332354239197 130.67677538131971 57.74907932075594 58.249061267900046
-139.296 130.67677538131971 131.6203153387197 57.74907932075594 58.249061267900046
-140.296 131.6203153387197 132.5638552961197 57.74907932075594 58.249061267900046
-141.296 132.5638552961197 133.5073952535197 57.74907932075594 58.249061267900046
-142.296 133.5073952535197 134.46606755500756 57.74907932075594 58.249061267900046
-209.296 196.70944005523182 197.6681123567197 57.74907932075594 58.249061267900046
-210.296 197.6681123567197 198.61165231411968 57.74907932075594 58.249061267900046
-211.296 198.61165231411968 199.55519227151967 57.74907932075594 58.249061267900046
-212.296 199.55519227151967 200.49873222891966 57.74907932075594 58.249061267900046
-213.296 200.49873222891966 201.44227218631968 57.74907932075594 58.249061267900046
-214.296 201.44227218631968 202.3858121437197 57.74907932075594 58.249061267900046
-215.296 202.3858121437197 203.3293521011197 57.74907932075594 58.249061267900046
-216.296 203.3293521011197 204.27289205851972 57.74907932075594 58.249061267900046
-217.296 204.27289205851972 205.21643201591968 57.74907932075594 58.249061267900046
-218.296 205.21643201591968 206.15997197331967 57.74907932075594 58.249061267900046
-219.296 206.15997197331967 207.1035119307197 57.74907932075594 58.249061267900046
-220.296 207.1035119307197 208.04705188811968 57.74907932075594 58.249061267900046
-221.296 208.04705188811968 208.99059184551967 57.74907932075594 58.249061267900046
-222.296 208.99059184551967 209.9341318029197 57.74907932075594 58.249061267900046
-223.296 209.9341318029197 210.87767176031969 57.74907932075594 58.249061267900046
-224.296 210.87767176031969 211.82121171771968 57.74907932075594 58.249061267900046
-225.296 211.82121171771968 212.76475167511967 57.74907932075594 58.249061267900046
-226.296 212.76475167511967 213.7082916325197 57.74907932075594 58.249061267900046
-227.296 213.7082916325197 214.6518315899197 57.74907932075594 58.249061267900046
-228.296 214.6518315899197 215.59537154731967 57.74907932075594 58.249061267900046
-229.296 215.59537154731967 216.5389115047197 57.74907932075594 58.249061267900046
-230.296 216.5389115047197 217.48245146211968 57.74907932075594 58.249061267900046
-231.296 217.48245146211968 218.42599141951968 57.74907932075594 58.249061267900046
-232.296 218.42599141951968 219.3695313769197 57.74907932075594 58.249061267900046
-233.296 219.3695313769197 220.31307133431972 57.74907932075594 58.249061267900046
-234.296 220.31307133431972 221.25661129171968 57.74907932075594 58.249061267900046
-235.296 221.25661129171968 222.2001512491197 57.74907932075594 58.249061267900046
-236.296 222.2001512491197 223.1436912065197 57.74907932075594 58.249061267900046
-237.296 223.1436912065197 224.08723116391968 57.74907932075594 58.249061267900046
-238.296 224.08723116391968 225.03077112131967 57.74907932075594 58.249061267900046
-239.296 225.03077112131967 225.97431107871967 57.74907932075594 58.249061267900046
-240.296 225.97431107871967 226.9178510361197 57.74907932075594 58.249061267900046
-241.296 226.9178510361197 227.8613909935197 57.74907932075594 58.249061267900046
-242.296 227.8613909935197 228.8049309509197 57.74907932075594 58.249061267900046
-243.296 228.8049309509197 229.74847090831972 57.74907932075594 58.249061267900046
-244.296 229.74847090831972 230.6920108657197 57.74907932075594 58.249061267900046
-245.296 230.6920108657197 231.63555082311967 57.74907932075594 58.249061267900046
-246.296 231.63555082311967 232.5790907805197 57.74907932075594 58.249061267900046
-247.296 232.5790907805197 233.52263073791968 57.74907932075594 58.249061267900046
-248.296 233.52263073791968 234.46617069531965 57.74907932075594 58.249061267900046
-249.296 234.46617069531965 235.4097106527197 57.74907932075594 58.249061267900046
-250.296 235.4097106527197 236.3532506101197 57.74907932075594 58.249061267900046
-251.296 236.3532506101197 237.29679056751968 57.74907932075594 58.249061267900046
-252.296 237.29679056751968 238.25546286900754 57.74907932075594 58.249061267900046
-264.296 248.60413771223182 249.56281001371968 57.74907932075594 58.249061267900046
-265.296 249.56281001371968 250.50634997111968 57.74907932075594 58.249061267900046
-266.296 250.50634997111968 251.44988992851967 57.74907932075594 58.249061267900046
-267.296 251.44988992851967 252.39342988591972 57.74907932075594 58.249061267900046
-268.296 252.39342988591972 253.3369698433197 57.74907932075594 58.249061267900046
-269.296 253.3369698433197 254.28050980071967 57.74907932075594 58.249061267900046
-270.296 254.28050980071967 255.2240497581197 57.74907932075594 58.249061267900046
-271.296 255.2240497581197 256.16758971551974 57.74907932075594 58.249061267900046
-272.296 256.16758971551974 257.1111296729197 57.74907932075594 58.249061267900046
-273.296 257.1111296729197 258.05466963031967 57.74907932075594 58.249061267900046
-274.296 258.05466963031967 258.99820958771966 57.74907932075594 58.249061267900046
-275.296 258.99820958771966 259.9417495451197 57.74907932075594 58.249061267900046
-276.296 259.9417495451197 260.9004218466076 57.74907932075594 58.249061267900046
-288.296 271.24909668983184 272.2077689913197 57.74907932075594 58.249061267900046
-289.296 272.2077689913197 273.1513089487197 57.74907932075594 58.249061267900046
-290.296 273.1513089487197 274.0948489061197 57.74907932075594 58.249061267900046
-291.296 274.0948489061197 275.0383888635197 57.74907932075594 58.249061267900046
-292.296 275.0383888635197 275.98192882091973 57.74907932075594 58.249061267900046
-293.296 275.98192882091973 276.92546877831967 57.74907932075594 58.249061267900046
-294.296 276.92546877831967 277.86900873571966 57.74907932075594 58.249061267900046
-295.296 277.86900873571966 278.81254869311965 57.74907932075594 58.249061267900046
-296.296 278.81254869311965 279.7712209946076 57.74907932075594 58.249061267900046
-112.297 106.67988111856123 107.65216948490239 58.249061267900046 58.749042698610026
-113.297 107.65216948490239 108.60910991265239 58.249061267900046 58.749042698610026
-114.297 108.60910991265239 109.56605034040238 58.249061267900046 58.749042698610026
-115.297 109.56605034040238 110.52299076810239 58.249061267900046 58.749042698610026
-116.297 110.52299076810239 111.47993119580238 58.249061267900046 58.749042698610026
-117.297 111.47993119580238 112.43687162350238 58.249061267900046 58.749042698610026
-118.297 112.43687162350238 113.39381205120239 58.249061267900046 58.749042698610026
-119.297 113.39381205120239 114.35075247895239 58.249061267900046 58.749042698610026
-120.297 114.35075247895239 115.30769290670239 58.249061267900046 58.749042698610026
-121.297 115.30769290670239 116.26463333440239 58.249061267900046 58.749042698610026
-122.297 116.26463333440239 117.2215737621024 58.249061267900046 58.749042698610026
-123.297 117.2215737621024 118.1785141898024 58.249061267900046 58.749042698610026
-124.297 118.1785141898024 119.1354546175024 58.249061267900046 58.749042698610026
-125.297 119.1354546175024 120.09239504520238 58.249061267900046 58.749042698610026
-126.297 120.09239504520238 121.0493354729524 58.249061267900046 58.749042698610026
-127.297 121.0493354729524 122.00627590070238 58.249061267900046 58.749042698610026
-128.297 122.00627590070238 122.96321632840238 58.249061267900046 58.749042698610026
-129.297 122.96321632840238 123.92015675610237 58.249061267900046 58.749042698610026
-130.297 123.92015675610237 124.87709718380239 58.249061267900046 58.749042698610026
-131.297 124.87709718380239 125.8340376115024 58.249061267900046 58.749042698610026
-132.297 125.8340376115024 126.7909780392524 58.249061267900046 58.749042698610026
-133.297 126.7909780392524 127.74791846700239 58.249061267900046 58.749042698610026
-134.297 127.74791846700239 128.70485889470237 58.249061267900046 58.749042698610026
-135.297 128.70485889470237 129.66179932240237 58.249061267900046 58.749042698610026
-136.297 129.66179932240237 130.6187397501024 58.249061267900046 58.749042698610026
-137.297 130.6187397501024 131.57568017780238 58.249061267900046 58.749042698610026
-138.297 131.57568017780238 132.5326206055524 58.249061267900046 58.749042698610026
-139.297 132.5326206055524 133.4895610333024 58.249061267900046 58.749042698610026
-140.297 133.4895610333024 134.46184939964357 58.249061267900046 58.749042698610026
-206.297 196.6322813238612 197.60456969020237 58.249061267900046 58.749042698610026
-207.297 197.60456969020237 198.56151011790237 58.249061267900046 58.749042698610026
-208.297 198.56151011790237 199.51845054560238 58.249061267900046 58.749042698610026
-209.297 199.51845054560238 200.47539097330238 58.249061267900046 58.749042698610026
-210.297 200.47539097330238 201.43233140105238 58.249061267900046 58.749042698610026
-211.297 201.43233140105238 202.38927182880238 58.249061267900046 58.749042698610026
-212.297 202.38927182880238 203.34621225650238 58.249061267900046 58.749042698610026
-213.297 203.34621225650238 204.30315268420236 58.249061267900046 58.749042698610026
-214.297 204.30315268420236 205.2600931119024 58.249061267900046 58.749042698610026
-215.297 205.2600931119024 206.21703353960237 58.249061267900046 58.749042698610026
-216.297 206.21703353960237 207.17397396735237 58.249061267900046 58.749042698610026
-217.297 207.17397396735237 208.13091439510237 58.249061267900046 58.749042698610026
-218.297 208.13091439510237 209.08785482280237 58.249061267900046 58.749042698610026
-219.297 209.08785482280237 210.04479525050237 58.249061267900046 58.749042698610026
-220.297 210.04479525050237 211.00173567820238 58.249061267900046 58.749042698610026
-221.297 211.00173567820238 211.95867610590238 58.249061267900046 58.749042698610026
-222.297 211.95867610590238 212.91561653360236 58.249061267900046 58.749042698610026
-223.297 212.91561653360236 213.87255696135236 58.249061267900046 58.749042698610026
-224.297 213.87255696135236 214.82949738910241 58.249061267900046 58.749042698610026
-225.297 214.82949738910241 215.7864378168024 58.249061267900046 58.749042698610026
-226.297 215.7864378168024 216.74337824450237 58.249061267900046 58.749042698610026
-227.297 216.74337824450237 217.7003186722024 58.249061267900046 58.749042698610026
-228.297 217.7003186722024 218.6572590999024 58.249061267900046 58.749042698610026
-229.297 218.6572590999024 219.61419952765237 58.249061267900046 58.749042698610026
-230.297 219.61419952765237 220.57113995540237 58.249061267900046 58.749042698610026
-231.297 220.57113995540237 221.52808038310238 58.249061267900046 58.749042698610026
-232.297 221.52808038310238 222.48502081080238 58.249061267900046 58.749042698610026
-233.297 222.48502081080238 223.44196123850236 58.249061267900046 58.749042698610026
-234.297 223.44196123850236 224.39890166620236 58.249061267900046 58.749042698610026
-235.297 224.39890166620236 225.3558420939524 58.249061267900046 58.749042698610026
-236.297 225.3558420939524 226.3127825217024 58.249061267900046 58.749042698610026
-237.297 226.3127825217024 227.26972294940236 58.249061267900046 58.749042698610026
-238.297 227.26972294940236 228.22666337710237 58.249061267900046 58.749042698610026
-239.297 228.22666337710237 229.18360380480237 58.249061267900046 58.749042698610026
-240.297 229.18360380480237 230.1405442325024 58.249061267900046 58.749042698610026
-241.297 230.1405442325024 231.09748466020238 58.249061267900046 58.749042698610026
-242.297 231.09748466020238 232.05442508795238 58.249061267900046 58.749042698610026
-243.297 232.05442508795238 233.01136551570238 58.249061267900046 58.749042698610026
-244.297 233.01136551570238 233.96830594340238 58.249061267900046 58.749042698610026
-245.297 233.96830594340238 234.92524637110236 58.249061267900046 58.749042698610026
-246.297 234.92524637110236 235.88218679880237 58.249061267900046 58.749042698610026
-247.297 235.88218679880237 236.83912722650237 58.249061267900046 58.749042698610026
-248.297 236.83912722650237 237.7960676542524 58.249061267900046 58.749042698610026
-249.297 237.7960676542524 238.76835602064355 58.249061267900046 58.749042698610026
-260.297 248.3070644204612 249.27935278680238 58.249061267900046 58.749042698610026
-261.297 249.27935278680238 250.2362932145524 58.249061267900046 58.749042698610026
-262.297 250.2362932145524 251.1932336423024 58.249061267900046 58.749042698610026
-263.297 251.1932336423024 252.15017407000238 58.249061267900046 58.749042698610026
-264.297 252.15017407000238 253.1071144977024 58.249061267900046 58.749042698610026
-265.297 253.1071144977024 254.0640549254024 58.249061267900046 58.749042698610026
-266.297 254.0640549254024 255.02099535310236 58.249061267900046 58.749042698610026
-267.297 255.02099535310236 255.97793578080237 58.249061267900046 58.749042698610026
-268.297 255.97793578080237 256.9348762085524 58.249061267900046 58.749042698610026
-269.297 256.9348762085524 257.89181663630234 58.249061267900046 58.749042698610026
-270.297 257.89181663630234 258.84875706400237 58.249061267900046 58.749042698610026
-271.297 258.84875706400237 259.8056974917024 58.249061267900046 58.749042698610026
-272.297 259.8056974917024 260.7626379194023 58.249061267900046 58.749042698610026
-273.297 260.7626379194023 261.73492628574354 58.249061267900046 58.749042698610026
-284.297 271.27363468566125 272.2459230520024 58.249061267900046 58.749042698610026
-285.297 272.2459230520024 273.2028634797024 58.249061267900046 58.749042698610026
-286.297 273.2028634797024 274.1598039074024 58.249061267900046 58.749042698610026
-287.297 274.1598039074024 275.11674433515236 58.249061267900046 58.749042698610026
-288.297 275.11674433515236 276.07368476290236 58.249061267900046 58.749042698610026
-289.297 276.07368476290236 277.03062519060234 58.249061267900046 58.749042698610026
-290.297 277.03062519060234 277.98756561830237 58.249061267900046 58.749042698610026
-291.297 277.98756561830237 278.9445060460024 58.249061267900046 58.749042698610026
-292.297 278.9445060460024 279.9167944123435 58.249061267900046 58.749042698610026
-111.298 107.25429713022459 108.24067012556316 58.749042698610026 59.249023587451674
-112.298 108.24067012556316 109.21147213876316 58.749042698610026 59.249023587451674
-113.298 109.21147213876316 110.18227415196316 58.749042698610026 59.249023587451674
-114.298 110.18227415196316 111.15307616516316 58.749042698610026 59.249023587451674
-115.298 111.15307616516316 112.12387817836316 58.749042698610026 59.249023587451674
-116.298 112.12387817836316 113.09468019156316 58.749042698610026 59.249023587451674
-117.298 113.09468019156316 114.06548220476316 58.749042698610026 59.249023587451674
-118.298 114.06548220476316 115.03628421796316 58.749042698610026 59.249023587451674
-119.298 115.03628421796316 116.00708623116316 58.749042698610026 59.249023587451674
-120.298 116.00708623116316 116.97788824436316 58.749042698610026 59.249023587451674
-121.298 116.97788824436316 117.94869025756317 58.749042698610026 59.249023587451674
-122.298 117.94869025756317 118.91949227076317 58.749042698610026 59.249023587451674
-123.298 118.91949227076317 119.89029428396317 58.749042698610026 59.249023587451674
-124.298 119.89029428396317 120.86109629716316 58.749042698610026 59.249023587451674
-125.298 120.86109629716316 121.83189831041315 58.749042698610026 59.249023587451674
-126.298 121.83189831041315 122.80270032366316 58.749042698610026 59.249023587451674
-127.298 122.80270032366316 123.77350233686317 58.749042698610026 59.249023587451674
-128.298 123.77350233686317 124.74430435006317 58.749042698610026 59.249023587451674
-129.298 124.74430435006317 125.71510636326316 58.749042698610026 59.249023587451674
-130.298 125.71510636326316 126.68590837646316 58.749042698610026 59.249023587451674
-131.298 126.68590837646316 127.65671038966315 58.749042698610026 59.249023587451674
-132.298 127.65671038966315 128.62751240286315 58.749042698610026 59.249023587451674
-133.298 128.62751240286315 129.59831441606315 58.749042698610026 59.249023587451674
-134.298 129.59831441606315 130.56911642926315 58.749042698610026 59.249023587451674
-135.298 130.56911642926315 131.53991844246315 58.749042698610026 59.249023587451674
-136.298 131.53991844246315 132.51072045566315 58.749042698610026 59.249023587451674
-137.298 132.51072045566315 133.48152246886315 58.749042698610026 59.249023587451674
-138.298 133.48152246886315 134.46789546420172 58.749042698610026 59.249023587451674
-204.298 197.53888435832457 198.52525735366316 58.749042698610026 59.249023587451674
-205.298 198.52525735366316 199.49605936686316 58.749042698610026 59.249023587451674
-206.298 199.49605936686316 200.46686138006316 58.749042698610026 59.249023587451674
-207.298 200.46686138006316 201.43766339326316 58.749042698610026 59.249023587451674
-208.298 201.43766339326316 202.40846540646316 58.749042698610026 59.249023587451674
-209.298 202.40846540646316 203.37926741966317 58.749042698610026 59.249023587451674
-210.298 203.37926741966317 204.35006943286317 58.749042698610026 59.249023587451674
-211.298 204.35006943286317 205.32087144606314 58.749042698610026 59.249023587451674
-212.298 205.32087144606314 206.29167345926317 58.749042698610026 59.249023587451674
-213.298 206.29167345926317 207.26247547246317 58.749042698610026 59.249023587451674
-214.298 207.26247547246317 208.23327748566317 58.749042698610026 59.249023587451674
-215.298 208.23327748566317 209.20407949886317 58.749042698610026 59.249023587451674
-216.298 209.20407949886317 210.17488151206317 58.749042698610026 59.249023587451674
-217.298 210.17488151206317 211.14568352526317 58.749042698610026 59.249023587451674
-218.298 211.14568352526317 212.11648553846317 58.749042698610026 59.249023587451674
-219.298 212.11648553846317 213.08728755166317 58.749042698610026 59.249023587451674
-220.298 213.08728755166317 214.05808956486317 58.749042698610026 59.249023587451674
-221.298 214.05808956486317 215.02889157806317 58.749042698610026 59.249023587451674
-222.298 215.02889157806317 215.99969359131313 58.749042698610026 59.249023587451674
-223.298 215.99969359131313 216.97049560456315 58.749042698610026 59.249023587451674
-224.298 216.97049560456315 217.94129761776315 58.749042698610026 59.249023587451674
-225.298 217.94129761776315 218.91209963096316 58.749042698610026 59.249023587451674
-226.298 218.91209963096316 219.88290164416316 58.749042698610026 59.249023587451674
-227.298 219.88290164416316 220.85370365736316 58.749042698610026 59.249023587451674
-228.298 220.85370365736316 221.82450567056316 58.749042698610026 59.249023587451674
-229.298 221.82450567056316 222.79530768376316 58.749042698610026 59.249023587451674
-230.298 222.79530768376316 223.76610969696316 58.749042698610026 59.249023587451674
-231.298 223.76610969696316 224.73691171016316 58.749042698610026 59.249023587451674
-232.298 224.73691171016316 225.70771372336316 58.749042698610026 59.249023587451674
-233.298 225.70771372336316 226.67851573656316 58.749042698610026 59.249023587451674
-234.298 226.67851573656316 227.64931774976316 58.749042698610026 59.249023587451674
-235.298 227.64931774976316 228.62011976296313 58.749042698610026 59.249023587451674
-236.298 228.62011976296313 229.59092177616313 58.749042698610026 59.249023587451674
-237.298 229.59092177616313 230.56172378936316 58.749042698610026 59.249023587451674
-238.298 230.56172378936316 231.53252580256316 58.749042698610026 59.249023587451674
-239.298 231.53252580256316 232.50332781576316 58.749042698610026 59.249023587451674
-240.298 232.50332781576316 233.47412982896316 58.749042698610026 59.249023587451674
-241.298 233.47412982896316 234.44493184221312 58.749042698610026 59.249023587451674
-242.298 234.44493184221312 235.41573385546315 58.749042698610026 59.249023587451674
-243.298 235.41573385546315 236.38653586866312 58.749042698610026 59.249023587451674
-244.298 236.38653586866312 237.35733788186312 58.749042698610026 59.249023587451674
-245.298 237.35733788186312 238.32813989506315 58.749042698610026 59.249023587451674
-246.298 238.32813989506315 239.31451289040172 58.749042698610026 59.249023587451674
-257.298 248.99139105812458 249.97776405346315 58.749042698610026 59.249023587451674
-258.298 249.97776405346315 250.94856606666315 58.749042698610026 59.249023587451674
-259.298 250.94856606666315 251.91936807986315 58.749042698610026 59.249023587451674
-260.298 251.91936807986315 252.89017009311317 58.749042698610026 59.249023587451674
-261.298 252.89017009311317 253.86097210636316 58.749042698610026 59.249023587451674
-262.298 253.86097210636316 254.83177411956314 58.749042698610026 59.249023587451674
-263.298 254.83177411956314 255.80257613276316 58.749042698610026 59.249023587451674
-264.298 255.80257613276316 256.77337814596314 58.749042698610026 59.249023587451674
-265.298 256.77337814596314 257.74418015916314 58.749042698610026 59.249023587451674
-266.298 257.74418015916314 258.71498217236314 58.749042698610026 59.249023587451674
-267.298 258.71498217236314 259.6857841855631 58.749042698610026 59.249023587451674
-268.298 259.6857841855631 260.65658619876314 58.749042698610026 59.249023587451674
-269.298 260.65658619876314 261.6429591941017 58.749042698610026 59.249023587451674
-280.298 271.31983736182457 272.3062103572132 58.749042698610026 59.249023587451674
-281.298 272.3062103572132 273.2770123704632 58.749042698610026 59.249023587451674
-282.298 273.2770123704632 274.2478143836632 58.749042698610026 59.249023587451674
-283.298 274.2478143836632 275.2186163968632 58.749042698610026 59.249023587451674
-284.298 275.2186163968632 276.1894184100631 58.749042698610026 59.249023587451674
-285.298 276.1894184100631 277.1602204232632 58.749042698610026 59.249023587451674
-286.298 277.1602204232632 278.1310224364632 58.749042698610026 59.249023587451674
-287.298 278.1310224364632 279.10182444966324 58.749042698610026 59.249023587451674
-288.298 279.10182444966324 280.0726264628632 58.749042698610026 59.249023587451674
-289.298 280.0726264628632 281.05899945820175 58.749042698610026 59.249023587451674
-110.299 107.8539309274975 108.8548799732144 59.249023587451674 59.74900390731439
-111.299 108.8548799732144 109.84002717881438 59.249023587451674 59.74900390731439
-112.299 109.84002717881438 110.8251743844144 59.249023587451674 59.74900390731439
-113.299 110.8251743844144 111.81032159001438 59.249023587451674 59.74900390731439
-114.299 111.81032159001438 112.79546879556439 59.249023587451674 59.74900390731439
-115.299 112.79546879556439 113.7806160011144 59.249023587451674 59.74900390731439
-116.299 113.7806160011144 114.76576320671441 59.249023587451674 59.74900390731439
-117.299 114.76576320671441 115.7509104123144 59.249023587451674 59.74900390731439
-118.299 115.7509104123144 116.7360576179144 59.249023587451674 59.74900390731439
-119.299 116.7360576179144 117.7212048235144 59.249023587451674 59.74900390731439
-120.299 117.7212048235144 118.70635202911438 59.249023587451674 59.74900390731439
-121.299 118.70635202911438 119.69149923471439 59.249023587451674 59.74900390731439
-122.299 119.69149923471439 120.67664644031439 59.249023587451674 59.74900390731439
-123.299 120.67664644031439 121.6775954860313 59.249023587451674 59.74900390731439
-201.299 197.5023266360975 198.5032756818144 59.249023587451674 59.74900390731439
-202.299 198.5032756818144 199.48842288741437 59.249023587451674 59.74900390731439
-203.299 199.48842288741437 200.4735700930144 59.249023587451674 59.74900390731439
-204.299 200.4735700930144 201.45871729861437 59.249023587451674 59.74900390731439
-205.299 201.45871729861437 202.4438645042144 59.249023587451674 59.74900390731439
-206.299 202.4438645042144 203.42901170976438 59.249023587451674 59.74900390731439
-207.299 203.42901170976438 204.41415891531437 59.249023587451674 59.74900390731439
-208.299 204.41415891531437 205.3993061209144 59.249023587451674 59.74900390731439
-209.299 205.3993061209144 206.38445332651438 59.249023587451674 59.74900390731439
-210.299 206.38445332651438 207.36960053211436 59.249023587451674 59.74900390731439
-211.299 207.36960053211436 208.35474773771438 59.249023587451674 59.74900390731439
-212.299 208.35474773771438 209.33989494331436 59.249023587451674 59.74900390731439
-213.299 209.33989494331436 210.32504214891438 59.249023587451674 59.74900390731439
-214.299 210.32504214891438 211.31018935451436 59.249023587451674 59.74900390731439
-215.299 211.31018935451436 212.29533656006436 59.249023587451674 59.74900390731439
-216.299 212.29533656006436 213.2804837656144 59.249023587451674 59.74900390731439
-217.299 213.2804837656144 214.2656309712144 59.249023587451674 59.74900390731439
-218.299 214.2656309712144 215.25077817681438 59.249023587451674 59.74900390731439
-219.299 215.25077817681438 216.2359253824144 59.249023587451674 59.74900390731439
-220.299 216.2359253824144 217.2210725880144 59.249023587451674 59.74900390731439
-221.299 217.2210725880144 218.20621979361437 59.249023587451674 59.74900390731439
-222.299 218.20621979361437 219.19136699921435 59.249023587451674 59.74900390731439
-223.299 219.19136699921435 220.17651420481437 59.249023587451674 59.74900390731439
-224.299 220.17651420481437 221.16166141036436 59.249023587451674 59.74900390731439
-225.299 221.16166141036436 222.14680861591435 59.249023587451674 59.74900390731439
-226.299 222.14680861591435 223.13195582151437 59.249023587451674 59.74900390731439
-227.299 223.13195582151437 224.11710302711435 59.249023587451674 59.74900390731439
-228.299 224.11710302711435 225.10225023271437 59.249023587451674 59.74900390731439
-229.299 225.10225023271437 226.08739743831438 59.249023587451674 59.74900390731439
-230.299 226.08739743831438 227.07254464391434 59.249023587451674 59.74900390731439
-231.299 227.07254464391434 228.05769184951438 59.249023587451674 59.74900390731439
-232.299 228.05769184951438 229.04283905511437 59.249023587451674 59.74900390731439
-233.299 229.04283905511437 230.02798626066436 59.249023587451674 59.74900390731439
-234.299 230.02798626066436 231.01313346621438 59.249023587451674 59.74900390731439
-235.299 231.01313346621438 231.9982806718144 59.249023587451674 59.74900390731439
-236.299 231.9982806718144 232.98342787741436 59.249023587451674 59.74900390731439
-237.299 232.98342787741436 233.96857508301437 59.249023587451674 59.74900390731439
-238.299 233.96857508301437 234.95372228861436 59.249023587451674 59.74900390731439
-239.299 234.95372228861436 235.93886949421437 59.249023587451674 59.74900390731439
-240.299 235.93886949421437 236.92401669981436 59.249023587451674 59.74900390731439
-241.299 236.92401669981436 237.90916390541435 59.249023587451674 59.74900390731439
-242.299 237.90916390541435 238.91011295113128 59.249023587451674 59.74900390731439
-255.299 250.70027573789747 251.70122478361438 59.249023587451674 59.74900390731439
-256.299 251.70122478361438 252.68637198921436 59.249023587451674 59.74900390731439
-257.299 252.68637198921436 253.67151919481438 59.249023587451674 59.74900390731439
-258.299 253.67151919481438 254.6566664004144 59.249023587451674 59.74900390731439
-259.299 254.6566664004144 255.64181360601438 59.249023587451674 59.74900390731439
-260.299 255.64181360601438 256.62696081161437 59.249023587451674 59.74900390731439
-261.299 256.62696081161437 257.6121080171644 59.249023587451674 59.74900390731439
-262.299 257.6121080171644 258.5972552227144 59.249023587451674 59.74900390731439
-263.299 258.5972552227144 259.58240242831437 59.249023587451674 59.74900390731439
-264.299 259.58240242831437 260.58335147403125 59.249023587451674 59.74900390731439
-276.299 271.3883670552975 272.3893161010144 59.249023587451674 59.74900390731439
-277.299 272.3893161010144 273.37446330661436 59.249023587451674 59.74900390731439
-278.299 273.37446330661436 274.3596105122144 59.249023587451674 59.74900390731439
-279.299 274.3596105122144 275.3447577177644 59.249023587451674 59.74900390731439
-280.299 275.3447577177644 276.3299049233144 59.249023587451674 59.74900390731439
-281.299 276.3299049233144 277.31505212891443 59.249023587451674 59.74900390731439
-282.299 277.31505212891443 278.3001993345144 59.249023587451674 59.74900390731439
-283.299 278.3001993345144 279.28534654011435 59.249023587451674 59.74900390731439
-284.299 279.28534654011435 280.27049374571436 59.249023587451674 59.74900390731439
-285.299 280.27049374571436 281.27144279143124 59.249023587451674 59.74900390731439
-093.300 92.4799343548446 93.49597525758085 59.74900390731439 60.248983629270306
-094.300 93.49597525758085 94.49597525758085 59.74900390731439 60.248983629270306
-095.300 94.49597525758085 95.49597525758085 59.74900390731439 60.248983629270306
-096.300 95.49597525758085 96.49597525758085 59.74900390731439 60.248983629270306
-097.300 96.49597525758085 97.49597525758084 59.74900390731439 60.248983629270306
-098.300 97.49597525758084 98.49597525758084 59.74900390731439 60.248983629270306
-099.300 98.49597525758084 99.49597525758084 59.74900390731439 60.248983629270306
-100.300 99.49597525758084 100.49597525758085 59.74900390731439 60.248983629270306
-101.300 100.49597525758085 101.49597525758085 59.74900390731439 60.248983629270306
-102.300 101.49597525758085 102.49597525758085 59.74900390731439 60.248983629270306
-103.300 102.49597525758085 103.49597525758085 59.74900390731439 60.248983629270306
-104.300 103.49597525758085 104.49597525758085 59.74900390731439 60.248983629270306
-105.300 104.49597525758085 105.49597525758085 59.74900390731439 60.248983629270306
-106.300 105.49597525758085 106.49597525758084 59.74900390731439 60.248983629270306
-107.300 106.49597525758084 107.51201616031707 59.74900390731439 60.248983629270306
-199.300 198.4799343548446 199.49597525758082 59.74900390731439 60.248983629270306
-200.300 199.49597525758082 200.49597525758082 59.74900390731439 60.248983629270306
-201.300 200.49597525758082 201.49597525758082 59.74900390731439 60.248983629270306
-202.300 201.49597525758082 202.49597525758082 59.74900390731439 60.248983629270306
-203.300 202.49597525758082 203.49597525758082 59.74900390731439 60.248983629270306
-204.300 203.49597525758082 204.49597525758082 59.74900390731439 60.248983629270306
-205.300 204.49597525758082 205.49597525758082 59.74900390731439 60.248983629270306
-206.300 205.49597525758082 206.49597525758085 59.74900390731439 60.248983629270306
-207.300 206.49597525758085 207.49597525758082 59.74900390731439 60.248983629270306
-208.300 207.49597525758082 208.49597525758082 59.74900390731439 60.248983629270306
-209.300 208.49597525758082 209.49597525758082 59.74900390731439 60.248983629270306
-210.300 209.49597525758082 210.49597525758082 59.74900390731439 60.248983629270306
-211.300 210.49597525758082 211.49597525758082 59.74900390731439 60.248983629270306
-212.300 211.49597525758082 212.49597525758082 59.74900390731439 60.248983629270306
-213.300 212.49597525758082 213.49597525758082 59.74900390731439 60.248983629270306
-214.300 213.49597525758082 214.49597525758082 59.74900390731439 60.248983629270306
-215.300 214.49597525758082 215.49597525758082 59.74900390731439 60.248983629270306
-216.300 215.49597525758082 216.49597525758082 59.74900390731439 60.248983629270306
-217.300 216.49597525758082 217.49597525758082 59.74900390731439 60.248983629270306
-218.300 217.49597525758082 218.49597525758082 59.74900390731439 60.248983629270306
-219.300 218.49597525758082 219.49597525758082 59.74900390731439 60.248983629270306
-220.300 219.49597525758082 220.49597525758082 59.74900390731439 60.248983629270306
-221.300 220.49597525758082 221.49597525758082 59.74900390731439 60.248983629270306
-222.300 221.49597525758082 222.49597525758082 59.74900390731439 60.248983629270306
-223.300 222.49597525758082 223.49597525758082 59.74900390731439 60.248983629270306
-224.300 223.49597525758082 224.49597525758085 59.74900390731439 60.248983629270306
-225.300 224.49597525758085 225.49597525758082 59.74900390731439 60.248983629270306
-226.300 225.49597525758082 226.49597525758082 59.74900390731439 60.248983629270306
-227.300 226.49597525758082 227.49597525758082 59.74900390731439 60.248983629270306
-228.300 227.49597525758082 228.49597525758085 59.74900390731439 60.248983629270306
-229.300 228.49597525758085 229.51201616031707 59.74900390731439 60.248983629270306
-272.300 271.4799343548446 272.4959752575809 59.74900390731439 60.248983629270306
-273.300 272.4959752575809 273.4959752575809 59.74900390731439 60.248983629270306
-274.300 273.4959752575809 274.4959752575809 59.74900390731439 60.248983629270306
-275.300 274.4959752575809 275.49597525758077 59.74900390731439 60.248983629270306
-276.300 275.49597525758077 276.4959752575808 59.74900390731439 60.248983629270306
-277.300 276.4959752575808 277.4959752575809 59.74900390731439 60.248983629270306
-278.300 277.4959752575809 278.4959752575809 59.74900390731439 60.248983629270306
-279.300 278.4959752575809 279.4959752575808 59.74900390731439 60.248983629270306
-280.300 279.4959752575808 280.51201616031705 59.74900390731439 60.248983629270306
-091.301 91.87197614162515 92.90365075083832 60.248983629270306 60.74896272241884
-092.301 92.90365075083832 93.91903677318831 60.248983629270306 60.74896272241884
-093.301 93.91903677318831 94.93442279553832 60.248983629270306 60.74896272241884
-094.301 94.93442279553832 95.94980881788831 60.248983629270306 60.74896272241884
-095.301 95.94980881788831 96.96519484018832 60.248983629270306 60.74896272241884
-096.301 96.96519484018832 97.98058086253832 60.248983629270306 60.74896272241884
-097.301 97.98058086253832 98.99596688488832 60.248983629270306 60.74896272241884
-098.301 98.99596688488832 100.01135290723832 60.248983629270306 60.74896272241884
-099.301 100.01135290723832 101.02673892958832 60.248983629270306 60.74896272241884
-100.301 101.02673892958832 102.04212495188831 60.248983629270306 60.74896272241884
-101.301 102.04212495188831 103.05751097423831 60.248983629270306 60.74896272241884
-102.301 103.05751097423831 104.07289699658833 60.248983629270306 60.74896272241884
-103.301 104.07289699658833 105.08828301893831 60.248983629270306 60.74896272241884
-104.301 105.08828301893831 106.10366904128833 60.248983629270306 60.74896272241884
-105.301 106.10366904128833 107.11905506358832 60.248983629270306 60.74896272241884
-106.301 107.11905506358832 108.15072967275148 60.248983629270306 60.74896272241884
-197.301 199.50289450972514 200.5345691188883 60.248983629270306 60.74896272241884
-198.301 200.5345691188883 201.54995514123829 60.248983629270306 60.74896272241884
-199.301 201.54995514123829 202.5653411635883 60.248983629270306 60.74896272241884
-200.301 202.5653411635883 203.58072718593831 60.248983629270306 60.74896272241884
-201.301 203.58072718593831 204.5961132082883 60.248983629270306 60.74896272241884
-202.301 204.5961132082883 205.61149923058832 60.248983629270306 60.74896272241884
-203.301 205.61149923058832 206.6268852529383 60.248983629270306 60.74896272241884
-204.301 206.6268852529383 207.6422712752883 60.248983629270306 60.74896272241884
-205.301 207.6422712752883 208.6576572976383 60.248983629270306 60.74896272241884
-206.301 208.6576572976383 209.67304331998832 60.248983629270306 60.74896272241884
-207.301 209.67304331998832 210.68842934228832 60.248983629270306 60.74896272241884
-208.301 210.68842934228832 211.70381536463833 60.248983629270306 60.74896272241884
-209.301 211.70381536463833 212.7192013869883 60.248983629270306 60.74896272241884
-210.301 212.7192013869883 213.7345874093383 60.248983629270306 60.74896272241884
-211.301 213.7345874093383 214.74997343168832 60.248983629270306 60.74896272241884
-212.301 214.74997343168832 215.7653594539883 60.248983629270306 60.74896272241884
-213.301 215.7653594539883 216.78074547633832 60.248983629270306 60.74896272241884
-214.301 216.78074547633832 217.7961314986883 60.248983629270306 60.74896272241884
-215.301 217.7961314986883 218.8115175210383 60.248983629270306 60.74896272241884
-216.301 218.8115175210383 219.8269035433883 60.248983629270306 60.74896272241884
-217.301 219.8269035433883 220.8422895656883 60.248983629270306 60.74896272241884
-218.301 220.8422895656883 221.85767558803832 60.248983629270306 60.74896272241884
-219.301 221.85767558803832 222.87306161038833 60.248983629270306 60.74896272241884
-220.301 222.87306161038833 223.8884476327383 60.248983629270306 60.74896272241884
-221.301 223.8884476327383 224.9038336550883 60.248983629270306 60.74896272241884
-222.301 224.9038336550883 225.9192196773883 60.248983629270306 60.74896272241884
-223.301 225.9192196773883 226.9346056997383 60.248983629270306 60.74896272241884
-224.301 226.9346056997383 227.9499917220883 60.248983629270306 60.74896272241884
-225.301 227.9499917220883 228.9653777444383 60.248983629270306 60.74896272241884
-226.301 228.9653777444383 229.9970523536515 60.248983629270306 60.74896272241884
-268.301 271.59530209582516 272.6269767050383 60.248983629270306 60.74896272241884
-269.301 272.6269767050383 273.64236272738833 60.248983629270306 60.74896272241884
-270.301 273.64236272738833 274.6577487497383 60.248983629270306 60.74896272241884
-271.301 274.6577487497383 275.6731347720883 60.248983629270306 60.74896272241884
-272.301 275.6731347720883 276.6885207943883 60.248983629270306 60.74896272241884
-273.301 276.6885207943883 277.70390681673825 60.248983629270306 60.74896272241884
-274.301 277.70390681673825 278.7192928390883 60.248983629270306 60.74896272241884
-275.301 278.7192928390883 279.73467886143834 60.248983629270306 60.74896272241884
-276.301 279.73467886143834 280.7663534706515 60.248983629270306 60.74896272241884
-090.302 92.28340522138751 93.33128322954929 60.74896272241884 61.24894115371521
-091.302 93.33128322954929 94.36261589939929 60.74896272241884 61.24894115371521
-092.302 94.36261589939929 95.39394856924926 60.74896272241884 61.24894115371521
-093.302 95.39394856924926 96.42528123904927 60.74896272241884 61.24894115371521
-094.302 96.42528123904927 97.45661390884926 60.74896272241884 61.24894115371521
-095.302 97.45661390884926 98.48794657864926 60.74896272241884 61.24894115371521
-096.302 98.48794657864926 99.51927924844927 60.74896272241884 61.24894115371521
-097.302 99.51927924844927 100.55061191824926 60.74896272241884 61.24894115371521
-098.302 100.55061191824926 101.58194458809928 60.74896272241884 61.24894115371521
-099.302 101.58194458809928 102.61327725794928 60.74896272241884 61.24894115371521
-100.302 102.61327725794928 103.64460992774929 60.74896272241884 61.24894115371521
-101.302 103.64460992774929 104.6759425975493 60.74896272241884 61.24894115371521
-102.302 104.6759425975493 105.70727526734927 60.74896272241884 61.24894115371521
-103.302 105.70727526734927 106.73860793714928 60.74896272241884 61.24894115371521
-104.302 106.73860793714928 107.78648594531104 60.74896272241884 61.24894115371521
-194.302 199.5420028819875 200.58988089019925 60.74896272241884 61.24894115371521
-195.302 200.58988089019925 201.62121356004926 60.74896272241884 61.24894115371521
-196.302 201.62121356004926 202.6525462298493 60.74896272241884 61.24894115371521
-197.302 202.6525462298493 203.68387889964927 60.74896272241884 61.24894115371521
-198.302 203.68387889964927 204.71521156944925 60.74896272241884 61.24894115371521
-199.302 204.71521156944925 205.74654423924926 60.74896272241884 61.24894115371521
-200.302 205.74654423924926 206.77787690904927 60.74896272241884 61.24894115371521
-201.302 206.77787690904927 207.8092095788993 60.74896272241884 61.24894115371521
-202.302 207.8092095788993 208.84054224874927 60.74896272241884 61.24894115371521
-203.302 208.84054224874927 209.87187491854928 60.74896272241884 61.24894115371521
-204.302 209.87187491854928 210.90320758834926 60.74896272241884 61.24894115371521
-205.302 210.90320758834926 211.93454025814927 60.74896272241884 61.24894115371521
-206.302 211.93454025814927 212.96587292794925 60.74896272241884 61.24894115371521
-207.302 212.96587292794925 213.99720559774926 60.74896272241884 61.24894115371521
-208.302 213.99720559774926 215.02853826759926 60.74896272241884 61.24894115371521
-209.302 215.02853826759926 216.05987093744926 60.74896272241884 61.24894115371521
-210.302 216.05987093744926 217.09120360724927 60.74896272241884 61.24894115371521
-211.302 217.09120360724927 218.12253627704928 60.74896272241884 61.24894115371521
-212.302 218.12253627704928 219.1538689468493 60.74896272241884 61.24894115371521
-213.302 219.1538689468493 220.18520161664924 60.74896272241884 61.24894115371521
-214.302 220.18520161664924 221.21653428644925 60.74896272241884 61.24894115371521
-215.302 221.21653428644925 222.24786695624925 60.74896272241884 61.24894115371521
-216.302 222.24786695624925 223.27919962609926 60.74896272241884 61.24894115371521
-217.302 223.27919962609926 224.31053229594926 60.74896272241884 61.24894115371521
-218.302 224.31053229594926 225.34186496574927 60.74896272241884 61.24894115371521
-219.302 225.34186496574927 226.37319763554927 60.74896272241884 61.24894115371521
-220.302 226.37319763554927 227.40453030534928 60.74896272241884 61.24894115371521
-221.302 227.40453030534928 228.4358629751493 60.74896272241884 61.24894115371521
-222.302 228.4358629751493 229.4671956449493 60.74896272241884 61.24894115371521
-223.302 229.4671956449493 230.49852831479927 60.74896272241884 61.24894115371521
-224.302 230.49852831479927 231.546406323011 60.74896272241884 61.24894115371521
-265.302 272.7666224387875 273.81450044694924 60.74896272241884 61.24894115371521
-266.302 273.81450044694924 274.84583311674925 60.74896272241884 61.24894115371521
-267.302 274.84583311674925 275.8771657865992 60.74896272241884 61.24894115371521
-268.302 275.8771657865992 276.90849845644925 60.74896272241884 61.24894115371521
-269.302 276.90849845644925 277.93983112624926 60.74896272241884 61.24894115371521
-270.302 277.93983112624926 278.97116379604927 60.74896272241884 61.24894115371521
-271.302 278.97116379604927 280.0024964658493 60.74896272241884 61.24894115371521
-272.302 280.0024964658493 281.0338291356493 60.74896272241884 61.24894115371521
-273.302 281.0338291356493 282.08170714381095 60.74896272241884 61.24894115371521
-192.303 200.64566828945883 201.7103491905383 61.24894115371521 61.74891888778053
-193.303 201.7103491905383 202.7582184567883 61.24894115371521 61.74891888778053
-194.303 202.7582184567883 203.80608772303827 61.24894115371521 61.74891888778053
-195.303 203.80608772303827 204.8539569892883 61.24894115371521 61.74891888778053
-196.303 204.8539569892883 205.9018262555383 61.24894115371521 61.74891888778053
-197.303 205.9018262555383 206.94969552178827 61.24894115371521 61.74891888778053
-198.303 206.94969552178827 207.9975647880383 61.24894115371521 61.74891888778053
-199.303 207.9975647880383 209.0454340542883 61.24894115371521 61.74891888778053
-200.303 209.0454340542883 210.0933033205383 61.24894115371521 61.74891888778053
-201.303 210.0933033205383 211.1411725867883 61.24894115371521 61.74891888778053
-202.303 211.1411725867883 212.1890418530383 61.24894115371521 61.74891888778053
-203.303 212.1890418530383 213.2369111193383 61.24894115371521 61.74891888778053
-204.303 213.2369111193383 214.2847803855883 61.24894115371521 61.74891888778053
-205.303 214.2847803855883 215.33264965183827 61.24894115371521 61.74891888778053
-206.303 215.33264965183827 216.38051891808828 61.24894115371521 61.74891888778053
-207.303 216.38051891808828 217.4283881843383 61.24894115371521 61.74891888778053
-208.303 217.4283881843383 218.4762574505883 61.24894115371521 61.74891888778053
-209.303 218.4762574505883 219.52412671683828 61.24894115371521 61.74891888778053
-210.303 219.52412671683828 220.5719959830883 61.24894115371521 61.74891888778053
-211.303 220.5719959830883 221.61986524933826 61.24894115371521 61.74891888778053
-212.303 221.61986524933826 222.66773451558828 61.24894115371521 61.74891888778053
-213.303 222.66773451558828 223.7156037818383 61.24894115371521 61.74891888778053
-214.303 223.7156037818383 224.76347304813828 61.24894115371521 61.74891888778053
-215.303 224.76347304813828 225.8113423143883 61.24894115371521 61.74891888778053
-216.303 225.8113423143883 226.8592115806383 61.24894115371521 61.74891888778053
-217.303 226.8592115806383 227.90708084688828 61.24894115371521 61.74891888778053
-218.303 227.90708084688828 228.9549501131383 61.24894115371521 61.74891888778053
-219.303 228.9549501131383 230.0028193793883 61.24894115371521 61.74891888778053
-220.303 230.0028193793883 231.05068864563827 61.24894115371521 61.74891888778053
-221.303 231.05068864563827 232.11536954671772 61.24894115371521 61.74891888778053
-260.303 271.90077839475885 272.96545929578826 61.24894115371521 61.74891888778053
-261.303 272.96545929578826 274.0133285620383 61.24894115371521 61.74891888778053
-262.303 274.0133285620383 275.0611978283383 61.24894115371521 61.74891888778053
-263.303 275.0611978283383 276.1090670945883 61.24894115371521 61.74891888778053
-264.303 276.1090670945883 277.1569363608383 61.24894115371521 61.74891888778053
-265.303 277.1569363608383 278.20480562708826 61.24894115371521 61.74891888778053
-266.303 278.20480562708826 279.2526748933383 61.24894115371521 61.74891888778053
-267.303 279.2526748933383 280.3005441595883 61.24894115371521 61.74891888778053
-268.303 280.3005441595883 281.34841342583826 61.24894115371521 61.74891888778053
-269.303 281.34841342583826 282.41309432691776 61.24894115371521 61.74891888778053
-203.304 215.6462725148078 216.72838773709123 61.74891888778053 62.248895886691656
-204.304 216.72838773709123 217.79341497119123 61.74891888778053 62.248895886691656
-205.304 217.79341497119123 218.8584422052912 61.74891888778053 62.248895886691656
-206.304 218.8584422052912 219.92346943939123 61.74891888778053 62.248895886691656
-207.304 219.92346943939123 220.98849667349123 61.74891888778053 62.248895886691656
-208.304 220.98849667349123 222.05352390759123 61.74891888778053 62.248895886691656
-209.304 222.05352390759123 223.11855114169123 61.74891888778053 62.248895886691656
-210.304 223.11855114169123 224.1835783757912 61.74891888778053 62.248895886691656
-211.304 224.1835783757912 225.24860560989123 61.74891888778053 62.248895886691656
-212.304 225.24860560989123 226.31363284399123 61.74891888778053 62.248895886691656
-213.304 226.31363284399123 227.3786600780912 61.74891888778053 62.248895886691656
-214.304 227.3786600780912 228.44368731219123 61.74891888778053 62.248895886691656
-215.304 228.44368731219123 229.50871454629123 61.74891888778053 62.248895886691656
-216.304 229.50871454629123 230.5737417803912 61.74891888778053 62.248895886691656
-217.304 230.5737417803912 231.63876901449123 61.74891888778053 62.248895886691656
-218.304 231.63876901449123 232.70379624859123 61.74891888778053 62.248895886691656
-219.304 232.70379624859123 233.78591147087462 61.74891888778053 62.248895886691656
-256.304 272.09271592190777 273.1748311441912 61.74891888778053 62.248895886691656
-257.304 273.1748311441912 274.2398583782412 61.74891888778053 62.248895886691656
-258.304 274.2398583782412 275.30488561229123 61.74891888778053 62.248895886691656
-259.304 275.30488561229123 276.36991284639123 61.74891888778053 62.248895886691656
-260.304 276.36991284639123 277.4349400804912 61.74891888778053 62.248895886691656
-261.304 277.4349400804912 278.49996731459123 61.74891888778053 62.248895886691656
-262.304 278.49996731459123 279.56499454869123 61.74891888778053 62.248895886691656
-263.304 279.56499454869123 280.63002178279123 61.74891888778053 62.248895886691656
-264.304 280.63002178279123 281.69504901689123 61.74891888778053 62.248895886691656
-265.304 281.69504901689123 282.76007625099123 61.74891888778053 62.248895886691656
-266.304 282.76007625099123 283.8421914732746 61.74891888778053 62.248895886691656
-189.305 204.0931852546081 205.19340048785065 62.248895886691656 62.74887210974755
-190.305 205.19340048785065 206.27624077295064 62.248895886691656 62.74887210974755
-191.305 206.27624077295064 207.35908105805063 62.248895886691656 62.74887210974755
-192.305 207.35908105805063 208.44192134315063 62.248895886691656 62.74887210974755
-193.305 208.44192134315063 209.52476162825064 62.248895886691656 62.74887210974755
-194.305 209.52476162825064 210.6076019133506 62.248895886691656 62.74887210974755
-195.305 210.6076019133506 211.69044219845063 62.248895886691656 62.74887210974755
-196.305 211.69044219845063 212.77328248355064 62.248895886691656 62.74887210974755
-197.305 212.77328248355064 213.8561227686506 62.248895886691656 62.74887210974755
-198.305 213.8561227686506 214.93896305375063 62.248895886691656 62.74887210974755
-199.305 214.93896305375063 216.02180333885065 62.248895886691656 62.74887210974755
-200.305 216.02180333885065 217.10464362395064 62.248895886691656 62.74887210974755
-201.305 217.10464362395064 218.18748390905063 62.248895886691656 62.74887210974755
-202.305 218.18748390905063 219.27032419415065 62.248895886691656 62.74887210974755
-203.305 219.27032419415065 220.35316447925064 62.248895886691656 62.74887210974755
-204.305 220.35316447925064 221.43600476435063 62.248895886691656 62.74887210974755
-205.305 221.43600476435063 222.51884504945065 62.248895886691656 62.74887210974755
-206.305 222.51884504945065 223.6016853345506 62.248895886691656 62.74887210974755
-207.305 223.6016853345506 224.68452561965063 62.248895886691656 62.74887210974755
-208.305 224.68452561965063 225.76736590475065 62.248895886691656 62.74887210974755
-209.305 225.76736590475065 226.85020618985064 62.248895886691656 62.74887210974755
-210.305 226.85020618985064 227.93304647495063 62.248895886691656 62.74887210974755
-211.305 227.93304647495063 229.01588676005065 62.248895886691656 62.74887210974755
-212.305 229.01588676005065 230.09872704515067 62.248895886691656 62.74887210974755
-213.305 230.09872704515067 231.18156733025063 62.248895886691656 62.74887210974755
-214.305 231.18156733025063 232.26440761535065 62.248895886691656 62.74887210974755
-215.305 232.26440761535065 233.3472479004506 62.248895886691656 62.74887210974755
-216.305 233.3472479004506 234.43008818555063 62.248895886691656 62.74887210974755
-217.305 234.43008818555063 235.51292847065065 62.248895886691656 62.74887210974755
-218.305 235.51292847065065 236.61314370389317 62.248895886691656 62.74887210974755
-252.305 272.31212321590806 273.41233844915064 62.248895886691656 62.74887210974755
-253.305 273.41233844915064 274.49517873425066 62.248895886691656 62.74887210974755
-254.305 274.49517873425066 275.5780190193506 62.248895886691656 62.74887210974755
-255.305 275.5780190193506 276.66085930445064 62.248895886691656 62.74887210974755
-256.305 276.66085930445064 277.74369958955066 62.248895886691656 62.74887210974755
-257.305 277.74369958955066 278.8265398746506 62.248895886691656 62.74887210974755
-258.305 278.8265398746506 279.90938015975064 62.248895886691656 62.74887210974755
-259.305 279.90938015975064 280.99222044485066 62.248895886691656 62.74887210974755
-260.305 280.99222044485066 282.0750607299507 62.248895886691656 62.74887210974755
-261.305 282.0750607299507 283.15790101505064 62.248895886691656 62.74887210974755
-262.305 283.15790101505064 284.2581162482932 62.248895886691656 62.74887210974755
-186.306 204.2767335127547 205.39575125051743 62.74887210974755 63.24884751320979
-187.306 205.39575125051743 206.49709588281746 62.74887210974755 63.24884751320979
-188.306 206.49709588281746 207.5984405151175 62.74887210974755 63.24884751320979
-189.306 207.5984405151175 208.69978514741746 62.74887210974755 63.24884751320979
-190.306 208.69978514741746 209.80112977971748 62.74887210974755 63.24884751320979
-191.306 209.80112977971748 210.90247441201745 62.74887210974755 63.24884751320979
-192.306 210.90247441201745 212.00381904431742 62.74887210974755 63.24884751320979
-193.306 212.00381904431742 213.10516367661745 62.74887210974755 63.24884751320979
-194.306 213.10516367661745 214.20650830891745 62.74887210974755 63.24884751320979
-195.306 214.20650830891745 215.30785294121745 62.74887210974755 63.24884751320979
-196.306 215.30785294121745 216.40919757346745 62.74887210974755 63.24884751320979
-197.306 216.40919757346745 217.51054220571746 62.74887210974755 63.24884751320979
-198.306 217.51054220571746 218.61188683801743 62.74887210974755 63.24884751320979
-199.306 218.61188683801743 219.71323147031745 62.74887210974755 63.24884751320979
-200.306 219.71323147031745 220.81457610261745 62.74887210974755 63.24884751320979
-201.306 220.81457610261745 221.91592073491745 62.74887210974755 63.24884751320979
-202.306 221.91592073491745 223.01726536721748 62.74887210974755 63.24884751320979
-203.306 223.01726536721748 224.11860999951745 62.74887210974755 63.24884751320979
-204.306 224.11860999951745 225.21995463181747 62.74887210974755 63.24884751320979
-205.306 225.21995463181747 226.32129926411744 62.74887210974755 63.24884751320979
-206.306 226.32129926411744 227.42264389641747 62.74887210974755 63.24884751320979
-207.306 227.42264389641747 228.52398852871744 62.74887210974755 63.24884751320979
-208.306 228.52398852871744 229.62533316101747 62.74887210974755 63.24884751320979
-209.306 229.62533316101747 230.72667779331744 62.74887210974755 63.24884751320979
-210.306 230.72667779331744 231.82802242556744 62.74887210974755 63.24884751320979
-211.306 231.82802242556744 232.92936705781744 62.74887210974755 63.24884751320979
-212.306 232.92936705781744 234.03071169011744 62.74887210974755 63.24884751320979
-213.306 234.03071169011744 235.13205632241744 62.74887210974755 63.24884751320979
-214.306 235.13205632241744 236.23340095471744 62.74887210974755 63.24884751320979
-215.306 236.23340095471744 237.33474558701744 62.74887210974755 63.24884751320979
-216.306 237.33474558701744 238.45376332478017 62.74887210974755 63.24884751320979
-248.306 272.56010071495473 273.6791184527175 62.74887210974755 63.24884751320979
-249.306 273.6791184527175 274.78046308501746 62.74887210974755 63.24884751320979
-250.306 274.78046308501746 275.88180771731743 62.74887210974755 63.24884751320979
-251.306 275.88180771731743 276.9831523495675 62.74887210974755 63.24884751320979
-252.306 276.9831523495675 278.08449698181744 62.74887210974755 63.24884751320979
-253.306 278.08449698181744 279.18584161411746 62.74887210974755 63.24884751320979
-254.306 279.18584161411746 280.2871862464175 62.74887210974755 63.24884751320979
-255.306 280.2871862464175 281.38853087871746 62.74887210974755 63.24884751320979
-256.306 281.38853087871746 282.48987551101743 62.74887210974755 63.24884751320979
-257.306 282.48987551101743 283.6088932487802 62.74887210974755 63.24884751320979
-183.307 204.48250306138044 205.62106538330278 63.24884751320979 63.7488220500132
-184.307 205.62106538330278 206.7416446092028 63.24884751320979 63.7488220500132
-185.307 206.7416446092028 207.86222383505282 63.24884751320979 63.7488220500132
-186.307 207.86222383505282 208.98280306090277 63.24884751320979 63.7488220500132
-187.307 208.98280306090277 210.10338228680277 63.24884751320979 63.7488220500132
-188.307 210.10338228680277 211.22396151270277 63.24884751320979 63.7488220500132
-189.307 211.22396151270277 212.34454073855278 63.24884751320979 63.7488220500132
-190.307 212.34454073855278 213.46511996440276 63.24884751320979 63.7488220500132
-191.307 213.46511996440276 214.58569919030276 63.24884751320979 63.7488220500132
-192.307 214.58569919030276 215.70627841615277 63.24884751320979 63.7488220500132
-193.307 215.70627841615277 216.82685764200278 63.24884751320979 63.7488220500132
-194.307 216.82685764200278 217.9474368679028 63.24884751320979 63.7488220500132
-195.307 217.9474368679028 219.06801609380278 63.24884751320979 63.7488220500132
-196.307 219.06801609380278 220.1885953196528 63.24884751320979 63.7488220500132
-197.307 220.1885953196528 221.3091745455028 63.24884751320979 63.7488220500132
-198.307 221.3091745455028 222.42975377140277 63.24884751320979 63.7488220500132
-199.307 222.42975377140277 223.55033299725278 63.24884751320979 63.7488220500132
-200.307 223.55033299725278 224.6709122231028 63.24884751320979 63.7488220500132
-201.307 224.6709122231028 225.79149144900276 63.24884751320979 63.7488220500132
-202.307 225.79149144900276 226.91207067485277 63.24884751320979 63.7488220500132
-203.307 226.91207067485277 228.03264990070278 63.24884751320979 63.7488220500132
-204.307 228.03264990070278 229.1532291266028 63.24884751320979 63.7488220500132
-205.307 229.1532291266028 230.27380835250278 63.24884751320979 63.7488220500132
-206.307 230.27380835250278 231.39438757835276 63.24884751320979 63.7488220500132
-207.307 231.39438757835276 232.5149668042028 63.24884751320979 63.7488220500132
-208.307 232.5149668042028 233.6355460301028 63.24884751320979 63.7488220500132
-209.307 233.6355460301028 234.75612525595278 63.24884751320979 63.7488220500132
-210.307 234.75612525595278 235.8767044818028 63.24884751320979 63.7488220500132
-211.307 235.8767044818028 236.99728370770276 63.24884751320979 63.7488220500132
-212.307 236.99728370770276 238.11786293360277 63.24884751320979 63.7488220500132
-213.307 238.11786293360277 239.25642525552513 63.24884751320979 63.7488220500132
-244.307 272.83783583958046 273.9763981614527 63.24884751320979 63.7488220500132
-245.307 273.9763981614527 275.0969773873028 63.24884751320979 63.7488220500132
-246.307 275.0969773873028 276.21755661320276 63.24884751320979 63.7488220500132
-247.307 276.21755661320276 277.3381358391028 63.24884751320979 63.7488220500132
-248.307 277.3381358391028 278.4587150649528 63.24884751320979 63.7488220500132
-249.307 278.4587150649528 279.57929429080275 63.24884751320979 63.7488220500132
-250.307 279.57929429080275 280.69987351670284 63.24884751320979 63.7488220500132
-251.307 280.69987351670284 281.8204527425528 63.24884751320979 63.7488220500132
-252.307 281.8204527425528 282.9410319684028 63.24884751320979 63.7488220500132
-253.307 282.9410319684028 284.0795942903252 63.24884751320979 63.7488220500132
-180.308 204.71145027877813 205.87034190035624 63.7488220500132 64.24879566944288
-181.308 205.87034190035624 207.01092791670624 63.7488220500132 64.24879566944288
-182.308 207.01092791670624 208.15151393305624 63.7488220500132 64.24879566944288
-183.308 208.15151393305624 209.29209994940624 63.7488220500132 64.24879566944288
-184.308 209.29209994940624 210.43268596575626 63.7488220500132 64.24879566944288
-185.308 210.43268596575626 211.57327198215626 63.7488220500132 64.24879566944288
-186.308 211.57327198215626 212.71385799850626 63.7488220500132 64.24879566944288
-187.308 212.71385799850626 213.85444401485626 63.7488220500132 64.24879566944288
-188.308 213.85444401485626 214.99503003120628 63.7488220500132 64.24879566944288
-189.308 214.99503003120628 216.13561604755625 63.7488220500132 64.24879566944288
-190.308 216.13561604755625 217.27620206390625 63.7488220500132 64.24879566944288
-191.308 217.27620206390625 218.41678808025625 63.7488220500132 64.24879566944288
-192.308 218.41678808025625 219.55737409660622 63.7488220500132 64.24879566944288
-193.308 219.55737409660622 220.69796011295625 63.7488220500132 64.24879566944288
-194.308 220.69796011295625 221.83854612930625 63.7488220500132 64.24879566944288
-195.308 221.83854612930625 222.97913214565625 63.7488220500132 64.24879566944288
-196.308 222.97913214565625 224.11971816200625 63.7488220500132 64.24879566944288
-197.308 224.11971816200625 225.26030417835625 63.7488220500132 64.24879566944288
-198.308 225.26030417835625 226.40089019470628 63.7488220500132 64.24879566944288
-199.308 226.40089019470628 227.54147621105625 63.7488220500132 64.24879566944288
-200.308 227.54147621105625 228.68206222740625 63.7488220500132 64.24879566944288
-201.308 228.68206222740625 229.82264824375625 63.7488220500132 64.24879566944288
-202.308 229.82264824375625 230.96323426010622 63.7488220500132 64.24879566944288
-203.308 230.96323426010622 232.10382027645625 63.7488220500132 64.24879566944288
-204.308 232.10382027645625 233.24440629280625 63.7488220500132 64.24879566944288
-205.308 233.24440629280625 234.38499230915625 63.7488220500132 64.24879566944288
-206.308 234.38499230915625 235.52557832555624 63.7488220500132 64.24879566944288
-207.308 235.52557832555624 236.66616434190627 63.7488220500132 64.24879566944288
-208.308 236.66616434190627 237.80675035825624 63.7488220500132 64.24879566944288
-209.308 237.80675035825624 238.94733637460624 63.7488220500132 64.24879566944288
-210.308 238.94733637460624 240.10622799613435 63.7488220500132 64.24879566944288
-241.308 274.28719727627816 275.44608889785627 63.7488220500132 64.24879566944288
-242.308 275.44608889785627 276.58667491420624 63.7488220500132 64.24879566944288
-243.308 276.58667491420624 277.72726093055627 63.7488220500132 64.24879566944288
-244.308 277.72726093055627 278.8678469469063 63.7488220500132 64.24879566944288
-245.308 278.8678469469063 280.00843296325627 63.7488220500132 64.24879566944288
-246.308 280.00843296325627 281.14901897960624 63.7488220500132 64.24879566944288
-247.308 281.14901897960624 282.28960499595627 63.7488220500132 64.24879566944288
-248.308 282.28960499595627 283.4484966175344 63.7488220500132 64.24879566944288
-178.309 206.12601971344992 207.306071334824 64.24879566944288 64.74876831677287
-179.309 207.306071334824 208.467481583524 64.24879566944288 64.74876831677287
-180.309 208.467481583524 209.628891832224 64.24879566944288 64.74876831677287
-181.309 209.628891832224 210.790302080874 64.24879566944288 64.74876831677287
-182.309 210.790302080874 211.95171232952399 64.24879566944288 64.74876831677287
-183.309 211.95171232952399 213.11312257822397 64.24879566944288 64.74876831677287
-184.309 213.11312257822397 214.27453282687398 64.24879566944288 64.74876831677287
-185.309 214.27453282687398 215.435943075524 64.24879566944288 64.74876831677287
-186.309 215.435943075524 216.597353324224 64.24879566944288 64.74876831677287
-187.309 216.597353324224 217.758763572924 64.24879566944288 64.74876831677287
-188.309 217.758763572924 218.920173821574 64.24879566944288 64.74876831677287
-189.309 218.920173821574 220.081584070224 64.24879566944288 64.74876831677287
-190.309 220.081584070224 221.242994318924 64.24879566944288 64.74876831677287
-191.309 221.242994318924 222.404404567574 64.24879566944288 64.74876831677287
-192.309 222.404404567574 223.565814816224 64.24879566944288 64.74876831677287
-193.309 223.565814816224 224.72722506492397 64.24879566944288 64.74876831677287
-194.309 224.72722506492397 225.88863531362398 64.24879566944288 64.74876831677287
-195.309 225.88863531362398 227.05004556227402 64.24879566944288 64.74876831677287
-196.309 227.05004556227402 228.211455810924 64.24879566944288 64.74876831677287
-197.309 228.211455810924 229.37286605962402 64.24879566944288 64.74876831677287
-198.309 229.37286605962402 230.534276308274 64.24879566944288 64.74876831677287
-199.309 230.534276308274 231.695686556924 64.24879566944288 64.74876831677287
-200.309 231.695686556924 232.857096805624 64.24879566944288 64.74876831677287
-201.309 232.857096805624 234.018507054324 64.24879566944288 64.74876831677287
-202.309 234.018507054324 235.179917302974 64.24879566944288 64.74876831677287
-203.309 235.179917302974 236.34132755162398 64.24879566944288 64.74876831677287
-204.309 236.34132755162398 237.502737800324 64.24879566944288 64.74876831677287
-205.309 237.502737800324 238.66414804897403 64.24879566944288 64.74876831677287
-206.309 238.66414804897403 239.84419967029805 64.24879566944288 64.74876831677287
-238.309 275.81063463374994 276.99068625512405 64.24879566944288 64.74876831677287
-239.309 276.99068625512405 278.152096503824 64.24879566944288 64.74876831677287
-240.309 278.152096503824 279.313506752524 64.24879566944288 64.74876831677287
-241.309 279.313506752524 280.474917001174 64.24879566944288 64.74876831677287
-242.309 280.474917001174 281.636327249824 64.24879566944288 64.74876831677287
-243.309 281.636327249824 282.816378871198 64.24879566944288 64.74876831677287
-188.310 221.80651164076957 223.00860363046388 64.74876831677287 66.74864201896122
-189.310 223.00860363046388 224.19170442206388 64.74876831677287 66.74864201896122
-190.310 224.19170442206388 225.37480521366393 64.74876831677287 66.74864201896122
-191.310 225.37480521366393 226.5579060052139 64.74876831677287 66.74864201896122
-192.310 226.5579060052139 227.7410067967639 64.74876831677287 66.74864201896122
-193.310 227.7410067967639 228.92410758836388 64.74876831677287 66.74864201896122
-194.310 228.92410758836388 230.10720837996388 64.74876831677287 66.74864201896122
-195.310 230.10720837996388 231.2903091715139 64.74876831677287 66.74864201896122
-196.310 231.2903091715139 232.4734099630639 64.74876831677287 66.74864201896122
-197.310 232.4734099630639 233.65651075466388 64.74876831677287 66.74864201896122
-198.310 233.65651075466388 234.8396115462639 64.74876831677287 66.74864201896122
-199.310 234.8396115462639 236.02271233781389 64.74876831677287 66.74864201896122
-200.310 236.02271233781389 237.20581312936392 64.74876831677287 66.74864201896122
-201.310 237.20581312936392 238.38891392096392 64.74876831677287 66.74864201896122
-202.310 238.38891392096392 239.59100591065823 64.74876831677287 66.74864201896122
-074.317 100.24255131306474 101.62871983408795 66.74864201896122 68.74850623532309
-075.317 101.62871983408795 102.99297174798795 66.74864201896122 68.74850623532309
-076.317 102.99297174798795 104.35722366188796 66.74864201896122 68.74850623532309
-077.317 104.35722366188796 105.72147557578793 66.74864201896122 68.74850623532309
-078.317 105.72147557578793 107.08572748968794 66.74864201896122 68.74850623532309
-079.317 107.08572748968794 108.44997940353794 66.74864201896122 68.74850623532309
-080.317 108.44997940353794 109.81423131738796 66.74864201896122 68.74850623532309
-081.317 109.81423131738796 111.17848323128796 66.74864201896122 68.74850623532309
-082.317 111.17848323128796 112.54273514518795 66.74864201896122 68.74850623532309
-083.317 112.54273514518795 113.90698705908795 66.74864201896122 68.74850623532309
-084.317 113.90698705908795 115.27123897298794 66.74864201896122 68.74850623532309
-085.317 115.27123897298794 116.63549088688796 66.74864201896122 68.74850623532309
-086.317 116.63549088688796 117.99974280073796 66.74864201896122 68.74850623532309
-087.317 117.99974280073796 119.36399471458796 66.74864201896122 68.74850623532309
-088.317 119.36399471458796 120.75016323561114 66.74864201896122 68.74850623532309
-071.318 98.33172772596913 99.74935911755605 68.74850623532309 69.24846676105042
-072.318 99.74935911755605 101.14457317235605 68.74850623532309 69.24846676105042
-073.318 101.14457317235605 102.53978722715604 68.74850623532309 69.24846676105042
-074.318 102.53978722715604 103.93500128200606 68.74850623532309 69.24846676105042
-075.318 103.93500128200606 105.33021533685604 68.74850623532309 69.24846676105042
-076.318 105.33021533685604 106.72542939165604 68.74850623532309 69.24846676105042
-077.318 106.72542939165604 108.12064344645604 68.74850623532309 69.24846676105042
-078.318 108.12064344645604 109.51585750125604 68.74850623532309 69.24846676105042
-079.318 109.51585750125604 110.91107155605604 68.74850623532309 69.24846676105042
-080.318 110.91107155605604 112.30628561085604 68.74850623532309 69.24846676105042
-081.318 112.30628561085604 113.70149966565604 68.74850623532309 69.24846676105042
-082.318 113.70149966565604 115.09671372050605 68.74850623532309 69.24846676105042
-083.318 115.09671372050605 116.49192777535605 68.74850623532309 69.24846676105042
-084.318 116.49192777535605 117.88714183015603 68.74850623532309 69.24846676105042
-085.318 117.88714183015603 119.28235588495605 68.74850623532309 69.24846676105042
-086.318 119.28235588495605 120.69998727654297 68.74850623532309 69.24846676105042
-070.319 99.19510391155953 100.6457727501001 69.24846676105042 69.74842542561765
-071.319 100.6457727501001 102.07349822580011 69.24846676105042 69.74842542561765
-072.319 102.07349822580011 103.50122370150011 69.24846676105042 69.74842542561765
-073.319 103.50122370150011 104.92894917720011 69.24846676105042 69.74842542561765
-074.319 104.92894917720011 106.3566746529001 69.24846676105042 69.74842542561765
-075.319 106.3566746529001 107.78440012860011 69.24846676105042 69.74842542561765
-076.319 107.78440012860011 109.2121256043001 69.24846676105042 69.74842542561765
-077.319 109.2121256043001 110.63985108000011 69.24846676105042 69.74842542561765
-078.319 110.63985108000011 112.0675765557001 69.24846676105042 69.74842542561765
-079.319 112.0675765557001 113.4953020314001 69.24846676105042 69.74842542561765
-080.319 113.4953020314001 114.9230275071001 69.24846676105042 69.74842542561765
-081.319 114.9230275071001 116.35075298280012 69.24846676105042 69.74842542561765
-082.319 116.35075298280012 117.77847845845011 69.24846676105042 69.74842542561765
-083.319 117.77847845845011 119.20620393410013 69.24846676105042 69.74842542561765
-084.319 119.20620393410013 120.63392940980012 69.24846676105042 69.74842542561765
-085.319 120.63392940980012 122.08459824834067 69.24846676105042 69.74842542561765
-068.320 98.64556871444923 100.1309675199425 69.74842542561765 70.25639136484793
-069.320 100.1309675199425 101.5928697200425 69.74842542561765 70.25639136484793
-070.320 101.5928697200425 103.0547719201425 69.74842542561765 70.25639136484793
-071.320 103.0547719201425 104.5166741202425 69.74842542561765 70.25639136484793
-072.320 104.5166741202425 105.97857632034251 69.74842542561765 70.25639136484793
-073.320 105.97857632034251 107.44047852039253 69.74842542561765 70.25639136484793
-074.320 107.44047852039253 108.90238072044251 69.74842542561765 70.25639136484793
-075.320 108.90238072044251 110.36428292054251 69.74842542561765 70.25639136484793
-076.320 110.36428292054251 111.8261851206425 69.74842542561765 70.25639136484793
-077.320 111.8261851206425 113.2880873207425 69.74842542561765 70.25639136484793
-078.320 113.2880873207425 114.74998952079252 69.74842542561765 70.25639136484793
-079.320 114.74998952079252 116.21189172084252 69.74842542561765 70.25639136484793
-080.320 116.21189172084252 117.67379392094252 69.74842542561765 70.25639136484793
-081.320 117.67379392094252 119.13569612104251 69.74842542561765 70.25639136484793
-082.320 119.13569612104251 120.5975983211425 69.74842542561765 70.25639136484793
-083.320 120.5975983211425 122.0829971266358 69.74842542561765 70.25639136484793
-066.321 98.07671817936645 99.59866952053102 70.24037281008577 70.7563458317989
-067.321 99.59866952053102 101.09654167678102 70.24037281008577 70.7563458317989
-068.321 101.09654167678102 102.59441383303101 70.24037281008577 70.7563458317989
-069.321 102.59441383303101 104.09228598923102 70.24037281008577 70.7563458317989
-070.321 104.09228598923102 105.59015814543102 70.24037281008577 70.7563458317989
-071.321 105.59015814543102 107.08803030163102 70.24037281008577 70.7563458317989
-072.321 107.08803030163102 108.58590245783101 70.24037281008577 70.7563458317989
-073.321 108.58590245783101 110.08377461403103 70.24037281008577 70.7563458317989
-074.321 110.08377461403103 111.58164677028103 70.24037281008577 70.7563458317989
-075.321 111.58164677028103 113.07951892653102 70.24037281008577 70.7563458317989
-076.321 113.07951892653102 114.57739108273103 70.24037281008577 70.7563458317989
-077.321 114.57739108273103 116.07526323893102 70.24037281008577 70.7563458317989
-078.321 116.07526323893102 117.573135395131 70.24037281008577 70.7563458317989
-079.321 117.573135395131 119.07100755133101 70.24037281008577 70.7563458317989
-080.321 119.07100755133101 120.56887970758102 70.24037281008577 70.7563458317989
-081.321 120.56887970758102 122.09083104879561 70.24037281008577 70.7563458317989
diff --git a/environment.yml b/environment.yml
index 548c7e618..b404c4268 100644
--- a/environment.yml
+++ b/environment.yml
@@ -18,6 +18,7 @@ dependencies:
   - numpy==1.22
   - pip:
     - cs_util
+    - mccd
     - modopt
     - PyQt5
     - pyqtgraph
diff --git a/example/cfis/config_exp_mccd.ini b/example/cfis/config_exp_mccd.ini
index 268ad3f91..e838f1733 100644
--- a/example/cfis/config_exp_mccd.ini
+++ b/example/cfis/config_exp_mccd.ini
@@ -21,7 +21,7 @@ RUN_NAME = run_sp_exp_SxSePsf
 # Module name, single string or comma-separated list of valid module runner names
 MODULE = sextractor_runner, setools_runner,
          mccd_preprocessing_runner, mccd_fit_val_runner,
-         mccd_merge_starcat_runner, mccd_plots_runner
+         merge_starcat_runner, mccd_plots_runner
 
 # Run mode, SMP or MPI
 MODE = SMP
@@ -129,7 +129,7 @@ MAKE_POST_PROCESS = FALSE
 
 [SETOOLS_RUNNER]
 
-INPUT_MODULE = sextractor_runner
+INPUT_MODULE = last:sextractor_runner
 
 # Note: Make sure this doe not match the SExtractor background images
 # (sexcat_background*)
diff --git a/scripts/python/get_number_objects.py b/scripts/python/get_number_objects.py
index 0f3ae41b1..073512d9f 100755
--- a/scripts/python/get_number_objects.py
+++ b/scripts/python/get_number_objects.py
@@ -177,94 +177,6 @@ class param
     return param
 
 
-def read_param_file(path, verbose=False):
-    """Return parameter list read from file
-
-    Parameters
-    ----------
-    path: str
-        input file name
-    verbose: bool, optional, default=False
-        verbose output if True
-
-    Returns
-    -------
-    list of str
-        parameter names
-
-    """
-    param_list = []
-
-    if path:
-
-        with open(path) as f:
-            for line in f:
-                if line.startswith('#'):
-                    continue 
-                entry = line.rstrip()
-                if not entry or entry == '':
-                    continue
-                param_list.append(entry)
-
-    if verbose:
-        if len(param_list) > 0: 
-            print(f'Copying {len(param_list)} columns', end='')
-        else:
-            print('Copying all columns', end='')
-        print(' into merged catalogue')
-
-    # Check for multiples
-    multiples = []
-    for param in param_list:
-        if param_list.count(param) > 1:
-            multiples.append(param)
-
-    if len(multiples) > 0:
-        print('The following parameters are more than one times '
-              'in the parameter file: ', end='')
-        for m in multiples:
-            print(m, end=' ')
-        print()
-        raise ValueError('Multiple identical keys found')
-
-    return param_list
-                            
-
-def get_data(path, hdu_num, param_list):
-    """Return data of selected columns from FITS file.
-
-    Parameters
-    ----------
-    path: str
-        input file name
-    hdu_num: int
-        HDU number
-    param_list: list of str
-        parameters to be extracted. If none, copy
-        all columns
-
-    Returns
-    -------
-    numpy array
-        data columns
-
-    """
-    hdu_list = fits.open(path)
-    hdu = hdu_list[hdu_num]
-
-    if param_list:
-        cols = []
-        for p in param_list:
-            cols.append(hdu.columns[p]) 
-        coldefs = fits.ColDefs(cols)
-        hdu_new = fits.BinTableHDU.from_columns(coldefs)
-        d = hdu_new.data
-    else:
-        d = hdu.data
-
-    return d
-
-
 def main(argv=None):
 
     # Set default parameters
@@ -289,18 +201,26 @@ def main(argv=None):
 
     # For v2
     module = "sextractor_runner"
+
+    # Get all sextractor output directories
     all_dir = get_all_dirs(run_log_file, module)
     paths = []
+
+    # Find tile runs
     for path in all_dir:
         if "run_sp_tile_Sx" in path:
             paths.append(path)
     paths = sorted(paths)
+
+    # Get latest run
     last_dir = paths[-1]
 
+    # Get all output SExtractor catalogues
     file_list = glob.glob(f'{last_dir}/{pattern}*.fits')
     if len(file_list) == 0:
         raise ValueError(f'No files {last_dir}/{pattern}*.fits found')
 
+    # Add up number of objects over all catalogues
     n_obj = 0
     hdu_no = -1
     for fpath in file_list:
@@ -308,6 +228,7 @@ def main(argv=None):
         header = hdu_list[-1].header
         n_obj += int(header['NAXIS2'])
 
+    # Compute average
     n_obj = int(n_obj / len(file_list))
 
     print(n_obj)
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index f2b9c03d1..7836a4f61 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -62,7 +62,7 @@ usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID]
    \tmax number of objects per parallel shape module call, \n
    \tdefault: unlimited; has precedent over --nsh_step\n
    TILE_ID_i\n
-   \ttile ID(s), e.g. 283.247 214.242\n
+   \ttile ID(s), e.g. 283.247 214.242, only with '-j 1'\n
 "
 
 ## Help if no arguments

From 8928c86c2ed9aaec5199b80dedbf92c7bcfbe1f2 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 09:56:54 +0000
Subject: [PATCH 120/207] summary bug fixed

---
 shapepipe/utilities/summary.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 0aedb4475..ae574e5c4 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -431,7 +431,8 @@ def output_missing_job(self):
             self.write_IDs_to_file(output_path, missing_IDs_all)
         else:
             #logging.warning("no missing IDs in output_missing_job")
-            os.unlink(output_path)
+            if os.path.exists(output_path):
+                os.unlink(output_path)
 
     @classmethod
     def get_last_full_path(self, base_and_subdir, matches):

From fc5a7df2ae9910dc01566f1b47d88a335a6f18ab Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 09:57:54 +0000
Subject: [PATCH 121/207] comment removed

---
 scripts/sh/curl_canfar_local.sh | 1 -
 1 file changed, 1 deletion(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index e745ebd06..3c2c73658 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -205,7 +205,6 @@ else
       echo "Split '$file_IDs' into $n_split batches of size $batch"
 
       count=1
-      #n_running=`stats_headless_canfar.py`
       n_running=`stats_jobs_canfar.sh`
       for batch in $prefix*; do
         echo "Number of running jobs = $n_running"

From e882df3376ab7c54471692c688ab68704c676018 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 09:59:15 +0000
Subject: [PATCH 122/207] style

---
 shapepipe/modules/mask_package/mask.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py
index a81ce18d0..fc40d1f30 100644
--- a/shapepipe/modules/mask_package/mask.py
+++ b/shapepipe/modules/mask_package/mask.py
@@ -102,7 +102,7 @@ def __init__(
         self._outname_base = outname_base
 
         # Search path for existing mask files
-        self._check_existing_dir= check_existing_dir
+        self._check_existing_dir = check_existing_dir
 
         # Set external star catalogue path if given
         if star_cat_path is not None:

From fde8fe9a00f3c221f4d3d5d8fbed41c6cef04975 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 11:03:58 +0100
Subject: [PATCH 123/207] Added DR5 tile list file

---
 auxdir/CFIS/tiles_202402/tiles_all.txt | 20859 +++++++++++++++++++++++
 1 file changed, 20859 insertions(+)
 create mode 100644 auxdir/CFIS/tiles_202402/tiles_all.txt

diff --git a/auxdir/CFIS/tiles_202402/tiles_all.txt b/auxdir/CFIS/tiles_202402/tiles_all.txt
new file mode 100644
index 000000000..97dce4eb3
--- /dev/null
+++ b/auxdir/CFIS/tiles_202402/tiles_all.txt
@@ -0,0 +1,20859 @@
+000.227
+000.228
+000.229
+000.230
+000.231
+000.232
+000.233
+000.234
+000.235
+000.236
+000.237
+000.238
+000.239
+000.240
+000.241
+000.242
+000.243
+000.244
+000.245
+000.246
+000.247
+000.248
+000.249
+000.250
+000.251
+000.252
+000.253
+000.254
+000.255
+001.227
+001.228
+001.229
+001.230
+001.231
+001.232
+001.233
+001.234
+001.235
+001.236
+001.237
+001.238
+001.239
+001.240
+001.241
+001.242
+001.243
+001.244
+001.245
+001.246
+001.247
+001.248
+001.249
+001.250
+001.251
+001.252
+001.253
+001.254
+001.255
+002.227
+002.228
+002.229
+002.230
+002.231
+002.232
+002.233
+002.234
+002.235
+002.236
+002.237
+002.238
+002.239
+002.240
+002.241
+002.242
+002.243
+002.244
+002.245
+002.246
+002.247
+002.248
+002.249
+002.250
+002.251
+002.252
+002.253
+002.254
+002.255
+003.227
+003.228
+003.229
+003.230
+003.231
+003.232
+003.233
+003.234
+003.235
+003.236
+003.237
+003.238
+003.239
+003.240
+003.241
+003.242
+003.243
+003.244
+003.245
+003.246
+003.247
+003.248
+003.249
+003.250
+003.251
+003.252
+003.253
+003.254
+003.255
+004.227
+004.228
+004.229
+004.230
+004.231
+004.232
+004.233
+004.234
+004.235
+004.236
+004.237
+004.238
+004.239
+004.240
+004.241
+004.242
+004.243
+004.244
+004.245
+004.246
+004.247
+004.248
+004.249
+004.250
+004.251
+004.252
+004.253
+004.254
+004.255
+005.227
+005.228
+005.229
+005.230
+005.231
+005.232
+005.233
+005.234
+005.235
+005.236
+005.237
+005.238
+005.239
+005.240
+005.241
+005.242
+005.243
+005.244
+005.245
+005.246
+005.247
+005.248
+005.249
+005.250
+005.251
+005.252
+005.253
+005.254
+005.255
+006.227
+006.228
+006.229
+006.230
+006.231
+006.232
+006.233
+006.234
+006.235
+006.236
+006.237
+006.238
+006.239
+006.240
+006.241
+006.242
+006.243
+006.244
+006.245
+006.246
+006.247
+006.248
+006.249
+006.250
+006.251
+006.252
+006.253
+006.254
+006.255
+007.227
+007.228
+007.229
+007.230
+007.231
+007.232
+007.233
+007.234
+007.235
+007.236
+007.237
+007.238
+007.239
+007.240
+007.241
+007.242
+007.243
+007.244
+007.245
+007.246
+007.247
+007.248
+007.249
+007.250
+007.251
+007.252
+007.253
+007.254
+007.255
+008.227
+008.228
+008.229
+008.230
+008.231
+008.232
+008.233
+008.234
+008.235
+008.236
+008.237
+008.238
+008.239
+008.240
+008.241
+008.242
+008.243
+008.244
+008.245
+008.246
+008.247
+008.248
+008.249
+008.250
+008.251
+008.252
+008.253
+008.254
+008.255
+009.227
+009.228
+009.229
+009.230
+009.231
+009.232
+009.233
+009.234
+009.235
+009.236
+009.237
+009.238
+009.239
+009.240
+009.241
+009.242
+009.243
+009.244
+009.245
+009.246
+009.247
+009.248
+009.249
+009.250
+009.251
+009.252
+009.253
+009.254
+009.255
+010.227
+010.228
+010.229
+010.230
+010.231
+010.232
+010.233
+010.234
+010.235
+010.236
+010.237
+010.238
+010.239
+010.240
+010.241
+010.242
+010.243
+010.244
+010.245
+010.246
+010.247
+010.248
+010.249
+010.250
+010.251
+010.252
+010.253
+010.254
+010.255
+011.227
+011.228
+011.229
+011.230
+011.231
+011.232
+011.233
+011.234
+011.235
+011.236
+011.237
+011.238
+011.239
+011.240
+011.241
+011.242
+011.243
+011.244
+011.245
+011.246
+011.247
+011.248
+011.249
+011.250
+011.251
+011.252
+011.253
+011.254
+011.255
+012.227
+012.228
+012.229
+012.230
+012.231
+012.232
+012.233
+012.234
+012.235
+012.236
+012.237
+012.238
+012.239
+012.240
+012.241
+012.242
+012.243
+012.244
+012.245
+012.246
+012.247
+012.248
+012.249
+012.250
+012.251
+012.252
+012.253
+012.254
+012.255
+013.227
+013.228
+013.229
+013.230
+013.231
+013.232
+013.233
+013.234
+013.235
+013.236
+013.237
+013.238
+013.239
+013.240
+013.241
+013.242
+013.243
+013.244
+013.245
+013.246
+013.247
+013.248
+013.249
+013.250
+013.251
+013.252
+013.253
+013.254
+013.255
+014.227
+014.228
+014.229
+014.230
+014.231
+014.232
+014.233
+014.234
+014.235
+014.236
+014.237
+014.238
+014.239
+014.240
+014.241
+014.242
+014.243
+014.244
+014.245
+014.246
+014.247
+014.248
+014.249
+014.250
+014.251
+014.252
+014.253
+014.254
+014.255
+015.227
+015.228
+015.229
+015.230
+015.231
+015.232
+015.233
+015.234
+015.235
+015.236
+015.237
+015.238
+015.239
+015.240
+015.241
+015.242
+015.243
+015.244
+015.245
+015.246
+015.247
+015.248
+015.249
+015.250
+015.251
+015.252
+015.253
+015.254
+015.255
+016.227
+016.228
+016.229
+016.230
+016.231
+016.232
+016.233
+016.234
+016.235
+016.236
+016.237
+016.238
+016.239
+016.240
+016.241
+016.242
+016.243
+016.244
+016.245
+016.246
+016.247
+016.248
+016.249
+016.250
+016.251
+016.252
+016.253
+016.254
+016.255
+017.227
+017.228
+017.229
+017.230
+017.231
+017.232
+017.233
+017.234
+017.235
+017.236
+017.237
+017.238
+017.239
+017.240
+017.241
+017.242
+017.243
+017.244
+017.245
+017.246
+017.247
+017.248
+017.249
+017.250
+017.251
+017.252
+017.253
+017.254
+017.255
+018.227
+018.228
+018.229
+018.230
+018.231
+018.232
+018.233
+018.234
+018.235
+018.236
+018.237
+018.238
+018.239
+018.240
+018.241
+018.242
+018.243
+018.244
+018.245
+018.246
+018.247
+018.248
+018.249
+018.250
+018.251
+018.252
+018.253
+018.254
+018.255
+019.227
+019.228
+019.229
+019.230
+019.231
+019.232
+019.233
+019.234
+019.235
+019.236
+019.237
+019.238
+019.239
+019.240
+019.241
+019.242
+019.243
+019.244
+019.245
+019.246
+019.247
+019.248
+019.249
+019.250
+019.251
+019.252
+019.253
+019.254
+019.255
+020.227
+020.228
+020.229
+020.230
+020.231
+020.232
+020.233
+020.234
+020.235
+020.236
+020.237
+020.238
+020.239
+020.240
+020.241
+020.242
+020.243
+020.244
+020.245
+020.246
+020.247
+020.248
+020.249
+020.250
+020.251
+020.252
+020.253
+020.254
+020.255
+021.228
+021.229
+021.230
+021.231
+021.232
+021.233
+021.234
+021.235
+021.236
+021.237
+021.238
+021.239
+021.240
+021.241
+021.242
+021.243
+021.244
+021.245
+021.246
+021.247
+021.248
+021.249
+021.250
+021.251
+021.252
+021.253
+021.254
+021.255
+022.228
+022.229
+022.230
+022.231
+022.232
+022.233
+022.234
+022.235
+022.236
+022.237
+022.238
+022.239
+022.240
+022.241
+022.242
+022.243
+022.244
+022.245
+022.246
+022.247
+022.248
+022.249
+022.250
+022.251
+022.252
+022.253
+022.254
+022.255
+023.228
+023.229
+023.230
+023.231
+023.232
+023.233
+023.234
+023.235
+023.236
+023.237
+023.238
+023.239
+023.240
+023.241
+023.242
+023.243
+023.244
+023.245
+023.246
+023.247
+023.248
+023.249
+023.250
+023.251
+023.252
+023.253
+023.254
+023.255
+024.228
+024.229
+024.230
+024.231
+024.232
+024.233
+024.234
+024.235
+024.236
+024.237
+024.238
+024.239
+024.240
+024.241
+024.242
+024.243
+024.244
+024.245
+024.246
+024.247
+024.248
+024.249
+024.250
+024.251
+024.252
+024.253
+024.254
+024.255
+024.350
+025.228
+025.229
+025.230
+025.231
+025.232
+025.233
+025.234
+025.235
+025.236
+025.237
+025.238
+025.239
+025.240
+025.241
+025.242
+025.243
+025.244
+025.245
+025.246
+025.247
+025.248
+025.249
+025.250
+025.251
+025.252
+025.253
+025.254
+025.255
+025.350
+026.228
+026.229
+026.230
+026.231
+026.232
+026.233
+026.234
+026.235
+026.236
+026.237
+026.238
+026.239
+026.240
+026.241
+026.242
+026.243
+026.244
+026.245
+026.246
+026.247
+026.248
+026.249
+026.250
+026.251
+026.252
+026.253
+026.254
+026.255
+026.349
+027.228
+027.229
+027.230
+027.231
+027.232
+027.233
+027.234
+027.235
+027.236
+027.237
+027.238
+027.239
+027.240
+027.241
+027.242
+027.243
+027.244
+027.245
+027.246
+027.247
+027.248
+027.249
+027.250
+027.251
+027.252
+027.253
+027.254
+027.255
+027.349
+027.350
+028.228
+028.229
+028.230
+028.231
+028.232
+028.233
+028.234
+028.235
+028.236
+028.237
+028.238
+028.239
+028.240
+028.241
+028.242
+028.243
+028.244
+028.245
+028.246
+028.247
+028.248
+028.249
+028.250
+028.251
+028.252
+028.253
+028.254
+028.255
+028.346
+028.348
+028.349
+028.350
+029.228
+029.229
+029.230
+029.231
+029.232
+029.233
+029.234
+029.235
+029.236
+029.237
+029.238
+029.239
+029.240
+029.241
+029.242
+029.243
+029.244
+029.245
+029.246
+029.247
+029.248
+029.249
+029.250
+029.251
+029.252
+029.253
+029.254
+029.255
+029.346
+029.348
+029.349
+030.228
+030.229
+030.230
+030.231
+030.232
+030.233
+030.234
+030.235
+030.236
+030.237
+030.238
+030.239
+030.240
+030.241
+030.242
+030.243
+030.244
+030.245
+030.246
+030.247
+030.248
+030.249
+030.250
+030.251
+030.252
+030.253
+030.254
+030.255
+030.345
+030.346
+030.347
+030.348
+030.349
+031.228
+031.229
+031.230
+031.231
+031.232
+031.233
+031.234
+031.235
+031.236
+031.237
+031.238
+031.239
+031.240
+031.241
+031.242
+031.243
+031.244
+031.245
+031.246
+031.247
+031.248
+031.249
+031.250
+031.251
+031.252
+031.253
+031.254
+031.255
+031.345
+031.346
+031.347
+031.349
+032.228
+032.229
+032.230
+032.231
+032.232
+032.233
+032.234
+032.235
+032.236
+032.237
+032.238
+032.239
+032.240
+032.241
+032.242
+032.243
+032.244
+032.245
+032.246
+032.247
+032.248
+032.249
+032.250
+032.251
+032.252
+032.253
+032.254
+032.255
+032.344
+032.345
+032.346
+032.347
+032.348
+033.228
+033.229
+033.230
+033.231
+033.232
+033.233
+033.234
+033.235
+033.236
+033.237
+033.238
+033.239
+033.240
+033.241
+033.242
+033.243
+033.244
+033.245
+033.246
+033.247
+033.248
+033.249
+033.250
+033.251
+033.252
+033.253
+033.254
+033.255
+033.344
+033.345
+033.346
+033.347
+033.348
+034.228
+034.229
+034.230
+034.231
+034.232
+034.233
+034.234
+034.235
+034.236
+034.237
+034.238
+034.239
+034.240
+034.241
+034.242
+034.243
+034.244
+034.245
+034.246
+034.247
+034.248
+034.249
+034.250
+034.251
+034.252
+034.253
+034.254
+034.255
+034.343
+034.344
+034.345
+034.346
+034.348
+035.221
+035.222
+035.223
+035.228
+035.229
+035.230
+035.231
+035.232
+035.233
+035.234
+035.235
+035.236
+035.237
+035.238
+035.239
+035.240
+035.241
+035.242
+035.243
+035.244
+035.245
+035.246
+035.247
+035.248
+035.249
+035.250
+035.251
+035.252
+035.253
+035.254
+035.255
+035.343
+035.344
+035.345
+035.346
+035.347
+036.221
+036.222
+036.223
+036.228
+036.229
+036.230
+036.231
+036.232
+036.233
+036.234
+036.235
+036.236
+036.237
+036.238
+036.239
+036.240
+036.241
+036.242
+036.243
+036.244
+036.245
+036.246
+036.247
+036.248
+036.249
+036.250
+036.251
+036.252
+036.253
+036.343
+036.344
+036.345
+036.346
+036.347
+037.221
+037.222
+037.223
+037.224
+037.228
+037.229
+037.230
+037.231
+037.232
+037.233
+037.234
+037.235
+037.236
+037.237
+037.238
+037.239
+037.240
+037.241
+037.242
+037.243
+037.244
+037.245
+037.246
+037.247
+037.248
+037.249
+037.250
+037.251
+037.252
+037.253
+037.343
+037.344
+037.345
+037.346
+037.347
+038.221
+038.222
+038.223
+038.224
+038.229
+038.230
+038.231
+038.232
+038.233
+038.234
+038.235
+038.236
+038.237
+038.238
+038.239
+038.240
+038.241
+038.242
+038.243
+038.244
+038.245
+038.246
+038.247
+038.248
+038.249
+038.250
+038.251
+038.252
+038.253
+038.343
+038.344
+038.345
+038.346
+039.221
+039.222
+039.223
+039.224
+039.230
+039.231
+039.232
+039.233
+039.234
+039.235
+039.236
+039.237
+039.238
+039.239
+039.240
+039.241
+039.242
+039.243
+039.244
+039.245
+039.246
+039.247
+039.248
+039.249
+039.250
+039.251
+039.252
+039.253
+039.343
+039.344
+039.345
+039.346
+040.221
+040.222
+040.223
+040.224
+040.230
+040.231
+040.232
+040.233
+040.234
+040.235
+040.236
+040.237
+040.238
+040.239
+040.240
+040.241
+040.242
+040.243
+040.244
+040.245
+040.246
+040.247
+040.248
+040.249
+040.250
+040.251
+040.252
+040.253
+040.343
+040.344
+040.345
+040.346
+041.222
+041.223
+041.224
+041.230
+041.231
+041.232
+041.233
+041.234
+041.235
+041.236
+041.237
+041.238
+041.239
+041.240
+041.241
+041.242
+041.243
+041.244
+041.245
+041.246
+041.247
+041.248
+041.249
+041.250
+041.251
+041.252
+041.253
+041.343
+041.344
+041.345
+042.230
+042.231
+042.232
+042.233
+042.234
+042.235
+042.236
+042.237
+042.238
+042.239
+042.240
+042.241
+042.242
+042.243
+042.244
+042.245
+042.246
+042.247
+042.248
+042.249
+042.250
+042.251
+042.252
+042.253
+042.342
+042.343
+042.344
+042.345
+043.230
+043.231
+043.232
+043.233
+043.234
+043.235
+043.236
+043.237
+043.238
+043.239
+043.240
+043.241
+043.242
+043.243
+043.244
+043.245
+043.246
+043.247
+043.248
+043.249
+043.250
+043.251
+043.252
+043.253
+043.342
+043.343
+043.344
+043.345
+044.230
+044.231
+044.232
+044.233
+044.234
+044.235
+044.236
+044.237
+044.238
+044.239
+044.240
+044.241
+044.242
+044.243
+044.244
+044.245
+044.246
+044.247
+044.248
+044.249
+044.250
+044.251
+044.252
+044.253
+044.342
+044.343
+044.344
+045.230
+045.231
+045.232
+045.233
+045.234
+045.235
+045.236
+045.237
+045.238
+045.239
+045.240
+045.241
+045.242
+045.243
+045.244
+045.245
+045.246
+045.247
+045.248
+045.249
+045.250
+045.251
+045.252
+045.253
+045.342
+045.343
+045.344
+046.230
+046.231
+046.232
+046.233
+046.234
+046.235
+046.236
+046.237
+046.238
+046.239
+046.240
+046.241
+046.242
+046.243
+046.244
+046.245
+046.246
+046.247
+046.248
+046.249
+046.250
+046.251
+046.252
+046.253
+046.342
+046.343
+046.344
+047.230
+047.231
+047.232
+047.233
+047.234
+047.235
+047.236
+047.237
+047.238
+047.239
+047.240
+047.241
+047.242
+047.243
+047.244
+047.245
+047.246
+047.247
+047.248
+047.249
+047.250
+047.251
+047.252
+047.253
+047.341
+047.342
+047.343
+048.230
+048.231
+048.232
+048.233
+048.234
+048.235
+048.236
+048.237
+048.238
+048.239
+048.240
+048.241
+048.242
+048.243
+048.244
+048.245
+048.246
+048.247
+048.248
+048.249
+048.250
+048.251
+048.252
+048.253
+048.340
+048.341
+048.342
+048.343
+049.230
+049.231
+049.232
+049.233
+049.234
+049.235
+049.236
+049.237
+049.238
+049.239
+049.240
+049.241
+049.242
+049.243
+049.244
+049.245
+049.246
+049.247
+049.248
+049.249
+049.250
+049.251
+049.340
+049.341
+049.342
+050.232
+050.233
+050.234
+050.235
+050.236
+050.237
+050.238
+050.239
+050.240
+050.241
+050.242
+050.243
+050.244
+050.245
+050.246
+050.247
+050.248
+050.249
+050.250
+050.251
+050.339
+050.340
+050.341
+050.342
+051.217
+051.218
+051.219
+051.232
+051.233
+051.234
+051.235
+051.236
+051.237
+051.238
+051.239
+051.240
+051.241
+051.242
+051.243
+051.244
+051.245
+051.246
+051.247
+051.248
+051.249
+051.250
+051.251
+051.339
+051.340
+051.341
+052.217
+052.218
+052.219
+052.233
+052.234
+052.235
+052.236
+052.237
+052.238
+052.239
+052.240
+052.241
+052.242
+052.243
+052.244
+052.245
+052.246
+052.247
+052.248
+052.249
+052.250
+052.251
+052.332
+052.338
+052.339
+052.340
+053.217
+053.218
+053.219
+053.233
+053.234
+053.235
+053.236
+053.237
+053.238
+053.239
+053.240
+053.241
+053.242
+053.243
+053.244
+053.245
+053.246
+053.247
+053.248
+053.249
+053.250
+053.251
+053.331
+053.332
+053.338
+053.339
+053.340
+054.217
+054.218
+054.219
+054.233
+054.234
+054.235
+054.236
+054.237
+054.238
+054.239
+054.240
+054.241
+054.242
+054.243
+054.244
+054.245
+054.246
+054.247
+054.248
+054.249
+054.250
+054.251
+054.331
+054.332
+054.337
+054.338
+054.339
+054.340
+055.221
+055.222
+055.236
+055.237
+055.238
+055.239
+055.240
+055.241
+055.242
+055.243
+055.244
+055.245
+055.246
+055.247
+055.248
+055.249
+055.250
+055.251
+055.330
+055.331
+055.332
+055.337
+055.338
+055.339
+056.220
+056.221
+056.222
+056.238
+056.239
+056.240
+056.241
+056.242
+056.243
+056.244
+056.245
+056.246
+056.247
+056.248
+056.249
+056.250
+056.251
+056.330
+056.331
+056.332
+056.336
+056.337
+056.338
+056.339
+057.220
+057.221
+057.222
+057.238
+057.239
+057.240
+057.241
+057.242
+057.243
+057.244
+057.245
+057.246
+057.247
+057.248
+057.249
+057.250
+057.329
+057.330
+057.331
+057.332
+057.336
+057.337
+057.338
+057.345
+058.220
+058.221
+058.238
+058.239
+058.240
+058.241
+058.242
+058.243
+058.244
+058.245
+058.246
+058.247
+058.248
+058.249
+058.250
+058.329
+058.330
+058.331
+058.332
+058.336
+058.337
+058.338
+058.345
+059.238
+059.239
+059.240
+059.241
+059.242
+059.243
+059.244
+059.245
+059.246
+059.247
+059.248
+059.249
+059.250
+059.328
+059.329
+059.330
+059.331
+059.332
+059.335
+059.336
+059.337
+059.338
+059.343
+059.345
+060.238
+060.239
+060.240
+060.241
+060.242
+060.243
+060.244
+060.245
+060.246
+060.247
+060.248
+060.249
+060.250
+060.328
+060.329
+060.330
+060.331
+060.332
+060.334
+060.335
+060.336
+060.337
+060.338
+060.343
+060.344
+061.238
+061.239
+061.240
+061.241
+061.242
+061.243
+061.244
+061.245
+061.246
+061.247
+061.248
+061.327
+061.328
+061.329
+061.330
+061.331
+061.332
+061.334
+061.335
+061.336
+061.337
+061.338
+061.343
+061.344
+062.238
+062.239
+062.240
+062.241
+062.242
+062.243
+062.244
+062.245
+062.246
+062.247
+062.248
+062.326
+062.327
+062.328
+062.329
+062.330
+062.331
+062.332
+062.333
+062.334
+062.335
+062.336
+062.337
+062.343
+062.344
+063.238
+063.239
+063.240
+063.241
+063.242
+063.243
+063.244
+063.245
+063.246
+063.247
+063.325
+063.326
+063.327
+063.328
+063.329
+063.330
+063.331
+063.332
+063.333
+063.334
+063.335
+063.336
+063.337
+063.342
+063.343
+063.344
+064.238
+064.239
+064.240
+064.241
+064.242
+064.324
+064.325
+064.326
+064.327
+064.328
+064.329
+064.330
+064.331
+064.332
+064.333
+064.334
+064.335
+064.336
+064.337
+064.342
+064.343
+065.240
+065.241
+065.324
+065.325
+065.326
+065.327
+065.328
+065.329
+065.330
+065.331
+065.332
+065.333
+065.334
+065.335
+065.336
+065.337
+065.341
+065.342
+065.343
+066.168
+066.169
+066.170
+066.171
+066.172
+066.173
+066.174
+066.321
+066.323
+066.324
+066.325
+066.326
+066.327
+066.328
+066.329
+066.330
+066.331
+066.332
+066.333
+066.334
+066.335
+066.336
+066.337
+066.341
+066.342
+066.343
+067.168
+067.169
+067.170
+067.171
+067.172
+067.173
+067.174
+067.321
+067.322
+067.323
+067.324
+067.325
+067.326
+067.327
+067.328
+067.329
+067.330
+067.331
+067.332
+067.333
+067.334
+067.335
+067.336
+067.337
+067.341
+067.342
+067.343
+068.167
+068.168
+068.169
+068.170
+068.171
+068.172
+068.173
+068.174
+068.320
+068.321
+068.322
+068.323
+068.324
+068.325
+068.326
+068.327
+068.328
+068.329
+068.330
+068.331
+068.332
+068.333
+068.334
+068.335
+068.336
+068.337
+068.340
+068.341
+068.342
+068.343
+069.167
+069.168
+069.169
+069.170
+069.171
+069.172
+069.173
+069.174
+069.319
+069.320
+069.321
+069.322
+069.323
+069.324
+069.325
+069.326
+069.327
+069.328
+069.329
+069.330
+069.331
+069.332
+069.333
+069.334
+069.335
+069.336
+069.337
+069.340
+069.341
+069.342
+069.343
+070.167
+070.168
+070.169
+070.170
+070.171
+070.172
+070.173
+070.174
+070.319
+070.320
+070.321
+070.322
+070.323
+070.324
+070.325
+070.326
+070.327
+070.328
+070.329
+070.330
+070.331
+070.332
+070.333
+070.334
+070.335
+070.336
+070.337
+070.340
+070.341
+070.342
+070.343
+071.167
+071.168
+071.169
+071.170
+071.171
+071.172
+071.173
+071.174
+071.318
+071.319
+071.320
+071.321
+071.322
+071.323
+071.324
+071.325
+071.326
+071.327
+071.328
+071.329
+071.330
+071.331
+071.332
+071.333
+071.334
+071.335
+071.336
+071.337
+071.340
+071.341
+071.342
+071.343
+072.167
+072.168
+072.169
+072.170
+072.171
+072.172
+072.173
+072.174
+072.318
+072.319
+072.320
+072.321
+072.322
+072.323
+072.324
+072.325
+072.326
+072.327
+072.328
+072.329
+072.330
+072.331
+072.332
+072.333
+072.334
+072.335
+072.336
+072.337
+072.339
+072.340
+072.341
+072.342
+072.343
+073.167
+073.168
+073.169
+073.170
+073.171
+073.172
+073.173
+073.174
+073.317
+073.318
+073.319
+073.320
+073.321
+073.322
+073.323
+073.324
+073.325
+073.326
+073.327
+073.328
+073.329
+073.330
+073.331
+073.332
+073.333
+073.334
+073.335
+073.336
+073.337
+073.339
+073.340
+073.341
+073.342
+074.167
+074.168
+074.169
+074.170
+074.171
+074.172
+074.173
+074.174
+074.317
+074.318
+074.319
+074.320
+074.321
+074.322
+074.323
+074.324
+074.325
+074.326
+074.327
+074.328
+074.329
+074.330
+074.331
+074.332
+074.333
+074.334
+074.335
+074.336
+074.337
+074.339
+074.340
+074.341
+074.342
+075.167
+075.168
+075.169
+075.170
+075.171
+075.172
+075.173
+075.174
+075.317
+075.318
+075.319
+075.320
+075.321
+075.322
+075.323
+075.324
+075.325
+075.326
+075.327
+075.328
+075.329
+075.330
+075.331
+075.332
+075.333
+075.334
+075.335
+075.336
+075.337
+075.338
+075.339
+075.340
+075.341
+075.342
+076.168
+076.169
+076.170
+076.171
+076.172
+076.173
+076.316
+076.317
+076.318
+076.319
+076.320
+076.321
+076.322
+076.323
+076.324
+076.325
+076.326
+076.327
+076.328
+076.329
+076.330
+076.331
+076.332
+076.333
+076.334
+076.335
+076.336
+076.337
+076.338
+076.339
+076.340
+076.341
+076.342
+077.316
+077.317
+077.318
+077.319
+077.320
+077.321
+077.322
+077.323
+077.324
+077.325
+077.326
+077.327
+077.328
+077.329
+077.330
+077.331
+077.332
+077.333
+077.334
+077.335
+077.336
+077.337
+077.338
+077.339
+077.340
+077.341
+077.342
+078.315
+078.316
+078.317
+078.318
+078.319
+078.320
+078.321
+078.322
+078.323
+078.324
+078.325
+078.326
+078.327
+078.328
+078.329
+078.330
+078.331
+078.332
+078.333
+078.334
+078.335
+078.336
+078.337
+078.338
+078.339
+078.340
+078.341
+079.314
+079.315
+079.316
+079.317
+079.318
+079.319
+079.320
+079.321
+079.322
+079.323
+079.324
+079.325
+079.326
+079.327
+079.328
+079.329
+079.330
+079.331
+079.332
+079.333
+079.334
+079.335
+079.336
+079.337
+079.338
+079.339
+079.340
+079.341
+079.343
+080.314
+080.315
+080.316
+080.317
+080.318
+080.319
+080.320
+080.321
+080.322
+080.323
+080.324
+080.325
+080.326
+080.327
+080.328
+080.329
+080.330
+080.331
+080.332
+080.333
+080.334
+080.335
+080.336
+080.337
+080.338
+080.339
+080.340
+080.341
+080.343
+081.313
+081.314
+081.315
+081.316
+081.317
+081.318
+081.319
+081.320
+081.321
+081.322
+081.323
+081.324
+081.325
+081.326
+081.327
+081.328
+081.329
+081.330
+081.331
+081.332
+081.333
+081.334
+081.335
+081.336
+081.337
+081.338
+081.339
+081.341
+081.343
+082.312
+082.313
+082.314
+082.315
+082.316
+082.317
+082.318
+082.319
+082.320
+082.321
+082.322
+082.323
+082.324
+082.325
+082.326
+082.327
+082.328
+082.329
+082.330
+082.331
+082.333
+082.334
+082.335
+082.336
+082.337
+082.338
+082.339
+083.312
+083.313
+083.314
+083.315
+083.316
+083.317
+083.318
+083.319
+083.320
+083.321
+083.322
+083.323
+083.324
+083.325
+083.326
+083.327
+083.328
+083.329
+083.330
+083.331
+083.333
+083.334
+083.335
+083.336
+083.337
+083.338
+083.339
+083.342
+084.311
+084.312
+084.313
+084.314
+084.315
+084.316
+084.317
+084.318
+084.319
+084.320
+084.321
+084.322
+084.323
+084.324
+084.325
+084.326
+084.327
+084.328
+084.329
+084.330
+084.331
+084.332
+084.333
+084.334
+084.335
+084.336
+084.337
+084.338
+084.339
+084.342
+085.311
+085.312
+085.313
+085.314
+085.315
+085.316
+085.317
+085.318
+085.319
+085.320
+085.321
+085.322
+085.323
+085.324
+085.325
+085.326
+085.327
+085.328
+085.329
+085.330
+085.331
+085.332
+085.333
+085.334
+085.335
+085.336
+085.337
+085.338
+085.342
+086.310
+086.311
+086.312
+086.313
+086.314
+086.315
+086.316
+086.317
+086.318
+086.319
+086.320
+086.321
+086.322
+086.323
+086.324
+086.325
+086.326
+086.327
+086.328
+086.329
+086.330
+086.332
+086.333
+086.334
+086.335
+086.336
+086.337
+086.338
+086.342
+087.310
+087.311
+087.312
+087.313
+087.314
+087.315
+087.316
+087.317
+087.318
+087.319
+087.320
+087.321
+087.322
+087.323
+087.324
+087.325
+087.326
+087.327
+087.328
+087.329
+087.330
+087.331
+087.332
+087.333
+087.334
+087.335
+087.336
+087.337
+087.338
+087.339
+087.341
+087.342
+088.309
+088.310
+088.311
+088.312
+088.313
+088.314
+088.315
+088.316
+088.317
+088.318
+088.319
+088.320
+088.321
+088.322
+088.323
+088.324
+088.325
+088.326
+088.327
+088.328
+088.329
+088.330
+088.331
+088.332
+088.333
+088.334
+088.335
+088.336
+088.337
+088.339
+088.341
+089.309
+089.310
+089.311
+089.312
+089.313
+089.314
+089.315
+089.316
+089.317
+089.318
+089.319
+089.320
+089.321
+089.322
+089.323
+089.324
+089.325
+089.326
+089.327
+089.328
+089.329
+089.330
+089.331
+089.333
+089.334
+089.335
+089.336
+089.337
+089.339
+089.341
+090.302
+090.309
+090.310
+090.311
+090.312
+090.313
+090.314
+090.315
+090.316
+090.317
+090.318
+090.319
+090.320
+090.321
+090.322
+090.323
+090.324
+090.325
+090.326
+090.327
+090.328
+090.329
+090.330
+090.331
+090.332
+090.333
+090.334
+090.335
+090.336
+090.337
+090.339
+090.341
+091.301
+091.302
+091.308
+091.309
+091.310
+091.311
+091.312
+091.313
+091.314
+091.315
+091.316
+091.317
+091.318
+091.319
+091.320
+091.321
+091.322
+091.323
+091.324
+091.325
+091.326
+091.328
+091.329
+091.330
+091.331
+091.332
+091.333
+091.334
+091.335
+091.336
+091.337
+091.338
+091.339
+091.341
+092.301
+092.302
+092.308
+092.309
+092.310
+092.311
+092.312
+092.313
+092.314
+092.315
+092.316
+092.317
+092.318
+092.319
+092.320
+092.321
+092.322
+092.323
+092.324
+092.325
+092.326
+092.328
+092.329
+092.330
+092.331
+092.332
+092.333
+092.334
+092.335
+092.336
+092.337
+092.338
+092.340
+092.341
+093.300
+093.301
+093.307
+093.308
+093.309
+093.310
+093.311
+093.312
+093.313
+093.314
+093.315
+093.316
+093.317
+093.318
+093.319
+093.320
+093.321
+093.322
+093.323
+093.324
+093.325
+093.328
+093.329
+093.330
+093.331
+093.332
+093.333
+093.334
+093.335
+093.336
+093.337
+093.338
+093.340
+094.300
+094.301
+094.306
+094.307
+094.308
+094.309
+094.310
+094.311
+094.312
+094.313
+094.314
+094.315
+094.316
+094.317
+094.318
+094.319
+094.320
+094.321
+094.322
+094.323
+094.327
+094.328
+094.329
+094.330
+094.331
+094.332
+094.333
+094.334
+094.335
+094.336
+094.337
+094.338
+094.340
+095.300
+095.306
+095.307
+095.308
+095.309
+095.310
+095.311
+095.312
+095.313
+095.314
+095.315
+095.316
+095.317
+095.318
+095.319
+095.320
+095.321
+095.322
+095.327
+095.328
+095.329
+095.330
+095.331
+095.332
+095.333
+095.334
+095.335
+095.336
+095.337
+095.338
+095.340
+096.305
+096.306
+096.307
+096.308
+096.309
+096.310
+096.311
+096.312
+096.313
+096.314
+096.315
+096.316
+096.317
+096.318
+096.319
+096.320
+096.321
+096.322
+096.327
+096.328
+096.329
+096.330
+096.331
+096.332
+096.333
+096.334
+096.335
+096.336
+096.337
+096.338
+096.340
+097.305
+097.306
+097.307
+097.308
+097.309
+097.310
+097.311
+097.312
+097.313
+097.314
+097.315
+097.316
+097.317
+097.318
+097.319
+097.320
+097.321
+097.322
+097.327
+097.328
+097.329
+097.330
+097.331
+097.332
+097.333
+097.334
+097.335
+097.336
+097.337
+098.304
+098.305
+098.306
+098.307
+098.308
+098.309
+098.310
+098.311
+098.312
+098.313
+098.314
+098.315
+098.316
+098.317
+098.318
+098.319
+098.320
+098.321
+098.322
+098.327
+098.328
+098.329
+098.330
+098.331
+098.332
+098.333
+098.334
+098.335
+098.336
+098.337
+098.338
+098.339
+099.303
+099.304
+099.305
+099.306
+099.307
+099.308
+099.309
+099.310
+099.311
+099.312
+099.313
+099.314
+099.315
+099.316
+099.317
+099.318
+099.319
+099.320
+099.321
+099.322
+099.327
+099.328
+099.329
+099.330
+099.331
+099.332
+099.333
+099.334
+099.335
+099.336
+099.337
+099.338
+099.339
+100.303
+100.304
+100.305
+100.306
+100.307
+100.308
+100.309
+100.310
+100.311
+100.312
+100.313
+100.314
+100.315
+100.316
+100.317
+100.318
+100.319
+100.320
+100.321
+100.322
+100.327
+100.328
+100.329
+100.330
+100.331
+100.332
+100.333
+100.334
+100.335
+100.336
+100.337
+100.338
+100.339
+101.302
+101.303
+101.304
+101.305
+101.306
+101.307
+101.308
+101.309
+101.310
+101.311
+101.312
+101.313
+101.314
+101.315
+101.316
+101.317
+101.318
+101.319
+101.320
+101.321
+101.322
+101.328
+101.329
+101.330
+101.331
+101.332
+101.333
+101.334
+101.335
+101.336
+101.337
+101.338
+101.339
+102.302
+102.303
+102.304
+102.305
+102.306
+102.307
+102.308
+102.309
+102.310
+102.311
+102.312
+102.313
+102.314
+102.315
+102.316
+102.317
+102.318
+102.319
+102.320
+102.321
+102.322
+102.327
+102.328
+102.329
+102.330
+102.331
+102.332
+102.333
+102.334
+102.335
+102.336
+102.337
+102.338
+103.301
+103.302
+103.303
+103.304
+103.305
+103.306
+103.307
+103.308
+103.309
+103.310
+103.311
+103.312
+103.313
+103.314
+103.315
+103.316
+103.317
+103.318
+103.319
+103.320
+103.321
+103.322
+103.327
+103.328
+103.329
+103.330
+103.331
+103.332
+103.333
+103.334
+103.335
+103.336
+103.337
+103.338
+104.301
+104.302
+104.303
+104.304
+104.305
+104.306
+104.307
+104.308
+104.309
+104.310
+104.311
+104.312
+104.313
+104.314
+104.315
+104.316
+104.317
+104.318
+104.319
+104.320
+104.321
+104.322
+104.327
+104.328
+104.329
+104.330
+104.331
+104.332
+104.333
+104.334
+104.335
+104.336
+104.337
+104.338
+105.301
+105.302
+105.303
+105.304
+105.305
+105.306
+105.307
+105.308
+105.309
+105.310
+105.311
+105.312
+105.313
+105.314
+105.315
+105.316
+105.317
+105.318
+105.319
+105.320
+105.321
+105.322
+105.326
+105.327
+105.328
+105.329
+105.330
+105.331
+105.332
+105.333
+105.334
+105.335
+105.336
+105.337
+105.338
+106.300
+106.301
+106.302
+106.303
+106.304
+106.305
+106.306
+106.307
+106.308
+106.309
+106.310
+106.311
+106.312
+106.313
+106.314
+106.315
+106.317
+106.318
+106.319
+106.320
+106.321
+106.326
+106.327
+106.328
+106.329
+106.330
+106.331
+106.332
+106.333
+106.334
+106.335
+106.336
+106.337
+106.338
+107.299
+107.300
+107.301
+107.302
+107.303
+107.304
+107.305
+107.306
+107.307
+107.308
+107.309
+107.310
+107.311
+107.312
+107.313
+107.314
+107.317
+107.318
+107.319
+107.320
+107.321
+107.326
+107.327
+107.328
+107.329
+107.330
+107.331
+107.332
+107.333
+107.334
+107.335
+107.336
+107.337
+108.299
+108.300
+108.301
+108.302
+108.303
+108.304
+108.305
+108.306
+108.307
+108.308
+108.309
+108.310
+108.311
+108.312
+108.313
+108.314
+108.317
+108.318
+108.319
+108.320
+108.321
+108.325
+108.326
+108.327
+108.328
+108.329
+108.330
+108.331
+108.332
+108.333
+108.334
+108.335
+108.336
+108.337
+109.298
+109.299
+109.300
+109.301
+109.302
+109.303
+109.304
+109.305
+109.306
+109.307
+109.308
+109.309
+109.310
+109.311
+109.312
+109.313
+109.317
+109.318
+109.319
+109.320
+109.325
+109.326
+109.327
+109.328
+109.329
+109.330
+109.331
+109.332
+109.333
+109.334
+109.335
+109.336
+109.337
+110.297
+110.298
+110.299
+110.300
+110.301
+110.302
+110.303
+110.304
+110.305
+110.306
+110.307
+110.308
+110.309
+110.310
+110.311
+110.312
+110.317
+110.318
+110.319
+110.320
+110.325
+110.326
+110.327
+110.328
+110.329
+110.330
+110.331
+110.332
+110.333
+110.334
+110.335
+110.336
+110.337
+111.297
+111.298
+111.299
+111.300
+111.301
+111.302
+111.303
+111.304
+111.305
+111.307
+111.308
+111.309
+111.310
+111.311
+111.312
+111.317
+111.318
+111.319
+111.320
+111.325
+111.326
+111.327
+111.328
+111.329
+111.330
+111.331
+111.332
+111.333
+111.334
+111.335
+111.336
+112.297
+112.298
+112.299
+112.300
+112.301
+112.302
+112.303
+112.304
+112.305
+112.307
+112.308
+112.309
+112.310
+112.311
+112.317
+112.318
+112.319
+112.324
+112.325
+112.326
+112.327
+112.328
+112.329
+112.330
+112.331
+112.332
+112.333
+112.334
+112.335
+112.336
+113.296
+113.297
+113.298
+113.299
+113.300
+113.301
+113.302
+113.303
+113.304
+113.307
+113.308
+113.309
+113.310
+113.311
+113.317
+113.318
+113.323
+113.324
+113.325
+113.326
+113.327
+113.328
+113.329
+113.330
+113.331
+113.332
+113.333
+113.334
+113.335
+113.336
+114.296
+114.297
+114.298
+114.299
+114.300
+114.301
+114.302
+114.303
+114.307
+114.308
+114.309
+114.310
+114.317
+114.318
+114.323
+114.324
+114.325
+114.326
+114.327
+114.328
+114.329
+114.330
+114.331
+114.332
+114.333
+114.334
+114.335
+114.336
+115.295
+115.296
+115.297
+115.298
+115.299
+115.300
+115.301
+115.302
+115.303
+115.307
+115.308
+115.309
+115.310
+115.317
+115.323
+115.324
+115.325
+115.326
+115.327
+115.328
+115.329
+115.330
+115.331
+115.332
+115.333
+115.334
+115.335
+115.336
+116.295
+116.296
+116.297
+116.298
+116.299
+116.300
+116.301
+116.302
+116.307
+116.308
+116.309
+116.310
+116.316
+116.317
+116.322
+116.323
+116.324
+116.325
+116.326
+116.327
+116.328
+116.329
+116.330
+116.331
+116.332
+116.333
+116.334
+116.335
+117.294
+117.295
+117.296
+117.297
+117.298
+117.299
+117.300
+117.301
+117.302
+117.307
+117.308
+117.309
+117.316
+117.322
+117.323
+117.324
+117.325
+117.326
+117.327
+117.328
+117.329
+117.330
+117.331
+117.332
+117.333
+117.334
+117.335
+118.293
+118.294
+118.295
+118.296
+118.297
+118.298
+118.299
+118.300
+118.301
+118.302
+118.307
+118.308
+118.309
+118.315
+118.316
+118.322
+118.323
+118.324
+118.325
+118.326
+118.327
+118.328
+118.329
+118.330
+118.331
+118.332
+118.333
+118.334
+118.335
+119.293
+119.294
+119.295
+119.296
+119.297
+119.298
+119.299
+119.300
+119.301
+119.307
+119.308
+119.314
+119.315
+119.316
+119.321
+119.322
+119.323
+119.324
+119.325
+119.326
+119.327
+119.328
+119.329
+119.330
+119.331
+119.332
+119.333
+119.334
+119.335
+120.292
+120.293
+120.294
+120.295
+120.296
+120.297
+120.298
+120.299
+120.300
+120.301
+120.307
+120.308
+120.314
+120.315
+120.316
+120.321
+120.322
+120.323
+120.324
+120.325
+120.326
+120.327
+120.328
+120.329
+120.330
+120.331
+120.332
+120.333
+120.334
+120.335
+121.292
+121.293
+121.294
+121.295
+121.296
+121.297
+121.298
+121.299
+121.300
+121.307
+121.313
+121.314
+121.315
+121.316
+121.321
+121.322
+121.323
+121.324
+121.325
+121.326
+121.327
+121.328
+121.329
+121.330
+121.331
+121.332
+121.333
+121.334
+121.335
+122.291
+122.292
+122.293
+122.294
+122.295
+122.296
+122.297
+122.298
+122.299
+122.313
+122.314
+122.315
+122.321
+122.322
+122.323
+122.324
+122.325
+122.326
+122.327
+122.328
+122.329
+122.330
+122.331
+122.332
+122.333
+122.334
+123.290
+123.291
+123.292
+123.293
+123.294
+123.295
+123.296
+123.297
+123.298
+123.299
+123.312
+123.313
+123.314
+123.315
+123.320
+123.321
+123.322
+123.323
+123.324
+123.325
+123.326
+123.327
+123.328
+123.329
+123.330
+123.331
+123.332
+123.333
+123.334
+124.289
+124.290
+124.291
+124.292
+124.293
+124.294
+124.295
+124.296
+124.297
+124.298
+124.299
+124.312
+124.313
+124.314
+124.320
+124.321
+124.322
+124.323
+124.324
+124.325
+124.326
+124.327
+124.328
+124.329
+124.330
+124.331
+124.332
+124.333
+124.334
+125.289
+125.290
+125.291
+125.292
+125.293
+125.294
+125.295
+125.296
+125.297
+125.298
+125.299
+125.311
+125.312
+125.313
+125.314
+125.319
+125.320
+125.321
+125.322
+125.323
+125.324
+125.325
+125.326
+125.327
+125.328
+125.329
+125.330
+125.331
+125.332
+125.333
+125.334
+126.288
+126.289
+126.290
+126.291
+126.292
+126.293
+126.294
+126.295
+126.296
+126.297
+126.298
+126.299
+126.311
+126.312
+126.313
+126.314
+126.319
+126.320
+126.321
+126.322
+126.323
+126.324
+126.325
+126.326
+126.327
+126.328
+126.329
+126.330
+126.331
+126.332
+126.333
+126.334
+127.287
+127.288
+127.289
+127.290
+127.291
+127.292
+127.293
+127.294
+127.295
+127.296
+127.297
+127.298
+127.299
+127.310
+127.311
+127.312
+127.313
+127.319
+127.320
+127.321
+127.322
+127.323
+127.324
+127.325
+127.326
+127.327
+127.328
+127.329
+127.330
+127.331
+127.332
+127.333
+128.287
+128.288
+128.289
+128.290
+128.291
+128.292
+128.293
+128.294
+128.295
+128.296
+128.297
+128.298
+128.310
+128.311
+128.312
+128.313
+128.318
+128.319
+128.320
+128.321
+128.322
+128.323
+128.324
+128.325
+128.326
+128.327
+128.328
+128.329
+128.330
+128.331
+128.332
+128.333
+129.286
+129.287
+129.288
+129.289
+129.290
+129.291
+129.292
+129.293
+129.294
+129.295
+129.296
+129.297
+129.298
+129.299
+129.309
+129.310
+129.311
+129.312
+129.318
+129.319
+129.320
+129.321
+129.322
+129.323
+129.324
+129.325
+129.326
+129.327
+129.328
+129.329
+129.330
+129.331
+129.332
+129.333
+130.285
+130.286
+130.287
+130.288
+130.289
+130.290
+130.291
+130.292
+130.293
+130.294
+130.295
+130.296
+130.297
+130.298
+130.299
+130.309
+130.310
+130.311
+130.312
+130.317
+130.318
+130.319
+130.320
+130.321
+130.322
+130.323
+130.324
+130.325
+130.326
+130.327
+130.328
+130.329
+130.330
+130.331
+130.332
+130.333
+131.285
+131.286
+131.287
+131.288
+131.289
+131.290
+131.291
+131.292
+131.293
+131.294
+131.295
+131.296
+131.297
+131.298
+131.299
+131.308
+131.309
+131.310
+131.311
+131.312
+131.317
+131.318
+131.319
+131.320
+131.321
+131.322
+131.323
+131.324
+131.325
+131.326
+131.327
+131.328
+131.329
+131.330
+131.331
+131.332
+131.333
+132.285
+132.286
+132.287
+132.288
+132.289
+132.290
+132.291
+132.292
+132.293
+132.294
+132.295
+132.296
+132.297
+132.298
+132.299
+132.308
+132.309
+132.310
+132.311
+132.312
+132.317
+132.318
+132.319
+132.320
+132.321
+132.322
+132.323
+132.324
+132.325
+132.326
+132.327
+132.328
+132.329
+132.330
+132.331
+132.332
+133.284
+133.285
+133.286
+133.287
+133.288
+133.289
+133.290
+133.291
+133.292
+133.293
+133.294
+133.295
+133.296
+133.297
+133.298
+133.299
+133.307
+133.308
+133.309
+133.310
+133.311
+133.316
+133.317
+133.318
+133.319
+133.320
+133.321
+133.322
+133.323
+133.324
+133.325
+133.326
+133.327
+133.328
+133.329
+133.330
+133.331
+133.332
+134.283
+134.284
+134.285
+134.286
+134.287
+134.288
+134.289
+134.290
+134.291
+134.292
+134.293
+134.294
+134.295
+134.296
+134.297
+134.298
+134.299
+134.307
+134.308
+134.309
+134.310
+134.311
+134.316
+134.317
+134.318
+134.319
+134.320
+134.321
+134.322
+134.323
+134.324
+134.325
+134.326
+134.327
+134.328
+134.329
+134.330
+134.331
+134.332
+135.283
+135.284
+135.285
+135.286
+135.287
+135.288
+135.289
+135.290
+135.291
+135.292
+135.293
+135.294
+135.295
+135.296
+135.297
+135.298
+135.299
+135.306
+135.307
+135.308
+135.309
+135.310
+135.315
+135.316
+135.317
+135.318
+135.319
+135.320
+135.321
+135.322
+135.323
+135.324
+135.325
+135.326
+135.327
+135.328
+135.329
+135.330
+135.331
+135.332
+136.282
+136.283
+136.284
+136.285
+136.286
+136.287
+136.288
+136.289
+136.290
+136.291
+136.292
+136.293
+136.294
+136.295
+136.296
+136.297
+136.298
+136.299
+136.306
+136.307
+136.308
+136.309
+136.310
+136.315
+136.316
+136.317
+136.318
+136.319
+136.320
+136.321
+136.322
+136.323
+136.324
+136.325
+136.326
+136.327
+136.328
+136.329
+136.330
+136.331
+136.332
+137.282
+137.283
+137.284
+137.285
+137.286
+137.287
+137.288
+137.289
+137.290
+137.291
+137.292
+137.293
+137.294
+137.295
+137.296
+137.297
+137.298
+137.299
+137.305
+137.306
+137.307
+137.308
+137.309
+137.310
+137.315
+137.316
+137.317
+137.318
+137.319
+137.320
+137.321
+137.322
+137.323
+137.324
+137.325
+137.326
+137.327
+137.328
+137.329
+137.330
+137.331
+138.281
+138.282
+138.283
+138.284
+138.285
+138.286
+138.287
+138.288
+138.289
+138.290
+138.291
+138.292
+138.293
+138.294
+138.295
+138.296
+138.297
+138.298
+138.304
+138.305
+138.306
+138.307
+138.308
+138.309
+138.314
+138.315
+138.316
+138.317
+138.318
+138.319
+138.320
+138.321
+138.322
+138.323
+138.324
+138.325
+138.326
+138.327
+138.328
+138.329
+138.330
+138.331
+139.281
+139.282
+139.283
+139.284
+139.285
+139.286
+139.287
+139.288
+139.289
+139.290
+139.291
+139.292
+139.293
+139.294
+139.295
+139.296
+139.297
+139.298
+139.304
+139.305
+139.306
+139.307
+139.308
+139.309
+139.314
+139.315
+139.316
+139.317
+139.318
+139.319
+139.320
+139.321
+139.322
+139.323
+139.324
+139.325
+139.326
+139.327
+139.328
+139.329
+139.330
+139.331
+140.280
+140.281
+140.282
+140.283
+140.284
+140.285
+140.286
+140.287
+140.288
+140.289
+140.290
+140.291
+140.292
+140.293
+140.294
+140.295
+140.296
+140.297
+140.303
+140.304
+140.305
+140.306
+140.307
+140.308
+140.313
+140.314
+140.315
+140.316
+140.317
+140.318
+140.319
+140.320
+140.321
+140.322
+140.323
+140.324
+140.325
+140.326
+140.327
+140.328
+140.329
+140.330
+140.331
+141.280
+141.281
+141.282
+141.283
+141.284
+141.285
+141.286
+141.287
+141.288
+141.289
+141.290
+141.291
+141.292
+141.293
+141.294
+141.295
+141.296
+141.297
+141.303
+141.304
+141.305
+141.306
+141.307
+141.308
+141.313
+141.314
+141.315
+141.316
+141.317
+141.318
+141.319
+141.320
+141.321
+141.322
+141.323
+141.324
+141.325
+141.326
+141.327
+141.328
+141.329
+141.330
+141.331
+142.279
+142.280
+142.281
+142.282
+142.283
+142.284
+142.285
+142.286
+142.287
+142.288
+142.289
+142.290
+142.291
+142.292
+142.293
+142.294
+142.295
+142.296
+142.302
+142.303
+142.304
+142.305
+142.306
+142.307
+142.308
+142.313
+142.314
+142.315
+142.316
+142.317
+142.318
+142.319
+142.320
+142.321
+142.322
+142.323
+142.324
+142.325
+142.326
+142.327
+142.328
+142.329
+142.330
+143.278
+143.279
+143.280
+143.281
+143.282
+143.283
+143.284
+143.285
+143.286
+143.287
+143.288
+143.289
+143.290
+143.291
+143.292
+143.293
+143.294
+143.295
+143.302
+143.303
+143.304
+143.305
+143.306
+143.307
+143.312
+143.313
+143.314
+143.315
+143.316
+143.317
+143.318
+143.319
+143.320
+143.321
+143.322
+143.323
+143.324
+143.325
+143.326
+143.327
+143.328
+143.329
+143.330
+144.278
+144.279
+144.280
+144.281
+144.282
+144.283
+144.284
+144.285
+144.286
+144.287
+144.288
+144.289
+144.290
+144.291
+144.292
+144.293
+144.294
+144.295
+144.301
+144.302
+144.303
+144.304
+144.305
+144.306
+144.307
+144.312
+144.313
+144.314
+144.315
+144.316
+144.317
+144.318
+144.319
+144.320
+144.321
+144.322
+144.323
+144.324
+144.325
+144.326
+144.327
+144.328
+144.329
+144.330
+145.277
+145.278
+145.279
+145.280
+145.281
+145.282
+145.283
+145.284
+145.285
+145.286
+145.287
+145.288
+145.289
+145.290
+145.291
+145.292
+145.293
+145.294
+145.301
+145.302
+145.303
+145.304
+145.305
+145.306
+145.311
+145.312
+145.313
+145.314
+145.315
+145.316
+145.317
+145.318
+145.319
+145.320
+145.321
+145.322
+145.323
+145.324
+145.325
+145.326
+145.327
+145.328
+145.329
+145.330
+146.277
+146.278
+146.279
+146.280
+146.281
+146.282
+146.283
+146.284
+146.285
+146.286
+146.287
+146.288
+146.289
+146.290
+146.291
+146.292
+146.293
+146.300
+146.301
+146.302
+146.303
+146.304
+146.305
+146.306
+146.311
+146.312
+146.313
+146.314
+146.315
+146.316
+146.317
+146.318
+146.319
+146.320
+146.321
+146.322
+146.323
+146.324
+146.325
+146.326
+146.327
+146.328
+146.329
+146.330
+147.276
+147.277
+147.278
+147.279
+147.280
+147.281
+147.282
+147.283
+147.284
+147.285
+147.286
+147.287
+147.288
+147.289
+147.290
+147.291
+147.292
+147.300
+147.301
+147.302
+147.303
+147.304
+147.305
+147.306
+147.311
+147.312
+147.313
+147.314
+147.315
+147.316
+147.317
+147.318
+147.319
+147.320
+147.321
+147.322
+147.323
+147.324
+147.325
+147.326
+147.327
+147.328
+147.329
+147.330
+148.276
+148.277
+148.278
+148.279
+148.280
+148.281
+148.282
+148.283
+148.284
+148.285
+148.286
+148.287
+148.288
+148.289
+148.290
+148.291
+148.292
+148.299
+148.300
+148.301
+148.302
+148.303
+148.304
+148.305
+148.310
+148.311
+148.312
+148.313
+148.314
+148.315
+148.316
+148.317
+148.318
+148.319
+148.320
+148.321
+148.322
+148.323
+148.324
+148.325
+148.326
+148.327
+148.328
+148.329
+149.276
+149.277
+149.278
+149.279
+149.280
+149.281
+149.282
+149.283
+149.284
+149.285
+149.286
+149.287
+149.288
+149.289
+149.290
+149.291
+149.292
+149.299
+149.300
+149.301
+149.302
+149.303
+149.304
+149.310
+149.311
+149.312
+149.313
+149.314
+149.315
+149.316
+149.317
+149.318
+149.319
+149.320
+149.321
+149.322
+149.323
+149.324
+149.325
+149.326
+149.327
+149.328
+149.329
+150.275
+150.276
+150.277
+150.278
+150.279
+150.280
+150.281
+150.282
+150.283
+150.284
+150.285
+150.286
+150.287
+150.288
+150.289
+150.290
+150.291
+150.298
+150.299
+150.300
+150.301
+150.302
+150.303
+150.304
+150.310
+150.311
+150.312
+150.313
+150.314
+150.315
+150.316
+150.317
+150.318
+150.319
+150.320
+150.321
+150.322
+150.323
+150.324
+150.325
+150.326
+150.327
+150.328
+150.329
+151.274
+151.275
+151.276
+151.277
+151.278
+151.279
+151.280
+151.281
+151.282
+151.283
+151.284
+151.285
+151.286
+151.287
+151.288
+151.289
+151.290
+151.291
+151.298
+151.299
+151.300
+151.301
+151.302
+151.303
+151.304
+151.309
+151.310
+151.311
+151.312
+151.313
+151.314
+151.315
+151.316
+151.317
+151.318
+151.319
+151.320
+151.321
+151.322
+151.323
+151.324
+151.325
+151.326
+151.327
+151.328
+151.329
+152.273
+152.274
+152.275
+152.276
+152.277
+152.278
+152.279
+152.280
+152.281
+152.282
+152.283
+152.284
+152.285
+152.286
+152.287
+152.288
+152.289
+152.290
+152.297
+152.298
+152.299
+152.300
+152.301
+152.302
+152.303
+152.309
+152.310
+152.311
+152.312
+152.313
+152.314
+152.315
+152.316
+152.317
+152.318
+152.319
+152.320
+152.321
+152.322
+152.323
+152.324
+152.325
+152.326
+152.327
+152.328
+152.329
+153.273
+153.274
+153.275
+153.276
+153.277
+153.278
+153.279
+153.280
+153.281
+153.282
+153.283
+153.284
+153.285
+153.286
+153.287
+153.288
+153.289
+153.297
+153.298
+153.299
+153.300
+153.301
+153.302
+153.303
+153.309
+153.310
+153.311
+153.312
+153.313
+153.314
+153.315
+153.316
+153.317
+153.318
+153.319
+153.320
+153.321
+153.322
+153.323
+153.324
+153.325
+153.326
+153.327
+153.328
+154.272
+154.273
+154.274
+154.275
+154.276
+154.277
+154.278
+154.279
+154.280
+154.281
+154.282
+154.283
+154.284
+154.285
+154.286
+154.287
+154.288
+154.297
+154.298
+154.299
+154.300
+154.301
+154.302
+154.308
+154.309
+154.310
+154.311
+154.312
+154.313
+154.314
+154.315
+154.316
+154.317
+154.318
+154.319
+154.320
+154.321
+154.322
+154.323
+154.324
+154.325
+154.326
+154.327
+154.328
+155.271
+155.272
+155.273
+155.274
+155.275
+155.276
+155.277
+155.278
+155.279
+155.280
+155.281
+155.282
+155.283
+155.284
+155.285
+155.286
+155.287
+155.288
+155.297
+155.298
+155.299
+155.300
+155.301
+155.302
+155.308
+155.309
+155.310
+155.311
+155.312
+155.313
+155.314
+155.315
+155.316
+155.317
+155.318
+155.319
+155.320
+155.321
+155.322
+155.323
+155.324
+155.325
+155.326
+155.327
+155.328
+156.270
+156.271
+156.272
+156.273
+156.274
+156.275
+156.276
+156.277
+156.278
+156.279
+156.280
+156.281
+156.282
+156.283
+156.284
+156.285
+156.286
+156.287
+156.288
+156.297
+156.298
+156.299
+156.300
+156.301
+156.307
+156.308
+156.309
+156.310
+156.311
+156.312
+156.313
+156.314
+156.315
+156.316
+156.317
+156.318
+156.319
+156.320
+156.321
+156.322
+156.323
+156.324
+156.325
+156.326
+156.327
+156.328
+157.270
+157.271
+157.272
+157.273
+157.274
+157.275
+157.276
+157.277
+157.278
+157.279
+157.280
+157.281
+157.282
+157.283
+157.284
+157.285
+157.286
+157.287
+157.288
+157.297
+157.298
+157.299
+157.300
+157.307
+157.308
+157.309
+157.310
+157.311
+157.312
+157.313
+157.314
+157.315
+157.316
+157.317
+157.318
+157.319
+157.320
+157.321
+157.322
+157.323
+157.324
+157.325
+157.326
+157.327
+158.270
+158.271
+158.272
+158.273
+158.274
+158.275
+158.276
+158.277
+158.278
+158.279
+158.280
+158.281
+158.282
+158.283
+158.284
+158.285
+158.286
+158.287
+158.288
+158.297
+158.298
+158.299
+158.300
+158.307
+158.308
+158.309
+158.310
+158.311
+158.312
+158.313
+158.314
+158.315
+158.316
+158.317
+158.318
+158.319
+158.320
+158.321
+158.322
+158.323
+158.324
+158.325
+158.326
+158.327
+159.269
+159.270
+159.271
+159.272
+159.273
+159.274
+159.275
+159.276
+159.277
+159.278
+159.279
+159.280
+159.281
+159.282
+159.283
+159.284
+159.285
+159.286
+159.287
+159.288
+159.297
+159.298
+159.299
+159.300
+159.307
+159.308
+159.309
+159.310
+159.311
+159.312
+159.313
+159.314
+159.315
+159.316
+159.317
+159.318
+159.319
+159.320
+159.321
+159.322
+159.323
+159.324
+159.325
+159.326
+159.327
+160.268
+160.269
+160.270
+160.271
+160.272
+160.273
+160.274
+160.275
+160.276
+160.277
+160.278
+160.279
+160.280
+160.281
+160.282
+160.283
+160.284
+160.285
+160.286
+160.287
+160.288
+160.297
+160.298
+160.299
+160.300
+160.307
+160.308
+160.309
+160.310
+160.311
+160.312
+160.313
+160.314
+160.315
+160.316
+160.317
+160.318
+160.319
+160.320
+160.321
+160.322
+160.323
+160.324
+160.325
+160.326
+160.327
+161.267
+161.268
+161.269
+161.270
+161.271
+161.272
+161.273
+161.274
+161.275
+161.276
+161.277
+161.278
+161.279
+161.280
+161.281
+161.282
+161.283
+161.284
+161.285
+161.286
+161.287
+161.288
+161.297
+161.298
+161.299
+161.307
+161.308
+161.309
+161.310
+161.311
+161.312
+161.313
+161.314
+161.315
+161.316
+161.317
+161.318
+161.319
+161.320
+161.321
+161.322
+161.323
+161.324
+161.325
+161.326
+161.327
+162.266
+162.267
+162.268
+162.269
+162.270
+162.271
+162.272
+162.273
+162.274
+162.275
+162.276
+162.277
+162.278
+162.279
+162.280
+162.281
+162.282
+162.283
+162.284
+162.285
+162.286
+162.287
+162.288
+162.297
+162.298
+162.299
+162.307
+162.308
+162.309
+162.310
+162.311
+162.312
+162.313
+162.314
+162.315
+162.316
+162.317
+162.318
+162.319
+162.320
+162.321
+162.322
+162.323
+162.324
+162.325
+162.326
+163.266
+163.267
+163.268
+163.269
+163.270
+163.271
+163.272
+163.273
+163.274
+163.275
+163.276
+163.277
+163.278
+163.279
+163.280
+163.281
+163.282
+163.283
+163.284
+163.285
+163.286
+163.287
+163.288
+163.297
+163.298
+163.299
+163.307
+163.308
+163.309
+163.310
+163.311
+163.312
+163.313
+163.314
+163.315
+163.316
+163.317
+163.318
+163.319
+163.320
+163.321
+163.322
+163.323
+163.324
+163.325
+163.326
+164.266
+164.267
+164.268
+164.269
+164.270
+164.271
+164.272
+164.273
+164.274
+164.275
+164.276
+164.277
+164.278
+164.279
+164.280
+164.281
+164.282
+164.283
+164.284
+164.285
+164.286
+164.287
+164.288
+164.297
+164.298
+164.307
+164.308
+164.309
+164.310
+164.311
+164.312
+164.313
+164.314
+164.315
+164.316
+164.317
+164.318
+164.319
+164.320
+164.321
+164.322
+164.323
+164.324
+164.325
+164.326
+165.265
+165.266
+165.267
+165.268
+165.269
+165.270
+165.271
+165.272
+165.273
+165.274
+165.275
+165.276
+165.277
+165.278
+165.279
+165.280
+165.281
+165.282
+165.283
+165.284
+165.285
+165.286
+165.287
+165.288
+165.297
+165.298
+165.307
+165.308
+165.309
+165.310
+165.311
+165.312
+165.313
+165.314
+165.315
+165.316
+165.317
+165.318
+165.319
+165.320
+165.321
+165.322
+165.323
+165.324
+165.325
+165.326
+166.264
+166.265
+166.266
+166.267
+166.268
+166.269
+166.270
+166.271
+166.272
+166.273
+166.274
+166.275
+166.276
+166.277
+166.278
+166.279
+166.280
+166.281
+166.282
+166.283
+166.284
+166.285
+166.286
+166.287
+166.288
+166.297
+166.307
+166.308
+166.309
+166.310
+166.311
+166.312
+166.313
+166.314
+166.315
+166.316
+166.317
+166.318
+166.319
+166.320
+166.321
+166.322
+166.323
+166.324
+166.325
+166.326
+167.263
+167.264
+167.265
+167.266
+167.267
+167.268
+167.269
+167.270
+167.271
+167.272
+167.273
+167.274
+167.275
+167.276
+167.277
+167.278
+167.279
+167.280
+167.281
+167.282
+167.283
+167.284
+167.285
+167.286
+167.287
+167.288
+167.307
+167.308
+167.309
+167.310
+167.311
+167.312
+167.313
+167.314
+167.315
+167.316
+167.317
+167.318
+167.319
+167.320
+167.321
+167.322
+167.323
+167.324
+167.325
+167.326
+168.263
+168.264
+168.265
+168.266
+168.267
+168.268
+168.269
+168.270
+168.271
+168.272
+168.273
+168.274
+168.275
+168.276
+168.277
+168.278
+168.279
+168.280
+168.281
+168.282
+168.283
+168.284
+168.285
+168.286
+168.287
+168.307
+168.308
+168.309
+168.310
+168.311
+168.312
+168.313
+168.314
+168.315
+168.316
+168.317
+168.318
+168.319
+168.320
+168.321
+168.322
+168.323
+168.324
+168.325
+169.262
+169.263
+169.264
+169.265
+169.266
+169.267
+169.268
+169.269
+169.270
+169.271
+169.272
+169.273
+169.274
+169.275
+169.276
+169.277
+169.278
+169.279
+169.280
+169.281
+169.282
+169.283
+169.284
+169.285
+169.286
+169.287
+169.307
+169.308
+169.309
+169.310
+169.311
+169.312
+169.313
+169.314
+169.315
+169.316
+169.317
+169.318
+169.319
+169.320
+169.321
+169.322
+169.323
+169.324
+169.325
+170.262
+170.263
+170.264
+170.265
+170.266
+170.267
+170.268
+170.269
+170.270
+170.271
+170.272
+170.273
+170.274
+170.275
+170.276
+170.277
+170.278
+170.279
+170.280
+170.281
+170.282
+170.283
+170.284
+170.285
+170.286
+170.287
+170.307
+170.308
+170.309
+170.310
+170.311
+170.312
+170.313
+170.314
+170.315
+170.316
+170.317
+170.318
+170.319
+170.320
+170.321
+170.322
+170.323
+170.324
+170.325
+171.261
+171.262
+171.263
+171.264
+171.265
+171.266
+171.267
+171.268
+171.269
+171.270
+171.271
+171.272
+171.273
+171.274
+171.275
+171.276
+171.277
+171.278
+171.279
+171.280
+171.281
+171.282
+171.283
+171.284
+171.285
+171.286
+171.307
+171.308
+171.309
+171.310
+171.311
+171.312
+171.313
+171.314
+171.315
+171.316
+171.317
+171.318
+171.319
+171.320
+171.321
+171.322
+171.323
+171.324
+171.325
+172.260
+172.261
+172.262
+172.263
+172.264
+172.265
+172.266
+172.267
+172.268
+172.269
+172.270
+172.271
+172.272
+172.273
+172.274
+172.275
+172.276
+172.277
+172.278
+172.279
+172.280
+172.281
+172.282
+172.283
+172.284
+172.285
+172.286
+172.306
+172.307
+172.308
+172.309
+172.310
+172.311
+172.312
+172.313
+172.314
+172.315
+172.316
+172.317
+172.318
+172.319
+172.320
+172.321
+172.322
+172.323
+172.324
+172.325
+173.259
+173.260
+173.261
+173.262
+173.263
+173.264
+173.265
+173.266
+173.267
+173.268
+173.269
+173.270
+173.271
+173.272
+173.273
+173.274
+173.275
+173.276
+173.277
+173.278
+173.279
+173.280
+173.281
+173.282
+173.283
+173.284
+173.285
+173.306
+173.307
+173.308
+173.309
+173.310
+173.311
+173.312
+173.313
+173.314
+173.315
+173.316
+173.317
+173.318
+173.319
+173.320
+173.321
+173.322
+173.323
+173.324
+174.259
+174.260
+174.261
+174.262
+174.263
+174.264
+174.265
+174.266
+174.267
+174.268
+174.269
+174.270
+174.271
+174.272
+174.273
+174.274
+174.275
+174.276
+174.277
+174.278
+174.279
+174.280
+174.281
+174.282
+174.283
+174.284
+174.285
+174.294
+174.306
+174.307
+174.308
+174.309
+174.310
+174.311
+174.312
+174.313
+174.314
+174.315
+174.316
+174.317
+174.318
+174.319
+174.320
+174.321
+174.322
+174.323
+174.324
+175.258
+175.259
+175.260
+175.261
+175.262
+175.263
+175.264
+175.265
+175.266
+175.267
+175.268
+175.269
+175.270
+175.271
+175.272
+175.273
+175.274
+175.275
+175.276
+175.277
+175.278
+175.279
+175.280
+175.281
+175.282
+175.283
+175.284
+175.294
+175.305
+175.306
+175.307
+175.308
+175.309
+175.310
+175.311
+175.312
+175.313
+175.314
+175.315
+175.316
+175.317
+175.318
+175.319
+175.320
+175.321
+175.322
+175.323
+175.324
+176.258
+176.259
+176.260
+176.261
+176.262
+176.263
+176.264
+176.265
+176.266
+176.267
+176.268
+176.269
+176.270
+176.271
+176.272
+176.273
+176.274
+176.275
+176.276
+176.277
+176.278
+176.279
+176.280
+176.281
+176.282
+176.283
+176.291
+176.293
+176.294
+176.305
+176.306
+176.307
+176.308
+176.309
+176.310
+176.311
+176.312
+176.313
+176.314
+176.315
+176.316
+176.317
+176.318
+176.319
+176.320
+176.321
+176.322
+176.323
+176.324
+177.257
+177.258
+177.259
+177.260
+177.261
+177.262
+177.263
+177.264
+177.265
+177.266
+177.267
+177.268
+177.269
+177.270
+177.271
+177.272
+177.273
+177.274
+177.275
+177.276
+177.277
+177.278
+177.279
+177.280
+177.281
+177.282
+177.283
+177.290
+177.291
+177.293
+177.294
+177.305
+177.306
+177.307
+177.308
+177.309
+177.310
+177.311
+177.312
+177.313
+177.314
+177.315
+177.316
+177.317
+177.318
+177.319
+177.320
+177.321
+177.322
+177.323
+177.324
+178.257
+178.258
+178.259
+178.260
+178.261
+178.262
+178.263
+178.264
+178.265
+178.266
+178.267
+178.268
+178.269
+178.270
+178.271
+178.272
+178.273
+178.274
+178.275
+178.276
+178.277
+178.278
+178.279
+178.280
+178.281
+178.282
+178.290
+178.291
+178.292
+178.293
+178.294
+178.305
+178.306
+178.307
+178.308
+178.309
+178.310
+178.311
+178.312
+178.313
+178.314
+178.315
+178.316
+178.317
+178.318
+178.319
+178.320
+178.321
+178.322
+178.323
+179.256
+179.257
+179.258
+179.259
+179.260
+179.261
+179.262
+179.263
+179.264
+179.265
+179.266
+179.267
+179.268
+179.269
+179.270
+179.271
+179.272
+179.273
+179.274
+179.275
+179.276
+179.277
+179.278
+179.279
+179.280
+179.281
+179.282
+179.289
+179.290
+179.291
+179.292
+179.293
+179.294
+179.305
+179.306
+179.307
+179.308
+179.309
+179.310
+179.311
+179.312
+179.313
+179.314
+179.315
+179.316
+179.317
+179.318
+179.319
+179.320
+179.321
+179.322
+179.323
+180.255
+180.256
+180.257
+180.258
+180.259
+180.260
+180.261
+180.262
+180.263
+180.264
+180.265
+180.266
+180.267
+180.268
+180.269
+180.270
+180.271
+180.272
+180.273
+180.274
+180.275
+180.276
+180.277
+180.278
+180.279
+180.280
+180.281
+180.288
+180.289
+180.290
+180.291
+180.292
+180.293
+180.294
+180.305
+180.306
+180.307
+180.308
+180.309
+180.310
+180.311
+180.312
+180.313
+180.314
+180.315
+180.316
+180.317
+180.318
+180.319
+180.320
+180.321
+180.322
+180.323
+181.254
+181.255
+181.256
+181.257
+181.258
+181.259
+181.260
+181.261
+181.262
+181.263
+181.264
+181.265
+181.266
+181.267
+181.268
+181.269
+181.270
+181.271
+181.272
+181.273
+181.274
+181.275
+181.276
+181.277
+181.278
+181.279
+181.280
+181.281
+181.287
+181.288
+181.289
+181.290
+181.291
+181.292
+181.293
+181.294
+181.305
+181.306
+181.307
+181.308
+181.309
+181.310
+181.311
+181.312
+181.313
+181.314
+181.315
+181.316
+181.317
+181.318
+181.319
+181.320
+181.321
+181.322
+181.323
+182.253
+182.254
+182.255
+182.256
+182.257
+182.258
+182.259
+182.260
+182.261
+182.262
+182.263
+182.264
+182.265
+182.266
+182.267
+182.268
+182.269
+182.270
+182.271
+182.272
+182.273
+182.274
+182.275
+182.276
+182.277
+182.278
+182.279
+182.280
+182.287
+182.288
+182.289
+182.290
+182.291
+182.292
+182.293
+182.294
+182.305
+182.306
+182.307
+182.308
+182.309
+182.310
+182.311
+182.312
+182.313
+182.314
+182.315
+182.316
+182.317
+182.318
+182.319
+182.320
+182.321
+182.322
+182.323
+183.252
+183.253
+183.254
+183.255
+183.256
+183.257
+183.258
+183.259
+183.260
+183.261
+183.262
+183.263
+183.264
+183.265
+183.266
+183.267
+183.268
+183.269
+183.270
+183.271
+183.272
+183.273
+183.274
+183.275
+183.276
+183.277
+183.278
+183.279
+183.287
+183.288
+183.289
+183.290
+183.291
+183.292
+183.293
+183.294
+183.305
+183.306
+183.307
+183.308
+183.309
+183.310
+183.311
+183.312
+183.313
+183.314
+183.315
+183.316
+183.317
+183.318
+183.319
+183.320
+183.321
+183.322
+184.252
+184.253
+184.254
+184.255
+184.256
+184.257
+184.258
+184.259
+184.260
+184.261
+184.262
+184.263
+184.264
+184.265
+184.266
+184.267
+184.268
+184.269
+184.270
+184.271
+184.272
+184.273
+184.274
+184.275
+184.276
+184.277
+184.278
+184.279
+184.286
+184.287
+184.288
+184.289
+184.290
+184.292
+184.293
+184.294
+184.305
+184.306
+184.307
+184.308
+184.309
+184.310
+184.311
+184.312
+184.313
+184.314
+184.315
+184.316
+184.317
+184.318
+184.319
+184.320
+184.321
+184.322
+185.251
+185.252
+185.253
+185.254
+185.255
+185.256
+185.257
+185.258
+185.259
+185.260
+185.261
+185.262
+185.263
+185.264
+185.265
+185.266
+185.267
+185.268
+185.269
+185.270
+185.271
+185.272
+185.273
+185.274
+185.275
+185.276
+185.277
+185.278
+185.279
+185.286
+185.287
+185.288
+185.289
+185.290
+185.292
+185.293
+185.294
+185.305
+185.306
+185.307
+185.308
+185.309
+185.310
+185.311
+185.312
+185.313
+185.314
+185.315
+185.316
+185.317
+185.318
+185.319
+185.320
+185.321
+185.322
+186.251
+186.252
+186.253
+186.254
+186.255
+186.256
+186.257
+186.258
+186.259
+186.260
+186.261
+186.262
+186.263
+186.264
+186.265
+186.266
+186.267
+186.268
+186.269
+186.270
+186.271
+186.272
+186.273
+186.274
+186.275
+186.276
+186.277
+186.278
+186.279
+186.285
+186.286
+186.287
+186.288
+186.289
+186.290
+186.292
+186.293
+186.294
+186.305
+186.306
+186.307
+186.308
+186.309
+186.310
+186.311
+186.312
+186.313
+186.314
+186.315
+186.316
+186.317
+186.318
+186.319
+186.320
+186.321
+186.322
+187.250
+187.251
+187.252
+187.253
+187.254
+187.255
+187.256
+187.257
+187.258
+187.259
+187.260
+187.261
+187.262
+187.263
+187.264
+187.265
+187.266
+187.267
+187.268
+187.269
+187.270
+187.271
+187.272
+187.273
+187.274
+187.275
+187.276
+187.277
+187.278
+187.279
+187.284
+187.285
+187.286
+187.287
+187.288
+187.289
+187.290
+187.292
+187.293
+187.294
+187.305
+187.306
+187.307
+187.308
+187.309
+187.310
+187.311
+187.312
+187.313
+187.314
+187.315
+187.316
+187.317
+187.318
+187.319
+187.320
+187.321
+187.322
+188.250
+188.251
+188.252
+188.253
+188.254
+188.255
+188.256
+188.257
+188.258
+188.259
+188.260
+188.261
+188.262
+188.263
+188.264
+188.265
+188.266
+188.267
+188.268
+188.269
+188.270
+188.271
+188.272
+188.273
+188.274
+188.275
+188.276
+188.277
+188.278
+188.279
+188.284
+188.285
+188.286
+188.287
+188.288
+188.289
+188.290
+188.292
+188.293
+188.305
+188.306
+188.307
+188.308
+188.309
+188.310
+188.311
+188.312
+188.313
+188.314
+188.315
+188.316
+188.317
+188.318
+188.319
+188.320
+188.321
+189.250
+189.251
+189.252
+189.253
+189.254
+189.255
+189.256
+189.257
+189.258
+189.259
+189.260
+189.261
+189.262
+189.263
+189.264
+189.265
+189.266
+189.267
+189.268
+189.269
+189.270
+189.271
+189.272
+189.273
+189.274
+189.275
+189.276
+189.277
+189.278
+189.279
+189.283
+189.284
+189.285
+189.286
+189.287
+189.288
+189.289
+189.290
+189.292
+189.293
+189.305
+189.306
+189.307
+189.308
+189.309
+189.310
+189.311
+189.312
+189.313
+189.314
+189.315
+189.316
+189.317
+189.318
+189.319
+189.320
+189.321
+190.249
+190.250
+190.251
+190.252
+190.253
+190.254
+190.255
+190.256
+190.257
+190.258
+190.259
+190.260
+190.261
+190.262
+190.263
+190.264
+190.265
+190.266
+190.267
+190.268
+190.269
+190.270
+190.271
+190.272
+190.273
+190.274
+190.275
+190.276
+190.277
+190.278
+190.279
+190.283
+190.284
+190.285
+190.286
+190.287
+190.288
+190.289
+190.290
+190.292
+190.293
+190.304
+190.305
+190.306
+190.307
+190.308
+190.309
+190.310
+190.311
+190.312
+190.313
+190.314
+190.315
+190.316
+190.317
+190.318
+190.319
+190.320
+190.321
+191.248
+191.249
+191.250
+191.251
+191.252
+191.253
+191.254
+191.255
+191.256
+191.257
+191.258
+191.259
+191.260
+191.261
+191.262
+191.263
+191.264
+191.265
+191.266
+191.267
+191.268
+191.269
+191.270
+191.271
+191.272
+191.273
+191.274
+191.275
+191.276
+191.277
+191.278
+191.279
+191.282
+191.283
+191.284
+191.285
+191.286
+191.287
+191.288
+191.289
+191.290
+191.292
+191.304
+191.305
+191.306
+191.307
+191.308
+191.309
+191.310
+191.311
+191.312
+191.313
+191.314
+191.315
+191.316
+191.317
+191.318
+191.319
+191.320
+191.321
+192.248
+192.249
+192.250
+192.251
+192.252
+192.253
+192.254
+192.255
+192.256
+192.257
+192.258
+192.259
+192.260
+192.261
+192.262
+192.263
+192.264
+192.265
+192.266
+192.267
+192.268
+192.269
+192.270
+192.271
+192.272
+192.273
+192.274
+192.275
+192.276
+192.277
+192.278
+192.279
+192.282
+192.283
+192.284
+192.285
+192.286
+192.287
+192.288
+192.289
+192.290
+192.292
+192.303
+192.304
+192.305
+192.306
+192.307
+192.308
+192.309
+192.310
+192.311
+192.312
+192.313
+192.314
+192.315
+192.316
+192.317
+192.318
+192.319
+192.320
+192.321
+193.247
+193.248
+193.249
+193.250
+193.251
+193.252
+193.253
+193.254
+193.255
+193.256
+193.257
+193.258
+193.259
+193.260
+193.261
+193.262
+193.263
+193.264
+193.265
+193.266
+193.267
+193.268
+193.269
+193.270
+193.271
+193.272
+193.273
+193.274
+193.275
+193.276
+193.277
+193.278
+193.279
+193.281
+193.282
+193.283
+193.284
+193.285
+193.286
+193.287
+193.288
+193.289
+193.290
+193.303
+193.304
+193.305
+193.306
+193.307
+193.308
+193.309
+193.310
+193.311
+193.312
+193.313
+193.314
+193.315
+193.316
+193.317
+193.318
+193.319
+193.320
+194.246
+194.247
+194.248
+194.249
+194.250
+194.251
+194.252
+194.253
+194.254
+194.255
+194.256
+194.257
+194.258
+194.259
+194.260
+194.261
+194.262
+194.263
+194.264
+194.265
+194.266
+194.267
+194.268
+194.269
+194.270
+194.271
+194.272
+194.273
+194.274
+194.275
+194.276
+194.277
+194.278
+194.279
+194.280
+194.281
+194.282
+194.283
+194.284
+194.285
+194.286
+194.287
+194.288
+194.289
+194.290
+194.297
+194.303
+194.304
+194.305
+194.306
+194.307
+194.308
+194.309
+194.310
+194.311
+194.312
+194.313
+194.314
+194.315
+194.316
+194.317
+194.318
+194.319
+194.320
+195.245
+195.246
+195.247
+195.248
+195.249
+195.250
+195.251
+195.252
+195.253
+195.254
+195.255
+195.256
+195.257
+195.258
+195.259
+195.260
+195.261
+195.262
+195.263
+195.264
+195.265
+195.266
+195.267
+195.268
+195.269
+195.270
+195.271
+195.272
+195.273
+195.274
+195.275
+195.276
+195.277
+195.278
+195.279
+195.280
+195.281
+195.282
+195.283
+195.284
+195.285
+195.286
+195.287
+195.288
+195.289
+195.290
+195.297
+195.302
+195.303
+195.304
+195.305
+195.306
+195.307
+195.308
+195.309
+195.310
+195.311
+195.312
+195.313
+195.314
+195.315
+195.316
+195.317
+195.318
+195.319
+195.320
+196.244
+196.245
+196.246
+196.247
+196.248
+196.249
+196.250
+196.251
+196.252
+196.253
+196.254
+196.255
+196.256
+196.257
+196.258
+196.259
+196.260
+196.261
+196.262
+196.263
+196.264
+196.265
+196.266
+196.267
+196.268
+196.269
+196.270
+196.271
+196.272
+196.273
+196.274
+196.275
+196.276
+196.277
+196.278
+196.279
+196.280
+196.281
+196.282
+196.283
+196.284
+196.285
+196.286
+196.287
+196.288
+196.289
+196.290
+196.296
+196.297
+196.302
+196.303
+196.304
+196.305
+196.306
+196.307
+196.308
+196.309
+196.310
+196.311
+196.312
+196.313
+196.314
+196.315
+196.316
+196.317
+196.318
+196.319
+196.320
+197.243
+197.244
+197.245
+197.246
+197.247
+197.248
+197.249
+197.250
+197.251
+197.252
+197.253
+197.254
+197.255
+197.256
+197.257
+197.258
+197.259
+197.260
+197.261
+197.262
+197.263
+197.264
+197.265
+197.266
+197.267
+197.268
+197.269
+197.270
+197.271
+197.272
+197.273
+197.274
+197.275
+197.276
+197.277
+197.278
+197.279
+197.280
+197.281
+197.282
+197.283
+197.284
+197.285
+197.286
+197.287
+197.288
+197.289
+197.290
+197.296
+197.297
+197.301
+197.302
+197.303
+197.304
+197.305
+197.306
+197.307
+197.308
+197.309
+197.310
+197.311
+197.312
+197.313
+197.314
+197.315
+197.316
+197.317
+197.318
+197.319
+197.320
+198.242
+198.243
+198.244
+198.245
+198.246
+198.247
+198.248
+198.249
+198.250
+198.251
+198.252
+198.253
+198.254
+198.255
+198.256
+198.257
+198.258
+198.259
+198.260
+198.261
+198.262
+198.263
+198.264
+198.265
+198.266
+198.267
+198.268
+198.269
+198.270
+198.271
+198.272
+198.273
+198.274
+198.275
+198.276
+198.277
+198.278
+198.279
+198.280
+198.281
+198.282
+198.283
+198.284
+198.285
+198.286
+198.287
+198.288
+198.289
+198.295
+198.296
+198.297
+198.301
+198.302
+198.303
+198.304
+198.305
+198.306
+198.307
+198.308
+198.309
+198.310
+198.311
+198.312
+198.313
+198.314
+198.315
+198.316
+198.317
+198.318
+198.319
+199.242
+199.243
+199.244
+199.245
+199.246
+199.247
+199.248
+199.249
+199.250
+199.251
+199.252
+199.253
+199.254
+199.255
+199.256
+199.257
+199.258
+199.259
+199.260
+199.261
+199.262
+199.263
+199.264
+199.265
+199.266
+199.267
+199.268
+199.269
+199.270
+199.271
+199.272
+199.273
+199.274
+199.275
+199.276
+199.277
+199.278
+199.279
+199.280
+199.281
+199.282
+199.283
+199.284
+199.285
+199.286
+199.287
+199.288
+199.289
+199.295
+199.296
+199.297
+199.300
+199.301
+199.302
+199.303
+199.304
+199.305
+199.306
+199.307
+199.308
+199.309
+199.310
+199.311
+199.312
+199.313
+199.314
+199.315
+199.316
+199.317
+199.318
+199.319
+200.241
+200.242
+200.243
+200.244
+200.245
+200.246
+200.247
+200.248
+200.249
+200.250
+200.251
+200.252
+200.253
+200.254
+200.255
+200.256
+200.257
+200.258
+200.259
+200.260
+200.261
+200.262
+200.263
+200.264
+200.265
+200.266
+200.267
+200.268
+200.269
+200.270
+200.271
+200.272
+200.273
+200.274
+200.275
+200.276
+200.277
+200.278
+200.279
+200.280
+200.281
+200.282
+200.283
+200.284
+200.285
+200.286
+200.287
+200.288
+200.289
+200.295
+200.296
+200.297
+200.300
+200.301
+200.302
+200.303
+200.304
+200.305
+200.306
+200.307
+200.308
+200.309
+200.310
+200.311
+200.312
+200.313
+200.314
+200.315
+200.316
+200.317
+200.318
+200.319
+201.240
+201.241
+201.242
+201.243
+201.244
+201.245
+201.246
+201.247
+201.248
+201.249
+201.250
+201.251
+201.252
+201.253
+201.254
+201.255
+201.256
+201.257
+201.258
+201.259
+201.260
+201.261
+201.262
+201.263
+201.264
+201.265
+201.266
+201.267
+201.268
+201.269
+201.270
+201.271
+201.272
+201.273
+201.274
+201.275
+201.276
+201.277
+201.278
+201.279
+201.280
+201.281
+201.282
+201.283
+201.284
+201.285
+201.286
+201.287
+201.288
+201.294
+201.295
+201.296
+201.297
+201.300
+201.301
+201.302
+201.303
+201.304
+201.305
+201.306
+201.307
+201.308
+201.309
+201.310
+201.311
+201.312
+201.313
+201.314
+201.315
+201.316
+201.317
+201.318
+201.319
+202.239
+202.240
+202.241
+202.242
+202.243
+202.244
+202.245
+202.246
+202.247
+202.248
+202.249
+202.250
+202.251
+202.252
+202.253
+202.254
+202.255
+202.256
+202.257
+202.258
+202.259
+202.260
+202.261
+202.262
+202.263
+202.264
+202.265
+202.266
+202.267
+202.268
+202.269
+202.270
+202.271
+202.272
+202.273
+202.274
+202.275
+202.276
+202.277
+202.278
+202.279
+202.280
+202.281
+202.282
+202.283
+202.284
+202.285
+202.286
+202.287
+202.288
+202.294
+202.295
+202.296
+202.297
+202.299
+202.300
+202.301
+202.302
+202.303
+202.304
+202.305
+202.306
+202.307
+202.308
+202.309
+202.310
+202.311
+202.312
+202.313
+202.314
+202.315
+202.316
+202.317
+202.318
+203.239
+203.240
+203.241
+203.242
+203.243
+203.244
+203.245
+203.246
+203.247
+203.248
+203.249
+203.250
+203.251
+203.252
+203.253
+203.254
+203.255
+203.256
+203.257
+203.258
+203.259
+203.260
+203.261
+203.262
+203.263
+203.264
+203.265
+203.266
+203.267
+203.268
+203.269
+203.270
+203.271
+203.272
+203.273
+203.274
+203.275
+203.276
+203.277
+203.278
+203.279
+203.280
+203.281
+203.282
+203.283
+203.284
+203.285
+203.286
+203.287
+203.293
+203.294
+203.295
+203.296
+203.297
+203.299
+203.300
+203.301
+203.302
+203.303
+203.304
+203.305
+203.306
+203.307
+203.308
+203.309
+203.310
+203.311
+203.312
+203.313
+203.314
+203.315
+203.316
+203.317
+203.318
+204.238
+204.239
+204.240
+204.241
+204.242
+204.243
+204.244
+204.245
+204.246
+204.247
+204.248
+204.249
+204.250
+204.251
+204.252
+204.253
+204.254
+204.255
+204.256
+204.257
+204.258
+204.259
+204.260
+204.261
+204.262
+204.263
+204.264
+204.265
+204.266
+204.267
+204.268
+204.269
+204.270
+204.271
+204.272
+204.273
+204.274
+204.275
+204.276
+204.277
+204.278
+204.279
+204.280
+204.281
+204.282
+204.283
+204.284
+204.285
+204.286
+204.287
+204.293
+204.294
+204.295
+204.296
+204.297
+204.298
+204.299
+204.300
+204.301
+204.302
+204.303
+204.304
+204.305
+204.306
+204.307
+204.308
+204.309
+204.310
+204.311
+204.312
+204.313
+204.314
+204.315
+204.316
+204.317
+204.318
+205.238
+205.239
+205.240
+205.241
+205.242
+205.243
+205.244
+205.245
+205.246
+205.247
+205.248
+205.249
+205.250
+205.251
+205.252
+205.253
+205.254
+205.255
+205.256
+205.257
+205.258
+205.259
+205.260
+205.261
+205.262
+205.263
+205.264
+205.265
+205.266
+205.267
+205.268
+205.269
+205.270
+205.271
+205.272
+205.273
+205.274
+205.275
+205.276
+205.277
+205.278
+205.279
+205.280
+205.281
+205.282
+205.283
+205.284
+205.285
+205.286
+205.287
+205.292
+205.293
+205.294
+205.295
+205.296
+205.297
+205.298
+205.299
+205.300
+205.301
+205.302
+205.303
+205.304
+205.305
+205.306
+205.307
+205.308
+205.309
+205.310
+205.311
+205.312
+205.313
+205.314
+205.315
+205.316
+205.317
+205.318
+206.238
+206.239
+206.240
+206.241
+206.242
+206.243
+206.244
+206.245
+206.246
+206.247
+206.248
+206.249
+206.250
+206.251
+206.252
+206.253
+206.254
+206.255
+206.256
+206.257
+206.258
+206.259
+206.260
+206.261
+206.262
+206.263
+206.264
+206.265
+206.266
+206.267
+206.268
+206.269
+206.270
+206.271
+206.272
+206.273
+206.274
+206.275
+206.276
+206.277
+206.278
+206.279
+206.280
+206.281
+206.282
+206.283
+206.284
+206.285
+206.286
+206.292
+206.293
+206.294
+206.295
+206.296
+206.297
+206.298
+206.299
+206.300
+206.301
+206.302
+206.303
+206.304
+206.305
+206.306
+206.307
+206.308
+206.309
+206.310
+206.311
+206.312
+206.313
+206.314
+206.315
+206.316
+206.317
+207.238
+207.239
+207.240
+207.241
+207.242
+207.243
+207.244
+207.245
+207.246
+207.247
+207.248
+207.249
+207.250
+207.251
+207.252
+207.253
+207.254
+207.255
+207.256
+207.257
+207.258
+207.259
+207.260
+207.261
+207.262
+207.263
+207.264
+207.265
+207.266
+207.267
+207.268
+207.269
+207.270
+207.271
+207.272
+207.273
+207.274
+207.275
+207.276
+207.277
+207.278
+207.279
+207.280
+207.281
+207.282
+207.283
+207.284
+207.285
+207.286
+207.291
+207.292
+207.293
+207.294
+207.295
+207.296
+207.297
+207.298
+207.299
+207.300
+207.301
+207.302
+207.303
+207.304
+207.305
+207.306
+207.307
+207.308
+207.309
+207.310
+207.311
+207.312
+207.313
+207.314
+207.315
+207.316
+207.317
+208.238
+208.239
+208.240
+208.241
+208.242
+208.243
+208.244
+208.245
+208.246
+208.247
+208.248
+208.249
+208.250
+208.251
+208.252
+208.253
+208.254
+208.255
+208.256
+208.257
+208.258
+208.259
+208.260
+208.261
+208.262
+208.263
+208.264
+208.265
+208.266
+208.267
+208.268
+208.269
+208.270
+208.271
+208.272
+208.273
+208.274
+208.275
+208.276
+208.277
+208.278
+208.279
+208.280
+208.281
+208.282
+208.283
+208.284
+208.285
+208.291
+208.292
+208.293
+208.294
+208.295
+208.296
+208.297
+208.298
+208.299
+208.300
+208.301
+208.302
+208.303
+208.304
+208.305
+208.306
+208.307
+208.308
+208.309
+208.310
+208.311
+208.312
+208.313
+208.314
+208.315
+208.316
+208.317
+209.238
+209.239
+209.240
+209.241
+209.242
+209.243
+209.244
+209.245
+209.246
+209.247
+209.248
+209.249
+209.250
+209.251
+209.252
+209.253
+209.254
+209.255
+209.256
+209.257
+209.258
+209.259
+209.260
+209.261
+209.262
+209.263
+209.264
+209.265
+209.266
+209.267
+209.268
+209.269
+209.270
+209.271
+209.272
+209.273
+209.274
+209.275
+209.276
+209.277
+209.278
+209.279
+209.280
+209.281
+209.282
+209.283
+209.284
+209.285
+209.291
+209.292
+209.293
+209.294
+209.295
+209.296
+209.297
+209.298
+209.299
+209.300
+209.301
+209.302
+209.303
+209.304
+209.305
+209.306
+209.307
+209.308
+209.309
+209.310
+209.311
+209.312
+209.313
+209.314
+209.315
+209.316
+209.317
+210.238
+210.239
+210.240
+210.241
+210.242
+210.243
+210.244
+210.245
+210.246
+210.247
+210.248
+210.249
+210.250
+210.251
+210.252
+210.253
+210.254
+210.255
+210.256
+210.257
+210.258
+210.259
+210.260
+210.261
+210.262
+210.263
+210.264
+210.265
+210.266
+210.267
+210.268
+210.269
+210.270
+210.271
+210.272
+210.273
+210.274
+210.275
+210.276
+210.277
+210.278
+210.279
+210.280
+210.281
+210.282
+210.283
+210.284
+210.290
+210.291
+210.292
+210.293
+210.294
+210.295
+210.296
+210.297
+210.298
+210.299
+210.300
+210.301
+210.302
+210.303
+210.304
+210.305
+210.306
+210.307
+210.308
+210.309
+210.310
+210.311
+210.312
+210.313
+210.314
+210.315
+210.316
+210.317
+211.238
+211.239
+211.240
+211.241
+211.242
+211.243
+211.244
+211.245
+211.246
+211.247
+211.248
+211.249
+211.250
+211.251
+211.252
+211.253
+211.254
+211.255
+211.256
+211.257
+211.258
+211.259
+211.260
+211.261
+211.262
+211.263
+211.264
+211.265
+211.266
+211.267
+211.268
+211.269
+211.270
+211.271
+211.272
+211.273
+211.274
+211.275
+211.276
+211.277
+211.278
+211.279
+211.280
+211.281
+211.282
+211.283
+211.284
+211.290
+211.291
+211.292
+211.293
+211.294
+211.295
+211.296
+211.297
+211.298
+211.299
+211.300
+211.301
+211.302
+211.303
+211.304
+211.305
+211.306
+211.307
+211.308
+211.309
+211.310
+211.311
+211.312
+211.313
+211.314
+211.315
+211.316
+212.238
+212.239
+212.240
+212.241
+212.242
+212.243
+212.244
+212.245
+212.246
+212.247
+212.248
+212.249
+212.250
+212.251
+212.252
+212.253
+212.254
+212.255
+212.256
+212.257
+212.258
+212.259
+212.260
+212.261
+212.262
+212.263
+212.264
+212.265
+212.266
+212.267
+212.268
+212.269
+212.270
+212.271
+212.272
+212.273
+212.274
+212.275
+212.276
+212.277
+212.278
+212.279
+212.280
+212.281
+212.282
+212.283
+212.284
+212.289
+212.290
+212.291
+212.292
+212.293
+212.294
+212.295
+212.296
+212.297
+212.298
+212.299
+212.300
+212.301
+212.302
+212.303
+212.304
+212.305
+212.306
+212.307
+212.308
+212.309
+212.310
+212.311
+212.312
+212.313
+212.314
+212.315
+212.316
+213.238
+213.239
+213.240
+213.241
+213.242
+213.243
+213.244
+213.245
+213.246
+213.247
+213.248
+213.249
+213.250
+213.251
+213.252
+213.253
+213.254
+213.255
+213.256
+213.257
+213.258
+213.259
+213.260
+213.261
+213.262
+213.263
+213.264
+213.265
+213.266
+213.267
+213.268
+213.269
+213.270
+213.271
+213.272
+213.273
+213.274
+213.275
+213.276
+213.277
+213.278
+213.279
+213.280
+213.281
+213.282
+213.283
+213.289
+213.290
+213.291
+213.292
+213.293
+213.294
+213.295
+213.296
+213.297
+213.298
+213.299
+213.300
+213.301
+213.302
+213.303
+213.304
+213.305
+213.306
+213.307
+213.308
+213.309
+213.310
+213.311
+213.312
+213.313
+213.314
+213.315
+213.316
+214.238
+214.239
+214.240
+214.241
+214.242
+214.243
+214.244
+214.245
+214.246
+214.247
+214.248
+214.249
+214.250
+214.251
+214.252
+214.253
+214.254
+214.255
+214.256
+214.257
+214.258
+214.259
+214.260
+214.261
+214.262
+214.263
+214.264
+214.265
+214.266
+214.267
+214.268
+214.269
+214.270
+214.271
+214.272
+214.273
+214.274
+214.275
+214.276
+214.277
+214.278
+214.279
+214.280
+214.281
+214.282
+214.283
+214.288
+214.289
+214.290
+214.291
+214.292
+214.293
+214.294
+214.295
+214.296
+214.297
+214.298
+214.299
+214.300
+214.301
+214.302
+214.303
+214.304
+214.305
+214.306
+214.307
+214.308
+214.309
+214.310
+214.311
+214.312
+214.313
+214.314
+214.315
+214.316
+215.238
+215.239
+215.240
+215.241
+215.242
+215.243
+215.244
+215.245
+215.246
+215.247
+215.248
+215.249
+215.250
+215.251
+215.252
+215.253
+215.254
+215.255
+215.256
+215.257
+215.258
+215.259
+215.260
+215.261
+215.262
+215.263
+215.264
+215.265
+215.266
+215.267
+215.268
+215.269
+215.270
+215.271
+215.272
+215.273
+215.274
+215.275
+215.276
+215.277
+215.278
+215.279
+215.280
+215.281
+215.282
+215.288
+215.289
+215.290
+215.291
+215.292
+215.293
+215.294
+215.295
+215.296
+215.297
+215.298
+215.299
+215.300
+215.301
+215.302
+215.303
+215.304
+215.305
+215.306
+215.307
+215.308
+215.309
+215.310
+215.311
+215.312
+215.313
+215.314
+215.315
+216.238
+216.239
+216.240
+216.241
+216.242
+216.243
+216.244
+216.245
+216.246
+216.247
+216.248
+216.249
+216.250
+216.251
+216.252
+216.253
+216.254
+216.255
+216.256
+216.257
+216.258
+216.259
+216.260
+216.261
+216.262
+216.263
+216.264
+216.265
+216.266
+216.267
+216.268
+216.269
+216.270
+216.271
+216.272
+216.273
+216.274
+216.275
+216.276
+216.277
+216.278
+216.279
+216.280
+216.281
+216.282
+216.288
+216.289
+216.290
+216.291
+216.292
+216.293
+216.294
+216.295
+216.296
+216.297
+216.298
+216.299
+216.300
+216.301
+216.302
+216.303
+216.304
+216.305
+216.306
+216.307
+216.308
+216.309
+216.310
+216.311
+216.312
+216.313
+216.314
+216.315
+217.238
+217.239
+217.240
+217.241
+217.242
+217.243
+217.244
+217.245
+217.246
+217.247
+217.248
+217.249
+217.250
+217.251
+217.252
+217.253
+217.254
+217.255
+217.256
+217.257
+217.258
+217.259
+217.260
+217.261
+217.262
+217.263
+217.264
+217.265
+217.266
+217.267
+217.268
+217.269
+217.270
+217.271
+217.272
+217.273
+217.274
+217.275
+217.276
+217.277
+217.278
+217.279
+217.280
+217.281
+217.287
+217.288
+217.289
+217.290
+217.291
+217.292
+217.293
+217.294
+217.295
+217.296
+217.297
+217.298
+217.299
+217.300
+217.301
+217.302
+217.303
+217.304
+217.305
+217.306
+217.307
+217.308
+217.309
+217.310
+217.311
+217.312
+217.313
+217.314
+217.315
+218.238
+218.239
+218.240
+218.241
+218.242
+218.243
+218.244
+218.245
+218.246
+218.247
+218.248
+218.249
+218.250
+218.251
+218.252
+218.253
+218.254
+218.255
+218.256
+218.257
+218.258
+218.259
+218.260
+218.261
+218.262
+218.263
+218.264
+218.265
+218.266
+218.267
+218.268
+218.269
+218.270
+218.271
+218.272
+218.273
+218.274
+218.275
+218.276
+218.277
+218.278
+218.279
+218.280
+218.281
+218.287
+218.288
+218.289
+218.290
+218.291
+218.292
+218.293
+218.294
+218.295
+218.296
+218.297
+218.298
+218.299
+218.300
+218.301
+218.302
+218.303
+218.304
+218.305
+218.306
+218.307
+218.308
+218.309
+218.310
+218.311
+218.312
+218.313
+218.314
+218.315
+219.238
+219.239
+219.240
+219.241
+219.242
+219.243
+219.244
+219.245
+219.246
+219.247
+219.248
+219.249
+219.250
+219.251
+219.252
+219.253
+219.254
+219.255
+219.256
+219.257
+219.258
+219.259
+219.260
+219.261
+219.262
+219.263
+219.264
+219.265
+219.266
+219.267
+219.268
+219.269
+219.270
+219.271
+219.272
+219.273
+219.274
+219.275
+219.276
+219.277
+219.278
+219.279
+219.280
+219.286
+219.287
+219.288
+219.289
+219.290
+219.291
+219.292
+219.293
+219.294
+219.295
+219.296
+219.297
+219.298
+219.299
+219.300
+219.301
+219.302
+219.303
+219.304
+219.305
+219.306
+219.307
+219.308
+219.309
+219.310
+219.311
+219.312
+219.313
+219.314
+220.238
+220.239
+220.240
+220.241
+220.242
+220.243
+220.244
+220.245
+220.246
+220.247
+220.248
+220.249
+220.250
+220.251
+220.252
+220.253
+220.254
+220.255
+220.256
+220.257
+220.258
+220.259
+220.260
+220.261
+220.262
+220.263
+220.264
+220.265
+220.266
+220.267
+220.268
+220.269
+220.270
+220.271
+220.272
+220.273
+220.274
+220.275
+220.276
+220.277
+220.278
+220.279
+220.280
+220.286
+220.287
+220.288
+220.289
+220.290
+220.291
+220.292
+220.293
+220.294
+220.295
+220.296
+220.297
+220.298
+220.299
+220.300
+220.301
+220.302
+220.303
+220.304
+220.305
+220.306
+220.307
+220.308
+220.309
+220.310
+220.311
+220.312
+220.313
+220.314
+221.238
+221.239
+221.240
+221.241
+221.242
+221.243
+221.244
+221.245
+221.246
+221.247
+221.248
+221.249
+221.250
+221.251
+221.252
+221.253
+221.254
+221.255
+221.256
+221.257
+221.258
+221.259
+221.260
+221.261
+221.262
+221.263
+221.264
+221.265
+221.266
+221.267
+221.268
+221.269
+221.270
+221.271
+221.272
+221.273
+221.274
+221.275
+221.276
+221.277
+221.278
+221.279
+221.285
+221.286
+221.287
+221.288
+221.289
+221.290
+221.291
+221.292
+221.293
+221.294
+221.295
+221.296
+221.297
+221.298
+221.299
+221.300
+221.301
+221.302
+221.303
+221.304
+221.305
+221.306
+221.307
+221.308
+221.309
+221.310
+221.311
+221.312
+221.313
+221.314
+222.238
+222.239
+222.240
+222.241
+222.242
+222.243
+222.244
+222.245
+222.246
+222.247
+222.248
+222.249
+222.250
+222.251
+222.252
+222.253
+222.254
+222.255
+222.256
+222.257
+222.258
+222.259
+222.260
+222.261
+222.262
+222.263
+222.264
+222.265
+222.266
+222.267
+222.268
+222.269
+222.270
+222.271
+222.272
+222.273
+222.274
+222.275
+222.276
+222.277
+222.278
+222.279
+222.285
+222.286
+222.287
+222.288
+222.289
+222.290
+222.291
+222.292
+222.293
+222.294
+222.295
+222.296
+222.297
+222.298
+222.299
+222.300
+222.301
+222.302
+222.303
+222.304
+222.305
+222.306
+222.307
+222.308
+222.309
+222.310
+222.311
+222.312
+222.313
+223.238
+223.239
+223.240
+223.241
+223.242
+223.243
+223.244
+223.245
+223.246
+223.247
+223.248
+223.249
+223.250
+223.251
+223.252
+223.253
+223.254
+223.255
+223.256
+223.257
+223.258
+223.259
+223.260
+223.261
+223.262
+223.263
+223.264
+223.265
+223.266
+223.267
+223.268
+223.269
+223.270
+223.271
+223.272
+223.273
+223.274
+223.275
+223.276
+223.277
+223.278
+223.285
+223.286
+223.287
+223.288
+223.289
+223.290
+223.291
+223.292
+223.293
+223.294
+223.295
+223.296
+223.297
+223.298
+223.299
+223.300
+223.301
+223.302
+223.303
+223.304
+223.305
+223.306
+223.307
+223.308
+223.309
+223.310
+223.311
+223.312
+223.313
+224.238
+224.239
+224.240
+224.241
+224.242
+224.243
+224.244
+224.245
+224.246
+224.247
+224.248
+224.249
+224.250
+224.251
+224.252
+224.253
+224.254
+224.255
+224.256
+224.257
+224.258
+224.259
+224.260
+224.261
+224.262
+224.263
+224.264
+224.265
+224.266
+224.267
+224.268
+224.269
+224.270
+224.271
+224.272
+224.273
+224.274
+224.275
+224.276
+224.277
+224.278
+224.284
+224.285
+224.286
+224.287
+224.288
+224.289
+224.290
+224.291
+224.292
+224.293
+224.294
+224.295
+224.296
+224.297
+224.298
+224.299
+224.300
+224.301
+224.302
+224.303
+224.304
+224.305
+224.306
+224.307
+224.308
+224.309
+224.310
+224.311
+224.312
+224.313
+225.238
+225.239
+225.240
+225.241
+225.242
+225.243
+225.244
+225.245
+225.246
+225.247
+225.248
+225.249
+225.250
+225.251
+225.252
+225.253
+225.254
+225.255
+225.256
+225.257
+225.258
+225.259
+225.260
+225.261
+225.262
+225.263
+225.264
+225.265
+225.266
+225.267
+225.268
+225.269
+225.270
+225.271
+225.272
+225.273
+225.274
+225.275
+225.276
+225.277
+225.284
+225.285
+225.286
+225.287
+225.288
+225.289
+225.290
+225.291
+225.292
+225.293
+225.294
+225.295
+225.296
+225.297
+225.298
+225.299
+225.300
+225.301
+225.302
+225.303
+225.304
+225.305
+225.306
+225.307
+225.308
+225.309
+225.310
+225.311
+225.312
+225.313
+226.238
+226.239
+226.240
+226.241
+226.242
+226.243
+226.244
+226.245
+226.246
+226.247
+226.248
+226.249
+226.250
+226.251
+226.252
+226.253
+226.254
+226.255
+226.256
+226.257
+226.258
+226.259
+226.260
+226.261
+226.262
+226.263
+226.264
+226.265
+226.266
+226.267
+226.268
+226.269
+226.270
+226.271
+226.272
+226.273
+226.274
+226.275
+226.276
+226.277
+226.283
+226.284
+226.285
+226.286
+226.287
+226.288
+226.289
+226.290
+226.291
+226.292
+226.293
+226.294
+226.295
+226.296
+226.297
+226.298
+226.299
+226.300
+226.301
+226.302
+226.303
+226.304
+226.305
+226.306
+226.307
+226.308
+226.309
+226.310
+226.311
+226.312
+226.313
+227.238
+227.239
+227.240
+227.241
+227.242
+227.243
+227.244
+227.245
+227.246
+227.247
+227.248
+227.249
+227.250
+227.251
+227.252
+227.253
+227.254
+227.255
+227.256
+227.257
+227.258
+227.259
+227.260
+227.261
+227.262
+227.263
+227.264
+227.265
+227.266
+227.267
+227.268
+227.269
+227.270
+227.271
+227.272
+227.273
+227.274
+227.275
+227.276
+227.277
+227.283
+227.284
+227.285
+227.286
+227.287
+227.288
+227.289
+227.290
+227.291
+227.292
+227.293
+227.294
+227.295
+227.296
+227.297
+227.298
+227.299
+227.300
+227.301
+227.302
+227.303
+227.304
+227.305
+227.306
+227.307
+227.308
+227.309
+227.310
+227.311
+227.312
+228.238
+228.239
+228.240
+228.241
+228.242
+228.243
+228.244
+228.245
+228.246
+228.247
+228.248
+228.249
+228.250
+228.251
+228.252
+228.253
+228.254
+228.255
+228.256
+228.257
+228.258
+228.259
+228.260
+228.261
+228.262
+228.263
+228.264
+228.265
+228.266
+228.267
+228.268
+228.269
+228.270
+228.271
+228.272
+228.273
+228.274
+228.275
+228.276
+228.282
+228.283
+228.284
+228.285
+228.286
+228.287
+228.288
+228.289
+228.290
+228.291
+228.292
+228.293
+228.294
+228.295
+228.296
+228.297
+228.298
+228.299
+228.300
+228.301
+228.302
+228.303
+228.304
+228.305
+228.306
+228.307
+228.308
+228.309
+228.310
+228.311
+228.312
+229.238
+229.239
+229.240
+229.241
+229.242
+229.243
+229.244
+229.245
+229.246
+229.247
+229.248
+229.249
+229.250
+229.251
+229.252
+229.253
+229.254
+229.255
+229.256
+229.257
+229.258
+229.259
+229.260
+229.261
+229.262
+229.263
+229.264
+229.265
+229.266
+229.267
+229.268
+229.269
+229.270
+229.271
+229.272
+229.273
+229.274
+229.275
+229.276
+229.282
+229.283
+229.284
+229.285
+229.286
+229.287
+229.288
+229.289
+229.290
+229.291
+229.292
+229.293
+229.294
+229.295
+229.296
+229.297
+229.298
+229.299
+229.300
+229.301
+229.302
+229.303
+229.304
+229.305
+229.306
+229.307
+229.308
+229.309
+229.310
+229.311
+229.312
+230.238
+230.239
+230.240
+230.241
+230.242
+230.243
+230.244
+230.245
+230.246
+230.247
+230.248
+230.249
+230.250
+230.251
+230.252
+230.253
+230.254
+230.255
+230.256
+230.257
+230.258
+230.259
+230.260
+230.261
+230.262
+230.263
+230.264
+230.265
+230.266
+230.267
+230.268
+230.269
+230.270
+230.271
+230.272
+230.273
+230.274
+230.275
+230.281
+230.282
+230.283
+230.284
+230.285
+230.286
+230.287
+230.288
+230.289
+230.290
+230.291
+230.292
+230.293
+230.294
+230.295
+230.296
+230.297
+230.298
+230.299
+230.300
+230.301
+230.302
+230.303
+230.304
+230.305
+230.306
+230.307
+230.308
+230.309
+230.310
+230.311
+230.312
+231.238
+231.239
+231.240
+231.241
+231.242
+231.243
+231.244
+231.245
+231.246
+231.247
+231.248
+231.249
+231.250
+231.251
+231.252
+231.253
+231.254
+231.255
+231.256
+231.257
+231.258
+231.259
+231.260
+231.261
+231.262
+231.263
+231.264
+231.265
+231.266
+231.267
+231.268
+231.269
+231.270
+231.271
+231.272
+231.273
+231.274
+231.275
+231.281
+231.282
+231.283
+231.284
+231.285
+231.286
+231.287
+231.288
+231.289
+231.290
+231.291
+231.292
+231.293
+231.294
+231.295
+231.296
+231.297
+231.298
+231.299
+231.300
+231.301
+231.302
+231.303
+231.304
+231.305
+231.306
+231.307
+231.308
+231.309
+231.310
+231.311
+231.312
+232.238
+232.239
+232.240
+232.241
+232.242
+232.243
+232.244
+232.245
+232.246
+232.247
+232.248
+232.249
+232.250
+232.251
+232.252
+232.253
+232.254
+232.255
+232.256
+232.257
+232.258
+232.259
+232.260
+232.261
+232.262
+232.263
+232.264
+232.265
+232.266
+232.267
+232.268
+232.269
+232.270
+232.271
+232.272
+232.273
+232.274
+232.281
+232.282
+232.283
+232.284
+232.285
+232.286
+232.287
+232.288
+232.289
+232.290
+232.291
+232.292
+232.293
+232.294
+232.295
+232.296
+232.297
+232.298
+232.299
+232.300
+232.301
+232.302
+232.303
+232.304
+232.305
+232.306
+232.307
+232.308
+232.309
+232.310
+232.311
+233.238
+233.239
+233.240
+233.241
+233.242
+233.243
+233.244
+233.245
+233.246
+233.247
+233.248
+233.249
+233.250
+233.251
+233.252
+233.253
+233.254
+233.255
+233.256
+233.257
+233.258
+233.259
+233.260
+233.261
+233.262
+233.263
+233.264
+233.265
+233.266
+233.267
+233.268
+233.269
+233.270
+233.271
+233.272
+233.273
+233.280
+233.281
+233.282
+233.283
+233.284
+233.285
+233.286
+233.287
+233.288
+233.289
+233.290
+233.291
+233.292
+233.293
+233.294
+233.295
+233.296
+233.297
+233.298
+233.299
+233.300
+233.301
+233.302
+233.303
+233.304
+233.305
+233.306
+233.307
+233.308
+233.309
+233.310
+233.311
+234.238
+234.239
+234.240
+234.241
+234.242
+234.243
+234.244
+234.245
+234.246
+234.247
+234.248
+234.249
+234.250
+234.251
+234.252
+234.253
+234.254
+234.255
+234.256
+234.257
+234.258
+234.259
+234.260
+234.261
+234.262
+234.263
+234.264
+234.265
+234.266
+234.267
+234.268
+234.269
+234.270
+234.271
+234.272
+234.273
+234.280
+234.281
+234.282
+234.283
+234.284
+234.285
+234.286
+234.287
+234.288
+234.289
+234.290
+234.291
+234.292
+234.293
+234.294
+234.295
+234.296
+234.297
+234.298
+234.299
+234.300
+234.301
+234.302
+234.303
+234.304
+234.305
+234.306
+234.307
+234.308
+234.309
+234.310
+234.311
+235.238
+235.239
+235.240
+235.241
+235.242
+235.243
+235.244
+235.245
+235.246
+235.247
+235.248
+235.249
+235.250
+235.251
+235.252
+235.253
+235.254
+235.255
+235.256
+235.257
+235.258
+235.259
+235.260
+235.261
+235.262
+235.263
+235.264
+235.265
+235.266
+235.267
+235.268
+235.269
+235.270
+235.271
+235.272
+235.279
+235.280
+235.281
+235.282
+235.283
+235.284
+235.285
+235.286
+235.287
+235.288
+235.289
+235.290
+235.291
+235.292
+235.293
+235.294
+235.295
+235.296
+235.297
+235.298
+235.299
+235.300
+235.301
+235.302
+235.303
+235.304
+235.305
+235.306
+235.307
+235.308
+235.309
+235.310
+235.311
+236.238
+236.239
+236.240
+236.241
+236.242
+236.243
+236.244
+236.245
+236.246
+236.247
+236.248
+236.249
+236.250
+236.251
+236.252
+236.253
+236.254
+236.255
+236.256
+236.257
+236.258
+236.259
+236.260
+236.261
+236.262
+236.263
+236.264
+236.265
+236.266
+236.267
+236.268
+236.269
+236.270
+236.271
+236.272
+236.278
+236.279
+236.280
+236.281
+236.282
+236.283
+236.284
+236.285
+236.286
+236.287
+236.288
+236.289
+236.290
+236.291
+236.292
+236.293
+236.294
+236.295
+236.296
+236.297
+236.298
+236.299
+236.300
+236.301
+236.302
+236.303
+236.304
+236.305
+236.306
+236.307
+236.308
+236.309
+236.310
+236.311
+237.238
+237.239
+237.240
+237.241
+237.242
+237.243
+237.244
+237.245
+237.246
+237.247
+237.248
+237.249
+237.250
+237.251
+237.252
+237.253
+237.254
+237.255
+237.256
+237.257
+237.258
+237.259
+237.260
+237.261
+237.262
+237.263
+237.264
+237.265
+237.266
+237.267
+237.268
+237.269
+237.270
+237.271
+237.278
+237.279
+237.280
+237.281
+237.282
+237.283
+237.284
+237.285
+237.286
+237.287
+237.288
+237.289
+237.290
+237.291
+237.292
+237.293
+237.294
+237.295
+237.296
+237.297
+237.298
+237.299
+237.300
+237.301
+237.302
+237.303
+237.304
+237.305
+237.306
+237.307
+237.308
+237.309
+237.310
+238.238
+238.239
+238.240
+238.241
+238.242
+238.243
+238.244
+238.245
+238.246
+238.247
+238.248
+238.249
+238.250
+238.251
+238.252
+238.253
+238.254
+238.255
+238.256
+238.257
+238.258
+238.259
+238.260
+238.261
+238.262
+238.263
+238.264
+238.265
+238.266
+238.267
+238.268
+238.269
+238.270
+238.271
+238.277
+238.278
+238.279
+238.280
+238.281
+238.282
+238.283
+238.284
+238.285
+238.286
+238.287
+238.288
+238.289
+238.290
+238.291
+238.292
+238.293
+238.294
+238.295
+238.296
+238.297
+238.298
+238.299
+238.300
+238.301
+238.302
+238.303
+238.304
+238.305
+238.306
+238.307
+238.308
+238.309
+238.310
+239.238
+239.239
+239.240
+239.241
+239.242
+239.243
+239.244
+239.245
+239.246
+239.247
+239.248
+239.249
+239.250
+239.251
+239.252
+239.253
+239.254
+239.255
+239.256
+239.257
+239.258
+239.259
+239.260
+239.261
+239.262
+239.263
+239.264
+239.265
+239.266
+239.267
+239.268
+239.269
+239.270
+239.277
+239.278
+239.279
+239.280
+239.281
+239.282
+239.283
+239.284
+239.285
+239.286
+239.287
+239.288
+239.289
+239.290
+239.291
+239.292
+239.293
+239.294
+239.295
+239.296
+239.297
+239.298
+239.299
+239.300
+239.301
+239.302
+239.303
+239.304
+239.305
+239.306
+239.307
+239.308
+239.309
+239.310
+240.238
+240.239
+240.240
+240.241
+240.242
+240.243
+240.244
+240.245
+240.246
+240.247
+240.248
+240.249
+240.250
+240.251
+240.252
+240.253
+240.254
+240.255
+240.256
+240.257
+240.258
+240.259
+240.260
+240.261
+240.263
+240.264
+240.265
+240.266
+240.267
+240.268
+240.269
+240.270
+240.276
+240.277
+240.278
+240.279
+240.280
+240.281
+240.282
+240.283
+240.284
+240.285
+240.286
+240.287
+240.288
+240.289
+240.290
+240.291
+240.292
+240.293
+240.294
+240.295
+240.296
+240.297
+240.298
+240.299
+240.300
+240.301
+240.302
+240.303
+240.304
+240.305
+240.306
+240.307
+240.308
+240.309
+240.310
+241.238
+241.239
+241.240
+241.241
+241.242
+241.243
+241.244
+241.245
+241.246
+241.247
+241.248
+241.249
+241.250
+241.251
+241.252
+241.253
+241.254
+241.255
+241.256
+241.257
+241.258
+241.259
+241.260
+241.261
+241.262
+241.263
+241.264
+241.265
+241.266
+241.267
+241.268
+241.269
+241.270
+241.276
+241.277
+241.278
+241.279
+241.280
+241.281
+241.282
+241.283
+241.284
+241.285
+241.286
+241.287
+241.288
+241.289
+241.290
+241.291
+241.292
+241.293
+241.294
+241.295
+241.296
+241.297
+241.298
+241.299
+241.300
+241.301
+241.302
+241.303
+241.304
+241.305
+241.306
+241.307
+241.308
+241.309
+242.238
+242.239
+242.240
+242.241
+242.242
+242.243
+242.244
+242.245
+242.246
+242.247
+242.248
+242.249
+242.250
+242.251
+242.252
+242.253
+242.254
+242.255
+242.256
+242.257
+242.258
+242.259
+242.260
+242.262
+242.263
+242.264
+242.265
+242.266
+242.267
+242.268
+242.269
+242.276
+242.277
+242.278
+242.279
+242.280
+242.281
+242.282
+242.283
+242.284
+242.285
+242.286
+242.287
+242.288
+242.289
+242.290
+242.291
+242.292
+242.293
+242.294
+242.295
+242.296
+242.297
+242.298
+242.299
+242.300
+242.301
+242.302
+242.303
+242.304
+242.305
+242.306
+242.307
+242.308
+242.309
+243.238
+243.239
+243.240
+243.241
+243.242
+243.243
+243.244
+243.245
+243.246
+243.247
+243.248
+243.249
+243.250
+243.251
+243.252
+243.253
+243.254
+243.255
+243.256
+243.257
+243.258
+243.259
+243.261
+243.262
+243.263
+243.264
+243.265
+243.266
+243.267
+243.268
+243.269
+243.275
+243.276
+243.277
+243.278
+243.279
+243.280
+243.281
+243.282
+243.283
+243.284
+243.285
+243.286
+243.287
+243.288
+243.289
+243.290
+243.291
+243.292
+243.293
+243.294
+243.295
+243.296
+243.297
+243.298
+243.299
+243.300
+243.301
+243.302
+243.303
+243.304
+243.305
+243.306
+243.307
+243.308
+243.309
+244.238
+244.239
+244.240
+244.241
+244.242
+244.243
+244.244
+244.245
+244.246
+244.247
+244.248
+244.249
+244.250
+244.251
+244.252
+244.253
+244.254
+244.255
+244.256
+244.257
+244.258
+244.259
+244.260
+244.261
+244.262
+244.263
+244.264
+244.265
+244.266
+244.267
+244.268
+244.269
+244.274
+244.275
+244.276
+244.277
+244.278
+244.279
+244.280
+244.281
+244.282
+244.283
+244.284
+244.285
+244.286
+244.287
+244.288
+244.289
+244.290
+244.291
+244.292
+244.293
+244.294
+244.295
+244.296
+244.297
+244.298
+244.299
+244.300
+244.301
+244.302
+244.303
+244.304
+244.305
+244.306
+244.307
+244.308
+245.238
+245.239
+245.240
+245.241
+245.242
+245.243
+245.244
+245.245
+245.246
+245.247
+245.248
+245.249
+245.250
+245.251
+245.252
+245.253
+245.254
+245.255
+245.256
+245.257
+245.258
+245.259
+245.260
+245.261
+245.262
+245.263
+245.264
+245.265
+245.266
+245.267
+245.268
+245.269
+245.274
+245.275
+245.276
+245.277
+245.278
+245.279
+245.280
+245.281
+245.282
+245.283
+245.284
+245.285
+245.286
+245.287
+245.288
+245.289
+245.290
+245.291
+245.292
+245.293
+245.294
+245.295
+245.296
+245.297
+245.298
+245.299
+245.300
+245.301
+245.302
+245.303
+245.304
+245.305
+245.306
+245.307
+245.308
+246.239
+246.240
+246.241
+246.242
+246.243
+246.244
+246.245
+246.246
+246.247
+246.248
+246.249
+246.250
+246.251
+246.252
+246.253
+246.254
+246.255
+246.256
+246.257
+246.258
+246.259
+246.260
+246.261
+246.262
+246.263
+246.264
+246.265
+246.266
+246.267
+246.268
+246.269
+246.273
+246.274
+246.275
+246.276
+246.277
+246.278
+246.279
+246.280
+246.281
+246.282
+246.283
+246.284
+246.285
+246.286
+246.287
+246.288
+246.289
+246.290
+246.291
+246.292
+246.293
+246.294
+246.295
+246.296
+246.297
+246.298
+246.299
+246.300
+246.301
+246.302
+246.303
+246.304
+246.305
+246.306
+246.307
+246.308
+247.239
+247.240
+247.241
+247.242
+247.243
+247.244
+247.245
+247.246
+247.247
+247.248
+247.249
+247.250
+247.251
+247.252
+247.253
+247.254
+247.255
+247.256
+247.257
+247.258
+247.259
+247.260
+247.261
+247.262
+247.263
+247.264
+247.265
+247.266
+247.267
+247.268
+247.269
+247.273
+247.274
+247.275
+247.276
+247.277
+247.278
+247.279
+247.280
+247.281
+247.282
+247.283
+247.284
+247.285
+247.286
+247.287
+247.288
+247.289
+247.290
+247.291
+247.292
+247.293
+247.294
+247.295
+247.296
+247.297
+247.298
+247.299
+247.300
+247.301
+247.302
+247.303
+247.304
+247.305
+247.306
+247.307
+247.308
+248.239
+248.240
+248.241
+248.242
+248.243
+248.244
+248.245
+248.246
+248.247
+248.248
+248.249
+248.250
+248.251
+248.252
+248.253
+248.254
+248.255
+248.256
+248.258
+248.259
+248.260
+248.261
+248.262
+248.263
+248.264
+248.265
+248.266
+248.267
+248.268
+248.269
+248.272
+248.273
+248.274
+248.275
+248.276
+248.277
+248.278
+248.279
+248.280
+248.281
+248.282
+248.283
+248.284
+248.285
+248.286
+248.287
+248.288
+248.289
+248.290
+248.291
+248.292
+248.293
+248.294
+248.295
+248.296
+248.297
+248.298
+248.299
+248.300
+248.301
+248.302
+248.303
+248.304
+248.305
+248.306
+248.307
+248.308
+249.238
+249.239
+249.240
+249.241
+249.242
+249.243
+249.244
+249.245
+249.246
+249.247
+249.248
+249.249
+249.250
+249.251
+249.252
+249.253
+249.254
+249.255
+249.257
+249.258
+249.259
+249.260
+249.261
+249.262
+249.263
+249.264
+249.265
+249.266
+249.267
+249.268
+249.269
+249.272
+249.273
+249.274
+249.275
+249.276
+249.277
+249.278
+249.279
+249.280
+249.281
+249.282
+249.283
+249.284
+249.285
+249.286
+249.287
+249.288
+249.289
+249.290
+249.291
+249.292
+249.293
+249.294
+249.295
+249.296
+249.297
+249.298
+249.299
+249.300
+249.301
+249.302
+249.303
+249.304
+249.305
+249.306
+249.307
+250.238
+250.239
+250.240
+250.241
+250.242
+250.243
+250.244
+250.245
+250.246
+250.247
+250.248
+250.249
+250.250
+250.251
+250.252
+250.253
+250.254
+250.257
+250.258
+250.259
+250.260
+250.261
+250.262
+250.263
+250.264
+250.265
+250.266
+250.267
+250.268
+250.269
+250.271
+250.272
+250.273
+250.274
+250.275
+250.276
+250.277
+250.278
+250.279
+250.280
+250.281
+250.282
+250.283
+250.284
+250.285
+250.286
+250.287
+250.288
+250.289
+250.290
+250.291
+250.292
+250.293
+250.294
+250.295
+250.296
+250.297
+250.298
+250.299
+250.300
+250.301
+250.302
+250.303
+250.304
+250.305
+250.306
+250.307
+251.238
+251.239
+251.240
+251.241
+251.242
+251.243
+251.244
+251.245
+251.246
+251.247
+251.248
+251.249
+251.250
+251.251
+251.252
+251.253
+251.256
+251.257
+251.258
+251.259
+251.260
+251.261
+251.262
+251.263
+251.264
+251.265
+251.266
+251.267
+251.268
+251.269
+251.271
+251.272
+251.273
+251.274
+251.275
+251.276
+251.277
+251.278
+251.279
+251.280
+251.281
+251.282
+251.283
+251.284
+251.285
+251.286
+251.287
+251.288
+251.289
+251.290
+251.291
+251.292
+251.293
+251.294
+251.295
+251.296
+251.297
+251.298
+251.299
+251.300
+251.301
+251.302
+251.303
+251.304
+251.305
+251.306
+251.307
+252.238
+252.239
+252.240
+252.241
+252.242
+252.243
+252.244
+252.245
+252.246
+252.247
+252.248
+252.249
+252.250
+252.251
+252.252
+252.253
+252.256
+252.257
+252.258
+252.259
+252.260
+252.261
+252.262
+252.263
+252.264
+252.265
+252.266
+252.267
+252.268
+252.269
+252.270
+252.271
+252.272
+252.273
+252.274
+252.275
+252.276
+252.277
+252.278
+252.279
+252.280
+252.281
+252.282
+252.283
+252.284
+252.285
+252.286
+252.287
+252.288
+252.289
+252.290
+252.291
+252.292
+252.293
+252.294
+252.295
+252.296
+252.297
+252.298
+252.299
+252.300
+252.301
+252.302
+252.303
+252.304
+252.305
+252.306
+252.307
+253.238
+253.239
+253.240
+253.241
+253.242
+253.243
+253.244
+253.245
+253.246
+253.247
+253.248
+253.249
+253.250
+253.251
+253.252
+253.255
+253.256
+253.257
+253.258
+253.259
+253.260
+253.261
+253.262
+253.263
+253.264
+253.265
+253.266
+253.267
+253.268
+253.269
+253.270
+253.271
+253.272
+253.273
+253.274
+253.275
+253.276
+253.277
+253.278
+253.279
+253.280
+253.281
+253.282
+253.283
+253.284
+253.285
+253.286
+253.287
+253.288
+253.289
+253.290
+253.291
+253.292
+253.293
+253.294
+253.295
+253.296
+253.297
+253.298
+253.299
+253.300
+253.301
+253.302
+253.303
+253.304
+253.305
+253.306
+254.238
+254.239
+254.240
+254.241
+254.242
+254.243
+254.244
+254.245
+254.246
+254.247
+254.248
+254.249
+254.250
+254.251
+254.254
+254.255
+254.256
+254.257
+254.258
+254.259
+254.260
+254.261
+254.262
+254.263
+254.264
+254.265
+254.266
+254.267
+254.268
+254.269
+254.270
+254.271
+254.272
+254.273
+254.274
+254.275
+254.276
+254.277
+254.278
+254.279
+254.280
+254.281
+254.282
+254.283
+254.284
+254.285
+254.286
+254.287
+254.288
+254.289
+254.290
+254.291
+254.292
+254.293
+254.294
+254.295
+254.296
+254.297
+254.298
+254.299
+254.300
+254.301
+254.302
+254.303
+254.304
+254.305
+254.306
+255.238
+255.239
+255.240
+255.241
+255.242
+255.243
+255.244
+255.245
+255.246
+255.247
+255.248
+255.249
+255.250
+255.251
+255.254
+255.255
+255.256
+255.257
+255.258
+255.259
+255.260
+255.261
+255.262
+255.263
+255.264
+255.265
+255.266
+255.267
+255.268
+255.269
+255.270
+255.271
+255.272
+255.273
+255.274
+255.275
+255.276
+255.277
+255.278
+255.279
+255.280
+255.281
+255.282
+255.283
+255.284
+255.285
+255.286
+255.287
+255.288
+255.289
+255.290
+255.291
+255.292
+255.293
+255.294
+255.295
+255.296
+255.297
+255.298
+255.299
+255.300
+255.301
+255.302
+255.303
+255.304
+255.305
+255.306
+256.238
+256.239
+256.240
+256.241
+256.242
+256.243
+256.244
+256.245
+256.246
+256.247
+256.248
+256.249
+256.250
+256.251
+256.253
+256.254
+256.255
+256.256
+256.257
+256.258
+256.259
+256.260
+256.261
+256.262
+256.263
+256.264
+256.265
+256.266
+256.267
+256.268
+256.269
+256.270
+256.271
+256.272
+256.273
+256.274
+256.275
+256.276
+256.277
+256.278
+256.279
+256.280
+256.281
+256.282
+256.283
+256.284
+256.285
+256.286
+256.287
+256.288
+256.289
+256.290
+256.291
+256.292
+256.293
+256.294
+256.295
+256.296
+256.297
+256.298
+256.299
+256.300
+256.301
+256.302
+256.303
+256.304
+256.305
+256.306
+257.238
+257.239
+257.240
+257.241
+257.242
+257.243
+257.244
+257.245
+257.246
+257.247
+257.248
+257.249
+257.250
+257.252
+257.253
+257.254
+257.255
+257.256
+257.257
+257.258
+257.259
+257.260
+257.261
+257.262
+257.263
+257.264
+257.265
+257.266
+257.267
+257.268
+257.269
+257.270
+257.271
+257.272
+257.273
+257.274
+257.275
+257.276
+257.277
+257.278
+257.279
+257.280
+257.281
+257.282
+257.283
+257.284
+257.285
+257.286
+257.287
+257.288
+257.289
+257.290
+257.291
+257.292
+257.293
+257.294
+257.295
+257.296
+257.297
+257.298
+257.299
+257.300
+257.301
+257.302
+257.303
+257.304
+257.305
+257.306
+258.238
+258.239
+258.240
+258.241
+258.242
+258.243
+258.244
+258.245
+258.246
+258.247
+258.248
+258.249
+258.250
+258.252
+258.253
+258.254
+258.255
+258.256
+258.257
+258.258
+258.259
+258.260
+258.261
+258.262
+258.263
+258.264
+258.265
+258.266
+258.267
+258.268
+258.269
+258.270
+258.271
+258.272
+258.273
+258.274
+258.275
+258.276
+258.277
+258.278
+258.279
+258.280
+258.281
+258.282
+258.283
+258.284
+258.285
+258.286
+258.287
+258.288
+258.289
+258.290
+258.291
+258.292
+258.293
+258.294
+258.295
+258.296
+258.297
+258.298
+258.299
+258.300
+258.301
+258.302
+258.303
+258.304
+258.305
+259.238
+259.239
+259.240
+259.241
+259.242
+259.243
+259.244
+259.245
+259.246
+259.247
+259.248
+259.249
+259.251
+259.252
+259.253
+259.254
+259.255
+259.256
+259.257
+259.258
+259.259
+259.260
+259.261
+259.262
+259.263
+259.264
+259.265
+259.266
+259.267
+259.268
+259.269
+259.270
+259.271
+259.272
+259.273
+259.274
+259.275
+259.276
+259.277
+259.278
+259.279
+259.280
+259.281
+259.282
+259.283
+259.284
+259.285
+259.286
+259.287
+259.288
+259.289
+259.290
+259.291
+259.292
+259.293
+259.294
+259.295
+259.296
+259.297
+259.298
+259.299
+259.300
+259.301
+259.302
+259.303
+259.304
+259.305
+260.238
+260.239
+260.240
+260.241
+260.242
+260.243
+260.244
+260.245
+260.246
+260.247
+260.248
+260.249
+260.251
+260.252
+260.253
+260.254
+260.255
+260.256
+260.257
+260.258
+260.259
+260.260
+260.261
+260.262
+260.263
+260.264
+260.265
+260.266
+260.267
+260.268
+260.269
+260.270
+260.271
+260.272
+260.273
+260.274
+260.275
+260.276
+260.277
+260.278
+260.279
+260.280
+260.281
+260.282
+260.283
+260.284
+260.285
+260.286
+260.287
+260.288
+260.289
+260.290
+260.291
+260.292
+260.293
+260.294
+260.295
+260.296
+260.297
+260.298
+260.299
+260.300
+260.301
+260.302
+260.303
+260.304
+260.305
+261.238
+261.239
+261.240
+261.241
+261.242
+261.243
+261.244
+261.245
+261.246
+261.247
+261.248
+261.250
+261.251
+261.252
+261.253
+261.254
+261.255
+261.256
+261.257
+261.258
+261.259
+261.260
+261.261
+261.262
+261.263
+261.264
+261.265
+261.266
+261.267
+261.268
+261.269
+261.270
+261.271
+261.272
+261.273
+261.274
+261.275
+261.276
+261.277
+261.278
+261.279
+261.280
+261.281
+261.282
+261.283
+261.284
+261.285
+261.286
+261.287
+261.288
+261.289
+261.290
+261.291
+261.292
+261.293
+261.294
+261.295
+261.296
+261.297
+261.298
+261.299
+261.300
+261.301
+261.302
+261.303
+261.304
+261.305
+262.238
+262.239
+262.240
+262.241
+262.242
+262.243
+262.244
+262.245
+262.246
+262.247
+262.250
+262.251
+262.252
+262.253
+262.254
+262.255
+262.256
+262.257
+262.258
+262.259
+262.260
+262.261
+262.262
+262.263
+262.264
+262.265
+262.266
+262.267
+262.268
+262.269
+262.270
+262.271
+262.272
+262.273
+262.274
+262.275
+262.276
+262.277
+262.278
+262.279
+262.280
+262.281
+262.282
+262.283
+262.284
+262.285
+262.286
+262.287
+262.288
+262.289
+262.290
+262.291
+262.292
+262.293
+262.294
+262.295
+262.296
+262.297
+262.298
+262.299
+262.300
+262.301
+262.302
+262.303
+262.304
+263.238
+263.239
+263.240
+263.241
+263.242
+263.243
+263.244
+263.245
+263.246
+263.249
+263.250
+263.251
+263.252
+263.253
+263.254
+263.255
+263.256
+263.257
+263.258
+263.259
+263.260
+263.261
+263.262
+263.263
+263.264
+263.265
+263.266
+263.267
+263.268
+263.269
+263.270
+263.271
+263.272
+263.273
+263.274
+263.275
+263.276
+263.277
+263.278
+263.279
+263.280
+263.281
+263.282
+263.283
+263.284
+263.285
+263.286
+263.287
+263.288
+263.289
+263.290
+263.291
+263.292
+263.293
+263.294
+263.295
+263.296
+263.297
+263.298
+263.299
+263.300
+263.301
+263.302
+263.303
+263.304
+264.238
+264.239
+264.240
+264.241
+264.242
+264.243
+264.244
+264.245
+264.249
+264.250
+264.251
+264.252
+264.253
+264.254
+264.255
+264.256
+264.257
+264.258
+264.259
+264.260
+264.261
+264.262
+264.263
+264.264
+264.265
+264.266
+264.267
+264.268
+264.269
+264.270
+264.271
+264.272
+264.273
+264.274
+264.275
+264.276
+264.277
+264.278
+264.279
+264.280
+264.281
+264.282
+264.283
+264.284
+264.285
+264.286
+264.287
+264.288
+264.289
+264.290
+264.291
+264.292
+264.293
+264.294
+264.295
+264.296
+264.297
+264.298
+264.299
+264.300
+264.301
+264.302
+264.303
+264.304
+265.238
+265.239
+265.240
+265.241
+265.242
+265.243
+265.244
+265.248
+265.249
+265.250
+265.251
+265.252
+265.253
+265.254
+265.255
+265.256
+265.257
+265.258
+265.259
+265.260
+265.261
+265.262
+265.263
+265.264
+265.265
+265.266
+265.267
+265.268
+265.269
+265.270
+265.271
+265.272
+265.273
+265.274
+265.275
+265.276
+265.277
+265.278
+265.279
+265.280
+265.281
+265.282
+265.283
+265.284
+265.285
+265.286
+265.287
+265.288
+265.289
+265.290
+265.291
+265.292
+265.293
+265.294
+265.295
+265.296
+265.297
+265.298
+265.299
+265.300
+265.301
+265.302
+265.303
+265.304
+266.238
+266.239
+266.240
+266.241
+266.242
+266.243
+266.244
+266.247
+266.248
+266.249
+266.250
+266.251
+266.252
+266.253
+266.254
+266.255
+266.256
+266.257
+266.258
+266.259
+266.260
+266.261
+266.262
+266.263
+266.264
+266.265
+266.266
+266.267
+266.268
+266.269
+266.270
+266.271
+266.272
+266.273
+266.274
+266.275
+266.276
+266.277
+266.278
+266.279
+266.280
+266.281
+266.282
+266.283
+266.284
+266.285
+266.286
+266.287
+266.288
+266.289
+266.290
+266.291
+266.292
+266.293
+266.294
+266.295
+266.296
+266.297
+266.298
+266.299
+266.300
+266.301
+266.302
+266.303
+266.304
+267.238
+267.239
+267.240
+267.241
+267.242
+267.243
+267.246
+267.247
+267.248
+267.249
+267.250
+267.251
+267.252
+267.253
+267.254
+267.255
+267.256
+267.257
+267.258
+267.259
+267.260
+267.261
+267.262
+267.263
+267.264
+267.265
+267.266
+267.267
+267.268
+267.269
+267.270
+267.271
+267.272
+267.273
+267.274
+267.275
+267.276
+267.277
+267.278
+267.279
+267.280
+267.281
+267.282
+267.283
+267.284
+267.285
+267.286
+267.287
+267.288
+267.289
+267.290
+267.291
+267.292
+267.293
+267.294
+267.295
+267.296
+267.297
+267.298
+267.299
+267.300
+267.301
+267.302
+267.303
+268.238
+268.239
+268.240
+268.241
+268.242
+268.243
+268.246
+268.247
+268.248
+268.249
+268.250
+268.251
+268.252
+268.253
+268.254
+268.255
+268.256
+268.257
+268.258
+268.259
+268.260
+268.261
+268.262
+268.263
+268.264
+268.265
+268.266
+268.267
+268.268
+268.269
+268.270
+268.271
+268.272
+268.273
+268.274
+268.275
+268.276
+268.277
+268.278
+268.279
+268.280
+268.281
+268.282
+268.283
+268.284
+268.285
+268.286
+268.287
+268.288
+268.289
+268.290
+268.291
+268.292
+268.293
+268.294
+268.295
+268.296
+268.297
+268.298
+268.299
+268.300
+268.301
+268.302
+268.303
+269.238
+269.239
+269.240
+269.241
+269.242
+269.245
+269.246
+269.247
+269.248
+269.249
+269.250
+269.251
+269.252
+269.253
+269.254
+269.255
+269.256
+269.257
+269.258
+269.259
+269.260
+269.261
+269.262
+269.263
+269.264
+269.265
+269.266
+269.267
+269.268
+269.269
+269.270
+269.271
+269.272
+269.273
+269.274
+269.275
+269.276
+269.277
+269.278
+269.279
+269.280
+269.281
+269.282
+269.283
+269.284
+269.285
+269.286
+269.287
+269.288
+269.289
+269.290
+269.291
+269.292
+269.293
+269.294
+269.295
+269.296
+269.297
+269.298
+269.299
+269.300
+269.301
+269.302
+269.303
+270.238
+270.239
+270.240
+270.241
+270.244
+270.245
+270.246
+270.247
+270.248
+270.249
+270.250
+270.251
+270.252
+270.253
+270.254
+270.255
+270.256
+270.257
+270.258
+270.259
+270.260
+270.261
+270.262
+270.263
+270.264
+270.265
+270.266
+270.267
+270.268
+270.269
+270.270
+270.271
+270.272
+270.273
+270.274
+270.275
+270.276
+270.277
+270.278
+270.279
+270.280
+270.281
+270.282
+270.283
+270.284
+270.285
+270.286
+270.287
+270.288
+270.289
+270.290
+270.291
+270.292
+270.293
+270.294
+270.295
+270.296
+270.297
+270.298
+270.299
+270.300
+270.301
+270.302
+271.238
+271.239
+271.240
+271.244
+271.245
+271.246
+271.247
+271.248
+271.249
+271.250
+271.251
+271.252
+271.253
+271.254
+271.255
+271.256
+271.257
+271.258
+271.259
+271.260
+271.261
+271.262
+271.263
+271.264
+271.265
+271.266
+271.267
+271.268
+271.269
+271.270
+271.271
+271.272
+271.273
+271.274
+271.275
+271.276
+271.277
+271.278
+271.279
+271.280
+271.281
+271.282
+271.283
+271.284
+271.285
+271.286
+271.287
+271.288
+271.289
+271.290
+271.291
+271.292
+271.293
+271.294
+271.295
+271.296
+271.297
+271.298
+271.299
+271.300
+271.301
+271.302
+272.238
+272.239
+272.243
+272.244
+272.245
+272.246
+272.247
+272.248
+272.249
+272.250
+272.251
+272.252
+272.253
+272.254
+272.255
+272.256
+272.257
+272.258
+272.259
+272.260
+272.261
+272.262
+272.263
+272.264
+272.265
+272.266
+272.267
+272.268
+272.269
+272.270
+272.271
+272.272
+272.273
+272.274
+272.275
+272.276
+272.277
+272.278
+272.279
+272.280
+272.281
+272.282
+272.283
+272.284
+272.285
+272.286
+272.287
+272.288
+272.289
+272.290
+272.291
+272.292
+272.293
+272.294
+272.295
+272.296
+272.297
+272.298
+272.299
+272.300
+272.301
+272.302
+273.242
+273.243
+273.244
+273.245
+273.246
+273.247
+273.248
+273.249
+273.250
+273.251
+273.252
+273.253
+273.254
+273.255
+273.256
+273.257
+273.258
+273.259
+273.260
+273.261
+273.262
+273.263
+273.264
+273.265
+273.266
+273.267
+273.268
+273.269
+273.270
+273.271
+273.272
+273.273
+273.274
+273.275
+273.276
+273.277
+273.278
+273.279
+273.280
+273.281
+273.282
+273.283
+273.284
+273.285
+273.286
+273.287
+273.288
+273.289
+273.290
+273.291
+273.292
+273.293
+273.294
+273.295
+273.296
+273.297
+273.298
+273.299
+273.300
+273.301
+273.302
+274.241
+274.242
+274.243
+274.244
+274.245
+274.246
+274.247
+274.248
+274.249
+274.250
+274.251
+274.252
+274.253
+274.254
+274.255
+274.256
+274.257
+274.258
+274.259
+274.260
+274.261
+274.262
+274.263
+274.264
+274.265
+274.266
+274.267
+274.268
+274.269
+274.270
+274.271
+274.272
+274.273
+274.274
+274.275
+274.276
+274.277
+274.278
+274.279
+274.280
+274.281
+274.282
+274.283
+274.284
+274.285
+274.286
+274.287
+274.288
+274.289
+274.290
+274.291
+274.292
+274.293
+274.294
+274.295
+274.296
+274.297
+274.298
+274.299
+274.300
+274.301
+275.241
+275.242
+275.243
+275.244
+275.245
+275.246
+275.247
+275.248
+275.249
+275.250
+275.251
+275.252
+275.253
+275.254
+275.255
+275.256
+275.257
+275.258
+275.259
+275.260
+275.261
+275.262
+275.263
+275.264
+275.265
+275.266
+275.267
+275.268
+275.269
+275.270
+275.271
+275.272
+275.273
+275.274
+275.275
+275.276
+275.277
+275.278
+275.279
+275.280
+275.281
+275.282
+275.283
+275.284
+275.285
+275.286
+275.287
+275.288
+275.289
+275.290
+275.291
+275.292
+275.293
+275.294
+275.295
+275.296
+275.297
+275.298
+275.299
+275.300
+275.301
+276.240
+276.241
+276.242
+276.243
+276.244
+276.245
+276.246
+276.247
+276.248
+276.249
+276.250
+276.251
+276.252
+276.253
+276.254
+276.255
+276.256
+276.257
+276.258
+276.259
+276.260
+276.261
+276.262
+276.263
+276.264
+276.265
+276.266
+276.267
+276.268
+276.269
+276.270
+276.271
+276.272
+276.273
+276.274
+276.275
+276.276
+276.277
+276.278
+276.279
+276.280
+276.281
+276.282
+276.283
+276.284
+276.285
+276.286
+276.287
+276.288
+276.289
+276.290
+276.291
+276.292
+276.293
+276.294
+276.295
+276.296
+276.297
+276.298
+276.299
+276.300
+276.301
+277.240
+277.241
+277.242
+277.243
+277.244
+277.245
+277.246
+277.247
+277.248
+277.249
+277.250
+277.251
+277.252
+277.253
+277.254
+277.255
+277.256
+277.257
+277.258
+277.259
+277.260
+277.261
+277.262
+277.263
+277.264
+277.265
+277.266
+277.267
+277.268
+277.269
+277.270
+277.271
+277.272
+277.273
+277.274
+277.275
+277.276
+277.277
+277.278
+277.279
+277.280
+277.281
+277.282
+277.283
+277.284
+277.285
+277.286
+277.287
+277.288
+277.289
+277.290
+277.291
+277.292
+277.293
+277.294
+277.295
+277.296
+277.297
+277.298
+277.299
+277.300
+278.239
+278.240
+278.241
+278.242
+278.243
+278.244
+278.245
+278.246
+278.247
+278.248
+278.249
+278.250
+278.251
+278.252
+278.253
+278.254
+278.255
+278.256
+278.257
+278.258
+278.259
+278.260
+278.261
+278.262
+278.263
+278.264
+278.265
+278.266
+278.267
+278.268
+278.269
+278.270
+278.271
+278.272
+278.273
+278.274
+278.275
+278.276
+278.277
+278.278
+278.279
+278.280
+278.281
+278.282
+278.283
+278.284
+278.285
+278.286
+278.287
+278.288
+278.289
+278.290
+278.291
+278.292
+278.293
+278.294
+278.295
+278.296
+278.297
+278.298
+278.299
+278.300
+279.239
+279.240
+279.241
+279.242
+279.243
+279.244
+279.245
+279.246
+279.247
+279.248
+279.249
+279.250
+279.251
+279.252
+279.253
+279.254
+279.255
+279.256
+279.257
+279.258
+279.259
+279.260
+279.261
+279.262
+279.263
+279.264
+279.265
+279.266
+279.267
+279.268
+279.269
+279.270
+279.271
+279.272
+279.273
+279.274
+279.275
+279.276
+279.277
+279.278
+279.279
+279.280
+279.281
+279.282
+279.283
+279.284
+279.285
+279.286
+279.287
+279.288
+279.289
+279.290
+279.291
+279.292
+279.293
+279.294
+279.295
+279.296
+279.297
+279.298
+279.299
+279.300
+280.238
+280.239
+280.240
+280.241
+280.242
+280.243
+280.244
+280.245
+280.246
+280.247
+280.248
+280.249
+280.250
+280.251
+280.252
+280.253
+280.254
+280.255
+280.256
+280.257
+280.258
+280.259
+280.260
+280.261
+280.262
+280.263
+280.264
+280.265
+280.266
+280.267
+280.268
+280.269
+280.270
+280.271
+280.272
+280.273
+280.274
+280.275
+280.276
+280.277
+280.278
+280.279
+280.280
+280.281
+280.282
+280.283
+280.284
+280.285
+280.286
+280.287
+280.288
+280.289
+280.290
+280.291
+280.292
+280.293
+280.294
+280.295
+280.296
+280.297
+280.298
+280.299
+280.300
+281.238
+281.239
+281.240
+281.241
+281.242
+281.243
+281.244
+281.245
+281.246
+281.247
+281.248
+281.249
+281.250
+281.251
+281.252
+281.253
+281.254
+281.255
+281.256
+281.257
+281.258
+281.259
+281.260
+281.261
+281.262
+281.263
+281.264
+281.265
+281.266
+281.267
+281.268
+281.269
+281.270
+281.271
+281.272
+281.273
+281.274
+281.275
+281.276
+281.277
+281.278
+281.279
+281.280
+281.281
+281.282
+281.283
+281.284
+281.285
+281.286
+281.287
+281.288
+281.289
+281.290
+281.291
+281.292
+281.293
+281.294
+281.295
+281.296
+281.297
+281.298
+281.299
+282.238
+282.239
+282.240
+282.241
+282.242
+282.243
+282.244
+282.245
+282.246
+282.247
+282.248
+282.249
+282.250
+282.251
+282.252
+282.253
+282.254
+282.255
+282.256
+282.257
+282.258
+282.259
+282.260
+282.261
+282.262
+282.263
+282.264
+282.265
+282.266
+282.267
+282.268
+282.269
+282.270
+282.271
+282.272
+282.273
+282.274
+282.275
+282.276
+282.277
+282.278
+282.279
+282.280
+282.281
+282.282
+282.283
+282.284
+282.285
+282.286
+282.287
+282.288
+282.289
+282.290
+282.291
+282.292
+282.293
+282.294
+282.295
+282.296
+282.297
+282.298
+282.299
+283.238
+283.239
+283.240
+283.241
+283.242
+283.243
+283.244
+283.245
+283.246
+283.247
+283.248
+283.249
+283.250
+283.251
+283.252
+283.253
+283.254
+283.255
+283.256
+283.257
+283.258
+283.259
+283.260
+283.261
+283.262
+283.263
+283.264
+283.265
+283.266
+283.267
+283.268
+283.269
+283.270
+283.271
+283.272
+283.273
+283.274
+283.275
+283.276
+283.277
+283.278
+283.279
+283.280
+283.281
+283.282
+283.283
+283.284
+283.285
+283.286
+283.287
+283.288
+283.289
+283.290
+283.291
+283.292
+283.293
+283.294
+283.295
+283.296
+283.297
+283.298
+283.299
+284.238
+284.239
+284.240
+284.241
+284.242
+284.243
+284.244
+284.245
+284.246
+284.247
+284.248
+284.249
+284.250
+284.251
+284.252
+284.253
+284.254
+284.255
+284.256
+284.257
+284.258
+284.259
+284.260
+284.261
+284.262
+284.263
+284.264
+284.265
+284.266
+284.267
+284.268
+284.269
+284.270
+284.271
+284.272
+284.273
+284.274
+284.275
+284.276
+284.277
+284.278
+284.279
+284.280
+284.281
+284.282
+284.283
+284.284
+284.285
+284.286
+284.287
+284.288
+284.289
+284.290
+284.291
+284.292
+284.293
+284.294
+284.295
+284.296
+284.297
+284.298
+284.299
+285.238
+285.239
+285.240
+285.241
+285.242
+285.243
+285.244
+285.245
+285.246
+285.247
+285.248
+285.249
+285.250
+285.251
+285.252
+285.253
+285.254
+285.255
+285.256
+285.257
+285.258
+285.259
+285.260
+285.261
+285.262
+285.263
+285.264
+285.265
+285.266
+285.267
+285.268
+285.269
+285.270
+285.271
+285.272
+285.273
+285.274
+285.275
+285.276
+285.277
+285.278
+285.279
+285.280
+285.281
+285.282
+285.283
+285.284
+285.285
+285.286
+285.287
+285.288
+285.289
+285.290
+285.291
+285.292
+285.293
+285.294
+285.295
+285.296
+285.297
+285.298
+286.238
+286.239
+286.240
+286.241
+286.242
+286.243
+286.244
+286.245
+286.246
+286.247
+286.248
+286.249
+286.250
+286.251
+286.252
+286.253
+286.254
+286.255
+286.256
+286.257
+286.258
+286.259
+286.260
+286.261
+286.262
+286.263
+286.264
+286.265
+286.266
+286.267
+286.268
+286.269
+286.270
+286.271
+286.272
+286.273
+286.274
+286.275
+286.276
+286.277
+286.278
+286.279
+286.280
+286.281
+286.282
+286.283
+286.284
+286.285
+286.286
+286.287
+286.288
+286.289
+286.290
+286.291
+286.292
+286.293
+286.294
+286.295
+286.296
+286.297
+286.298
+287.238
+287.239
+287.240
+287.241
+287.242
+287.243
+287.244
+287.245
+287.246
+287.247
+287.248
+287.249
+287.250
+287.251
+287.252
+287.253
+287.254
+287.255
+287.256
+287.257
+287.258
+287.259
+287.260
+287.261
+287.262
+287.263
+287.264
+287.265
+287.266
+287.267
+287.268
+287.269
+287.270
+287.271
+287.272
+287.273
+287.274
+287.275
+287.276
+287.277
+287.278
+287.279
+287.280
+287.281
+287.282
+287.283
+287.284
+287.285
+287.286
+287.287
+287.288
+287.289
+287.290
+287.291
+287.292
+287.293
+287.294
+287.295
+287.296
+287.297
+287.298
+288.238
+288.239
+288.240
+288.241
+288.242
+288.243
+288.244
+288.245
+288.246
+288.247
+288.248
+288.249
+288.250
+288.251
+288.252
+288.253
+288.254
+288.255
+288.256
+288.257
+288.258
+288.259
+288.260
+288.261
+288.262
+288.263
+288.264
+288.265
+288.266
+288.267
+288.268
+288.269
+288.270
+288.271
+288.272
+288.273
+288.274
+288.275
+288.276
+288.277
+288.278
+288.279
+288.280
+288.281
+288.282
+288.283
+288.284
+288.285
+288.286
+288.287
+288.288
+288.289
+288.290
+288.291
+288.292
+288.293
+288.294
+288.295
+288.296
+288.297
+288.298
+289.238
+289.239
+289.240
+289.241
+289.242
+289.243
+289.244
+289.245
+289.246
+289.247
+289.248
+289.249
+289.250
+289.251
+289.252
+289.253
+289.254
+289.255
+289.256
+289.257
+289.258
+289.259
+289.260
+289.261
+289.262
+289.263
+289.264
+289.265
+289.266
+289.267
+289.268
+289.269
+289.270
+289.271
+289.272
+289.273
+289.274
+289.275
+289.276
+289.277
+289.278
+289.279
+289.280
+289.281
+289.282
+289.283
+289.284
+289.285
+289.286
+289.287
+289.288
+289.289
+289.290
+289.291
+289.292
+289.293
+289.294
+289.295
+289.296
+289.297
+290.238
+290.239
+290.240
+290.241
+290.242
+290.243
+290.244
+290.245
+290.246
+290.247
+290.248
+290.249
+290.250
+290.251
+290.252
+290.253
+290.254
+290.255
+290.256
+290.257
+290.258
+290.259
+290.260
+290.261
+290.262
+290.263
+290.264
+290.265
+290.266
+290.267
+290.268
+290.269
+290.270
+290.271
+290.272
+290.273
+290.274
+290.275
+290.276
+290.277
+290.278
+290.279
+290.280
+290.281
+290.282
+290.283
+290.284
+290.285
+290.286
+290.287
+290.288
+290.289
+290.290
+290.291
+290.292
+290.293
+290.294
+290.295
+290.296
+290.297
+291.238
+291.239
+291.240
+291.241
+291.242
+291.243
+291.244
+291.245
+291.246
+291.247
+291.248
+291.249
+291.250
+291.251
+291.252
+291.253
+291.254
+291.255
+291.256
+291.257
+291.258
+291.259
+291.260
+291.261
+291.262
+291.263
+291.264
+291.265
+291.266
+291.267
+291.268
+291.269
+291.270
+291.271
+291.272
+291.273
+291.274
+291.275
+291.276
+291.277
+291.278
+291.279
+291.280
+291.281
+291.282
+291.283
+291.284
+291.285
+291.286
+291.287
+291.288
+291.289
+291.290
+291.291
+291.292
+291.293
+291.294
+291.295
+291.296
+291.297
+292.238
+292.239
+292.240
+292.241
+292.242
+292.243
+292.244
+292.245
+292.246
+292.247
+292.248
+292.249
+292.250
+292.251
+292.252
+292.253
+292.254
+292.255
+292.256
+292.257
+292.258
+292.259
+292.260
+292.261
+292.262
+292.263
+292.264
+292.265
+292.266
+292.267
+292.268
+292.269
+292.270
+292.271
+292.272
+292.273
+292.274
+292.275
+292.276
+292.277
+292.278
+292.279
+292.280
+292.281
+292.282
+292.283
+292.284
+292.285
+292.286
+292.287
+292.288
+292.289
+292.290
+292.291
+292.292
+292.293
+292.294
+292.295
+292.296
+292.297
+293.238
+293.239
+293.240
+293.241
+293.242
+293.243
+293.244
+293.245
+293.246
+293.247
+293.248
+293.249
+293.250
+293.251
+293.252
+293.253
+293.254
+293.255
+293.256
+293.257
+293.258
+293.259
+293.260
+293.261
+293.262
+293.263
+293.264
+293.265
+293.266
+293.267
+293.268
+293.269
+293.270
+293.271
+293.272
+293.273
+293.274
+293.275
+293.276
+293.277
+293.278
+293.279
+293.280
+293.281
+293.282
+293.283
+293.284
+293.285
+293.286
+293.287
+293.288
+293.289
+293.290
+293.291
+293.292
+293.293
+293.294
+293.295
+293.296
+294.238
+294.239
+294.240
+294.241
+294.242
+294.243
+294.244
+294.245
+294.246
+294.247
+294.248
+294.249
+294.250
+294.251
+294.252
+294.253
+294.254
+294.255
+294.256
+294.257
+294.258
+294.259
+294.260
+294.261
+294.262
+294.263
+294.264
+294.265
+294.266
+294.267
+294.268
+294.269
+294.270
+294.271
+294.272
+294.273
+294.274
+294.275
+294.276
+294.277
+294.278
+294.279
+294.280
+294.281
+294.282
+294.283
+294.284
+294.285
+294.286
+294.287
+294.288
+294.289
+294.290
+294.291
+294.292
+294.293
+294.294
+294.295
+294.296
+295.238
+295.239
+295.240
+295.241
+295.242
+295.243
+295.244
+295.245
+295.246
+295.247
+295.248
+295.249
+295.250
+295.251
+295.252
+295.253
+295.254
+295.255
+295.256
+295.257
+295.258
+295.259
+295.260
+295.261
+295.262
+295.263
+295.264
+295.265
+295.266
+295.267
+295.268
+295.269
+295.270
+295.271
+295.272
+295.273
+295.274
+295.275
+295.276
+295.277
+295.278
+295.279
+295.280
+295.281
+295.282
+295.283
+295.284
+295.285
+295.286
+295.287
+295.288
+295.289
+295.290
+295.291
+295.292
+295.293
+295.294
+295.295
+295.296
+296.238
+296.239
+296.240
+296.241
+296.242
+296.243
+296.244
+296.245
+296.246
+296.247
+296.248
+296.249
+296.250
+296.251
+296.252
+296.253
+296.254
+296.255
+296.256
+296.257
+296.258
+296.259
+296.260
+296.261
+296.262
+296.263
+296.264
+296.265
+296.266
+296.267
+296.268
+296.269
+296.270
+296.271
+296.272
+296.273
+296.274
+296.275
+296.276
+296.277
+296.278
+296.279
+296.280
+296.281
+296.282
+296.283
+296.284
+296.285
+296.286
+296.287
+296.288
+296.289
+296.290
+296.291
+296.292
+296.293
+296.294
+296.295
+296.296
+297.238
+297.239
+297.240
+297.241
+297.242
+297.243
+297.244
+297.245
+297.246
+297.247
+297.248
+297.249
+297.250
+297.251
+297.252
+297.253
+297.254
+297.255
+297.256
+297.257
+297.258
+297.259
+297.260
+297.261
+297.262
+297.263
+297.264
+297.265
+297.266
+297.267
+297.268
+297.269
+297.270
+297.271
+297.272
+297.273
+297.274
+297.275
+297.276
+297.277
+297.278
+297.279
+297.280
+297.281
+297.282
+297.283
+297.284
+297.285
+297.286
+297.287
+297.288
+297.289
+297.290
+297.291
+297.292
+297.293
+297.294
+297.295
+298.238
+298.239
+298.240
+298.241
+298.242
+298.243
+298.244
+298.245
+298.246
+298.247
+298.248
+298.249
+298.250
+298.251
+298.252
+298.253
+298.254
+298.255
+298.256
+298.257
+298.258
+298.259
+298.260
+298.261
+298.262
+298.263
+298.264
+298.265
+298.266
+298.267
+298.268
+298.269
+298.270
+298.271
+298.272
+298.273
+298.274
+298.275
+298.276
+298.277
+298.278
+298.279
+298.280
+298.281
+298.282
+298.283
+298.284
+298.285
+298.286
+298.287
+298.288
+298.289
+298.290
+298.291
+298.292
+298.293
+298.294
+298.295
+299.183
+299.184
+299.185
+299.238
+299.239
+299.240
+299.241
+299.242
+299.243
+299.244
+299.245
+299.246
+299.247
+299.248
+299.249
+299.250
+299.251
+299.252
+299.253
+299.254
+299.255
+299.256
+299.257
+299.258
+299.259
+299.260
+299.261
+299.262
+299.263
+299.264
+299.265
+299.266
+299.267
+299.268
+299.269
+299.270
+299.271
+299.272
+299.273
+299.274
+299.275
+299.276
+299.277
+299.278
+299.279
+299.280
+299.281
+299.282
+299.283
+299.284
+299.285
+299.286
+299.287
+299.288
+299.289
+299.290
+299.291
+299.292
+299.293
+299.294
+299.295
+300.183
+300.184
+300.185
+300.238
+300.239
+300.240
+300.241
+300.242
+300.243
+300.244
+300.245
+300.246
+300.247
+300.248
+300.249
+300.250
+300.251
+300.252
+300.253
+300.254
+300.255
+300.256
+300.257
+300.258
+300.259
+300.260
+300.261
+300.262
+300.263
+300.264
+300.265
+300.266
+300.267
+300.268
+300.269
+300.270
+300.271
+300.272
+300.273
+300.274
+300.275
+300.276
+300.277
+300.278
+300.279
+300.280
+300.281
+300.282
+300.283
+300.284
+300.285
+300.286
+300.287
+300.288
+300.289
+300.290
+300.291
+300.292
+300.293
+300.294
+300.295
+301.183
+301.184
+301.185
+301.238
+301.239
+301.240
+301.241
+301.242
+301.243
+301.244
+301.245
+301.246
+301.247
+301.248
+301.249
+301.250
+301.251
+301.252
+301.253
+301.254
+301.255
+301.256
+301.257
+301.258
+301.259
+301.260
+301.261
+301.262
+301.263
+301.264
+301.265
+301.266
+301.268
+301.269
+301.270
+301.271
+301.272
+301.273
+301.274
+301.275
+301.276
+301.277
+301.278
+301.279
+301.280
+301.281
+301.282
+301.283
+301.284
+301.285
+301.286
+301.287
+301.288
+301.289
+301.290
+301.291
+301.292
+301.293
+301.294
+302.238
+302.239
+302.240
+302.241
+302.242
+302.243
+302.244
+302.245
+302.246
+302.247
+302.248
+302.249
+302.250
+302.251
+302.252
+302.253
+302.254
+302.255
+302.256
+302.257
+302.258
+302.259
+302.260
+302.261
+302.262
+302.263
+302.264
+302.265
+302.266
+302.268
+302.269
+302.270
+302.271
+302.272
+302.273
+302.274
+302.275
+302.276
+302.277
+302.278
+302.279
+302.280
+302.281
+302.282
+302.283
+302.284
+302.285
+302.286
+302.287
+302.288
+302.289
+302.290
+302.291
+302.292
+302.293
+302.294
+303.238
+303.239
+303.240
+303.241
+303.242
+303.243
+303.244
+303.245
+303.246
+303.247
+303.248
+303.249
+303.250
+303.251
+303.252
+303.253
+303.254
+303.255
+303.256
+303.257
+303.258
+303.259
+303.260
+303.261
+303.262
+303.263
+303.264
+303.265
+303.268
+303.269
+303.270
+303.271
+303.272
+303.273
+303.274
+303.275
+303.276
+303.277
+303.278
+303.279
+303.280
+303.281
+303.282
+303.283
+303.284
+303.285
+303.286
+303.287
+303.288
+303.289
+303.290
+303.291
+303.292
+303.293
+303.294
+304.238
+304.239
+304.240
+304.241
+304.242
+304.243
+304.244
+304.245
+304.246
+304.247
+304.248
+304.249
+304.250
+304.251
+304.252
+304.253
+304.254
+304.255
+304.256
+304.257
+304.258
+304.259
+304.260
+304.261
+304.262
+304.263
+304.264
+304.265
+304.268
+304.269
+304.270
+304.271
+304.272
+304.273
+304.274
+304.275
+304.276
+304.277
+304.278
+304.279
+304.280
+304.281
+304.282
+304.283
+304.284
+304.285
+304.286
+304.287
+304.288
+304.289
+304.290
+304.291
+304.292
+304.293
+304.294
+305.238
+305.239
+305.240
+305.241
+305.242
+305.243
+305.244
+305.245
+305.246
+305.247
+305.248
+305.249
+305.250
+305.251
+305.252
+305.253
+305.254
+305.255
+305.256
+305.257
+305.258
+305.259
+305.260
+305.261
+305.262
+305.263
+305.264
+305.265
+305.268
+305.269
+305.270
+305.271
+305.272
+305.273
+305.274
+305.275
+305.276
+305.277
+305.278
+305.279
+305.280
+305.281
+305.282
+305.283
+305.284
+305.285
+305.286
+305.287
+305.288
+305.289
+305.290
+305.291
+305.292
+305.293
+306.238
+306.239
+306.240
+306.241
+306.242
+306.243
+306.244
+306.245
+306.246
+306.247
+306.248
+306.249
+306.250
+306.251
+306.252
+306.253
+306.254
+306.255
+306.256
+306.257
+306.258
+306.259
+306.260
+306.261
+306.262
+306.263
+306.264
+306.268
+306.269
+306.270
+306.271
+306.272
+306.273
+306.274
+306.275
+306.276
+306.277
+306.278
+306.279
+306.280
+306.281
+306.282
+306.283
+306.284
+306.285
+306.286
+306.287
+306.288
+306.289
+306.290
+306.291
+306.292
+306.293
+307.238
+307.239
+307.240
+307.241
+307.242
+307.243
+307.244
+307.245
+307.246
+307.247
+307.248
+307.249
+307.250
+307.251
+307.252
+307.253
+307.254
+307.255
+307.256
+307.257
+307.258
+307.259
+307.260
+307.261
+307.262
+307.263
+307.264
+307.268
+307.269
+307.270
+307.271
+307.272
+307.273
+307.274
+307.275
+307.276
+307.277
+307.278
+307.279
+307.280
+307.281
+307.282
+307.283
+307.284
+307.285
+307.286
+307.287
+307.288
+307.289
+307.290
+307.291
+307.292
+307.293
+308.238
+308.239
+308.240
+308.241
+308.242
+308.243
+308.244
+308.245
+308.246
+308.247
+308.248
+308.249
+308.250
+308.251
+308.252
+308.253
+308.254
+308.255
+308.257
+308.258
+308.259
+308.260
+308.261
+308.262
+308.263
+308.268
+308.269
+308.270
+308.271
+308.272
+308.273
+308.274
+308.275
+308.276
+308.277
+308.278
+308.279
+308.280
+308.281
+308.282
+308.283
+308.284
+308.285
+308.286
+308.287
+308.288
+308.289
+308.290
+308.291
+308.292
+308.293
+309.238
+309.239
+309.240
+309.241
+309.242
+309.243
+309.244
+309.245
+309.246
+309.247
+309.248
+309.249
+309.250
+309.251
+309.252
+309.253
+309.254
+309.255
+309.257
+309.258
+309.259
+309.260
+309.261
+309.262
+309.263
+309.268
+309.269
+309.270
+309.271
+309.272
+309.273
+309.274
+309.275
+309.276
+309.277
+309.278
+309.279
+309.280
+309.281
+309.282
+309.283
+309.284
+309.285
+309.286
+309.287
+309.288
+309.289
+309.290
+309.291
+309.292
+309.293
+310.238
+310.239
+310.240
+310.241
+310.242
+310.243
+310.244
+310.245
+310.246
+310.247
+310.248
+310.249
+310.250
+310.251
+310.252
+310.253
+310.254
+310.255
+310.257
+310.258
+310.259
+310.260
+310.261
+310.262
+310.268
+310.269
+310.270
+310.271
+310.272
+310.273
+310.274
+310.275
+310.276
+310.277
+310.278
+310.279
+310.280
+310.281
+310.282
+310.283
+310.284
+310.285
+310.286
+310.287
+310.288
+310.289
+310.290
+310.291
+310.292
+311.238
+311.239
+311.240
+311.241
+311.242
+311.243
+311.244
+311.245
+311.246
+311.247
+311.248
+311.249
+311.250
+311.251
+311.252
+311.253
+311.254
+311.255
+311.257
+311.258
+311.259
+311.260
+311.261
+311.262
+311.268
+311.269
+311.270
+311.271
+311.272
+311.273
+311.274
+311.275
+311.276
+311.277
+311.278
+311.279
+311.280
+311.281
+311.282
+311.283
+311.284
+311.285
+311.286
+311.287
+311.288
+311.289
+311.290
+311.291
+311.292
+312.238
+312.239
+312.240
+312.241
+312.242
+312.243
+312.244
+312.245
+312.246
+312.247
+312.248
+312.249
+312.250
+312.251
+312.252
+312.253
+312.254
+312.255
+312.257
+312.258
+312.259
+312.260
+312.261
+312.267
+312.268
+312.269
+312.270
+312.271
+312.272
+312.273
+312.274
+312.275
+312.276
+312.277
+312.278
+312.279
+312.280
+312.281
+312.282
+312.283
+312.284
+312.285
+312.286
+312.287
+312.288
+312.289
+312.290
+312.291
+312.292
+313.238
+313.239
+313.240
+313.241
+313.242
+313.243
+313.244
+313.245
+313.246
+313.247
+313.248
+313.249
+313.250
+313.251
+313.252
+313.253
+313.254
+313.255
+313.257
+313.258
+313.259
+313.260
+313.261
+313.267
+313.268
+313.269
+313.270
+313.271
+313.272
+313.273
+313.274
+313.275
+313.276
+313.277
+313.278
+313.279
+313.280
+313.281
+313.282
+313.283
+313.284
+313.285
+313.286
+313.287
+313.288
+313.289
+313.290
+313.291
+314.238
+314.239
+314.240
+314.241
+314.242
+314.243
+314.244
+314.245
+314.246
+314.247
+314.248
+314.249
+314.250
+314.251
+314.252
+314.253
+314.254
+314.255
+314.257
+314.258
+314.259
+314.266
+314.267
+314.268
+314.269
+314.270
+314.271
+314.272
+314.273
+314.274
+314.275
+314.276
+314.277
+314.278
+314.279
+314.280
+314.281
+314.282
+314.283
+314.284
+314.285
+314.286
+314.287
+314.288
+314.289
+314.290
+314.291
+315.238
+315.239
+315.240
+315.241
+315.242
+315.243
+315.244
+315.245
+315.246
+315.247
+315.248
+315.249
+315.250
+315.251
+315.252
+315.253
+315.254
+315.255
+315.257
+315.258
+315.259
+315.266
+315.267
+315.268
+315.269
+315.270
+315.271
+315.272
+315.273
+315.274
+315.275
+315.276
+315.277
+315.278
+315.279
+315.280
+315.281
+315.282
+315.283
+315.284
+315.285
+315.286
+315.287
+315.288
+315.289
+315.290
+315.291
+316.238
+316.239
+316.240
+316.241
+316.242
+316.243
+316.244
+316.245
+316.246
+316.247
+316.248
+316.249
+316.250
+316.251
+316.252
+316.253
+316.254
+316.255
+316.257
+316.258
+316.266
+316.267
+316.268
+316.269
+316.270
+316.271
+316.272
+316.273
+316.274
+316.275
+316.276
+316.277
+316.278
+316.279
+316.280
+316.281
+316.282
+316.283
+316.284
+316.285
+316.286
+316.287
+316.288
+316.289
+316.290
+316.291
+317.238
+317.239
+317.240
+317.241
+317.242
+317.243
+317.244
+317.245
+317.246
+317.247
+317.248
+317.249
+317.250
+317.251
+317.252
+317.253
+317.254
+317.255
+317.257
+317.258
+317.265
+317.266
+317.267
+317.268
+317.269
+317.270
+317.271
+317.272
+317.273
+317.274
+317.275
+317.276
+317.277
+317.278
+317.279
+317.280
+317.281
+317.282
+317.283
+317.284
+317.285
+317.286
+317.287
+317.288
+317.289
+317.290
+318.238
+318.239
+318.240
+318.241
+318.242
+318.243
+318.244
+318.245
+318.246
+318.247
+318.248
+318.249
+318.250
+318.251
+318.252
+318.253
+318.254
+318.255
+318.257
+318.265
+318.266
+318.267
+318.268
+318.269
+318.270
+318.271
+318.272
+318.273
+318.274
+318.275
+318.276
+318.277
+318.278
+318.279
+318.280
+318.281
+318.282
+318.283
+318.284
+318.285
+318.286
+318.287
+318.288
+318.289
+318.290
+319.238
+319.239
+319.240
+319.241
+319.242
+319.243
+319.244
+319.245
+319.246
+319.247
+319.248
+319.249
+319.250
+319.251
+319.252
+319.253
+319.254
+319.255
+319.257
+319.264
+319.265
+319.266
+319.267
+319.268
+319.269
+319.270
+319.271
+319.272
+319.273
+319.274
+319.275
+319.276
+319.277
+319.278
+319.279
+319.280
+319.281
+319.282
+319.283
+319.284
+319.285
+319.286
+319.287
+319.288
+319.289
+319.290
+320.238
+320.239
+320.240
+320.241
+320.242
+320.243
+320.244
+320.245
+320.246
+320.247
+320.248
+320.249
+320.250
+320.251
+320.252
+320.253
+320.254
+320.255
+320.264
+320.265
+320.266
+320.267
+320.268
+320.269
+320.270
+320.271
+320.272
+320.273
+320.274
+320.275
+320.276
+320.277
+320.278
+320.279
+320.280
+320.281
+320.282
+320.283
+320.284
+320.285
+320.286
+320.287
+320.288
+320.289
+320.290
+321.238
+321.239
+321.240
+321.241
+321.242
+321.243
+321.244
+321.245
+321.246
+321.247
+321.248
+321.249
+321.250
+321.251
+321.252
+321.253
+321.254
+321.255
+321.263
+321.264
+321.265
+321.266
+321.267
+321.268
+321.269
+321.270
+321.271
+321.272
+321.273
+321.274
+321.275
+321.276
+321.277
+321.278
+321.279
+321.280
+321.281
+321.282
+321.283
+321.284
+321.285
+321.286
+321.287
+321.288
+321.289
+322.238
+322.239
+322.240
+322.241
+322.242
+322.243
+322.244
+322.245
+322.246
+322.247
+322.248
+322.249
+322.250
+322.251
+322.252
+322.253
+322.254
+322.263
+322.264
+322.265
+322.266
+322.267
+322.268
+322.269
+322.270
+322.271
+322.272
+322.273
+322.274
+322.275
+322.276
+322.277
+322.278
+322.279
+322.280
+322.281
+322.282
+322.283
+322.284
+322.285
+322.286
+322.287
+322.288
+322.289
+323.238
+323.239
+323.240
+323.241
+323.242
+323.243
+323.244
+323.245
+323.246
+323.247
+323.248
+323.249
+323.250
+323.251
+323.252
+323.253
+323.254
+323.261
+323.262
+323.263
+323.264
+323.265
+323.266
+323.267
+323.268
+323.269
+323.270
+323.271
+323.272
+323.273
+323.274
+323.275
+323.276
+323.277
+323.278
+323.279
+323.280
+323.281
+323.282
+323.283
+323.284
+323.285
+323.286
+323.287
+323.288
+323.289
+324.238
+324.239
+324.240
+324.241
+324.242
+324.243
+324.244
+324.245
+324.246
+324.247
+324.248
+324.249
+324.250
+324.251
+324.252
+324.253
+324.261
+324.262
+324.263
+324.264
+324.265
+324.266
+324.267
+324.268
+324.269
+324.270
+324.271
+324.272
+324.273
+324.274
+324.275
+324.276
+324.277
+324.278
+324.279
+324.280
+324.281
+324.282
+324.283
+324.284
+324.285
+324.286
+324.287
+324.288
+324.289
+325.238
+325.239
+325.240
+325.241
+325.242
+325.243
+325.244
+325.245
+325.246
+325.247
+325.248
+325.249
+325.250
+325.251
+325.252
+325.253
+325.260
+325.261
+325.262
+325.263
+325.264
+325.265
+325.266
+325.267
+325.268
+325.269
+325.270
+325.271
+325.272
+325.273
+325.274
+325.275
+325.276
+325.277
+325.278
+325.279
+325.280
+325.281
+325.282
+325.283
+325.284
+325.285
+325.286
+325.287
+325.288
+326.238
+326.239
+326.240
+326.241
+326.242
+326.243
+326.244
+326.245
+326.246
+326.247
+326.248
+326.249
+326.250
+326.251
+326.252
+326.260
+326.261
+326.262
+326.263
+326.264
+326.265
+326.266
+326.267
+326.268
+326.269
+326.270
+326.271
+326.272
+326.273
+326.274
+326.275
+326.276
+326.277
+326.278
+326.279
+326.280
+326.281
+326.282
+326.283
+326.284
+326.285
+326.286
+326.287
+326.288
+327.238
+327.239
+327.240
+327.241
+327.242
+327.243
+327.244
+327.245
+327.246
+327.247
+327.248
+327.249
+327.250
+327.251
+327.252
+327.259
+327.260
+327.261
+327.262
+327.263
+327.264
+327.265
+327.266
+327.267
+327.268
+327.269
+327.270
+327.271
+327.272
+327.273
+327.274
+327.275
+327.276
+327.277
+327.278
+327.279
+327.280
+327.281
+327.282
+327.283
+327.284
+327.285
+327.286
+327.287
+327.288
+328.238
+328.239
+328.240
+328.241
+328.242
+328.243
+328.244
+328.245
+328.246
+328.247
+328.248
+328.249
+328.250
+328.251
+328.259
+328.260
+328.261
+328.262
+328.263
+328.264
+328.265
+328.266
+328.267
+328.268
+328.269
+328.270
+328.271
+328.272
+328.273
+328.274
+328.275
+328.276
+328.277
+328.278
+328.279
+328.280
+328.281
+328.282
+328.283
+328.284
+328.285
+328.286
+328.287
+329.238
+329.239
+329.240
+329.241
+329.242
+329.243
+329.244
+329.245
+329.246
+329.247
+329.248
+329.249
+329.250
+329.251
+329.258
+329.259
+329.260
+329.261
+329.262
+329.263
+329.264
+329.265
+329.266
+329.267
+329.268
+329.269
+329.270
+329.271
+329.272
+329.273
+329.274
+329.275
+329.276
+329.277
+329.278
+329.279
+329.280
+329.281
+329.282
+329.283
+329.284
+329.285
+329.286
+329.287
+330.238
+330.239
+330.240
+330.241
+330.242
+330.243
+330.244
+330.245
+330.246
+330.247
+330.248
+330.249
+330.250
+330.258
+330.259
+330.260
+330.261
+330.262
+330.263
+330.264
+330.265
+330.266
+330.267
+330.268
+330.269
+330.270
+330.271
+330.272
+330.273
+330.274
+330.275
+330.276
+330.277
+330.278
+330.279
+330.280
+330.281
+330.282
+330.283
+330.284
+330.285
+330.286
+330.287
+331.238
+331.239
+331.240
+331.241
+331.242
+331.243
+331.244
+331.245
+331.246
+331.247
+331.248
+331.249
+331.250
+331.257
+331.258
+331.259
+331.260
+331.261
+331.262
+331.263
+331.264
+331.265
+331.266
+331.267
+331.268
+331.269
+331.270
+331.271
+331.272
+331.273
+331.274
+331.275
+331.276
+331.277
+331.278
+331.279
+331.280
+331.281
+331.282
+331.283
+331.284
+331.285
+331.286
+331.287
+332.238
+332.239
+332.240
+332.241
+332.242
+332.243
+332.244
+332.245
+332.246
+332.247
+332.248
+332.249
+332.250
+332.257
+332.258
+332.259
+332.260
+332.261
+332.262
+332.263
+332.264
+332.265
+332.266
+332.267
+332.268
+332.269
+332.270
+332.271
+332.272
+332.273
+332.274
+332.275
+332.276
+332.277
+332.278
+332.279
+332.280
+332.281
+332.282
+332.283
+332.284
+332.285
+332.286
+333.238
+333.239
+333.240
+333.241
+333.242
+333.243
+333.244
+333.245
+333.246
+333.247
+333.248
+333.249
+333.250
+333.256
+333.257
+333.258
+333.259
+333.260
+333.261
+333.262
+333.263
+333.264
+333.265
+333.266
+333.267
+333.268
+333.269
+333.270
+333.271
+333.272
+333.273
+333.274
+333.275
+333.276
+333.277
+333.278
+333.279
+333.280
+333.281
+333.282
+333.283
+333.284
+333.285
+333.286
+334.238
+334.239
+334.240
+334.241
+334.242
+334.243
+334.244
+334.245
+334.246
+334.247
+334.248
+334.249
+334.250
+334.255
+334.256
+334.257
+334.258
+334.259
+334.260
+334.261
+334.262
+334.263
+334.264
+334.265
+334.266
+334.267
+334.268
+334.269
+334.270
+334.271
+334.272
+334.273
+334.274
+334.275
+334.276
+334.277
+334.278
+334.279
+334.280
+334.281
+334.282
+334.283
+334.284
+334.285
+334.286
+335.238
+335.239
+335.240
+335.241
+335.242
+335.243
+335.244
+335.245
+335.246
+335.247
+335.248
+335.249
+335.250
+335.255
+335.256
+335.257
+335.258
+335.259
+335.260
+335.261
+335.262
+335.263
+335.264
+335.265
+335.266
+335.267
+335.268
+335.269
+335.270
+335.271
+335.272
+335.273
+335.274
+335.275
+335.276
+335.277
+335.278
+335.279
+335.280
+335.281
+335.282
+335.283
+335.284
+335.285
+335.286
+336.238
+336.239
+336.240
+336.241
+336.242
+336.243
+336.244
+336.245
+336.246
+336.247
+336.248
+336.249
+336.250
+336.254
+336.255
+336.256
+336.257
+336.258
+336.259
+336.260
+336.261
+336.262
+336.263
+336.264
+336.265
+336.266
+336.267
+336.268
+336.269
+336.270
+336.271
+336.272
+336.273
+336.274
+336.275
+336.276
+336.277
+336.278
+336.279
+336.280
+336.281
+336.282
+336.283
+336.284
+336.285
+337.238
+337.239
+337.240
+337.241
+337.242
+337.243
+337.244
+337.245
+337.246
+337.247
+337.248
+337.249
+337.250
+337.253
+337.254
+337.255
+337.256
+337.257
+337.258
+337.259
+337.260
+337.261
+337.262
+337.263
+337.264
+337.265
+337.266
+337.267
+337.268
+337.269
+337.270
+337.271
+337.272
+337.273
+337.274
+337.275
+337.276
+337.277
+337.278
+337.279
+337.280
+337.281
+337.282
+337.283
+337.284
+337.285
+338.238
+338.239
+338.240
+338.241
+338.242
+338.243
+338.244
+338.245
+338.246
+338.247
+338.248
+338.249
+338.250
+338.253
+338.254
+338.255
+338.256
+338.257
+338.258
+338.259
+338.260
+338.261
+338.262
+338.263
+338.264
+338.265
+338.266
+338.267
+338.268
+338.269
+338.270
+338.271
+338.272
+338.273
+338.274
+338.275
+338.276
+338.277
+338.278
+338.279
+338.280
+338.281
+338.282
+338.283
+338.284
+338.285
+339.238
+339.239
+339.240
+339.241
+339.242
+339.243
+339.244
+339.245
+339.246
+339.247
+339.248
+339.249
+339.250
+339.252
+339.253
+339.254
+339.255
+339.256
+339.257
+339.258
+339.259
+339.260
+339.261
+339.262
+339.263
+339.264
+339.265
+339.266
+339.267
+339.268
+339.269
+339.270
+339.271
+339.272
+339.273
+339.274
+339.275
+339.276
+339.277
+339.278
+339.279
+339.280
+339.281
+339.282
+339.283
+339.284
+339.285
+340.238
+340.239
+340.240
+340.241
+340.242
+340.243
+340.244
+340.245
+340.246
+340.247
+340.248
+340.249
+340.250
+340.252
+340.253
+340.254
+340.255
+340.256
+340.257
+340.258
+340.259
+340.260
+340.261
+340.262
+340.263
+340.264
+340.265
+340.266
+340.267
+340.268
+340.269
+340.270
+340.271
+340.272
+340.273
+340.274
+340.275
+340.276
+340.277
+340.278
+340.279
+340.280
+340.281
+340.282
+340.283
+340.284
+341.238
+341.239
+341.240
+341.241
+341.242
+341.243
+341.244
+341.245
+341.246
+341.247
+341.248
+341.249
+341.250
+341.251
+341.252
+341.253
+341.254
+341.255
+341.256
+341.257
+341.258
+341.259
+341.260
+341.261
+341.262
+341.263
+341.264
+341.265
+341.266
+341.267
+341.268
+341.269
+341.270
+341.271
+341.272
+341.273
+341.274
+341.275
+341.276
+341.277
+341.278
+341.279
+341.280
+341.281
+341.282
+341.283
+341.284
+342.238
+342.239
+342.240
+342.241
+342.242
+342.243
+342.244
+342.245
+342.246
+342.247
+342.248
+342.249
+342.250
+342.251
+342.252
+342.253
+342.254
+342.255
+342.256
+342.257
+342.258
+342.259
+342.260
+342.261
+342.262
+342.263
+342.264
+342.265
+342.266
+342.267
+342.268
+342.269
+342.270
+342.271
+342.272
+342.273
+342.274
+342.275
+342.276
+342.277
+342.278
+342.279
+342.280
+342.281
+342.282
+342.283
+342.284
+343.238
+343.239
+343.240
+343.241
+343.242
+343.243
+343.244
+343.245
+343.246
+343.247
+343.248
+343.249
+343.250
+343.251
+343.252
+343.253
+343.254
+343.255
+343.256
+343.257
+343.258
+343.259
+343.260
+343.261
+343.262
+343.263
+343.264
+343.265
+343.266
+343.267
+343.268
+343.269
+343.270
+343.271
+343.272
+343.273
+343.274
+343.275
+343.276
+343.277
+343.278
+343.279
+343.280
+343.281
+343.282
+343.283
+344.238
+344.239
+344.240
+344.241
+344.242
+344.243
+344.244
+344.245
+344.246
+344.247
+344.248
+344.249
+344.250
+344.251
+344.252
+344.253
+344.254
+344.255
+344.256
+344.257
+344.258
+344.259
+344.260
+344.261
+344.262
+344.263
+344.264
+344.265
+344.266
+344.267
+344.268
+344.269
+344.270
+344.271
+344.272
+344.273
+344.274
+344.275
+344.276
+344.277
+344.278
+344.279
+344.280
+344.281
+344.282
+344.283
+345.238
+345.239
+345.240
+345.241
+345.242
+345.243
+345.244
+345.245
+345.246
+345.247
+345.248
+345.249
+345.250
+345.251
+345.252
+345.253
+345.254
+345.255
+345.256
+345.257
+345.258
+345.259
+345.260
+345.261
+345.262
+345.263
+345.264
+345.265
+345.266
+345.267
+345.268
+345.269
+345.270
+345.271
+345.272
+345.273
+345.274
+345.275
+345.276
+345.277
+345.278
+345.279
+345.280
+345.281
+345.282
+345.283
+346.238
+346.239
+346.240
+346.241
+346.242
+346.243
+346.244
+346.245
+346.246
+346.247
+346.248
+346.249
+346.250
+346.251
+346.252
+346.253
+346.254
+346.255
+346.256
+346.257
+346.258
+346.259
+346.260
+346.261
+346.262
+346.263
+346.264
+346.265
+346.266
+346.267
+346.268
+346.269
+346.270
+346.271
+346.272
+346.273
+346.274
+346.275
+346.276
+346.277
+346.278
+346.279
+346.280
+346.281
+346.282
+346.283
+347.238
+347.239
+347.240
+347.241
+347.242
+347.243
+347.244
+347.245
+347.246
+347.247
+347.248
+347.249
+347.250
+347.251
+347.252
+347.253
+347.254
+347.255
+347.256
+347.257
+347.258
+347.259
+347.260
+347.261
+347.262
+347.263
+347.264
+347.265
+347.266
+347.267
+347.268
+347.269
+347.270
+347.271
+347.272
+347.273
+347.274
+347.275
+347.276
+347.277
+347.278
+347.279
+347.280
+347.281
+347.282
+348.239
+348.240
+348.241
+348.242
+348.243
+348.244
+348.245
+348.246
+348.247
+348.248
+348.249
+348.250
+348.251
+348.252
+348.253
+348.254
+348.255
+348.256
+348.257
+348.258
+348.259
+348.260
+348.261
+348.262
+348.263
+348.264
+348.265
+348.266
+348.267
+348.268
+348.269
+348.270
+348.271
+348.272
+348.273
+348.274
+348.275
+348.276
+348.277
+348.278
+348.279
+348.280
+348.281
+348.282
+349.239
+349.240
+349.241
+349.242
+349.243
+349.244
+349.245
+349.246
+349.247
+349.248
+349.249
+349.250
+349.251
+349.252
+349.253
+349.254
+349.255
+349.256
+349.257
+349.258
+349.259
+349.260
+349.261
+349.262
+349.263
+349.264
+349.265
+349.266
+349.267
+349.268
+349.269
+349.270
+349.271
+349.272
+349.273
+349.274
+349.275
+349.276
+349.277
+349.278
+349.279
+349.280
+349.281
+349.282
+350.239
+350.240
+350.241
+350.242
+350.243
+350.244
+350.245
+350.246
+350.247
+350.248
+350.249
+350.250
+350.251
+350.252
+350.253
+350.254
+350.255
+350.256
+350.257
+350.258
+350.259
+350.260
+350.261
+350.262
+350.263
+350.264
+350.265
+350.266
+350.267
+350.268
+350.269
+350.270
+350.271
+350.272
+350.273
+350.274
+350.275
+350.276
+350.277
+350.278
+350.279
+350.280
+350.281
+351.239
+351.240
+351.241
+351.242
+351.243
+351.244
+351.245
+351.246
+351.247
+351.248
+351.249
+351.250
+351.251
+351.252
+351.253
+351.254
+351.255
+351.256
+351.257
+351.258
+351.259
+351.260
+351.261
+351.262
+351.263
+351.264
+351.265
+351.266
+351.267
+351.268
+351.269
+351.270
+351.271
+351.272
+351.273
+351.274
+351.275
+351.276
+351.277
+351.278
+351.279
+351.280
+351.281
+352.239
+352.240
+352.241
+352.242
+352.243
+352.244
+352.245
+352.246
+352.247
+352.248
+352.249
+352.250
+352.251
+352.252
+352.253
+352.254
+352.255
+352.256
+352.257
+352.258
+352.259
+352.260
+352.261
+352.262
+352.263
+352.264
+352.265
+352.266
+352.267
+352.268
+352.269
+352.270
+352.271
+352.272
+352.273
+352.274
+352.275
+352.276
+352.277
+352.278
+352.279
+352.280
+352.281
+353.239
+353.240
+353.241
+353.242
+353.243
+353.244
+353.245
+353.246
+353.247
+353.248
+353.249
+353.250
+353.251
+353.252
+353.253
+353.254
+353.255
+353.256
+353.257
+353.258
+353.259
+353.260
+353.261
+353.262
+353.263
+353.264
+353.265
+353.266
+353.267
+353.268
+353.269
+353.270
+353.271
+353.272
+353.273
+353.274
+353.275
+353.276
+353.277
+353.278
+353.279
+353.280
+353.281
+354.239
+354.240
+354.241
+354.242
+354.243
+354.244
+354.245
+354.246
+354.247
+354.248
+354.249
+354.250
+354.251
+354.252
+354.253
+354.254
+354.255
+354.256
+354.257
+354.258
+354.259
+354.260
+354.261
+354.262
+354.263
+354.264
+354.265
+354.266
+354.267
+354.268
+354.269
+354.270
+354.271
+354.272
+354.273
+354.274
+354.275
+354.276
+354.277
+354.278
+354.279
+354.280
+355.239
+355.240
+355.241
+355.242
+355.243
+355.244
+355.245
+355.246
+355.247
+355.248
+355.249
+355.250
+355.251
+355.252
+355.253
+355.254
+355.255
+355.256
+355.257
+355.258
+355.259
+355.260
+355.261
+355.262
+355.263
+355.264
+355.265
+355.266
+355.267
+355.268
+355.269
+355.270
+355.271
+355.272
+355.273
+355.274
+355.275
+355.276
+355.277
+355.278
+355.279
+355.280
+356.239
+356.240
+356.241
+356.242
+356.243
+356.244
+356.245
+356.246
+356.247
+356.248
+356.249
+356.250
+356.251
+356.252
+356.253
+356.254
+356.255
+356.256
+356.257
+356.258
+356.259
+356.260
+356.261
+356.262
+356.263
+356.264
+356.265
+356.266
+356.267
+356.268
+356.269
+356.270
+356.271
+356.272
+356.273
+356.274
+356.275
+356.276
+356.277
+356.278
+356.279
+356.280
+357.239
+357.240
+357.241
+357.242
+357.243
+357.244
+357.245
+357.246
+357.247
+357.248
+357.249
+357.250
+357.251
+357.252
+357.253
+357.254
+357.255
+357.256
+357.257
+357.258
+357.259
+357.260
+357.261
+357.262
+357.263
+357.264
+357.265
+357.266
+357.267
+357.268
+357.269
+357.270
+357.271
+357.272
+357.273
+357.274
+357.275
+357.276
+357.277
+357.278
+357.279
+358.239
+358.240
+358.241
+358.242
+358.243
+358.244
+358.245
+358.246
+358.247
+358.248
+358.249
+358.250
+358.251
+358.252
+358.253
+358.254
+358.255
+358.256
+358.257
+358.258
+358.259
+358.260
+358.261
+358.262
+358.263
+358.264
+358.265
+358.266
+358.267
+358.268
+358.269
+358.270
+358.271
+358.272
+358.273
+358.274
+358.275
+358.276
+358.277
+358.278
+358.279
+359.239
+359.240
+359.241
+359.242
+359.243
+359.244
+359.245
+359.246
+359.247
+359.248
+359.249
+359.250
+359.251
+359.252
+359.253
+359.254
+359.255
+359.256
+359.257
+359.258
+359.259
+359.260
+359.261
+359.262
+359.263
+359.264
+359.265
+359.266
+359.267
+359.268
+359.269
+359.270
+359.271
+359.272
+359.273
+359.274
+359.275
+359.276
+359.277
+359.278
+359.279
+360.239
+360.240
+360.241
+360.242
+360.243
+360.244
+360.245
+360.246
+360.247
+360.248
+360.249
+360.250
+360.251
+360.252
+360.253
+360.254
+360.255
+360.256
+360.257
+360.258
+360.259
+360.260
+360.261
+360.262
+360.263
+360.264
+360.265
+360.266
+360.267
+360.268
+360.269
+360.270
+360.271
+360.272
+360.273
+360.274
+360.275
+360.276
+360.277
+360.278
+360.279
+361.239
+361.240
+361.241
+361.242
+361.243
+361.244
+361.245
+361.246
+361.247
+361.248
+361.249
+361.250
+361.251
+361.252
+361.253
+361.254
+361.255
+361.256
+361.257
+361.258
+361.259
+361.260
+361.261
+361.262
+361.263
+361.264
+361.265
+361.266
+361.267
+361.268
+361.269
+361.270
+361.271
+361.272
+361.273
+361.274
+361.275
+361.276
+361.277
+361.278
+362.238
+362.239
+362.240
+362.241
+362.242
+362.243
+362.244
+362.245
+362.246
+362.247
+362.248
+362.249
+362.250
+362.251
+362.252
+362.253
+362.254
+362.255
+362.256
+362.257
+362.258
+362.259
+362.260
+362.261
+362.262
+362.263
+362.264
+362.265
+362.266
+362.267
+362.268
+362.269
+362.270
+362.271
+362.272
+362.273
+362.274
+362.275
+362.276
+362.277
+362.278
+363.238
+363.239
+363.240
+363.241
+363.242
+363.243
+363.244
+363.245
+363.246
+363.247
+363.248
+363.249
+363.250
+363.251
+363.252
+363.253
+363.254
+363.255
+363.256
+363.257
+363.258
+363.259
+363.260
+363.261
+363.262
+363.263
+363.264
+363.265
+363.266
+363.267
+363.268
+363.269
+363.270
+363.271
+363.272
+363.273
+363.274
+363.275
+363.276
+363.277
+363.278
+364.238
+364.239
+364.240
+364.241
+364.242
+364.243
+364.244
+364.245
+364.246
+364.247
+364.248
+364.249
+364.250
+364.251
+364.252
+364.253
+364.254
+364.255
+364.256
+364.257
+364.258
+364.259
+364.260
+364.261
+364.262
+364.263
+364.264
+364.265
+364.266
+364.267
+364.268
+364.269
+364.270
+364.271
+364.272
+364.273
+364.274
+364.275
+364.276
+364.277
+365.238
+365.239
+365.240
+365.241
+365.242
+365.243
+365.244
+365.245
+365.246
+365.247
+365.248
+365.249
+365.250
+365.251
+365.252
+365.253
+365.254
+365.255
+365.256
+365.257
+365.258
+365.259
+365.260
+365.261
+365.262
+365.263
+365.264
+365.265
+365.266
+365.267
+365.268
+365.269
+365.270
+365.271
+365.272
+365.273
+365.274
+365.275
+365.276
+365.277
+366.238
+366.239
+366.240
+366.241
+366.242
+366.243
+366.244
+366.245
+366.246
+366.247
+366.248
+366.249
+366.250
+366.251
+366.252
+366.253
+366.254
+366.255
+366.256
+366.257
+366.258
+366.259
+366.260
+366.261
+366.262
+366.263
+366.264
+366.265
+366.266
+366.267
+366.268
+366.269
+366.270
+366.271
+366.272
+366.273
+366.274
+366.275
+366.276
+366.277
+367.238
+367.239
+367.240
+367.241
+367.242
+367.243
+367.244
+367.245
+367.246
+367.247
+367.248
+367.249
+367.250
+367.251
+367.252
+367.253
+367.254
+367.255
+367.256
+367.257
+367.258
+367.259
+367.260
+367.261
+367.262
+367.263
+367.264
+367.265
+367.266
+367.267
+367.268
+367.269
+367.270
+367.271
+367.272
+367.273
+367.274
+367.275
+367.276
+368.238
+368.239
+368.240
+368.241
+368.242
+368.243
+368.244
+368.245
+368.246
+368.247
+368.248
+368.249
+368.250
+368.251
+368.252
+368.253
+368.254
+368.255
+368.256
+368.257
+368.258
+368.259
+368.260
+368.261
+368.262
+368.263
+368.264
+368.265
+368.266
+368.267
+368.268
+368.269
+368.270
+368.271
+368.272
+368.273
+368.274
+368.275
+368.276
+369.238
+369.239
+369.240
+369.241
+369.242
+369.243
+369.244
+369.245
+369.246
+369.247
+369.248
+369.249
+369.250
+369.251
+369.252
+369.253
+369.254
+369.255
+369.256
+369.257
+369.258
+369.259
+369.260
+369.261
+369.262
+369.263
+369.264
+369.265
+369.266
+369.267
+369.268
+369.269
+369.270
+369.271
+369.272
+369.273
+369.274
+369.275
+370.238
+370.239
+370.240
+370.241
+370.242
+370.243
+370.244
+370.245
+370.246
+370.247
+370.248
+370.249
+370.250
+370.251
+370.252
+370.253
+370.254
+370.255
+370.256
+370.257
+370.258
+370.259
+370.260
+370.261
+370.262
+370.263
+370.264
+370.265
+370.266
+370.267
+370.268
+370.269
+370.270
+370.271
+370.272
+370.273
+370.274
+370.275
+371.238
+371.239
+371.240
+371.241
+371.242
+371.243
+371.244
+371.245
+371.246
+371.247
+371.248
+371.249
+371.250
+371.251
+371.252
+371.253
+371.254
+371.255
+371.256
+371.257
+371.258
+371.259
+371.260
+371.261
+371.262
+371.263
+371.264
+371.265
+371.266
+371.267
+371.268
+371.269
+371.270
+371.271
+371.272
+371.273
+371.274
+371.275
+372.238
+372.239
+372.240
+372.241
+372.242
+372.243
+372.244
+372.245
+372.246
+372.247
+372.248
+372.249
+372.250
+372.251
+372.252
+372.253
+372.254
+372.255
+372.256
+372.257
+372.258
+372.259
+372.260
+372.261
+372.262
+372.263
+372.264
+372.265
+372.266
+372.267
+372.268
+372.269
+372.270
+372.271
+372.272
+372.273
+372.274
+372.275
+373.238
+373.239
+373.240
+373.241
+373.242
+373.243
+373.244
+373.245
+373.246
+373.247
+373.248
+373.249
+373.250
+373.251
+373.252
+373.253
+373.254
+373.255
+373.256
+373.257
+373.258
+373.259
+373.260
+373.261
+373.262
+373.263
+373.264
+373.265
+373.266
+373.267
+373.268
+373.269
+373.270
+373.271
+373.272
+373.273
+373.274
+374.238
+374.239
+374.240
+374.241
+374.242
+374.243
+374.244
+374.245
+374.246
+374.247
+374.248
+374.249
+374.250
+374.251
+374.252
+374.253
+374.254
+374.255
+374.256
+374.257
+374.258
+374.259
+374.260
+374.261
+374.262
+374.263
+374.264
+374.265
+374.266
+374.267
+374.268
+374.269
+374.270
+374.271
+374.272
+374.273
+374.274
+375.238
+375.239
+375.240
+375.241
+375.242
+375.243
+375.244
+375.245
+375.246
+375.247
+375.248
+375.249
+375.250
+375.251
+375.252
+375.253
+375.254
+375.255
+375.256
+375.257
+375.258
+375.259
+375.260
+375.261
+375.262
+375.263
+375.264
+375.265
+375.266
+375.267
+375.268
+375.269
+375.270
+375.271
+375.272
+375.273
+375.274
+376.238
+376.239
+376.240
+376.241
+376.242
+376.243
+376.244
+376.245
+376.246
+376.247
+376.248
+376.249
+376.250
+376.251
+376.252
+376.253
+376.254
+376.255
+376.256
+376.257
+376.258
+376.259
+376.260
+376.261
+376.262
+376.263
+376.264
+376.265
+376.266
+376.267
+376.268
+376.269
+376.270
+376.271
+376.272
+376.273
+376.274
+377.238
+377.239
+377.240
+377.241
+377.242
+377.243
+377.244
+377.245
+377.246
+377.247
+377.248
+377.249
+377.250
+377.251
+377.252
+377.253
+377.254
+377.255
+377.256
+377.257
+377.258
+377.259
+377.260
+377.261
+377.262
+377.263
+377.264
+377.265
+377.266
+377.267
+377.268
+377.269
+377.270
+377.271
+377.272
+377.273
+378.238
+378.239
+378.240
+378.241
+378.242
+378.243
+378.244
+378.245
+378.246
+378.247
+378.248
+378.249
+378.250
+378.251
+378.252
+378.253
+378.254
+378.255
+378.256
+378.257
+378.258
+378.259
+378.260
+378.261
+378.262
+378.263
+378.264
+378.265
+378.266
+378.267
+378.268
+378.269
+378.270
+378.271
+378.272
+378.273
+379.238
+379.239
+379.240
+379.241
+379.242
+379.243
+379.244
+379.245
+379.246
+379.247
+379.248
+379.249
+379.250
+379.251
+379.252
+379.253
+379.254
+379.255
+379.256
+379.257
+379.258
+379.259
+379.260
+379.261
+379.262
+379.263
+379.264
+379.265
+379.266
+379.267
+379.268
+379.269
+379.270
+379.271
+379.272
+379.273
+380.238
+380.239
+380.240
+380.241
+380.242
+380.243
+380.244
+380.245
+380.246
+380.247
+380.248
+380.249
+380.250
+380.251
+380.252
+380.253
+380.254
+380.255
+380.256
+380.257
+380.258
+380.259
+380.260
+380.261
+380.262
+380.263
+380.264
+380.265
+380.266
+380.267
+380.268
+380.269
+380.270
+380.271
+380.272
+380.273
+381.238
+381.239
+381.240
+381.241
+381.242
+381.243
+381.244
+381.245
+381.246
+381.247
+381.248
+381.249
+381.250
+381.251
+381.252
+381.253
+381.254
+381.255
+381.256
+381.257
+381.258
+381.259
+381.260
+381.261
+381.262
+381.263
+381.264
+381.265
+381.266
+381.267
+381.268
+381.269
+381.270
+381.271
+381.272
+382.238
+382.239
+382.240
+382.241
+382.242
+382.243
+382.244
+382.245
+382.246
+382.247
+382.248
+382.249
+382.250
+382.251
+382.252
+382.253
+382.254
+382.255
+382.256
+382.257
+382.258
+382.259
+382.260
+382.261
+382.262
+382.263
+382.264
+382.265
+382.266
+382.267
+382.268
+382.269
+382.270
+382.271
+382.272
+383.238
+383.239
+383.240
+383.241
+383.242
+383.243
+383.244
+383.245
+383.246
+383.247
+383.248
+383.249
+383.250
+383.251
+383.252
+383.253
+383.254
+383.255
+383.256
+383.257
+383.258
+383.259
+383.260
+383.261
+383.262
+383.263
+383.264
+383.265
+383.266
+383.267
+383.268
+383.269
+383.270
+383.271
+383.272
+384.238
+384.239
+384.240
+384.241
+384.242
+384.243
+384.244
+384.245
+384.246
+384.247
+384.248
+384.249
+384.250
+384.251
+384.252
+384.253
+384.254
+384.255
+384.256
+384.257
+384.258
+384.259
+384.260
+384.261
+384.262
+384.263
+384.264
+384.265
+384.266
+384.267
+384.268
+384.269
+384.270
+384.271
+385.238
+385.239
+385.240
+385.241
+385.242
+385.243
+385.244
+385.245
+385.246
+385.247
+385.248
+385.249
+385.250
+385.251
+385.252
+385.253
+385.254
+385.255
+385.256
+385.257
+385.258
+385.259
+385.260
+385.261
+385.262
+385.263
+385.264
+385.265
+385.266
+385.267
+385.268
+385.269
+385.270
+385.271
+386.238
+386.239
+386.240
+386.241
+386.242
+386.243
+386.244
+386.245
+386.246
+386.247
+386.248
+386.249
+386.250
+386.251
+386.252
+386.253
+386.254
+386.255
+386.256
+386.257
+386.258
+386.259
+386.260
+386.261
+386.262
+386.263
+386.264
+386.265
+386.266
+386.267
+386.268
+386.269
+386.270
+386.271
+387.238
+387.239
+387.240
+387.241
+387.242
+387.243
+387.244
+387.245
+387.246
+387.247
+387.248
+387.249
+387.250
+387.251
+387.252
+387.253
+387.254
+387.255
+387.256
+387.257
+387.258
+387.259
+387.260
+387.261
+387.262
+387.263
+387.264
+387.265
+387.266
+387.267
+387.268
+387.269
+387.270
+387.271
+388.238
+388.239
+388.240
+388.241
+388.242
+388.243
+388.244
+388.245
+388.246
+388.247
+388.248
+388.249
+388.250
+388.251
+388.252
+388.253
+388.254
+388.255
+388.256
+388.257
+388.258
+388.259
+388.260
+388.261
+388.262
+388.263
+388.264
+388.265
+388.266
+388.267
+388.268
+388.269
+388.270
+389.238
+389.239
+389.240
+389.241
+389.242
+389.243
+389.244
+389.245
+389.246
+389.247
+389.248
+389.249
+389.250
+389.251
+389.252
+389.253
+389.254
+389.255
+389.256
+389.257
+389.258
+389.259
+389.260
+389.261
+389.262
+389.263
+389.264
+389.265
+389.266
+389.267
+389.268
+389.269
+389.270
+390.238
+390.239
+390.240
+390.241
+390.242
+390.243
+390.244
+390.245
+390.246
+390.247
+390.248
+390.249
+390.250
+390.251
+390.252
+390.253
+390.254
+390.255
+390.256
+390.257
+390.258
+390.259
+390.260
+390.261
+390.262
+390.263
+390.264
+390.265
+390.266
+390.267
+390.268
+390.269
+391.238
+391.239
+391.240
+391.241
+391.242
+391.243
+391.244
+391.245
+391.246
+391.247
+391.248
+391.249
+391.250
+391.251
+391.252
+391.253
+391.254
+391.255
+391.256
+391.257
+391.258
+391.259
+391.260
+391.261
+391.262
+391.263
+391.264
+391.265
+391.266
+391.267
+391.268
+391.269
+392.238
+392.239
+392.240
+392.241
+392.242
+392.243
+392.244
+392.245
+392.246
+392.247
+392.248
+392.249
+392.250
+392.251
+392.252
+392.253
+392.254
+392.255
+392.256
+392.257
+392.258
+392.259
+392.260
+392.261
+392.262
+392.263
+392.264
+392.265
+392.266
+392.267
+392.268
+392.269
+393.238
+393.239
+393.240
+393.241
+393.242
+393.243
+393.244
+393.245
+393.246
+393.247
+393.248
+393.249
+393.250
+393.251
+393.252
+393.253
+393.254
+393.255
+393.256
+393.257
+393.258
+393.259
+393.260
+393.261
+393.262
+393.263
+393.264
+393.265
+393.266
+393.267
+393.268
+394.238
+394.239
+394.240
+394.241
+394.242
+394.243
+394.244
+394.245
+394.246
+394.247
+394.248
+394.249
+394.250
+394.251
+394.252
+394.253
+394.254
+394.255
+394.256
+394.257
+394.258
+394.259
+394.260
+394.261
+394.262
+394.263
+394.264
+394.265
+394.266
+394.267
+394.268
+395.238
+395.239
+395.240
+395.241
+395.242
+395.243
+395.244
+395.245
+395.246
+395.247
+395.248
+395.249
+395.250
+395.251
+395.252
+395.253
+395.254
+395.255
+395.256
+395.257
+395.258
+395.259
+395.260
+395.261
+395.262
+395.263
+395.264
+395.265
+395.266
+395.267
+396.238
+396.239
+396.240
+396.241
+396.242
+396.243
+396.244
+396.245
+396.246
+396.247
+396.248
+396.249
+396.250
+396.251
+396.252
+396.253
+396.254
+396.255
+396.256
+396.257
+396.258
+396.259
+396.260
+396.261
+396.262
+396.263
+396.264
+396.265
+396.266
+396.267
+397.238
+397.239
+397.240
+397.241
+397.242
+397.243
+397.244
+397.245
+397.246
+397.247
+397.248
+397.249
+397.250
+397.251
+397.252
+397.253
+397.254
+397.255
+397.256
+397.257
+397.258
+397.259
+397.260
+397.261
+397.262
+397.263
+397.264
+397.265
+397.266
+397.267
+398.238
+398.239
+398.240
+398.241
+398.242
+398.243
+398.244
+398.245
+398.246
+398.247
+398.248
+398.249
+398.250
+398.251
+398.252
+398.253
+398.254
+398.255
+398.256
+398.257
+398.258
+398.259
+398.260
+398.261
+398.262
+398.263
+398.264
+398.265
+398.266
+398.267
+399.238
+399.239
+399.240
+399.241
+399.242
+399.243
+399.244
+399.245
+399.246
+399.247
+399.248
+399.249
+399.250
+399.251
+399.252
+399.253
+399.254
+399.255
+399.256
+399.257
+399.258
+399.259
+399.260
+399.261
+399.262
+399.263
+399.264
+399.265
+399.266
+400.238
+400.239
+400.240
+400.241
+400.242
+400.243
+400.244
+400.245
+400.246
+400.247
+400.248
+400.249
+400.250
+400.251
+400.252
+400.253
+400.254
+400.255
+400.256
+400.257
+400.258
+400.259
+400.260
+400.261
+400.262
+400.263
+400.264
+400.265
+400.266
+401.238
+401.239
+401.240
+401.241
+401.242
+401.243
+401.244
+401.245
+401.246
+401.247
+401.248
+401.249
+401.250
+401.251
+401.252
+401.253
+401.254
+401.255
+401.256
+401.257
+401.258
+401.259
+401.260
+401.261
+401.262
+401.263
+401.264
+401.265
+401.266
+402.238
+402.239
+402.240
+402.241
+402.242
+402.243
+402.244
+402.245
+402.246
+402.247
+402.248
+402.249
+402.250
+402.251
+402.252
+402.253
+402.254
+402.255
+402.256
+402.257
+402.258
+402.259
+402.260
+402.261
+402.262
+402.263
+402.264
+402.265
+403.238
+403.239
+403.240
+403.241
+403.242
+403.243
+403.244
+403.245
+403.246
+403.247
+403.248
+403.249
+403.250
+403.251
+403.252
+403.253
+403.254
+403.255
+403.256
+403.257
+403.258
+403.259
+403.260
+403.261
+403.262
+403.263
+403.264
+403.265
+404.238
+404.239
+404.240
+404.241
+404.242
+404.243
+404.244
+404.245
+404.246
+404.247
+404.248
+404.249
+404.250
+404.251
+404.252
+404.253
+404.254
+404.255
+404.256
+404.257
+404.258
+404.259
+404.260
+404.261
+404.262
+404.263
+404.264
+404.265
+405.238
+405.239
+405.240
+405.241
+405.242
+405.243
+405.244
+405.245
+405.246
+405.247
+405.248
+405.249
+405.250
+405.251
+405.252
+405.253
+405.254
+405.255
+405.256
+405.257
+405.258
+405.259
+405.260
+405.261
+405.262
+405.263
+405.264
+406.238
+406.239
+406.240
+406.241
+406.242
+406.243
+406.244
+406.245
+406.246
+406.247
+406.248
+406.249
+406.250
+406.251
+406.252
+406.253
+406.254
+406.255
+406.256
+406.257
+406.258
+406.259
+406.260
+406.261
+406.262
+406.263
+406.264
+407.238
+407.239
+407.240
+407.241
+407.242
+407.243
+407.244
+407.245
+407.246
+407.247
+407.248
+407.249
+407.250
+407.251
+407.252
+407.253
+407.254
+407.255
+407.256
+407.257
+407.258
+407.259
+407.260
+407.261
+407.262
+407.263
+407.264
+408.238
+408.239
+408.240
+408.241
+408.242
+408.243
+408.244
+408.245
+408.246
+408.247
+408.248
+408.249
+408.250
+408.251
+408.252
+408.253
+408.254
+408.255
+408.256
+408.257
+408.258
+408.259
+408.260
+408.261
+408.262
+408.263
+408.264
+409.238
+409.239
+409.240
+409.241
+409.242
+409.243
+409.244
+409.245
+409.246
+409.247
+409.248
+409.249
+409.250
+409.251
+409.252
+409.253
+409.254
+409.255
+409.256
+409.257
+409.258
+409.259
+409.260
+409.261
+409.262
+409.263
+410.238
+410.239
+410.240
+410.241
+410.242
+410.243
+410.244
+410.245
+410.246
+410.247
+410.248
+410.249
+410.250
+410.251
+410.252
+410.253
+410.254
+410.255
+410.256
+410.257
+410.258
+410.259
+410.260
+410.261
+410.262
+410.263
+411.238
+411.239
+411.240
+411.241
+411.242
+411.243
+411.244
+411.245
+411.246
+411.247
+411.248
+411.249
+411.250
+411.251
+411.252
+411.253
+411.254
+411.255
+411.256
+411.257
+411.258
+411.259
+411.260
+411.261
+411.262
+412.238
+412.239
+412.240
+412.241
+412.242
+412.243
+412.244
+412.245
+412.246
+412.247
+412.248
+412.249
+412.250
+412.251
+412.252
+412.253
+412.254
+412.255
+412.256
+412.257
+412.258
+412.259
+412.260
+412.261
+412.262
+413.238
+413.239
+413.240
+413.241
+413.242
+413.243
+413.244
+413.245
+413.246
+413.247
+413.248
+413.249
+413.250
+413.251
+413.252
+413.253
+413.254
+413.255
+413.256
+413.257
+413.258
+413.259
+413.260
+413.261
+413.262
+414.238
+414.239
+414.240
+414.241
+414.242
+414.243
+414.244
+414.245
+414.246
+414.247
+414.248
+414.249
+414.250
+414.251
+414.252
+414.253
+414.254
+414.255
+414.256
+414.257
+414.258
+414.259
+414.260
+414.261
+415.238
+415.239
+415.240
+415.241
+415.242
+415.243
+415.244
+415.245
+415.246
+415.247
+415.248
+415.249
+415.250
+415.251
+415.252
+415.253
+415.254
+415.255
+415.256
+415.257
+415.258
+415.259
+415.260
+415.261
+416.238
+416.239
+416.240
+416.241
+416.242
+416.243
+416.244
+416.245
+416.246
+416.247
+416.248
+416.249
+416.250
+416.251
+416.252
+416.253
+416.254
+416.255
+416.256
+416.257
+416.258
+416.259
+416.260
+416.261
+417.238
+417.239
+417.240
+417.241
+417.242
+417.243
+417.244
+417.245
+417.246
+417.247
+417.248
+417.249
+417.250
+417.251
+417.252
+417.253
+417.254
+417.255
+417.256
+417.257
+417.258
+417.259
+417.260
+418.238
+418.239
+418.240
+418.241
+418.242
+418.243
+418.244
+418.245
+418.246
+418.247
+418.248
+418.249
+418.250
+418.251
+418.252
+418.253
+418.254
+418.255
+418.256
+418.257
+418.258
+418.259
+418.260
+419.238
+419.239
+419.240
+419.241
+419.242
+419.243
+419.244
+419.245
+419.246
+419.247
+419.248
+419.249
+419.250
+419.251
+419.252
+419.253
+419.254
+419.255
+419.256
+419.257
+419.258
+419.259
+420.238
+420.239
+420.240
+420.241
+420.242
+420.243
+420.244
+420.245
+420.246
+420.247
+420.248
+420.249
+420.250
+420.251
+420.252
+420.253
+420.254
+420.255
+420.256
+420.257
+420.258
+420.259
+421.238
+421.239
+421.240
+421.241
+421.242
+421.243
+421.244
+421.245
+421.246
+421.247
+421.248
+421.249
+421.250
+421.251
+421.252
+421.253
+421.254
+421.255
+421.256
+421.257
+421.258
+422.238
+422.239
+422.240
+422.241
+422.242
+422.243
+422.244
+422.245
+422.246
+422.247
+422.248
+422.249
+422.250
+422.251
+422.252
+422.253
+422.254
+422.255
+422.256
+422.257
+422.258
+423.238
+423.239
+423.240
+423.241
+423.242
+423.243
+423.244
+423.245
+423.246
+423.247
+423.248
+423.249
+423.250
+423.251
+423.252
+423.253
+423.254
+423.255
+423.256
+423.257
+424.238
+424.239
+424.240
+424.241
+424.242
+424.243
+424.244
+424.245
+424.246
+424.247
+424.248
+424.249
+424.250
+424.251
+424.252
+424.253
+424.254
+424.255
+424.256
+424.257
+425.238
+425.239
+425.240
+425.241
+425.242
+425.243
+425.244
+425.245
+425.246
+425.247
+425.248
+425.249
+425.250
+425.251
+425.252
+425.253
+425.254
+425.255
+425.256
+425.257
+426.238
+426.239
+426.240
+426.241
+426.242
+426.243
+426.244
+426.245
+426.246
+426.247
+426.248
+426.249
+426.250
+426.251
+426.252
+426.253
+426.254
+426.255
+426.256
+426.257
+427.238
+427.239
+427.240
+427.241
+427.242
+427.243
+427.244
+427.245
+427.246
+427.247
+427.248
+427.249
+427.250
+427.251
+427.252
+427.253
+427.254
+427.255
+427.256
+427.257
+428.238
+428.239
+428.240
+428.241
+428.242
+428.243
+428.244
+428.245
+428.246
+428.247
+428.248
+428.249
+428.250
+428.251
+428.252
+428.253
+428.254
+428.255
+428.256
+429.238
+429.239
+429.240
+429.241
+429.242
+429.243
+429.244
+429.245
+429.246
+429.247
+429.248
+429.249
+429.250
+429.251
+429.252
+429.253
+429.254
+429.255
+429.256
+430.238
+430.239
+430.240
+430.241
+430.242
+430.243
+430.244
+430.245
+430.246
+430.247
+430.248
+430.249
+430.250
+430.251
+430.252
+430.253
+430.254
+430.255
+430.256
+431.238
+431.239
+431.240
+431.241
+431.242
+431.243
+431.244
+431.245
+431.246
+431.247
+431.248
+431.249
+431.250
+431.251
+431.252
+431.253
+431.254
+431.255
+432.238
+432.239
+432.240
+432.241
+432.242
+432.243
+432.244
+432.245
+432.246
+432.247
+432.248
+432.249
+432.250
+432.251
+432.252
+432.253
+432.254
+432.255
+433.238
+433.239
+433.240
+433.241
+433.242
+433.243
+433.244
+433.245
+433.246
+433.247
+433.248
+433.249
+433.250
+433.251
+433.252
+433.253
+433.254
+433.255
+434.238
+434.239
+434.240
+434.241
+434.242
+434.243
+434.244
+434.245
+434.246
+434.247
+434.248
+434.249
+434.250
+434.251
+434.252
+434.253
+434.254
+435.238
+435.239
+435.240
+435.241
+435.242
+435.243
+435.244
+435.245
+435.246
+435.247
+435.248
+435.249
+435.250
+435.251
+435.252
+435.253
+436.238
+436.239
+436.240
+436.241
+436.242
+436.243
+436.244
+436.245
+436.246
+436.247
+436.248
+436.249
+436.250
+436.251
+436.252
+436.253
+437.238
+437.239
+437.240
+437.241
+437.242
+437.243
+437.244
+437.245
+437.246
+437.247
+437.248
+437.249
+437.250
+437.251
+437.252
+437.253
+438.238
+438.239
+438.240
+438.241
+438.242
+438.243
+438.244
+438.245
+438.246
+438.247
+438.248
+438.249
+438.250
+438.251
+438.252
+438.253
+439.238
+439.239
+439.240
+439.241
+439.242
+439.243
+439.244
+439.245
+439.246
+439.247
+439.248
+439.249
+439.250
+439.251
+439.252
+440.238
+440.239
+440.240
+440.241
+440.242
+440.243
+440.244
+440.245
+440.246
+440.247
+440.248
+440.249
+440.250
+440.251
+440.252
+441.238
+441.239
+441.240
+441.241
+441.242
+441.243
+441.244
+441.245
+441.246
+441.247
+441.248
+441.249
+441.250
+441.251
+442.238
+442.239
+442.240
+442.241
+442.242
+442.243
+442.244
+442.245
+442.246
+442.247
+442.248
+442.249
+442.250
+442.251
+443.238
+443.239
+443.240
+443.241
+443.242
+443.243
+443.244
+443.245
+443.246
+443.247
+443.248
+443.249
+443.250
+443.251
+444.238
+444.239
+444.240
+444.241
+444.242
+444.243
+444.244
+444.245
+444.246
+444.247
+444.248
+444.249
+444.250
+445.238
+445.239
+445.240
+445.241
+445.242
+445.243
+445.244
+445.245
+445.246
+445.247
+445.248
+445.249
+446.238
+446.239
+446.240
+446.241
+446.242
+446.243
+446.244
+446.245
+446.246
+446.247
+446.248
+446.249
+447.238
+447.239
+447.240
+447.241
+447.242
+447.243
+447.244
+447.245
+447.246
+447.247
+447.248
+448.238
+448.239
+448.240
+448.241
+448.242
+448.243
+448.244
+448.245
+448.246
+448.247
+448.248
+449.238
+449.239
+449.240
+449.241
+449.242
+449.243
+449.244
+449.245
+449.246
+449.247
+449.248
+450.238
+450.239
+450.240
+450.241
+450.242
+450.243
+450.244
+450.245
+450.246
+450.247
+451.238
+451.239
+451.240
+451.241
+451.242
+451.243
+451.244
+451.245
+451.246
+451.247
+452.238
+452.239
+452.240
+452.241
+452.242
+452.243
+452.244
+452.245
+452.246
+452.247
+453.238
+453.239
+453.240
+453.241
+453.242
+453.243
+453.244
+453.245
+453.246
+454.238
+454.239
+454.240
+454.241
+454.242
+454.243
+454.244
+454.245
+454.246
+455.238
+455.239
+455.240
+455.241
+455.242
+455.243
+455.244
+455.245
+456.238
+456.239
+456.240
+456.241
+456.242
+456.243
+456.244
+456.245
+457.238
+457.239
+457.240
+457.241
+457.242
+457.243
+457.244
+458.238
+458.239
+458.240
+458.241
+458.242
+458.243
+458.244
+459.238
+459.239
+459.240
+459.241
+459.242
+459.243
+460.238
+460.239
+460.240
+460.241
+460.242
+460.243
+461.238
+461.239
+461.240
+461.241
+461.242
+462.238
+462.239
+462.240
+462.241
+462.242
+463.238
+463.239
+463.240
+463.241
+463.242
+464.238
+464.239
+464.240
+464.241
+465.238
+465.239
+465.240
+465.241
+466.238
+466.239
+466.240
+467.238
+467.239
+467.240
+468.238
+468.239
+469.238
+470.238
+567.255
+568.253
+568.255
+569.253
+569.255
+570.251
+570.253
+570.254
+570.255
+571.250
+571.251
+571.252
+571.253
+571.254
+571.255
+572.250
+572.251
+572.252
+572.253
+572.254
+572.255
+573.248
+573.250
+573.251
+573.252
+573.253
+573.254
+574.248
+574.249
+574.250
+574.251
+574.252
+574.253
+574.254
+575.248
+575.249
+575.250
+575.251
+575.252
+575.253
+575.254
+576.246
+576.247
+576.248
+576.249
+576.250
+576.251
+576.252
+576.253
+576.254
+577.238
+577.240
+577.246
+577.247
+577.248
+577.249
+577.250
+577.251
+577.252
+577.253
+578.238
+578.240
+578.246
+578.247
+578.248
+578.249
+578.250
+578.251
+578.252
+578.253
+579.237
+579.238
+579.239
+579.240
+579.244
+579.245
+579.246
+579.247
+579.248
+579.249
+579.250
+579.251
+579.252
+579.253
+580.237
+580.238
+580.239
+580.240
+580.244
+580.245
+580.246
+580.247
+580.248
+580.249
+580.250
+580.251
+580.252
+580.253
+581.236
+581.237
+581.238
+581.239
+581.240
+581.244
+581.245
+581.246
+581.247
+581.248
+581.249
+581.250
+581.251
+581.252
+582.236
+582.237
+582.238
+582.239
+582.240
+582.243
+582.244
+582.245
+582.246
+582.247
+582.248
+582.249
+582.250
+582.251
+582.252
+583.236
+583.237
+583.238
+583.239
+583.240
+583.243
+583.244
+583.245
+583.246
+583.247
+583.248
+583.249
+583.250
+583.251
+583.252
+584.235
+584.236
+584.237
+584.238
+584.239
+584.240
+584.242
+584.243
+584.244
+584.245
+584.246
+584.247
+584.248
+584.249
+584.250
+584.251
+584.252
+585.235
+585.236
+585.237
+585.238
+585.239
+585.240
+585.242
+585.243
+585.244
+585.245
+585.246
+585.247
+585.248
+585.249
+585.250
+585.251
+586.234
+586.235
+586.236
+586.237
+586.238
+586.239
+586.242
+586.243
+586.244
+586.245
+586.246
+586.247
+586.248
+586.249
+586.250
+586.251
+587.234
+587.235
+587.236
+587.237
+587.238
+587.239
+587.241
+587.242
+587.243
+587.244
+587.245
+587.246
+587.247
+587.248
+587.249
+587.250
+587.251
+588.234
+588.235
+588.236
+588.237
+588.238
+588.239
+588.240
+588.241
+588.242
+588.243
+588.244
+588.245
+588.246
+588.247
+588.248
+588.249
+588.250
+589.233
+589.234
+589.235
+589.236
+589.237
+589.238
+589.240
+589.241
+589.242
+589.243
+589.244
+589.245
+589.246
+589.247
+589.248
+589.249
+589.250
+590.233
+590.234
+590.235
+590.236
+590.237
+590.238
+590.240
+590.241
+590.242
+590.243
+590.244
+590.245
+590.246
+590.247
+590.248
+590.249
+590.250
+591.232
+591.233
+591.234
+591.235
+591.236
+591.237
+591.238
+591.239
+591.240
+591.241
+591.242
+591.243
+591.244
+591.245
+591.246
+591.247
+591.248
+591.249
+591.250
+592.232
+592.233
+592.234
+592.235
+592.236
+592.237
+592.239
+592.240
+592.241
+592.242
+592.243
+592.244
+592.245
+592.246
+592.247
+592.248
+592.249
+593.232
+593.233
+593.234
+593.235
+593.236
+593.238
+593.239
+593.240
+593.241
+593.242
+593.243
+593.244
+593.245
+593.246
+593.247
+593.248
+593.249
+594.231
+594.232
+594.233
+594.234
+594.235
+594.236
+594.238
+594.239
+594.240
+594.241
+594.242
+594.243
+594.244
+594.245
+594.246
+594.247
+594.248
+594.249
+595.231
+595.232
+595.233
+595.234
+595.235
+595.237
+595.238
+595.239
+595.240
+595.241
+595.242
+595.243
+595.244
+595.245
+595.246
+595.247
+595.248
+596.230
+596.231
+596.232
+596.233
+596.234
+596.235
+596.236
+596.237
+596.238
+596.239
+596.240
+596.241
+596.242
+596.243
+596.244
+596.245
+596.246
+596.247
+596.248
+597.230
+597.231
+597.232
+597.233
+597.234
+597.235
+597.236
+597.237
+597.238
+597.239
+597.240
+597.241
+597.242
+597.243
+597.244
+597.245
+597.246
+597.247
+597.248
+598.230
+598.231
+598.232
+598.233
+598.234
+598.235
+598.236
+598.237
+598.238
+598.239
+598.240
+598.241
+598.242
+598.243
+598.244
+598.245
+598.246
+598.247
+598.248
+599.229
+599.230
+599.231
+599.232
+599.233
+599.234
+599.235
+599.236
+599.237
+599.238
+599.239
+599.240
+599.241
+599.242
+599.243
+599.244
+599.245
+599.246
+599.247
+600.229
+600.230
+600.231
+600.232
+600.233
+600.234
+600.235
+600.236
+600.237
+600.238
+600.239
+600.240
+600.241
+600.242
+600.243
+600.244
+600.245
+600.246
+600.247
+601.228
+601.229
+601.230
+601.231
+601.232
+601.233
+601.234
+601.235
+601.236
+601.237
+601.238
+601.239
+601.240
+601.241
+601.242
+601.243
+601.244
+601.245
+601.246
+601.247
+602.228
+602.229
+602.230
+602.231
+602.232
+602.233
+602.234
+602.235
+602.236
+602.237
+602.238
+602.239
+602.240
+602.241
+602.242
+602.243
+602.244
+602.245
+602.246
+603.227
+603.228
+603.229
+603.230
+603.231
+603.232
+603.233
+603.234
+603.235
+603.236
+603.238
+603.239
+603.240
+603.241
+603.242
+603.243
+603.244
+603.245
+603.246
+604.227
+604.228
+604.229
+604.230
+604.231
+604.232
+604.233
+604.234
+604.235
+604.236
+604.238
+604.239
+604.240
+604.241
+604.242
+604.243
+604.244
+604.245
+604.246
+605.227
+605.228
+605.229
+605.230
+605.231
+605.232
+605.233
+605.234
+605.235
+605.236
+605.238
+605.239
+605.240
+605.241
+605.242
+605.243
+605.244
+605.245
+606.226
+606.227
+606.228
+606.229
+606.230
+606.231
+606.232
+606.233
+606.234
+606.235
+606.236
+606.238
+606.239
+606.240
+606.241
+606.242
+606.243
+606.244
+606.245
+607.226
+607.227
+607.228
+607.229
+607.230
+607.231
+607.232
+607.233
+607.234
+607.235
+607.236
+607.237
+607.238
+607.239
+607.240
+607.241
+607.242
+607.243
+607.244
+607.245
+608.225
+608.226
+608.227
+608.228
+608.229
+608.230
+608.231
+608.232
+608.233
+608.234
+608.235
+608.236
+608.237
+608.238
+608.239
+608.240
+608.241
+608.242
+608.243
+608.244
+608.245
+609.225
+609.226
+609.227
+609.228
+609.229
+609.230
+609.231
+609.232
+609.233
+609.234
+609.235
+609.236
+609.237
+609.238
+609.239
+609.240
+609.241
+609.242
+609.243
+609.244
+610.224
+610.225
+610.226
+610.227
+610.228
+610.229
+610.230
+610.231
+610.232
+610.233
+610.234
+610.235
+610.236
+610.237
+610.238
+610.239
+610.240
+610.241
+610.242
+610.243
+610.244
+611.224
+611.225
+611.226
+611.227
+611.228
+611.229
+611.230
+611.231
+611.232
+611.233
+611.234
+611.235
+611.236
+611.237
+611.238
+611.239
+611.240
+611.241
+611.242
+611.243
+611.244
+612.223
+612.224
+612.225
+612.226
+612.227
+612.228
+612.229
+612.230
+612.231
+612.232
+612.233
+612.234
+612.235
+612.236
+612.237
+612.238
+612.239
+612.240
+612.241
+612.242
+612.243
+613.223
+613.224
+613.225
+613.226
+613.227
+613.228
+613.229
+613.230
+613.231
+613.232
+613.233
+613.234
+613.235
+613.236
+613.237
+613.238
+613.239
+613.240
+613.241
+613.242
+613.243
+614.222
+614.223
+614.224
+614.225
+614.226
+614.227
+614.228
+614.229
+614.230
+614.231
+614.232
+614.233
+614.234
+614.235
+614.236
+614.237
+614.238
+614.239
+614.240
+614.241
+614.242
+614.243
+615.222
+615.223
+615.224
+615.225
+615.226
+615.227
+615.228
+615.229
+615.230
+615.231
+615.232
+615.233
+615.234
+615.235
+615.236
+615.237
+615.238
+615.239
+615.240
+615.241
+615.242
+615.243
+616.221
+616.222
+616.223
+616.224
+616.225
+616.226
+616.227
+616.228
+616.229
+616.230
+616.231
+616.232
+616.233
+616.234
+616.235
+616.236
+616.237
+616.238
+616.239
+616.240
+616.241
+616.242
+617.221
+617.222
+617.223
+617.224
+617.225
+617.226
+617.227
+617.228
+617.229
+617.230
+617.231
+617.232
+617.233
+617.234
+617.235
+617.236
+617.237
+617.238
+617.239
+617.240
+617.241
+617.242
+618.220
+618.221
+618.222
+618.223
+618.224
+618.225
+618.226
+618.227
+618.228
+618.229
+618.230
+618.231
+618.232
+618.233
+618.234
+618.235
+618.236
+618.237
+618.238
+618.239
+618.240
+618.241
+618.242
+619.220
+619.221
+619.222
+619.223
+619.224
+619.225
+619.226
+619.227
+619.228
+619.229
+619.230
+619.231
+619.232
+619.233
+619.234
+619.235
+619.236
+619.237
+619.238
+619.239
+619.240
+619.241
+620.219
+620.220
+620.221
+620.222
+620.223
+620.224
+620.225
+620.226
+620.227
+620.228
+620.229
+620.230
+620.231
+620.232
+620.233
+620.234
+620.235
+620.236
+620.237
+620.238
+620.239
+620.240
+620.241
+621.219
+621.220
+621.221
+621.222
+621.223
+621.224
+621.225
+621.226
+621.227
+621.228
+621.229
+621.230
+621.231
+621.232
+621.233
+621.234
+621.235
+621.236
+621.237
+621.238
+621.239
+621.240
+621.241
+622.218
+622.219
+622.220
+622.221
+622.222
+622.223
+622.224
+622.225
+622.226
+622.227
+622.228
+622.229
+622.230
+622.231
+622.232
+622.233
+622.234
+622.235
+622.236
+622.237
+622.238
+622.239
+622.240
+622.241
+623.218
+623.219
+623.220
+623.221
+623.222
+623.223
+623.224
+623.225
+623.226
+623.227
+623.228
+623.229
+623.230
+623.231
+623.232
+623.233
+623.234
+623.235
+623.236
+623.237
+623.238
+623.239
+623.240
+624.217
+624.218
+624.219
+624.220
+624.221
+624.222
+624.223
+624.224
+624.225
+624.226
+624.227
+624.228
+624.229
+624.230
+624.231
+624.232
+624.233
+624.234
+624.235
+624.236
+624.237
+624.238
+624.239
+624.240
+625.217
+625.218
+625.219
+625.220
+625.221
+625.222
+625.223
+625.224
+625.225
+625.226
+625.227
+625.228
+625.229
+625.230
+625.231
+625.232
+625.233
+625.234
+625.235
+625.236
+625.237
+625.238
+625.239
+625.240
+626.217
+626.218
+626.219
+626.220
+626.221
+626.222
+626.223
+626.224
+626.225
+626.226
+626.227
+626.228
+626.229
+626.230
+626.231
+626.232
+626.233
+626.234
+626.235
+626.236
+626.237
+626.238
+626.239
+627.217
+627.218
+627.219
+627.220
+627.221
+627.222
+627.223
+627.224
+627.225
+627.226
+627.227
+627.228
+627.229
+627.230
+627.231
+627.232
+627.233
+627.234
+627.235
+627.236
+627.237
+627.238
+627.239
+628.217
+628.218
+628.219
+628.220
+628.221
+628.222
+628.223
+628.224
+628.225
+628.226
+628.227
+628.228
+628.229
+628.230
+628.231
+628.232
+628.233
+628.234
+628.235
+628.236
+628.237
+628.238
+628.239
+629.217
+629.218
+629.219
+629.220
+629.221
+629.222
+629.223
+629.224
+629.225
+629.226
+629.227
+629.228
+629.229
+629.230
+629.231
+629.232
+629.233
+629.234
+629.235
+629.236
+629.237
+629.238
+630.217
+630.218
+630.219
+630.220
+630.221
+630.222
+630.223
+630.224
+630.225
+630.226
+630.227
+630.228
+630.229
+630.230
+630.231
+630.232
+630.233
+630.234
+630.235
+630.236
+630.237
+630.238
+631.217
+631.218
+631.219
+631.220
+631.221
+631.222
+631.223
+631.224
+631.225
+631.226
+631.227
+631.228
+631.229
+631.230
+631.231
+631.232
+631.233
+631.234
+631.235
+631.236
+631.237
+631.238
+632.217
+632.218
+632.219
+632.220
+632.221
+632.222
+632.223
+632.224
+632.225
+632.226
+632.227
+632.228
+632.229
+632.230
+632.231
+632.232
+632.233
+632.234
+632.235
+632.236
+632.237
+633.217
+633.218
+633.219
+633.220
+633.221
+633.222
+633.223
+633.224
+633.225
+633.226
+633.227
+633.228
+633.229
+633.230
+633.231
+633.232
+633.233
+633.234
+633.235
+633.236
+633.237
+634.217
+634.218
+634.219
+634.220
+634.221
+634.222
+634.223
+634.224
+634.225
+634.226
+634.227
+634.228
+634.229
+634.230
+634.231
+634.232
+634.233
+634.234
+634.235
+634.236
+634.237
+635.217
+635.218
+635.219
+635.220
+635.221
+635.222
+635.223
+635.224
+635.225
+635.226
+635.227
+635.228
+635.229
+635.230
+635.231
+635.232
+635.233
+635.234
+635.235
+635.236
+636.217
+636.219
+636.220
+636.221
+636.222
+636.223
+636.224
+636.225
+636.226
+636.227
+636.228
+636.229
+636.230
+636.231
+636.232
+636.233
+636.234
+636.235
+636.236
+637.217
+637.219
+637.220
+637.221
+637.222
+637.223
+637.224
+637.225
+637.226
+637.227
+637.228
+637.229
+637.230
+637.231
+637.232
+637.233
+637.234
+637.235
+637.236
+638.219
+638.221
+638.222
+638.223
+638.224
+638.225
+638.226
+638.227
+638.228
+638.229
+638.230
+638.231
+638.232
+638.233
+638.234
+638.235
+639.219
+639.221
+639.222
+639.223
+639.224
+639.225
+639.226
+639.227
+639.228
+639.229
+639.230
+639.231
+639.232
+639.233
+639.234
+639.235
+640.221
+640.222
+640.223
+640.224
+640.225
+640.226
+640.227
+640.228
+640.229
+640.230
+640.231
+640.232
+640.233
+640.234
+640.235
+641.221
+641.222
+641.223
+641.224
+641.225
+641.226
+641.227
+641.228
+641.229
+641.230
+641.231
+641.232
+641.233
+641.234
+642.221
+642.222
+642.223
+642.224
+642.225
+642.226
+642.227
+642.228
+642.229
+642.230
+642.231
+642.232
+642.233
+642.234
+643.221
+643.222
+643.223
+643.224
+643.225
+643.226
+643.227
+643.228
+643.229
+643.230
+643.231
+643.232
+643.233
+643.234
+644.221
+644.222
+644.223
+644.224
+644.225
+644.226
+644.227
+644.228
+644.229
+644.230
+644.231
+644.232
+644.233
+645.221
+645.222
+645.223
+645.224
+645.225
+645.226
+645.227
+645.228
+645.229
+645.230
+645.231
+645.232
+645.233
+646.221
+646.223
+646.224
+646.225
+646.226
+646.227
+646.228
+646.229
+646.230
+646.231
+646.232
+646.233
+647.223
+647.224
+647.225
+647.226
+647.227
+647.228
+647.229
+647.230
+647.231
+647.232
+648.223
+648.225
+648.226
+648.227
+648.228
+648.229
+648.230
+648.231
+648.232
+649.225
+649.226
+649.227
+649.228
+649.229
+649.230
+649.231
+649.232
+650.225
+650.226
+650.227
+650.228
+650.229
+650.230
+650.231
+651.225
+651.226
+651.227
+651.228
+651.229
+651.230
+651.231
+652.195
+652.197
+652.225
+652.226
+652.227
+652.228
+652.229
+652.230
+653.194
+653.195
+653.196
+653.197
+653.225
+653.226
+653.227
+653.228
+653.229
+653.230
+654.192
+654.193
+654.194
+654.195
+654.196
+654.197
+654.225
+654.226
+654.227
+654.228
+654.229
+654.230
+655.191
+655.192
+655.193
+655.194
+655.195
+655.196
+655.225
+655.228
+655.229
+656.188
+656.189
+656.190
+656.191
+656.192
+656.193
+656.194
+656.195
+656.228
+656.229
+657.185
+657.186
+657.187
+657.188
+657.189
+657.190
+657.191
+657.192
+657.193
+657.194
+657.195
+657.227
+657.228
+657.229
+658.181
+658.182
+658.183
+658.184
+658.185
+658.186
+658.187
+658.188
+658.189
+658.190
+658.191
+658.192
+658.193
+658.194
+658.195
+658.227
+658.228
+659.181
+659.182
+659.183
+659.184
+659.185
+659.186
+659.187
+659.188
+659.189
+659.190
+659.191
+659.192
+659.193
+659.194
+659.195
+659.227
+659.228
+660.181
+660.182
+660.183
+660.184
+660.185
+660.186
+660.187
+660.188
+660.189
+660.190
+660.191
+660.192
+660.193
+660.194
+660.195
+660.227
+661.182
+661.183
+661.184
+661.185
+661.186
+661.187
+661.188
+661.189
+661.190
+661.191
+661.192
+661.193
+661.194
+661.227
+662.182
+662.183
+662.184
+662.185
+662.186
+662.187
+662.188
+662.189
+662.190
+662.191
+662.193
+663.182
+663.183
+663.184
+663.185
+663.186
+663.187
+663.188
+663.189
+663.190
+663.191
+664.183
+664.184
+664.185
+664.186
+664.187
+664.188
+664.189
+665.185
+665.186
+665.187

From 93e86e934c338ec35b79eea042249d6eb1abc9e5 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 13:25:59 +0100
Subject: [PATCH 124/207] Delete scripts/sh/init_canfar.sh

---
 scripts/sh/init_canfar.sh | 13 -------------
 1 file changed, 13 deletions(-)
 delete mode 100755 scripts/sh/init_canfar.sh

diff --git a/scripts/sh/init_canfar.sh b/scripts/sh/init_canfar.sh
deleted file mode 100755
index dd3346f94..000000000
--- a/scripts/sh/init_canfar.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-echo "start init canfar"
-
-echo init_canfar > ~/init_canfar.log
-date >> ~/init_canfar.log
-
-. /opt/conda/etc/profile.d/conda.sh
-
-conda activate shapepipe
-
-echo "end init canfar"
-

From a6bf8a52b174d6f7a49a70c578fc1f2e57b9643a Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 15:30:08 +0100
Subject: [PATCH 125/207] remove centos ci

---
 .github/workflows/ci-tests.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml
index ba9fe6cce..cc4ae4e93 100644
--- a/.github/workflows/ci-tests.yml
+++ b/.github/workflows/ci-tests.yml
@@ -20,7 +20,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        os: [ubuntu-latest, macos-latest, centos-latest]
+        os: [ubuntu-latest, macos-latest]
         python-version: [3.9]
 
     steps:

From bddc491c4e58876ca4af76717455f0a9e7e45757 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 16:29:12 +0100
Subject: [PATCH 126/207] repaired plot spectro notebook

---
 scripts/jupyter/plot_spectro_areas.ipynb | 76 ++----------------------
 1 file changed, 5 insertions(+), 71 deletions(-)

diff --git a/scripts/jupyter/plot_spectro_areas.ipynb b/scripts/jupyter/plot_spectro_areas.ipynb
index 6497c57a6..b881d208c 100644
--- a/scripts/jupyter/plot_spectro_areas.ipynb
+++ b/scripts/jupyter/plot_spectro_areas.ipynb
@@ -9,27 +9,9 @@
   },
   {
    "cell_type": "code",
-<<<<<<< HEAD
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [
-    {
-     "ename": "ModuleNotFoundError",
-     "evalue": "No module named 'skymapper'",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
-      "Cell \u001b[0;32mIn [1], line 12\u001b[0m\n\u001b[1;32m      9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mastropy\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m units \u001b[38;5;28;01mas\u001b[39;00m u\n\u001b[1;32m     10\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m---> 12\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mskymapper\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mskm\u001b[39;00m\n",
-      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'skymapper'"
-     ]
-    }
-   ],
-=======
    "execution_count": null,
    "metadata": {},
    "outputs": [],
->>>>>>> origin/develop
    "source": [
     "import os\n",
     "import sys\n",
@@ -63,11 +45,7 @@
   },
   {
    "cell_type": "code",
-<<<<<<< HEAD
-   "execution_count": 2,
-=======
    "execution_count": null,
->>>>>>> origin/develop
    "metadata": {},
    "outputs": [],
    "source": [
@@ -113,11 +91,7 @@
   },
   {
    "cell_type": "code",
-<<<<<<< HEAD
-   "execution_count": 3,
-=======
    "execution_count": null,
->>>>>>> origin/develop
    "metadata": {},
    "outputs": [],
    "source": [
@@ -210,17 +184,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "DESI: 17450894 objects in total, 4835230/17450894 = 27.7% potentially in UNIONS footprint\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "surveys = []\n",
     "\n",
@@ -319,17 +285,7 @@
     "if 'DECaLS-groups'in use:\n",
     "    surveys.append(Survey.from_fits('DECaLS-groups', 'cyan',\n",
     "                                    '{}/DESI_NGC_group_cut.txt.fits'.format(cat_home),\n",
-<<<<<<< HEAD
-    "                                    key_ra='RA[deg]', key_dec='DEC[deg]'))\n",
-    "    \n",
-    "if 'DESI-Iron'in use:\n",
-    "    surveys.append(Survey.from_fits('DESI', 'cyan',\n",
-    "                                    '{}/galaxies_desi_iron_v0.1.fits'.format(cat_home),\n",
-    "                                    key_ra='TARGET_RA', key_dec='TARGET_DEC'))\n",
-    "    "
-=======
     "                                    key_ra='RA[deg]', key_dec='DEC[deg]'))"
->>>>>>> origin/develop
    ]
   },
   {
@@ -341,7 +297,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -406,21 +362,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "ename": "AttributeError",
-     "evalue": "module 'cs_util.cfis' has no attribute 'get_image_list'",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
-      "Cell \u001b[0;32mIn[6], line 24\u001b[0m\n\u001b[1;32m     22\u001b[0m images \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m     23\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m band \u001b[38;5;129;01min\u001b[39;00m bands:\n\u001b[0;32m---> 24\u001b[0m     images[band] \u001b[38;5;241m=\u001b[39m \u001b[43mcfis\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_image_list\u001b[49m(tiles_ID[band], band, image_type, input_format\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mID_only\u001b[39m\u001b[38;5;124m'\u001b[39m, verbose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n",
-      "\u001b[0;31mAttributeError\u001b[0m: module 'cs_util.cfis' has no attribute 'get_image_list'"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "# Variables\n",
     "unit = 'deg'\n",
@@ -684,15 +628,9 @@
  ],
  "metadata": {
   "kernelspec": {
-<<<<<<< HEAD
-   "display_name": "shapepipe",
-   "language": "python",
-   "name": "shapepipe"
-=======
    "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
->>>>>>> origin/develop
   },
   "language_info": {
    "codemirror_mode": {
@@ -704,11 +642,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-<<<<<<< HEAD
-   "version": "3.9.13"
-=======
    "version": "3.9.7"
->>>>>>> origin/develop
   }
  },
  "nbformat": 4,

From 4dffd478a61223ca1a10ce0d7100c2cfe020db61 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 16:58:13 +0100
Subject: [PATCH 127/207] added doc string

---
 scripts/python/link_to_exp_for_tile.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index 0ad205adf..929c90940 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -2,7 +2,10 @@
 
 # -*- coding: utf-8 -*-
 
-"""Script link_to_esp_for_tile.py
+"""Script link_to_exp_for_tile.py
+
+:Description: Link to exposure and PSF catalogue
+ for a given tile.
 
 :Author: Martin Kilbinger
 

From 5675c0654d0b2aafe222eaaa8d42151b58867126 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 18:54:04 +0100
Subject: [PATCH 128/207] python example runner: added back mccd and pysap

---
 shapepipe/modules/python_example_runner.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/shapepipe/modules/python_example_runner.py b/shapepipe/modules/python_example_runner.py
index fc5565ecc..d468c10e0 100644
--- a/shapepipe/modules/python_example_runner.py
+++ b/shapepipe/modules/python_example_runner.py
@@ -19,8 +19,10 @@
         'astropy',
         'galsim',
         'joblib',
+        'mccd',
         'ngmix',
         'pandas',
+        'pysap',
         'scipy',
         'sf_tools',
         'sip_tpv',

From 14569b28b75d4b283260f9f6e146f44123010623 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 6 Mar 2024 18:57:41 +0100
Subject: [PATCH 129/207] corrected typo in doc string

---
 shapepipe/pipeline/args.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shapepipe/pipeline/args.py b/shapepipe/pipeline/args.py
index 21eecef84..818f54163 100644
--- a/shapepipe/pipeline/args.py
+++ b/shapepipe/pipeline/args.py
@@ -131,7 +131,7 @@ def create_arg_parser():
     optional.add_argument(
         '-e',
         '--exclusive',
-        help='exclusive input filer number string',
+        help='exclusive input file number string',
     )
     # Return parser
     return parser.parse_args()

From b406438e51a4e990b67994a1ca5a2b7bf2d9f2f4 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Mar 2024 07:01:38 +0000
Subject: [PATCH 130/207] updated canfar pipeline doc

---
 docs/source/pipeline_canfar.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 7227cf463..36a1a2025 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -79,13 +79,13 @@ curl_canfar_local.sh -j 64 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
 curl_canfar_local.sh -j 128 -f tile_numbers.txt -k tile -p $psf -N 8
 
 # Merge subcatalogues, and create final cat
-job_sp_canfar.bash -p $psf -n 1 -j 256
+curl_canfar_local.sh -j 256 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
 
 # Combine all final cats in common output dir as links
 combine_runs.bash -c final -p psfex
 
 # Merge all final cats
-# (use 192GB RAM)
+# (W3: 140GB RAM)
 merge_final_cat -i output/run_sp_combined_final/make_catalog_runner/output -p cfis/final_cat.param -v
 
 

From fe6683158ccb3a6a201816997242054478e58d90 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Mar 2024 07:02:10 +0000
Subject: [PATCH 131/207] fixed combined mask input dir

---
 example/cfis/config_exp_psfex.ini | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/example/cfis/config_exp_psfex.ini b/example/cfis/config_exp_psfex.ini
index 52ca81f24..a5ac5d8a1 100644
--- a/example/cfis/config_exp_psfex.ini
+++ b/example/cfis/config_exp_psfex.ini
@@ -58,7 +58,7 @@ TIMEOUT = 96:00:00
 [SEXTRACTOR_RUNNER]
 
 # Input from two modules
-INPUT_DIR = last:split_exp_runner, run_sp_exp_Ma:mask_runner
+INPUT_DIR = last:split_exp_runner, run_sp_Ma_exp:mask_runner
 
 # Read pipeline flag files created by mask module
 FILE_PATTERN = image, weight, pipeline_flag

From 282d76b4294609c4fe1124cadb744fe5a33aab8e Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Mar 2024 07:02:24 +0000
Subject: [PATCH 132/207] added parameters to final cat

---
 example/cfis/final_cat.param | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/example/cfis/final_cat.param b/example/cfis/final_cat.param
index 6372a13e8..a70de962d 100644
--- a/example/cfis/final_cat.param
+++ b/example/cfis/final_cat.param
@@ -76,12 +76,23 @@ NGMIX_FLUX_ERR_2M
 NGMIX_FLUX_ERR_2P
 NGMIX_FLUX_ERR_NOSHEAR
 
-# magnitude, mainly for plots
+# magnitudes
 MAG_AUTO
-
-# SNR from SExtractor, used for cuts on GALSIM shapes
+MAGERR_AUTO
+MAG_WIN
+MAGERR_WIN
+FLUX_AUTO
+FLUXERR_AUTO
+FLUX_APER
+FLUXERR_APER
+FLUX_RADIUS
+
+# SNR from SExtractor
 SNR_WIN
 
+FWHM_IMAGE
+FWHM_WORLD
+
 # PSF size measured on original image
 NGMIX_T_PSFo_NOSHEAR
 

From 9ac6bb475440d2848542d799969ff5f65f82bd6c Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Mar 2024 07:02:47 +0000
Subject: [PATCH 133/207] summary

---
 scripts/python/summary_params_pre_v2.py | 3 +--
 shapepipe/utilities/summary.py          | 7 +++++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index d8d08201f..dc16b59a2 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -88,7 +88,6 @@ def set_jobs_v2_pre_v2(patch, verbose):
         verbose=verbose,
     )
 
-    #        n_mult=[1, 1, 1],
     jobs["2"] = job_data(
         2,
         ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh"],
@@ -223,7 +222,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     jobs["512"] = job_data(
         "512",
         ["run_sp_combined_final"],
-        ["make_cat_runner"],
+        ["make_catalog_runner"],
         "tile_IDs",
         path_main=path_main,
         path_left="output",
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index ae574e5c4..8a1776905 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -15,7 +15,7 @@
 
 from tqdm import tqdm
 
-print("summaary v1.0")
+print("summaary v1.1")
 
 
 def get_IDs_from_file(path):
@@ -243,7 +243,7 @@ def print_intro(self):
         Print header line for job statistics.
 
         """
-        logging.info(f" (Job {self._bit})")
+        logging.info(f" # Job {self._bit}:")
 
     @classmethod
     def print_stats_header(self):
@@ -649,6 +649,9 @@ def check_numbers(self, par_runtime=None, indices=None):
                 n_missing_job += n_missing
                 self._missing_IDs_job.extend(missing_IDs)
 
+        # Empty line after job
+        logging.info("")
+
         # Write missing IDs for entire job to file
         #if n_missing_job > 0:
         self.output_missing_job()

From 25ef4e22bdb1abb2d7c29213dd24bd8768b71815 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Mar 2024 07:03:22 +0000
Subject: [PATCH 134/207] Removed rarely used ngmix njob/ngal options; splits
 computed automatically

---
 scripts/sh/job_sp_canfar.bash | 27 +++------------------------
 1 file changed, 3 insertions(+), 24 deletions(-)

diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index f2b9c03d1..3ba748c69 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -20,8 +20,6 @@ star_cat_for_mask='onthefly'
 exclusive=''
 results='cosmostat/kilbinger/results_v2'
 n_smp=-1
-nsh_step=-1
-nsh_max=-1
 nsh_jobs=8
 
 ## Help string
@@ -53,14 +51,9 @@ usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID]
    \toutput (upload) directory on vos:cfis, default='$results'\n
    -n, --n_smp N_SMP\n
    \tnumber of jobs (SMP mode only), default from original config files\n
-   --nsh_step NSTEP\n
-   \tnumber of shape measurement parallel jobs, default=$nsh_jobs\n
    --nsh_jobs NJOB\n
    \tnumber of objects per parallel shape module call, \n
    \tdefault: optimal number is computed\n
-   --nsh_max NMAX\n
-   \tmax number of objects per parallel shape module call, \n
-   \tdefault: unlimited; has precedent over --nsh_step\n
    TILE_ID_i\n
    \ttile ID(s), e.g. 283.247 214.242\n
 "
@@ -110,14 +103,6 @@ while [ $# -gt 0 ]; do
       n_smp="$2"
       shift
       ;;
-    --nsh_max)
-      nsh_max="$2"
-      shift
-      ;;
-    --nsh_step)
-      nsh_step="$2"
-      shift
-      ;;
     --nsh_jobs)
       nsh_jobs="$2"
       shift
@@ -142,10 +127,6 @@ if [ "$retrieve" != "vos" ] && [ "$retrieve" != "symlink" ]; then
   exit 5
 fi
 
-if [ $nsh_max != -1 ]; then
-  nsh_step=$nsh_max
-fi
-
 # For tar archives. TODO: Should be unique to each job
 export ID="test"
 
@@ -460,10 +441,8 @@ if [[ $do_job != 0 ]]; then
 
   ### Prepare config files
   n_min=0
-  if [[ $nsh_step == -1 ]]; then
-    n_obj=`get_number_objects`
-    nsh_step=`echo "$(($n_obj/$nsh_jobs))"`
-  fi
+  n_obj=`get_number_objects`
+  nsh_step=`echo "$(($n_obj/$nsh_jobs))"`
 
   n_max=$((nsh_step - 1))
   for k in $(seq 1 $nsh_jobs); do
@@ -472,7 +451,7 @@ if [[ $do_job != 0 ]]; then
         's/(ID_OBJ_MIN =) X/$1 '$n_min'/; s/(ID_OBJ_MAX =) X/$1 '$n_max'/; s/NgXu/Ng'$k'u/; s/X_interp/'$psf'_interp/g; print' \
         > $SP_CONFIG_MOD/config_tile_Ng${k}u.ini
     n_min=$((n_min + nsh_step))
-    if [ "$k" == $((nsh_jobs - 1)) ] && [ $nsh_max == -1 ]; then
+    if [ "$k" == $((nsh_jobs - 1)) ];  then
       n_max=-1
     else
       n_max=$((n_min + nsh_step - 1))

From 75fb975f39cc7d05ec4cfca26d3a7ab5f67a0e94 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Mar 2024 07:04:10 +0000
Subject: [PATCH 135/207] canfar init + run job: removed prev Ms and Mc dirs
 for job 256

---
 scripts/sh/init_run_exclusive_canfar.sh | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 65ecfe8c1..dbaac2444 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -181,9 +181,9 @@ if [[ $do_job != 0 ]]; then
     cd ${kind}_runs/$ID/output
 
     # Remove duplicate job-32 runs (tile detection)
-    n_16=`ls -rt1d run_sp_tile_Sx_* | wc -l`
-    if [ "$n_16" != "1" ]; then
-      n_remove="$(($n_16-1))"
+    n_32=`ls -rt1d run_sp_tile_Sx_* | wc -l`
+    if [ "$n_32" != "1" ]; then
+      n_remove="$(($n_32-1))"
       echo "removing $n_remove duplicate old job-32 runs"
       rm -rf `ls -rt1d run_sp_tile_Sx_* | head -$n_remove`
     fi
@@ -193,6 +193,15 @@ if [[ $do_job != 0 ]]; then
   fi
 fi
 
+(( do_job= $job & 256 ))
+if [[ $do_job != 0 ]]; then
+
+  # Remove previous runs of this job
+  rm -rf run_sp_Ms_20??_*
+  rm -rf run_sp_Mc_20??_*
+
+fi
+
 cd ..
 
 # Update log file

From 376bbf1b2337e8e746a7955b89a8167b68a577d2 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Wed, 13 Mar 2024 07:04:44 +0000
Subject: [PATCH 136/207] merge sep cats: error if ngmix #HDUs < 6

---
 .../modules/merge_sep_cats_package/merge_sep_cats.py   | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
index d9200529e..4c82d1a8c 100644
--- a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
+++ b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
@@ -87,6 +87,16 @@ def process(self):
             cat0.open()
             list_ext_name = cat0.get_ext_name()
             list_col_name = cat0.get_col_names()
+
+
+            # Inupt ngmix files sometimes have not all sheared versions
+            # (HDUs 1 - 5 = 1M, 1P, 2M, 2P, NOSHEAR) due to IO errors
+            if len(list_ext_name) < 6:
+                raise IndexError(
+                    f"Input ngmix catalogue {input_file} has only"
+                    + f" {len(list_ext_name)} HDUs, required are 6"
+                )
+
             # MKDEBUG: Some input ngmix catalogues have multiple of 5 HDUs
             # if reprocessed and not deleted but appended
             if len(list_ext_name) > 6:

From 21deebc692952574b2641628d8ad4cb64cb72551 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Wed, 3 Apr 2024 09:29:32 +0200
Subject: [PATCH 137/207] env-dev updated to min versions on canfar (docker
 image SP 1.1)

---
 environment-dev.yml | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/environment-dev.yml b/environment-dev.yml
index cd2977ab8..703c19172 100644
--- a/environment-dev.yml
+++ b/environment-dev.yml
@@ -8,29 +8,29 @@ name: shapepipe-dev
 channels:
   - conda-forge
 dependencies:
-  - python=3.11
-  - pip>=21.2.4
-  - astropy>=5.0
+  - python>=3.9.18
+  - pip>=23.3.1
+  - astropy>=5.1.1
   - autoconf>=2.71
-  - automake>=1.16
-  - cmake>=3.27
-  - galsim>=2.5
-  - joblib>=1.3
+  - automake>=1.16.5
+  - cmake>=3.27.7
+  - galsim>=2.5.1
+  - joblib>=1.3.2
   - libtool>=2.4
-  - matplotlib>=3.8
-  - numba>=0.57
+  - matplotlib>=3.8.1
+  - numba>=0.58.1
   - pandas>=2.1
-  - pyqt5-sip>=12.12
-  - pyqtgraph>=0.13
+  - pyqt5-sip>=12.13
+  - pyqtgraph>=0.13.3
   - reproject>=0.12
   - sqlitedict>=2.1
   - termcolor>=2.3
-  - tqdm>=4.66
-  - treecorr>=4.3
+  - tqdm>=4.66.1
+  - treecorr>=4.3.3
   - pip:
     - cs_util==0.0.5
-    - mccd==1.2.3
-    - modopt==1.6.0
+    - mccd==1.2.4
+    - modopt==1.6.1
     - sip_tpv==1.1
     - sf_tools==2.0.4
     - git+https://github.com/CEA-COSMIC/pysap@develop

From f2a5a069497fb071e8489452ebd52d8fc9cdf55c Mon Sep 17 00:00:00 2001
From: martinkilbinger <martinkilbinger@cea.fr>
Date: Wed, 10 Apr 2024 16:32:13 +0200
Subject: [PATCH 138/207] minor changes

---
 install_shapepipe | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/install_shapepipe b/install_shapepipe
index e169f4859..85deab531 100755
--- a/install_shapepipe
+++ b/install_shapepipe
@@ -119,7 +119,7 @@ check_conda() {
   CONDA_VERSION_MAJOR=$(cut -d'.' -f1 <<<$CONDA_VERSION)
   CONDA_VERSION_MINOR=$(cut -d'.' -f2 <<<$CONDA_VERSION)
   CONDA_VERSION_PATCH=$(cut -d'.' -f3 <<<$CONDA_VERSION)
-  CONDA_SH=/opt/conda/etc/profile.d/conda.sh
+  CONDA_SH=/etc/profile.d/conda.sh
   # Check Conda major version
   if [ "$CONDA_VERSION_MAJOR" -lt 4 ]
   then
@@ -127,14 +127,14 @@ check_conda() {
     exit 1
   fi
   # Look for conda.sh file
-  if [ -f "$CONDA_PREFIX_1$CONDA_SH" ]
+  if [ -f "/opt/conda/$CONDA_SH" ]
   then
-    source "$CONDA_PREFIX_1$CONDA_SH"
+    source "/opt/conda/$CONDA_SH"
   elif [ -f "$CONDA_PREFIX$CONDA_SH" ]
   then
     source "$CONDA_PREFIX$CONDA_SH"
   else
-    echo -ne "${RED}ERROR: Could not find $CONDA_SH in \$CONDA_PREFIX.${NC}\n"
+    echo -ne "${RED}ERROR: Could not find $CONDA_SH in /opt/conda or \$CONDA_PREFIX.${NC}\n"
     echo -ne "${RED}Activate the base/root Conda environment and try again.${NC}\n"
     exit 1
   fi

From df90225251145505f3ea5a1c0738af394d3dc269 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 14 May 2024 08:14:25 +0000
Subject: [PATCH 139/207] Improved error msg for empty process list and -e flag

---
 shapepipe/pipeline/file_handler.py | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index 66baf12e6..2d7bb90ce 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -1136,7 +1136,11 @@ def _format_process_list(
             process_list.append(process_items)
 
         if len(process_list) == 0:
-            raise ValueError("Empty process list")
+            msg = "Empty process list"
+            if self._exclusive is not None:
+                if len(number_list) > 0:
+                    msg = f"{msg}. No input file found matching exclusive ID"
+            raise ValueError(msg
 
         return process_list
 

From b7cf7ad69419b96ae392202571562d305ba6dd03 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:16:32 +0000
Subject: [PATCH 140/207] canfar job descr and summary updated

---
 docs/source/pipeline_canfar.md | 30 ++++++++++++++-----
 shapepipe/utilities/summary.py | 55 +++++++++++++++++++---------------
 2 files changed, 54 insertions(+), 31 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 36a1a2025..cb60c4e71 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -21,6 +21,8 @@ ln -s ~/shapepipe/auxdir/CFIS/tiles_202106/tiles_$patch.txt tile_numbers.txt
 ### Create and link to central image storage directory
 mkdir -p ~/cosmostat/v2/data_tiles/$patch
 ln -s ~/cosmostat/v2/data_tiles/$patch data_tiles
+mkdir -p ~/cosmostat/v2/data_exp/$patch
+ln -s ~/cosmostat/v2/data_tiles/$patch data_exp
 
 ### Download and move tiles 
 ln -s ~/shapepipe/example/cfis
@@ -28,9 +30,8 @@ mkdir -p output
 export SP_RUN=`pwd`
 
 shapepipe_run -c cfis/config_Git_vos.ini
-mv -i output/run_sp_Git_*/get_images_runner/output/CFIS.???.???.*fits* data_tiles
-rm -rf output/run_sp_tiles_Git_*
-update_run_log_file.py
+ls -l data_tiles/ | wc; mv -i output/run_sp_Git_*/get_images_runner/output/CFIS.???.???.*fits* data_tiles; ls -l data_tiles/ | wc
+rm -rf output/run_sp_Git_*; update_run_log_file.py
 # repeat the above block
 
 ### Find exposures; this run can be stopped after Fe
@@ -42,7 +43,8 @@ shapepipe_run -c cfis/config_Gie_vos.ini
 mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp
 rm -rf  output/run_sp_Gie_*
 update_run_log_file.py
-# repeat the above
+# repeat the above; or:
+while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp;  ls -l data_exp/ | wc; rm -rf output/run_sp_Git_*; update_run_log_file.py; done
 
 ### Create links (and re-run Fe, not necessary)
 job_sp_canfar.bash -p $psf `cat tile_numbers.txt` -j 1 -r symlink
@@ -51,15 +53,21 @@ job_sp_canfar.bash -p $psf `cat tile_numbers.txt` -j 1 -r symlink
 job_sp_canfar.bash -p $psf -n $N_SMP -j 2
 
 # Mask tiles
+
+## Run repeatedly if necessary
 job_sp_canfar.bash -p $psf -n $N_SMP -j 4
 
-# If not finshed:
-combine_runs.bash -p psfex -c flag
-mv output/run_sp_combined_flag output/run_sp_exp_Ma
+## Combine all runs
+combine_runs.bash -c flag_tile
 
 # Mask exposures
+
+## Run repeatedly if necessary
 job_sp_canfar.bash -p $psf -n $N_SMP -j 8
 
+# Combine all runs
+combine_runs.bash -c flag_exp
+
 
 # Tile detection
 curl_canfar_local.sh -j 16 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
@@ -89,7 +97,15 @@ combine_runs.bash -c final -p psfex
 merge_final_cat -i output/run_sp_combined_final/make_catalog_runner/output -p cfis/final_cat.param -v
 
 
+# Star catalogue
+combine_runs.bash  -p $psf -c psf
+shapepipe_run -c $SP_CONFIG/config_MsPl_$psf.ini
+
 # Delete jobs
 SSL=~/.ssl/cadcproxy.pem
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
 for ID in `cat session_IDs.txt`; do echo $ID; curl -X DELETE -E $SSL $SESSION/$ID; done
+
+# Run in terminal in parallel (-e needs to be last arg)
+cat all.txt | xargs -P 16 -n 1  init_run_exclusive_canfar.sh -j 64 -p psfex -k tile -f summary/missing_job_64_all.txt -n -e
+
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 8a1776905..1a5f1efec 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -252,8 +252,11 @@ def print_stats_header(self):
         Print overall header information for stats output.
 
         """
+        #logging.info(
+            #"module                          expected     found   miss_expl"
+            #+ " missing uniq_miss  fr_found"
         logging.info(
-            "module                          expected     found   miss_expl"
+            "module                          expected     found"
             + " missing uniq_miss  fr_found"
         )
         logging.info("=" * 100)
@@ -297,7 +300,7 @@ def print_stats(
 
         logging.info(
             f"{module:30s} {n_expected:9d} {n_found:9d}"
-            + f" {n_missing_explained:9d} {n_missing:9d}"
+            + f" {n_missing:9d}"
             + f" {n_missing_per_mult:9.1f} {fraction_found:9.1%}"
         )
 
@@ -357,9 +360,16 @@ def write_IDs_to_file(self, output_path, IDs):
 
         """
         IDs_dot = self.replace_dash_dot_if_tile(IDs)
-        with open(output_path, "w") as f_out:
-            for ID in IDs_dot:
-                print(ID, file=f_out)
+        if len(IDs_dot) > 0:
+            #print("MKDEBUG writing", output_path, len(IDs_dot))
+            # Write IDs to file
+            with open(output_path, "w") as f_out:
+                for ID in IDs_dot:
+                    print(ID, file=f_out)
+        elif os.path.exists(output_path):
+            # Remove preivous obsolete ID file
+            #print("MKDEBUG removing ", output_path)
+            os.unlink(output_path)
 
     def output_missing(
         self,
@@ -404,19 +414,20 @@ def output_missing(
                 missing_IDs.append(ID)
 
         n_all = len(missing_IDs)
+        #print("MKDEBUG ", module, len(IDs), n_all, len(list_expected))
         missing_IDs_unique = self.get_unique(missing_IDs)
-        n_unique = len(missing_IDs_unique)
 
-        if n_unique > 0:
-            if not self._output_path_missing_IDs:
-                output_path = (
-                    f"{self._path_main}/summary/missing_job_{self._bit}"
-                    + f"_{module}.txt"
-                )
-            else:
-                output_path = self._output_path_missing_IDs[idx]
-            #print("MKDEBUG", missing_IDs_unique)
-            self.write_IDs_to_file(output_path, missing_IDs_unique)
+        if not self._output_path_missing_IDs:
+            # Default name using bit and module
+            output_path = (
+                f"{self._path_main}/summary/missing_job_{self._bit}"
+                + f"_{module}.txt"
+            )
+        else:
+            # User-defined name (e.g. ngmix_runner_X)
+            output_path = self._output_path_missing_IDs[idx]
+        #print("MKDEBUG output_missing", module, output_path, len(missing_IDs_unique))
+        self.write_IDs_to_file(output_path, missing_IDs_unique)
 
         return missing_IDs_unique
 
@@ -427,12 +438,7 @@ def output_missing_job(self):
 
         missing_IDs_all = set(self._missing_IDs_job)
 
-        if len(missing_IDs_all) > 0:
-            self.write_IDs_to_file(output_path, missing_IDs_all)
-        else:
-            #logging.warning("no missing IDs in output_missing_job")
-            if os.path.exists(output_path):
-                os.unlink(output_path)
+        self.write_IDs_to_file(output_path, missing_IDs_all)
 
     @classmethod
     def get_last_full_path(self, base_and_subdir, matches):
@@ -675,7 +681,7 @@ def get_par_runtime(par_runtime, key, kind="n"):
         combined_key == "list_3*n_shdus+n_exposures"
         and combined_key not in par_runtime
     ):
-        print("{combined_key} not set, TBD")
+        print(f"{combined_key} not set, TBD")
         return []
 
     return par_runtime[combined_key]
@@ -692,6 +698,7 @@ def print_par_runtime(par_runtime, verbose=True):
             if not key.startswith("list"):
                 logging.info(f"{key:30s} {value:6d}")
             else:
-                logging.info(f"{key:29s} {len(value):6d} entries")
+                #logging.info(f"{key:30s} {len(value):6d} entries")
+                pass
         logging.info("===========")
         logging.info("")

From df983c4daf95bf904ffbdc42269beb326125a1a4 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:18:10 +0000
Subject: [PATCH 141/207] fixed err msg

---
 shapepipe/pipeline/file_handler.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index 2d7bb90ce..03c9c76ab 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -1140,7 +1140,7 @@ def _format_process_list(
             if self._exclusive is not None:
                 if len(number_list) > 0:
                     msg = f"{msg}. No input file found matching exclusive ID"
-            raise ValueError(msg
+            raise ValueError(msg)
 
         return process_list
 

From cca5694d24037b69c6f1f23f28f601550d62beda Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:18:30 +0000
Subject: [PATCH 142/207] config files updated

---
 example/cfis/config_Fe.ini              | 72 ++++++++++++++++++
 example/cfis/config_Gie_symlink.ini     | 97 +++++++++++++++++++++++++
 example/cfis/config_exp_Ma_onthefly.ini |  3 +
 example/cfis/config_exp_Sp.ini          | 74 +++++++++++++++++++
 example/cfis/config_tile_Sx.ini         |  2 +-
 5 files changed, 247 insertions(+), 1 deletion(-)
 create mode 100644 example/cfis/config_Fe.ini
 create mode 100644 example/cfis/config_Gie_symlink.ini
 create mode 100644 example/cfis/config_exp_Sp.ini

diff --git a/example/cfis/config_Fe.ini b/example/cfis/config_Fe.ini
new file mode 100644
index 000000000..240c3a747
--- /dev/null
+++ b/example/cfis/config_Fe.ini
@@ -0,0 +1,72 @@
+# ShapePipe configuration file for: find exposures
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = False
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_Fe
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = True
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = find_exposures_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 1
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+# Get tiles
+[FIND_EXPOSURES_RUNNER]
+
+INPUT_DIR = run_sp_Git:get_images_runner_run_1
+
+FILE_PATTERN = CFIS_image
+
+FILE_EXT = .fits
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+# Column number of exposure name in FITS header
+COLNUM = 3
+
+# Prefix to remove from exposure name
+EXP_PREFIX = p
+
diff --git a/example/cfis/config_Gie_symlink.ini b/example/cfis/config_Gie_symlink.ini
new file mode 100644
index 000000000..e6fa49f4c
--- /dev/null
+++ b/example/cfis/config_Gie_symlink.ini
@@ -0,0 +1,97 @@
+# ShapePipe configuration file for: get images
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = False
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_Gie
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = True
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = get_images_runner            
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 1
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+# Get exposures
+[GET_IMAGES_RUNNER]
+
+INPUT_DIR = last:find_exposures_runner
+
+FILE_PATTERN = exp_numbers
+
+FILE_EXT = .txt
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -000-000
+
+
+# Paths
+
+# Output path (optional, default is [FILE]:OUTPUT_DIR
+# OUTPUT_PATH = input_images
+
+# Input path where original images are stored. Can be local path or vos url.
+# Single string or list of strings
+INPUT_PATH = $SP_RUN/data_exp, $SP_RUN/data_exp, $SP_RUN/data_exp
+
+# Input file pattern including tile number as dummy template
+INPUT_FILE_PATTERN = 000000, 000000.weight, 000000.flag
+
+# Input file extensions
+INPUT_FILE_EXT = .fits.fz, .fits.fz, .fits.fz
+
+# Input numbering scheme, python regexp
+INPUT_NUMBERING = \d{6}
+
+# Output file pattern without number
+OUTPUT_FILE_PATTERN = image-, weight-, flag-
+
+# Method to retrieve images, one in 'vos', 'symlink'
+RETRIEVE = symlink
+
+# If RETRIEVE=vos, number of attempts to download
+# Optional, default=3
+N_TRY = 3
+
+# Retrieve command options, optional
+RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem
diff --git a/example/cfis/config_exp_Ma_onthefly.ini b/example/cfis/config_exp_Ma_onthefly.ini
index 5f629500d..a2ff95fe6 100644
--- a/example/cfis/config_exp_Ma_onthefly.ini
+++ b/example/cfis/config_exp_Ma_onthefly.ini
@@ -74,3 +74,6 @@ USE_EXT_STAR = False
 
 # File name suffix for the output flag files (optional)
 PREFIX = pipeline
+
+# Path to check for existing output mask files
+CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Ma_exp/mask_runner/output
diff --git a/example/cfis/config_exp_Sp.ini b/example/cfis/config_exp_Sp.ini
new file mode 100644
index 000000000..491b17bdf
--- /dev/null
+++ b/example/cfis/config_exp_Sp.ini
@@ -0,0 +1,74 @@
+# ShapePipe configuration file for single-exposures,
+# split images
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_exp_Sp
+
+# Add date and time to RUN_NAME, optional, default: True
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = split_exp_runner
+
+# Run mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 8
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+[SPLIT_EXP_RUNNER]
+
+INPUT_DIR = last:get_images_runner_run_2
+
+FILE_PATTERN = image, weight, flag
+
+# Matches compressed single-exposure files
+FILE_EXT = .fitsfz, .fitsfz, .fitsfz
+
+NUMBERING_SCHEME = -0000000
+
+# OUTPUT_SUFFIX, actually file name prefixes.
+# Expected keyword "flag" will lead to a behavior where the data are saved as int.
+# The code also expects the image data to use the "image" suffix
+# (default value in the pipeline).
+OUTPUT_SUFFIX = image, weight, flag
+
+# Number of HDUs/CCDs of mosaic
+N_HDU = 40
diff --git a/example/cfis/config_tile_Sx.ini b/example/cfis/config_tile_Sx.ini
index a079c2488..42b3a09a9 100644
--- a/example/cfis/config_tile_Sx.ini
+++ b/example/cfis/config_tile_Sx.ini
@@ -45,7 +45,7 @@ OUTPUT_DIR = $SP_RUN/output
 [JOB]
 
 # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
-SMP_BATCH_SIZE = 2
+SMP_BATCH_SIZE = 16
 
 # Timeout value (optional), default is None, i.e. no timeout limit applied
 TIMEOUT = 96:00:00

From 6b2f4989260692ed54aaf18bb79da6ad7ef8319e Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:18:54 +0000
Subject: [PATCH 143/207] summary updated

---
 scripts/python/summary_params_pre_v2.py | 17 +++++++----------
 scripts/python/summary_run.py           | 12 +++++++++++-
 2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index dc16b59a2..6d16e4270 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -92,21 +92,18 @@ def set_jobs_v2_pre_v2(patch, verbose):
         2,
         ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh"],
         ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
-        ["tile_IDs", 0, "3*n_shdus+n_exposures"],
+        #["tile_IDs", 0, "3*n_shdus+n_exposures"],
+        ["tile_IDs", 0, "exposures"],
+        n_mult=[1, 1, 121],
         path_main=path_main,
         path_left="output",
         verbose=verbose,
     )
 
-    run_dir_mask_tiles = "run_sp_tile_Ma"
-    run_dir_mask_exp = "run_sp_exp_Ma"
-    mask_module_tiles = "mask_runner"
-    mask_module_exp = "mask_runner"
-
     jobs["4"] = job_data(
         4,
-        run_dir_mask_tiles,
-        [mask_module_tiles],
+        ["run_sp_Ma_tile"],
+        ["mask_runner"],
         ["tile_IDs"],
         path_main=path_main,
         path_left="output",
@@ -115,8 +112,8 @@ def set_jobs_v2_pre_v2(patch, verbose):
 
     jobs["8"] = job_data(
         8,
-        run_dir_mask_exp,
-        [mask_module_exp],
+        ["run_sp_Ma_exp"],
+        ["mask_runner"],
         ["shdus"],
         path_main=path_main,
         path_left="output",
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index 331764b24..5b2ff671d 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -12,6 +12,11 @@ def main(argv=None):
 
     patch = argv[1]
 
+    if len(argv) == 3:
+        job_exclusive = argv[2]
+    else:
+        job_exclusive = None
+
     verbose = False
 
     jobs, list_tile_IDs_dot = set_jobs_v2_pre_v2(patch, verbose)
@@ -27,7 +32,10 @@ def main(argv=None):
         jobs[key].print_intro()
         jobs[key].check_numbers(par_runtime=par_runtime, indices=[0, 1])
 
-        all_exposures = get_all_exposures(jobs[key]._paths_in_dir[1], verbose=True)
+        all_exposures = get_all_exposures(
+            jobs[key]._paths_in_dir[1],
+            verbose=True
+        )
         par_runtime["n_exposures"] = len(all_exposures)
         par_runtime["list_exposures"] = all_exposures
 
@@ -43,6 +51,8 @@ def main(argv=None):
     _ = keys.pop(0)
 
     for key in keys:
+        if job_exclusive and key != job_exclusive:
+            continue
         jobs[key].print_intro()
         jobs[key].check_numbers(par_runtime=par_runtime)
 

From 86816d606e8d8d04e324b18ff7ef05f2fa2c1b28 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:20:26 +0000
Subject: [PATCH 144/207] spread model: added check on non-positive object size

---
 .../spread_model_package/spread_model.py      | 34 +++++++++++--------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/shapepipe/modules/spread_model_package/spread_model.py b/shapepipe/modules/spread_model_package/spread_model.py
index 9d4bd76ea..98deb4aa5 100644
--- a/shapepipe/modules/spread_model_package/spread_model.py
+++ b/shapepipe/modules/spread_model_package/spread_model.py
@@ -223,23 +223,27 @@ def process(self):
                     psf_cat_id_ccd['SHAPES']['SIGMA_PSF_HSM']
                 )
 
-            obj_vign_tmp = obj_vign[idx]
-            obj_flux_tmp = 1.
             obj_sigma_tmp = np.mean(sigma_list)
-            obj_weight_tmp = weigh_vign[idx]
-            obj_model_tmp, obj_psf_tmp = get_model(
-                obj_sigma_tmp,
-                obj_flux_tmp,
-                obj_vign_tmp.shape,
-                self._pixel_scale
-            )
+            if obj_sigma_tmp > 0:
+                obj_vign_tmp = obj_vign[idx]
+                obj_flux_tmp = 1.
+                obj_weight_tmp = weigh_vign[idx]
+                obj_model_tmp, obj_psf_tmp = get_model(
+                    obj_sigma_tmp,
+                    obj_flux_tmp,
+                    obj_vign_tmp.shape,
+                    self._pixel_scale
+                )
 
-            obj_sm, obj_sm_err = get_sm(
-                obj_vign_tmp,
-                obj_psf_tmp,
-                obj_model_tmp,
-                obj_weight_tmp
-            )
+                obj_sm, obj_sm_err = get_sm(
+                    obj_vign_tmp,
+                    obj_psf_tmp,
+                    obj_model_tmp,
+                    obj_weight_tmp
+                )
+            else:
+                # size < 0, something is not right with this object
+                obj_sm, obj_sm_err = -1.0, -1.0
 
             spread_model_final.append(obj_sm)
             spread_model_err_final.append(obj_sm_err)

From 1e5f83d2e94dc71992d13e6468d2bea825a727a2 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:30:08 +0000
Subject: [PATCH 145/207] no change

---
 shapepipe/modules/mask_package/mask.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py
index fc40d1f30..23ca9f034 100644
--- a/shapepipe/modules/mask_package/mask.py
+++ b/shapepipe/modules/mask_package/mask.py
@@ -321,7 +321,6 @@ def make_mask(self):
         if (
             os.path.exists(f"{self._check_existing_dir}//{output_file_name}")
         ):
-            print("MKDEBUG skipping ", output_file_name)
             return None, None
 
         if self._config['MD']['make']:

From 182ff223f32074ff2567acb1905fdf1fd1929d81 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:30:34 +0000
Subject: [PATCH 146/207] added checks

---
 .../modules/merge_sep_cats_package/merge_sep_cats.py | 12 ++++++++++++
 .../modules/sextractor_package/sextractor_script.py  |  6 ++++++
 2 files changed, 18 insertions(+)

diff --git a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
index 4c82d1a8c..f5c1941b5 100644
--- a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
+++ b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
@@ -122,10 +122,22 @@ def process(self):
                     cat = file_io.FITSCatalogue(cat_path, SEx_catalogue=True)
                     cat.open()
 
+                    list_ext_name_n = cat.get_ext_name()
+                    if len(list_ext_name_n) < 6:
+                        raise IndexError(
+                            f"Input ngmix catalogue {cat_path} has only"
+                            + f" {len(list_ext_name_n)} HDUs, required are 6"
+                        )
                     for hdu_ind, ext_name in enumerate(list_ext_name):
                         if ext_name == 'PRIMARY':
                             continue
+                        if not ext_name in data:
+                            raise IndexError(
+                                f"Extension {ext_name} not found in file "
+                                + f"{cat_path}"
+                            )
                         for col_name in list_col_name:
+                            #print("MKDEBUG ", cat_path, ext_name, col_name)
                             data[ext_name][col_name] += list(
                                 cat.get_data(hdu_ind)[col_name]
                             )
diff --git a/shapepipe/modules/sextractor_package/sextractor_script.py b/shapepipe/modules/sextractor_package/sextractor_script.py
index 45f44cb49..5e41b8c96 100644
--- a/shapepipe/modules/sextractor_package/sextractor_script.py
+++ b/shapepipe/modules/sextractor_package/sextractor_script.py
@@ -105,6 +105,12 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size):
     for idx, exp in enumerate(exp_list):
         pos_tmp = np.ones(len(obj_id), dtype='int32') * -1
         for idx_j in range(n_hdu):
+            if exp not in f_wcs:
+                raise KeyError(
+                    f"Exposure {exp} used in image {cat_path} but not"
+                    + f" found in header file {f_wcs_path. Make sure this"
+                    + " file is complete."
+                )
             w = f_wcs[exp][idx_j]['WCS']
             pix_tmp = w.all_world2pix(
                 cat.get_data()[pos_params[0]],

From 9827d2979b1c55dafc8b6b6df0860bf283334cf6 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 20 May 2024 10:30:51 +0000
Subject: [PATCH 147/207] scripts updated

---
 scripts/sh/combine_runs.bash    |  3 ++-
 scripts/sh/curl_canfar_local.sh | 10 ++++++----
 scripts/sh/job_sp_canfar.bash   |  6 ------
 scripts/sh/stats_jobs_canfar.sh |  4 ++--
 4 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index 3b8a27824..3354da8b1 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -142,7 +142,8 @@ elif [ "$cat" == "psf" ]; then
   # v1
   #run_in="$pwf/$out_base/run_sp_exp_Pi_*"
   # v2
-  run_in="$pwd/exp_runs/*/$out_base/run_sp_exp_Pi_*"
+  #run_in="$pwd/exp_runs/*/$out_base/run_sp_exp_Pi_*"
+  run_in="$pwd/exp_runs/*/$out_base/run_sp_exp_SxSePsfPi_*"
 
   pattern="validation_psf-*"
   if [ "$psf" == "psfex" ]; then
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 3c2c73658..5839b16e1 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -36,7 +36,7 @@ usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
    -k, --kind KIND\n
     \timage kind, allowed are 'tile' and 'exp'\n
    -N, --N_SMP N_SMOp\n
-    \tnumber of jobs (SMP mode only), default from original config files\n
+    \tnumber of jobs (SMP mode only), default=$N_SMP\n
    -V, --version\n
     \tversion of docker image, default='$version'\n
    -C, --command_remote\n
@@ -144,6 +144,7 @@ function call_curl() {
 
 # Add session and image IDs to log files
 function update_session_logs() {
+  #echo "MKDEBUG $my_session $ID"
   echo $my_session >> session_IDs.txt
   echo "$my_session $ID" >> session_image_IDs.txt
 
@@ -161,7 +162,7 @@ function submit_batch() {
 }
 
 batch=20
-sleep=300
+sleep=150
 
 ((n_thresh=batch_max-batch))
 
@@ -176,7 +177,7 @@ if [ "$dry_run" == 2 ]; then
     # Submit file (dry run = 2)
     for ID in `cat $file_IDs`; do
       arg=$(set_arg)
-      echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+      echo curl -b -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
     done
 
   else
@@ -235,7 +236,8 @@ else
 
     # Submit image
     arg=$(set_arg)
-    session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
+    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
+    echo curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"
     update_session_logs
 
   fi
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 3ba748c69..84dacf8ed 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -325,12 +325,6 @@ if [[ $do_job != 0 ]]; then
      -1 \
      $exclusive
 
-  #if [[ ! -d "data_tiles" ]]; then
-    #echo "Directory or link 'data_tiles' does not exist, exiting"
-    #exit 1
-  #fi
-  #command_cfg_shapepipe "config_Git_vos.ini" "Retrieve tiles" -1 $n_exclusive
-
   ### Retrieve and save star catalogues for masking
   if [ "$star_cat_for_mask" == "save" ]; then
     #### For tiles
diff --git a/scripts/sh/stats_jobs_canfar.sh b/scripts/sh/stats_jobs_canfar.sh
index 3c1332f59..fbfbbf7fa 100755
--- a/scripts/sh/stats_jobs_canfar.sh
+++ b/scripts/sh/stats_jobs_canfar.sh
@@ -22,7 +22,7 @@ SESSION=https://ws-uv.canfar.net/skaha/v0/session
 mode="count"
 
 ## Help string
-usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
+usage="Usage: $(basename "$0") [OPTIONS]
 \n\nOptions:\n
    -h\tthis message\n
    -m, --mode MODE\n
@@ -87,4 +87,4 @@ fi
 
 
 # Remove temporary files
-rm -f $tmpfile_jobs $tmpfile_ids
+#rm -f $tmpfile_jobs $tmpfile_ids

From a872dfdd369e9909d5023e6d5060af991db94356 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 21 May 2024 15:21:39 +0000
Subject: [PATCH 148/207] split exp runner: added checks and err msg for data
 integrity

---
 .../modules/split_exp_package/split_exp.py    | 23 +++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/shapepipe/modules/split_exp_package/split_exp.py b/shapepipe/modules/split_exp_package/split_exp.py
index 2dd1a5875..58d215c62 100644
--- a/shapepipe/modules/split_exp_package/split_exp.py
+++ b/shapepipe/modules/split_exp_package/split_exp.py
@@ -102,13 +102,31 @@ def create_hdus(
         """
         header_file = np.zeros(self._n_hdu, dtype='O')
 
+        hdu_list = fits.open(exp_path)
+        if len(hdu_list) != self._n_hdu + 1:
+            raise ValueError(
+                f"Image {exp_path} has {len(hdu_list)} + 1 HDUs,"
+                + " expected were {self._n_hdu} + 1"
+            )
+
         for idx in range(1, self._n_hdu + 1):
 
-            h = fits.getheader(exp_path, idx)
+            #h = fits.getheader(exp_path, idx)
+            h = hdu_list[idx].header
             if transf_coord:
                 stp.pv_to_sip(h)
 
-            d = fits.getdata(exp_path, idx)
+            #d = fits.getdata(exp_path, idx)
+            try:
+                d = hdu_list[idx].data
+            except TypeError as e:
+                msg = (
+                    f"Error retrieving data of HDU #{idx} of image {exp_path}."
+                    + f" Check if image file is complete."
+                )
+                print(msg, e)
+                raise
+
             if transf_int:
                 d = d.astype(np.int16)
 
@@ -131,6 +149,7 @@ def create_hdus(
                     raise
                 header_file[idx - 1] = {'WCS': w, 'header': h.tostring()}
 
+
         if save_header:
             file_name = (
                 f'{self._output_dir}/headers{self._file_number_string}.npy'

From d445932b33cc2505561fcfea6a67afa701bf285a Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 21 May 2024 15:22:00 +0000
Subject: [PATCH 149/207] added Mh cfg file

---
 example/cfis/config_exp_Mh.ini | 65 ++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)
 create mode 100644 example/cfis/config_exp_Mh.ini

diff --git a/example/cfis/config_exp_Mh.ini b/example/cfis/config_exp_Mh.ini
new file mode 100644
index 000000000..59f6edc56
--- /dev/null
+++ b/example/cfis/config_exp_Mh.ini
@@ -0,0 +1,65 @@
+# ShapePipe configuration file for single-exposures,
+# merge headers
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_exp_Mh
+
+# Add date and time to RUN_NAME, optional, default: True
+; RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = merge_headers_runner
+
+# Run mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN
+INPUT_DIR = .
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 16
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+
+[MERGE_HEADERS_RUNNER]
+
+FILE_PATTERN = headers
+
+FILE_EXT = .npy
+
+# Single-exposure numbering scheme
+NUMBERING_SCHEME = -0000000
+
+OUTPUT_PATH = $SP_RUN/output

From f91cc104c41492fd467b7c34aa024d686c6f1ca9 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 21 May 2024 15:22:42 +0000
Subject: [PATCH 150/207] summary v1.2: split_exp using exposures, no longer
 shdu

---
 scripts/python/summary_params_pre_v2.py |  8 --------
 shapepipe/utilities/summary.py          | 26 +++++++++++--------------
 2 files changed, 11 insertions(+), 23 deletions(-)

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 6d16e4270..5ffa849b8 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -22,13 +22,6 @@ def update_par_runtime_after_find_exp(par_runtime, all_exposures):
     par_runtime["n_shdus"] = get_par_runtime(par_runtime, "exposures") * n_CCD
     par_runtime["list_shdus"] = get_all_shdus(all_exposures, n_CCD)
 
-    ## For split_exposure_runner, the output is image, weight,flag per single-HDU image
-    ## and a header per exposure.
-    par_runtime["n_3*n_shdus+n_exposures"] = (
-        3 * get_par_runtime(par_runtime, "shdus")
-        + get_par_runtime(par_runtime, "exposures")
-    )
-    
     return par_runtime
 
 
@@ -92,7 +85,6 @@ def set_jobs_v2_pre_v2(patch, verbose):
         2,
         ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh"],
         ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"],
-        #["tile_IDs", 0, "3*n_shdus+n_exposures"],
         ["tile_IDs", 0, "exposures"],
         n_mult=[1, 1, 121],
         path_main=path_main,
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 1a5f1efec..315df4a18 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -15,7 +15,7 @@
 
 from tqdm import tqdm
 
-print("summaary v1.1")
+print("summaary v1.2")
 
 
 def get_IDs_from_file(path):
@@ -361,14 +361,12 @@ def write_IDs_to_file(self, output_path, IDs):
         """
         IDs_dot = self.replace_dash_dot_if_tile(IDs)
         if len(IDs_dot) > 0:
-            #print("MKDEBUG writing", output_path, len(IDs_dot))
             # Write IDs to file
             with open(output_path, "w") as f_out:
                 for ID in IDs_dot:
                     print(ID, file=f_out)
         elif os.path.exists(output_path):
             # Remove preivous obsolete ID file
-            #print("MKDEBUG removing ", output_path)
             os.unlink(output_path)
 
     def output_missing(
@@ -393,9 +391,16 @@ def output_missing(
 
         ## Extract image IDs from names
         IDs = []
-        pattern = re.compile(
-            r"(?:\d{3}-\d{3}|\d{7}-\d+|\d{7})"
-        )
+        if module != "split_exp_runner":
+            pattern = re.compile(
+                r"(?:\d{3}-\d{3}|\d{7}-\d+|\d{7})"
+            )
+        else:
+            # split_exp_runner: input is exp, output is shdu (images) and exp
+            # (header); ignore hdu number
+            pattern = re.compile(
+                r"(?:\d{3}-\d{3}|\d{7})"
+            )
         for name, path in zip(names_in_dir, paths_in_dir):
             match = pattern.search(name)
             if match:
@@ -403,7 +408,6 @@ def output_missing(
             else:
                 raise ValueError(f"No ID found in {name}")
 
-
         ## Count occurences
         ID_counts = Counter(IDs)
 
@@ -414,7 +418,6 @@ def output_missing(
                 missing_IDs.append(ID)
 
         n_all = len(missing_IDs)
-        #print("MKDEBUG ", module, len(IDs), n_all, len(list_expected))
         missing_IDs_unique = self.get_unique(missing_IDs)
 
         if not self._output_path_missing_IDs:
@@ -426,7 +429,6 @@ def output_missing(
         else:
             # User-defined name (e.g. ngmix_runner_X)
             output_path = self._output_path_missing_IDs[idx]
-        #print("MKDEBUG output_missing", module, output_path, len(missing_IDs_unique))
         self.write_IDs_to_file(output_path, missing_IDs_unique)
 
         return missing_IDs_unique
@@ -677,12 +679,6 @@ def get_par_runtime(par_runtime, key, kind="n"):
 
     """
     combined_key = f"{kind}_{key}"
-    if (
-        combined_key == "list_3*n_shdus+n_exposures"
-        and combined_key not in par_runtime
-    ):
-        print(f"{combined_key} not set, TBD")
-        return []
 
     return par_runtime[combined_key]
 

From 4c9f938301cdbc9f63df19bde013e7760228a752 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martinkilbinger@cea.fr>
Date: Tue, 28 May 2024 10:12:35 +0200
Subject: [PATCH 151/207] Added script to convert pix to world coordinates of
 PSF measurements

---
 scripts/python/convert_psf_pix2world.py | 331 ++++++++++++++++++++++++
 1 file changed, 331 insertions(+)
 create mode 100644 scripts/python/convert_psf_pix2world.py

diff --git a/scripts/python/convert_psf_pix2world.py b/scripts/python/convert_psf_pix2world.py
new file mode 100644
index 000000000..35d98778d
--- /dev/null
+++ b/scripts/python/convert_psf_pix2world.py
@@ -0,0 +1,331 @@
+import sys
+import os
+import re
+import glob
+from tqdm import tqdm
+from joblib import Parallel, delayed
+import gc
+
+import numpy as np
+from astropy.io import fits
+import galsim
+
+from cs_util import args as cs_args
+from cs_util import logging
+
+
+def transform_shape(mom_list, jac):
+    scale, shear, theta, flip = jac.getDecomposition()
+
+    sig_tmp = mom_list[2] * scale
+    shape = galsim.Shear(g1=mom_list[0], g2=mom_list[1])
+    if flip:
+        print("FLIP!")
+        shape = galsim.Shear(g1=-shape.g1, g2=shape.g2)
+    shape = galsim.Shear(g=shape.g, beta=shape.beta + theta)
+    shape = shear + shape
+
+    return shape.g1, shape.g2, sig_tmp
+
+
+class Convert(object):
+
+    def __init__(self):
+
+        self.params_default()
+
+    def set_params_from_command_line(self, args):
+        """Set Params From Command line.
+
+        Only use when calling using python from command line.
+        Does not work from ipython or jupyter.
+
+        """
+        # Read command line options
+        options = cs_args.parse_options(
+            self._params,
+            self._short_options,
+            self._types,
+            self._help_strings,
+        )
+        self._params = options
+
+        # Save calling command
+        logging.log_command(args)
+
+    def params_default(self):
+
+        self._params = {
+            "input_base_dir": ".",
+            "output_base_dir": "./star_cat",
+            "mode": "merge",
+            "sub_dir_pattern" : "run_sp_exp_202",
+            "file_pattern_psfint": "validation_psf",
+            "sub_dir_psfint": "psfex_interp_runner/output/",
+        }
+
+        self._short_options = {
+            "input_base_dir": "-i",
+            "mode": "-m",
+            "sub_dir_pattern" : "-s",
+        }
+
+        self._types = {}
+
+        self._help_strings = {
+            "input_base_dir" : (
+                "input base dir, runs are expected in"
+                + " <input_base_dir>/P<patch?>/output;"
+                " default is {}"
+            ),
+            "sub_dir_pattern" : (
+                "First subdir name of PSF interpolation, default is {}"
+            ),
+            "mode" : (
+                "run mode, allowed are 'create', 'merge', 'test'; default is"
+                + " '{}':"
+            )
+        }
+
+        self._dt = [
+            ("X", float),
+            ("Y", float),
+            ("RA", float),
+            ("DEC", float),
+            ("E1_PSF_HSM", float),
+            ("E2_PSF_HSM", float),
+            ("SIGMA_PSF_HSM", float),
+            ("FLAG_PSF_HSM", float),
+            ("E1_STAR_HSM", float),
+            ("E2_STAR_HSM", float),
+            ("SIGMA_STAR_HSM", float),
+            ("FLAG_STAR_HSM", float),
+            ("CCD_NB", int),
+        ]
+
+    def run(self):
+
+        if self._params["mode"] == "test":
+            patch_nums = ["3", "4"]
+        else:
+            n_patch = 7                                                             
+            patch_nums = [idx for idx in np.arange(n_patch) + 1]
+
+        do_parallel = True
+
+        # Loop over patches
+        for patch in patch_nums:
+
+            output_dir = f"{self._params['output_base_dir']}/P{patch}"
+            if not os.path.isdir(output_dir):
+                os.makedirs(output_dir, exist_ok=False)
+
+            print("Running patch:", patch)
+
+            patch_dir = f"{self._params['input_base_dir']}/P{patch}/output/"
+            subdirs = f"{patch_dir}/{self._params['sub_dir_pattern']}*"
+            exp_run_dirs = glob.glob(subdirs)
+            n_exp_runs = len(exp_run_dirs)
+            print(
+                f"Found {n_exp_runs} input single-exposure runs for patch"
+                + f" {patch_dir} ({subdirs})"
+            )
+
+            if self._params["mode"] == "test":
+                exp_run_dirs = exp_run_dirs[:2]
+                n_exp_runs = len(exp_run_dirs)
+                print(
+                    f"test mode: only using {n_exp_runs} input single-exposure"
+                    + f" runs"
+                )
+
+            # Loop over exposure runs
+            if not do_parallel:
+                for idx_exp, exp_run_dir in tqdm(
+                        enumerate(exp_run_dirs), total=n_exp_runs,
+                        disable=self._params["verbose"],
+                ):
+                    self.transform_exposure(
+                        output_dir, idx_exp, exp_run_dir
+                    )
+            else:
+                res = Parallel(n_jobs=-1, backend="loky")(
+                    delayed(self.transform_exposure)(
+                        output_dir, idx_exp, exp_run_dir
+                    )
+                    for idx_exp, exp_run_dir in tqdm(
+                            enumerate(exp_run_dirs),
+                            total=n_exp_runs,
+                            disable=self._params["verbose"],
+                    )
+                )
+
+    def transform_exposure(self, output_dir, idx, exp_run_dir):
+        """Transform exposures.
+
+        Transform shapes for exposures for a given run (input exp run dir).
+
+        """
+        output_path = f"{output_dir}/psf_cat_{idx}.fits"
+        if os.path.exists(output_path):
+            print(f"Skipping transform_exposure, file {output_path} exists")
+            return
+
+        mccd_dir = f"{exp_run_dir}/{self._params['sub_dir_psfint']}"
+        try:
+            all_files = os.listdir(mccd_dir)
+            if self._params["verbose"]:
+                print(f"Found {len(all_files)} files in {mccd_dir}")
+        except Exception:
+            if self._params["verbose"]:
+                print(f"Found zero PSFEx files in {mccd_dir}, skipping")
+            return
+
+        cat_list = []
+        for file_name in all_files:
+            if self._params["file_pattern_psfint"] not in file_name:
+                continue
+
+            tmp = re.findall(r"\d+", file_name)
+            exp_name, ccd_id = int(tmp[0]), int(tmp[1])
+            if self._params["verbose"]:
+                print("Match found ", exp_name, ccd_id)
+
+            psfex_file_path = f"{mccd_dir}/{file_name}"
+
+            try:
+                psf_file = fits.open(psfex_file_path, memmap=False)
+                psfex_file = psf_file[2].data
+                header_file = psf_file[1].data
+            except Exception:
+                continue
+
+            new_e1_psf = np.zeros_like(psfex_file["RA"])
+            new_e2_psf = np.zeros_like(psfex_file["RA"])
+            new_sig_psf = np.zeros_like(psfex_file["RA"])
+            new_e1_star = np.zeros_like(psfex_file["RA"])
+            new_e2_star = np.zeros_like(psfex_file["RA"])
+            new_sig_star = np.zeros_like(psfex_file["RA"])
+
+            header = fits.Header.fromstring(
+                "\n".join(header_file[0][0]), sep="\n"
+            )
+            wcs = galsim.AstropyWCS(header=header)
+
+            k = 0
+            for ind, obj in enumerate(psfex_file):
+                try:
+                    # jac = wcs.jacobian(world_pos=galsim.CelestialCoord(
+                    #     ra=obj["RA"]*galsim.degrees,
+                    #     dec=obj["DEC"]*galsim.degrees
+                    # ))
+                    jac = wcs.jacobian(
+                        image_pos=galsim.PositionD(
+                            obj["X"],
+                            obj["Y"],
+                        )
+                    )
+                except Exception:
+                    continue
+                g1_psf_tmp, g2_psf_tmp, sig_psf_tmp = transform_shape(
+                    [
+                        obj["E1_PSF_HSM"],
+                        obj["E2_PSF_HSM"],
+                        obj["SIGMA_PSF_HSM"],
+                    ],
+                    jac,
+                )
+
+                new_e1_psf[ind] = g1_psf_tmp
+                new_e2_psf[ind] = g2_psf_tmp
+                new_sig_psf[ind] = sig_psf_tmp
+
+                g1_star_tmp, g2_star_tmp, sig_star_tmp = transform_shape(
+                    [
+                        obj["E1_STAR_HSM"],
+                        obj["E2_STAR_HSM"],
+                        obj["SIGMA_STAR_HSM"],
+                    ],
+                    jac,
+                )
+                new_e1_star[ind] = g1_star_tmp
+                new_e2_star[ind] = g2_star_tmp
+                new_sig_star[ind] = sig_star_tmp
+                k += 1
+
+            exp_cat = np.array(
+                list(
+                    map(
+                        tuple,
+                        np.array(
+                            [
+                                psfex_file["X"],
+                                psfex_file["Y"],
+                                psfex_file["RA"],
+                                psfex_file["DEC"],
+                                new_e1_psf,
+                                new_e2_psf,
+                                new_sig_psf,
+                                psfex_file["FLAG_PSF_HSM"],
+                                new_e1_star,
+                                new_e2_star,
+                                new_sig_star,
+                                psfex_file["FLAG_STAR_HSM"],
+                                np.ones_like(psfex_file["RA"], dtype=int)
+                                * ccd_id,
+                            ]
+                        ).T.tolist(),
+                    )
+                ),
+                dtype=self._dt,
+            )
+            cat_list.append(exp_cat)
+
+            psf_file.close()
+            del psf_file
+            gc.collect()
+
+        if len(cat_list) == 0:
+            return
+
+        # Finalize catalogue
+        patch_cat = np.concatenate(cat_list)
+        hdul = fits.HDUList()
+        hdul.append(fits.PrimaryHDU())
+        hdul.append(fits.BinTableHDU(patch_cat))
+
+        # Write catalogue
+        hdul.writeto(
+            output_path,
+            overwrite=True,
+        )
+
+        del cat_list
+        del hdul
+        gc.collect()
+
+
+def run_convert(*args):
+
+    # Create instance
+    obj = Convert()
+
+    obj.set_params_from_command_line(args)
+
+    obj.run()
+
+
+def main(argv=None):
+    """Main
+
+    Main program
+    """
+    if argv is None:
+        argv = sys.argv[1:]
+    run_convert(*argv)
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))

From 89622db29e9bdc2b912d8b5e64a84fc521f7cfbc Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Thu, 30 May 2024 09:12:35 +0000
Subject: [PATCH 152/207] merge sep module: fixed cat handling if not
 sufficient HDUs on input

---
 .../merge_sep_cats_package/merge_sep_cats.py  | 10 +++++----
 shapepipe/pipeline/file_io.py                 | 21 +++++++++++--------
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
index f5c1941b5..1cc3c2131 100644
--- a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
+++ b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
@@ -86,8 +86,6 @@ def process(self):
             cat0 = file_io.FITSCatalogue(input_file, SEx_catalogue=True)
             cat0.open()
             list_ext_name = cat0.get_ext_name()
-            list_col_name = cat0.get_col_names()
-
 
             # Inupt ngmix files sometimes have not all sheared versions
             # (HDUs 1 - 5 = 1M, 1P, 2M, 2P, NOSHEAR) due to IO errors
@@ -97,8 +95,12 @@ def process(self):
                     + f" {len(list_ext_name)} HDUs, required are 6"
                 )
 
-            # MKDEBUG: Some input ngmix catalogues have multiple of 5 HDUs
-            # if reprocessed and not deleted but appended
+            list_col_name = cat0.get_col_names()
+
+            # Some older input ngmix catalogues have multiple of 5 HDUs
+            # if reprocessed and not deleted but appended.
+            # The following log message should be replaced by raising
+            # and error in future
             if len(list_ext_name) > 6:
                 wmsg = f"Cropping input HDUs from {len(list_ext_name)} to 5"
                 self._w_log.info(wmsg)
diff --git a/shapepipe/pipeline/file_io.py b/shapepipe/pipeline/file_io.py
index 52e847147..2aa87959f 100644
--- a/shapepipe/pipeline/file_io.py
+++ b/shapepipe/pipeline/file_io.py
@@ -419,14 +419,17 @@ class FITSCatalogue(BaseCatalogue):
     ----------
     fullpath : str
         Full path to file
-    hdu_no : int
-        HDU number
-    open_mode : OpenMode
-        File opening mode
-    memmap : Bool
-        Option to use memory mapping
-    SEx_catalogue : bool
-        Option to specify if the input is a SExtractor catalogue
+    hdu_no : int, optional
+        HDU number; default is ``None``, in which case
+        it will be set to 1 (2) if SEx_catalogue is ``False``
+        (``True``)
+    open_mode : OpenMode, optional
+        File opening mode, default is ``BaseCatalogue.OpenMode.ReadOnly``
+    memmap : bool, optional
+        Option to use memory mapping, default is ``False``
+    SEx_catalogue : bool, optional
+        Option to specify if the input is a SExtractor catalogue;
+        default is ``False``
 
     """
 
@@ -449,7 +452,7 @@ def __init__(
         self._SEx_catalogue = SEx_catalogue
         # HDU number of the underlying .FITS table
         if hdu_no is None:
-            # Default is 1 (or 2 if you are using )
+            # Set to default value if not given by user
             if SEx_catalogue:
                 self._hdu_no = 2
             else:

From badca6903c705eaa5b4cb0ab6a4484c351bb4956 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Thu, 30 May 2024 09:15:06 +0000
Subject: [PATCH 153/207] summary: split Ms and Mh; writing/reading list_exp to
 file for sped-up

---
 docs/source/pipeline_canfar.md          |  7 ++++-
 scripts/python/summary_params_pre_v2.py | 42 ++++++++++---------------
 scripts/python/summary_run.py           | 18 ++++++++---
 scripts/sh/job_sp_canfar.bash           | 42 +++++++++++++++++--------
 shapepipe/utilities/summary.py          | 27 +++++++++++++++-
 5 files changed, 90 insertions(+), 46 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index cb60c4e71..948bcd4eb 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -86,9 +86,14 @@ curl_canfar_local.sh -j 64 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
 # Tile shape measurement
 curl_canfar_local.sh -j 128 -f tile_numbers.txt -k tile -p $psf -N 8
 
-# Merge subcatalogues, and create final cat
+# Merge subcatalogues
 curl_canfar_local.sh -j 256 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
 
+# Create final cat
+curl_canfar_local.sh -j 512 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
+# Run in parallel
+cat mc.txt | xargs -I {} -P 16 bash -c 'init_run_exclusive_canfar.sh -p psfex -j 512 -e {} --n_smp 1 -k tile'
+
 # Combine all final cats in common output dir as links
 combine_runs.bash -c final -p psfex
 
diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 5ffa849b8..d640c8ab1 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -3,27 +3,6 @@
 import os
 from shapepipe.utilities.summary import *
 
-def init_par_runtime(list_tile_IDs):
-    
-    # Numbers updated at runtime 
-    par_runtime = {}
-
-    par_runtime["n_tile_IDs"] = len(list_tile_IDs)
-    par_runtime["list_tile_IDs"] = list_tile_IDs
-
-    return par_runtime
-
-
-def update_par_runtime_after_find_exp(par_runtime, all_exposures):
-    
-    n_CCD = 40
-    
-    # Single-HDU single exposure images
-    par_runtime["n_shdus"] = get_par_runtime(par_runtime, "exposures") * n_CCD
-    par_runtime["list_shdus"] = get_all_shdus(all_exposures, n_CCD)
-
-    return par_runtime
-
 
 def set_jobs_v2_pre_v2(patch, verbose):
     """ Return information about shapepipe jobs
@@ -198,8 +177,8 @@ def set_jobs_v2_pre_v2(patch, verbose):
 
     jobs["256"] = job_data(
         "256",
-        ["run_sp_Ms", "run_sp_Mc"],
-        ["merge_sep_cats_runner", "make_cat_runner"],
+        ["run_sp_Ms"],
+        ["merge_sep_cats_runner"],
         "tile_IDs",
         path_main=path_main,
         path_left="tile_runs",
@@ -207,9 +186,20 @@ def set_jobs_v2_pre_v2(patch, verbose):
         verbose=verbose,
     )
 
-    # Post-processing
     jobs["512"] = job_data(
         "512",
+        ["run_sp_Mc"],
+        ["make_cat_runner"],
+        "tile_IDs",
+        path_main=path_main,
+        path_left="tile_runs",
+        output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        verbose=verbose,
+    )
+
+    # Post-processing
+    jobs["1024"] = job_data(
+        "1024",
         ["run_sp_combined_final"],
         ["make_catalog_runner"],
         "tile_IDs",
@@ -218,8 +208,8 @@ def set_jobs_v2_pre_v2(patch, verbose):
         verbose=verbose,
     )
 
-    jobs["1024"] = job_data(
-        "1024",
+    jobs["2048"] = job_data(
+        "2048",
         "run_sp_combined_psf",
         ["psfex_interp_runner"],
         "shdus",
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index 5b2ff671d..5e92b659e 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -28,7 +28,16 @@ def main(argv=None):
     
     job_data.print_stats_header()
 
-    for key in "1":
+    exp_IDs_path = "exp_numbers.txt"
+    if os.path.exists(exp_IDs_path):
+        # Read exposure ID list if file exists
+        all_exposures = get_IDs_from_file(exp_IDs_path)
+        par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)
+
+    if not os.path.exists(exp_IDs_path) or not job_exclusive or job_exclusive == "1":
+        # Run job 1 if exposure ID list file does not exist or
+        # job_exclusive is 1 or not set
+        key = "1"
         jobs[key].print_intro()
         jobs[key].check_numbers(par_runtime=par_runtime, indices=[0, 1])
 
@@ -36,13 +45,12 @@ def main(argv=None):
             jobs[key]._paths_in_dir[1],
             verbose=True
         )
-        par_runtime["n_exposures"] = len(all_exposures)
-        par_runtime["list_exposures"] = all_exposures
+        par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)
+
+        jobs[key].write_IDs_to_file("exp_numbers.txt", all_exposures)
 
         jobs[key].check_numbers(par_runtime, indices=[2])
 
-    par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)
-    
     print_par_runtime(par_runtime, verbose=verbose)
 
 
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 84dacf8ed..88ceae36c 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -315,7 +315,7 @@ fi
 
 ## Retrieve config files and images (online if retrieve=vos)
 ## Retrieve and save star catalogues for masking (if star_cat_for_mask=save)
-(( do_job= $job & 1 ))
+(( do_job = $job & 1 ))
 if [[ $do_job != 0 ]]; then
 
   ### Retrieve files
@@ -343,7 +343,7 @@ if [[ $do_job != 0 ]]; then
 fi
 
 ## Prepare images (offline)
-(( do_job= $job & 2 ))
+(( do_job = $job & 2 ))
 if [[ $do_job != 0 ]]; then
 
   ### Uncompress tile weights
@@ -359,7 +359,7 @@ if [[ $do_job != 0 ]]; then
 fi
 
 ## Mask tiles: add star, halo, and Messier object masks (online if "star_cat_for_mask" is "onthefly")
-(( do_job= $job & 4 ))
+(( do_job = $job & 4 ))
 if [[ $do_job != 0 ]]; then
 
   ### Mask tiles
@@ -372,7 +372,7 @@ if [[ $do_job != 0 ]]; then
 fi
 
 ## Mask exposures: add star, halo, and Messier object masks (online if "star_cat_for_mask" is "onthefly")
-(( do_job= $job & 8 ))
+(( do_job = $job & 8 ))
 if [[ $do_job != 0 ]]; then
 
   ### Mask exposures
@@ -386,7 +386,7 @@ fi
 
 
 ## Remaining exposure processing (offline)
-(( do_job= $job & 16 ))
+(( do_job = $job & 16 ))
 if [[ $do_job != 0 ]]; then
 
   ### Object detection on tiles
@@ -399,7 +399,7 @@ if [[ $do_job != 0 ]]; then
 fi
 
 ## Exposure processing (offline)
-(( do_job= $job & 32 ))
+(( do_job = $job & 32 ))
 if [[ $do_job != 0 ]]; then
 
   ### Star detection, selection, PSF model. setools can exit with an error for CCD with insufficient stars,
@@ -415,7 +415,7 @@ if [[ $do_job != 0 ]]; then
 fi
 
 ## Process tiles up to shape measurement
-(( do_job= $job & 64 ))
+(( do_job = $job & 64 ))
 if [[ $do_job != 0 ]]; then
 
   ### PSF model letter: 'P' (psfex) or 'M' (mccd)
@@ -430,7 +430,7 @@ if [[ $do_job != 0 ]]; then
 fi
 
 ## Shape measurement (offline)
-(( do_job= $job & 128 ))
+(( do_job = $job & 128 ))
 if [[ $do_job != 0 ]]; then
 
   ### Prepare config files
@@ -483,7 +483,7 @@ if [[ $do_job != 0 ]]; then
 fi
 
 ## Create final catalogues (offline)
-(( do_job= $job & 256 ))
+(( do_job = $job & 256 ))
 if [[ $do_job != 0 ]]; then
 
   cat $SP_CONFIG/config_merge_sep_cats_template.ini | \
@@ -497,12 +497,28 @@ if [[ $do_job != 0 ]]; then
     "Run shapepipe (tile: merge sep cats)" \
     "$VERBOSE" \
     "$ID"
+fi
+
+(( do_job = $job & 512 ))
+if [[ $do_job != 0 ]]; then
 
   ### Merge all relevant information into final catalogue
-  command_sp \
-    "shapepipe_run -c $SP_CONFIG/config_make_cat_$psf.ini" \
+  command_cfg_shapepipe \
+    "config_make_cat_$psf.ini" \
     "Run shapepipe (tile: create final cat $psf)" \
-    "$VERBOSE" \
-    "$ID"
+    $n_smp \
+    $exclusive
+
+fi
+
+# MKDEBUG: Putting Mh at the end for now, could be integrated before 16.
+(( do_job = $job & 1024 ))
+if [[ $do_job != 0 ]]; then
+
+  command_cfg_shapepipe \
+    "config_exp_Mh.ini" \
+    "Run shapepipe (merge exp headers)" \
+    $n_smp \
+    $exclusive
 
 fi
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 315df4a18..8977a5d66 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -18,6 +18,31 @@
 print("summaary v1.2")
 
 
+def init_par_runtime(list_tile_IDs):
+
+    # Numbers updated at runtime
+    par_runtime = {}
+
+    par_runtime["n_tile_IDs"] = len(list_tile_IDs)
+    par_runtime["list_tile_IDs"] = list_tile_IDs
+
+    return par_runtime
+
+
+def update_par_runtime_after_find_exp(par_runtime, all_exposures):
+
+    # Single-exposure images
+    par_runtime["n_exposures"] = len(all_exposures)
+    par_runtime["list_exposures"] = all_exposures
+
+    # Single-HDU single exposure images
+    n_CCD = 40
+    par_runtime["n_shdus"] = get_par_runtime(par_runtime, "exposures") * n_CCD
+    par_runtime["list_shdus"] = get_all_shdus(all_exposures, n_CCD)
+
+    return par_runtime
+
+
 def get_IDs_from_file(path):
     """Get IDs From File.
 
@@ -257,7 +282,7 @@ def print_stats_header(self):
             #+ " missing uniq_miss  fr_found"
         logging.info(
             "module                          expected     found"
-            + " missing uniq_miss  fr_found"
+            + "   missing uniq_miss  fr_found"
         )
         logging.info("=" * 100)
 

From fd6bb215865d622d0eede42b3868edd2b32ace25 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Thu, 30 May 2024 09:16:21 +0000
Subject: [PATCH 154/207] improved log and error msg

---
 shapepipe/modules/merge_headers_runner.py                 | 2 ++
 shapepipe/modules/psfex_interp_package/psfex_interp.py    | 2 +-
 shapepipe/modules/sextractor_package/sextractor_script.py | 2 +-
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/shapepipe/modules/merge_headers_runner.py b/shapepipe/modules/merge_headers_runner.py
index 9e692bba7..9f64d6788 100644
--- a/shapepipe/modules/merge_headers_runner.py
+++ b/shapepipe/modules/merge_headers_runner.py
@@ -38,5 +38,7 @@ def merge_headers_runner(
     # Merge header files
     merge_headers(input_file_list, output_dir)
 
+    w_log.info(f"Merged {len(input_file_list)} input file headers")
+
     # No return objects
     return None, None
diff --git a/shapepipe/modules/psfex_interp_package/psfex_interp.py b/shapepipe/modules/psfex_interp_package/psfex_interp.py
index 74064c296..1a3a0e50d 100644
--- a/shapepipe/modules/psfex_interp_package/psfex_interp.py
+++ b/shapepipe/modules/psfex_interp_package/psfex_interp.py
@@ -579,7 +579,7 @@ def _interpolate_me(self):
         if key_ne not in cat.get_data().dtype.names:
             raise KeyError(
                 f'Key {key_ne} not found in input galaxy catalogue'
-                + f'{self._galcat_path}, needed for'
+                + f' {self._galcat_path}, needed for'
                 + ' PSF interpolation to multi-epoch data; run previous module'
                 + ' (SExtractor) in multi-epoch mode'
             )
diff --git a/shapepipe/modules/sextractor_package/sextractor_script.py b/shapepipe/modules/sextractor_package/sextractor_script.py
index 5e41b8c96..3720c00bc 100644
--- a/shapepipe/modules/sextractor_package/sextractor_script.py
+++ b/shapepipe/modules/sextractor_package/sextractor_script.py
@@ -108,7 +108,7 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size):
             if exp not in f_wcs:
                 raise KeyError(
                     f"Exposure {exp} used in image {cat_path} but not"
-                    + f" found in header file {f_wcs_path. Make sure this"
+                    + f" found in header file {f_wcs_path}. Make sure this"
                     + " file is complete."
                 )
             w = f_wcs[exp][idx_j]['WCS']

From 760c35180d8ba381161a7949eaa27e3ded4a7809 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Thu, 30 May 2024 09:27:32 +0000
Subject: [PATCH 155/207] tile processing: using all split exp inputs, not only
 last

---
 example/cfis/config_exp_Mh.ini               | 2 ++
 example/cfis/config_tile_PiViSmVi_canfar.ini | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/example/cfis/config_exp_Mh.ini b/example/cfis/config_exp_Mh.ini
index 59f6edc56..2ad16ef0d 100644
--- a/example/cfis/config_exp_Mh.ini
+++ b/example/cfis/config_exp_Mh.ini
@@ -55,6 +55,8 @@ TIMEOUT = 96:00:00
 
 [MERGE_HEADERS_RUNNER]
 
+INPUT_DIR = last:split_exp_runner
+
 FILE_PATTERN = headers
 
 FILE_EXT = .npy
diff --git a/example/cfis/config_tile_PiViSmVi_canfar.ini b/example/cfis/config_tile_PiViSmVi_canfar.ini
index 51900b525..0ce5fe056 100644
--- a/example/cfis/config_tile_PiViSmVi_canfar.ini
+++ b/example/cfis/config_tile_PiViSmVi_canfar.ini
@@ -183,6 +183,6 @@ PREFIX =
 
 # Additional parameters for path and file pattern corresponding to single-exposure
 # run outputs
-ME_IMAGE_DIR = last:split_exp_runner, last:split_exp_runner, last:split_exp_runner, all:sextractor_runner
+ME_IMAGE_DIR = all:split_exp_runner, all:split_exp_runner, all:split_exp_runner, all:sextractor_runner
 ME_IMAGE_PATTERN = flag, image, weight, background
 ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite

From 79abdc8713bae064aa4a923fd7ad4771fb6b44e4 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Thu, 30 May 2024 09:28:08 +0000
Subject: [PATCH 156/207] convert psf script err msg

---
 scripts/python/convert_psf_pix2world.py | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
 mode change 100644 => 100755 scripts/python/convert_psf_pix2world.py

diff --git a/scripts/python/convert_psf_pix2world.py b/scripts/python/convert_psf_pix2world.py
old mode 100644
new mode 100755
index 35d98778d..f7fba4da8
--- a/scripts/python/convert_psf_pix2world.py
+++ b/scripts/python/convert_psf_pix2world.py
@@ -1,3 +1,5 @@
+#! /usr/bin/env python3
+
 import sys
 import os
 import re
@@ -109,7 +111,8 @@ def run(self):
             patch_nums = ["3", "4"]
         else:
             n_patch = 7                                                             
-            patch_nums = [idx for idx in np.arange(n_patch) + 1]
+            #patch_nums = [idx for idx in np.arange(n_patch) + 1]
+            patch_nums = [1, 3]
 
         do_parallel = True
 
@@ -127,7 +130,8 @@ def run(self):
             exp_run_dirs = glob.glob(subdirs)
             n_exp_runs = len(exp_run_dirs)
             print(
-                f"Found {n_exp_runs} input single-exposure runs for patch"
+                pl = 's' if n_exp_runs > 1 else ''
+                f"Found {n_exp_runs} input single-exposure run{pl} for patch"
                 + f" {patch_dir} ({subdirs})"
             )
 
@@ -175,7 +179,8 @@ def transform_exposure(self, output_dir, idx, exp_run_dir):
         try:
             all_files = os.listdir(mccd_dir)
             if self._params["verbose"]:
-                print(f"Found {len(all_files)} files in {mccd_dir}")
+                pl = "s" if len(all_files) > 1 else ""
+                print(f"Found {len(all_files)} file{pl} in {mccd_dir}")
         except Exception:
             if self._params["verbose"]:
                 print(f"Found zero PSFEx files in {mccd_dir}, skipping")

From 03e8150d5c8fa2e1ebe02514672b3e76faccf7d7 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Thu, 30 May 2024 09:30:02 +0000
Subject: [PATCH 157/207] local Mh handling; 256 512 split

---
 scripts/sh/init_run_exclusive_canfar.sh | 69 +++++++++++++++++++++++--
 1 file changed, 64 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index dbaac2444..57cc81344 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -11,13 +11,17 @@ kind=-1
 dry_run=0
 nsh_jobs=8
 dir=`pwd`
+
+# mh_local is 0 (1) if merge_header_runner is run on all exposures,
+# which is standard so far (run on exposures of given tile only; new)
+mh_local=1
 VERBOSE=1
 
 
 # TODO: psf
 
 ## Help string
-usage="Usage: $(basename "$0") -j JOB -e ID  -k KIND [OPTIONS]
+usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
 \n\nOptions:\n
    -h\tthis message\n
    -j, --job JOB\tRUnning JOB, bit-coded\n
@@ -162,8 +166,22 @@ fi
 
 cd output
 
-if [ ! -f log_exp_headers.sqlite ]; then
-  command "ln -s $dir/output/log_exp_headers.sqlite" $dry_run
+if [ "$mh_local" == "1" ]; then
+  if [ -L log_exp_headers.sqlite ]; then
+    # Local Mh and symlink -> remove previous link to
+    # (potentially incomplete) global mh file
+    command "rm log_exp_headers.sqlite" $dry_run
+    #echo "MKDEBUG not rm hm file"
+    ls -l log_exp_headers.sqlite
+  else
+    echo "no mh link found"
+  fi
+else
+  if [ ! -f log_exp_headers.sqlite ]; then
+    # Global Mh and file does not exist -> symlink to
+    # gllobal mh file
+    command "ln -s $dir/output/log_exp_headers.sqlite" $dry_run
+  fi
 fi
 
 
@@ -172,8 +190,41 @@ for dir in $dir/output/run_sp_*; do
   command "ln -sf $dir" $dry_run
 done
 
+(( do_job = $job & 16 ))
+if [ "$mh_local" == "1" ] && [ $do_job != 0 ]; then
+
+  if [ "$ID" == "-1" ]; then
+    echo "ID needs to be given (option -e) for mh_local and job&16"
+    exit 6 
+  fi
+
+  echo "Creating local mh file"
+
+  # Remove previous Sextractor run and (local) split_exp dir
+  command "rm -rf run_sp_tile_Sx_*" $dry_run
+  command "rm -rf run_sp_exp_Sp" $dry_run
+
+  # Create new split exp run dir
+  new_dir="run_sp_exp_Sp//split_exp_runner/output"
+  command "mkdir -p $new_dir" $dry_run
+
+  # Link to all header files of exposures used for the current tile
+  IDs=`echo $ID | tr "." "-"`
+  for exp_ID in `cat run_sp_GitFeGie_*/find_exposures_runner/output/exp_numbers-$IDs.txt` ; do
+    x=`echo $exp_ID | tr -d p `
+    command "ln -s ../../../run_sp_exp_SpMh_2024-01-28_07-40-12/split_exp_runner/output/headers-$x.npy $new_dir/headers-$x.npy" $dry_run
+  done
+
+  # Run merge_headers_runner on local exposure selection
+  cd ..
+  command "update_runs_log_file.py" $dry_run
+  export SP_RUN=`pwd`
+  command "shapepipe_run -c cfis/config_exp_Mh.ini" $dry_run
+  cd output
+fi
+
 # Update links to exposure run directories, which were created in job 32
-(( do_job= $job & 64 ))
+(( do_job = $job & 64 ))
 if [[ $do_job != 0 ]]; then
   if [ "$kind" == "tile" ]; then
     cd ../../..
@@ -193,15 +244,23 @@ if [[ $do_job != 0 ]]; then
   fi
 fi
 
-(( do_job= $job & 256 ))
+(( do_job = $job & 256 ))
 if [[ $do_job != 0 ]]; then
 
   # Remove previous runs of this job
   rm -rf run_sp_Ms_20??_*
+
+fi
+
+(( do_job = $job & 512 ))
+if [[ $do_job != 0 ]]; then
+
+  # Remove previous runs of this job
   rm -rf run_sp_Mc_20??_*
 
 fi
 
+
 cd ..
 
 # Update log file

From 01fea37d9d0a9c3f80f348aa119546efcc22ce61 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 3 Jun 2024 12:09:32 +0000
Subject: [PATCH 158/207] psf converting from val input to merge stars working
 (not yet plotting)

---
 example/cfis/config_MsPl_psfex_conv.ini       | 101 ++++++++++++++++++
 scripts/python/convert_psf_pix2world.py       |  10 +-
 scripts/sh/combine_runs.bash                  |  11 +-
 .../modules/merge_starcat_package/__init__.py |   5 +-
 .../merge_starcat_package/merge_starcat.py    |  18 +++-
 5 files changed, 134 insertions(+), 11 deletions(-)
 create mode 100644 example/cfis/config_MsPl_psfex_conv.ini

diff --git a/example/cfis/config_MsPl_psfex_conv.ini b/example/cfis/config_MsPl_psfex_conv.ini
new file mode 100644
index 000000000..840be689d
--- /dev/null
+++ b/example/cfis/config_MsPl_psfex_conv.ini
@@ -0,0 +1,101 @@
+# ShapePipe configuration file for post-processing.
+# merge star cat and PSF plots.
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_MsPl
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = merge_starcat_runner, mccd_plots_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN/output
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 4
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+[MERGE_STARCAT_RUNNER]
+
+INPUT_DIR = last:psfex_interp_runner
+
+PSF_MODEL = psfex
+
+NUMBERING_SCHEME = -0-0
+
+# Input file pattern(s), list of strings with length matching number of expected input file types
+# Cannot contain wild cards
+FILE_PATTERN = validation_psf_conv
+
+# FILE_EXT (optional) list of string extensions to identify input files
+FILE_EXT = .fits
+
+
+[MCCD_PLOTS_RUNNER]
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -0000000
+
+FILE_PATTERN = full_starcat
+FILE_EXT = .fits
+
+PLOT_MEANSHAPES = True
+X_GRID = 5
+Y_GRID = 10
+
+# Optional: max values for elliptity and residual ellipticities
+MAX_E = 0.05
+MAX_DE = 0.005
+
+PSF = psfex
+PLOT_HISTOGRAMS = True
+REMOVE_OUTLIERS = False
+
+# X_GRID, Y_GRID: correspond to the number of bins in each direction of each
+# CCD from the focal plane. Ex: each CCD will be binned in 5x10 regular grids.
+#
+# REMOVE_OUTLIERS: Remove validated stars that are outliers in terms of shape
+# before drawing the plots.
+
+PLOT_RHO_STATS = True
+RHO_STATS_STYLE = HSC
+
+RHO_STATS_YLIM_L = 1e-10, 4e-5
+RHO_STATS_YLIM_R = 1e-8, 4e-5
diff --git a/scripts/python/convert_psf_pix2world.py b/scripts/python/convert_psf_pix2world.py
index f7fba4da8..0e563ee06 100755
--- a/scripts/python/convert_psf_pix2world.py
+++ b/scripts/python/convert_psf_pix2world.py
@@ -59,7 +59,7 @@ def params_default(self):
 
         self._params = {
             "input_base_dir": ".",
-            "output_base_dir": "./star_cat",
+            "output_base_dir": "./psf_conv_all",
             "mode": "merge",
             "sub_dir_pattern" : "run_sp_exp_202",
             "file_pattern_psfint": "validation_psf",
@@ -150,12 +150,12 @@ def run(self):
                         disable=self._params["verbose"],
                 ):
                     self.transform_exposure(
-                        output_dir, idx_exp, exp_run_dir
+                        output_dir, patch, idx_exp, exp_run_dir
                     )
             else:
                 res = Parallel(n_jobs=-1, backend="loky")(
                     delayed(self.transform_exposure)(
-                        output_dir, idx_exp, exp_run_dir
+                        output_dir, patch, idx_exp, exp_run_dir
                     )
                     for idx_exp, exp_run_dir in tqdm(
                             enumerate(exp_run_dirs),
@@ -164,13 +164,13 @@ def run(self):
                     )
                 )
 
-    def transform_exposure(self, output_dir, idx, exp_run_dir):
+    def transform_exposure(self, output_dir, patch, idx, exp_run_dir):
         """Transform exposures.
 
         Transform shapes for exposures for a given run (input exp run dir).
 
         """
-        output_path = f"{output_dir}/psf_cat_{idx}.fits"
+        output_path = f"{output_dir}/validation_psf-{patch}-{idx}.fits"
         if os.path.exists(output_path):
             print(f"Skipping transform_exposure, file {output_path} exists")
             return
diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index 3354da8b1..504b67c37 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -20,7 +20,7 @@ usage="Usage: $(basename "$0") [OPTIONS]
     \tPSF model, allowed are 'psfex', 'mccd', 'setools', default='$psf'\n
    -c, --cat TYPE\n
     \tCatalogue type, allowed are 'final', 'flag_tile', 'flag_exp', \n
-    \t'psf', 'image', default='$cat'\n
+    \t'psf', 'psf_conv', 'image', default='$cat'\n
 "
 
 ## Parse command line
@@ -52,8 +52,9 @@ if [ "$cat" != "final" ] \
   && [ "$cat" != "flag_tile" ] \
   && [ "$cat" != "flag_exp" ] \
   && [ "$cat" != "psf" ] \
+  && [ "$cat" != "psf_conv" ] \
   && [ "$cat" != "image" ]; then
-  echo "cat (option -c) needs to be 'final', 'flag_tile', 'flag_exp', 'psf', or 'image'"
+  echo "cat (option -c) needs to be 'final', 'flag_tile', 'flag_exp', 'psf', 'psf_conv' or 'image'"
   exit 2
 fi
 
@@ -154,6 +155,12 @@ elif [ "$cat" == "psf" ]; then
     module="mccd_interp_runner"
   fi
 
+elif [ "$cat" == "psf_conv" ]; then
+
+  run_in="$pwd/psf_conv_all/P?"
+  pattern="validation_psf_conv-*"
+  module="psfex_interp_runner"
+
 else
 
   echo "Invalid catalogue type $cat"
diff --git a/shapepipe/modules/merge_starcat_package/__init__.py b/shapepipe/modules/merge_starcat_package/__init__.py
index c75a9c863..d7657b46a 100644
--- a/shapepipe/modules/merge_starcat_package/__init__.py
+++ b/shapepipe/modules/merge_starcat_package/__init__.py
@@ -21,7 +21,10 @@
 ===================================
 
 PSF_MODEL : str
-    PSF model used; options are ``psfex`` or ``mccd``
+    PSF model used; options are ``psfex`` or ``mccd``, ``setools''
+HDU : int, optional
+    HDU number of input catalogue table, default is ``1`` for ``mccd``
+    and ``2`` for ``psfex`` and ``setools``
 
 """
 
diff --git a/shapepipe/modules/merge_starcat_package/merge_starcat.py b/shapepipe/modules/merge_starcat_package/merge_starcat.py
index 924c46aab..005366300 100644
--- a/shapepipe/modules/merge_starcat_package/merge_starcat.py
+++ b/shapepipe/modules/merge_starcat_package/merge_starcat.py
@@ -560,9 +560,21 @@ def process(self):
             flag_star += list(data_j['FLAG_STAR_HSM'])
 
             # misc
-            mag += list(data_j['MAG'])
-            snr += list(data_j['SNR'])
-            psfex_acc += list(data_j['ACCEPTED'])
+
+            # MKDEBUG: The following columns do not exist (yet)
+            # for psf converted (pix2wcs) files.
+            try:
+                mag += list(data_j['MAG'])
+            except:
+                mag += list(np.zeros_like(data_j["X"]))
+            try:
+                snr += list(data_j['SNR'])
+            except:
+                snr += list(np.zeros_like(data_j["X"]))
+            try:
+                psfex_acc += list(data_j['ACCEPTED'])
+            except:
+                psfex_acc += list(np.zeros_like(data_j["X"]))
 
             # CCD number
             ccd_nb += [

From 1af8b49d3978c3638a203276737b2d19d5babaeb Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 3 Jun 2024 14:21:45 +0000
Subject: [PATCH 159/207] summary script fixed bitwise & type

---
 scripts/python/summary_run.py | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index 5e92b659e..0039ff628 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -34,7 +34,11 @@ def main(argv=None):
         all_exposures = get_IDs_from_file(exp_IDs_path)
         par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)
 
-    if not os.path.exists(exp_IDs_path) or not job_exclusive or job_exclusive == "1":
+    if (
+        not os.path.exists(exp_IDs_path)
+        or not job_exclusive
+        or int(job_exclusive) & 1
+    ):
         # Run job 1 if exposure ID list file does not exist or
         # job_exclusive is 1 or not set
         key = "1"
@@ -59,7 +63,7 @@ def main(argv=None):
     _ = keys.pop(0)
 
     for key in keys:
-        if job_exclusive and key != job_exclusive:
+        if job_exclusive and not int(key) & int(job_exclusive):
             continue
         jobs[key].print_intro()
         jobs[key].check_numbers(par_runtime=par_runtime)

From 5468a5c6d1181186d13efd5276dca181c613842e Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 3 Jun 2024 14:22:29 +0000
Subject: [PATCH 160/207] init canfar script: added DISPLAY to avoid setools qt
 bug

---
 scripts/sh/init_run_exclusive_canfar.sh | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 57cc81344..620e81b06 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -272,6 +272,9 @@ pwd
 echo -n "environment: "
 echo $CONDA_PREFIX
 
+# To avoid (new?) qt error with setools (-j 32)
+export DISPLAY=:1.0
+
 command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP" $dry_run
 
 cd $dir

From 6bf14e0526232ec9869c6dd088162c895b328325 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 3 Jun 2024 14:22:46 +0000
Subject: [PATCH 161/207] trying job name

---
 scripts/sh/curl_canfar_local.sh | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 5839b16e1..28351b61c 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -155,7 +155,8 @@ function submit_batch() {
 
   for ID in `cat $path`; do
     my_arg=$(set_arg)
-    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg" &> /dev/null`
+    MY_NAME="SP_P${patch}_J${job}_${ID}"
+    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg" &> /dev/null`
     update_session_logs
   done
 
@@ -174,17 +175,19 @@ if [ "$dry_run" == 2 ]; then
 
   if [ "$ID" == "-1" ]; then
 
+    MY_NAME="SP_P${patch}_J${job}_${ID}"
+
     # Submit file (dry run = 2)
     for ID in `cat $file_IDs`; do
       arg=$(set_arg)
-      echo curl -b -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+      echo curl -b -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
     done
 
   else
 
     # Submit image (dry run = 2)
     arg=$(set_arg)
-    echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+    echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
 
   fi
 
@@ -236,8 +239,9 @@ else
 
     # Submit image
     arg=$(set_arg)
-    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
-    echo curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"
+    MY_NAME="SP_P${patch}_J${job}_${ID}"
+    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
+    echo curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"
     update_session_logs
 
   fi

From da379f16afd7e715912b7760dfb0b41f1f72ee48 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 3 Jun 2024 14:23:14 +0000
Subject: [PATCH 162/207] merge starcat mod: added input HDU number

---
 shapepipe/modules/merge_starcat_runner.py | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/shapepipe/modules/merge_starcat_runner.py b/shapepipe/modules/merge_starcat_runner.py
index 5d0b43f6d..d1f388a96 100644
--- a/shapepipe/modules/merge_starcat_runner.py
+++ b/shapepipe/modules/merge_starcat_runner.py
@@ -37,6 +37,12 @@ def merge_starcat_runner(
             + f'needs to be one of {allowed_psf_models}'
         )
 
+    # Get input catalogue HDU number
+    if config.has_option(module_config_sec, 'HDU'):
+        hdu = config.getint(module_config_sec, 'HDU')
+    else:
+        hdu = 1
+
     # Set output directory
     output_dir = run_dirs['output']
 
@@ -49,7 +55,7 @@ def merge_starcat_runner(
         MSC = merge_starcat.MergeStarCatSetools
 
     # Create instance of merge class
-    merge_inst = MSC(input_file_list, output_dir, w_log)
+    merge_inst = MSC(input_file_list, output_dir, w_log, hdu_table=hdu)
 
     # Run processing
     merge_inst.process()

From 6c4029b70bacf5c82ffa7adf3762589c3ac0e98c Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 11 Jun 2024 07:56:06 +0000
Subject: [PATCH 163/207] get IDs of running jobs

---
 docs/source/pipeline_canfar.md  | 22 ++++++++++++++++++++--
 scripts/sh/stats_jobs_canfar.sh |  4 ++++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 948bcd4eb..235c5f1de 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -106,11 +106,29 @@ merge_final_cat -i output/run_sp_combined_final/make_catalog_runner/output -p cf
 combine_runs.bash  -p $psf -c psf
 shapepipe_run -c $SP_CONFIG/config_MsPl_$psf.ini
 
-# Delete jobs
+# Convert star cat to WCS
+## Convert all input validation psf files and create directories par patch
+## psf_conv_all/P?
+cd star_cat
+convert_psf_pix2world.py -i .. -s run_sp_combined_psf
+
+# Combine previously created files within one SP run dir
+combine_runs.bash -p psfex -c psf_conv
+
+# Merge all converted star catalogues and create final-starcat.fits
+shapepipe_run -c ~/shapepipe/example/cfis/config_Ms_psfex_conv.ini
+
+
+# Extra stuff
+
+## Delete jobs
 SSL=~/.ssl/cadcproxy.pem
 SESSION=https://ws-uv.canfar.net/skaha/v0/session
 for ID in `cat session_IDs.txt`; do echo $ID; curl -X DELETE -E $SSL $SESSION/$ID; done
 
-# Run in terminal in parallel (-e needs to be last arg)
+## Run in terminal in parallel (-e needs to be last arg)
 cat all.txt | xargs -P 16 -n 1  init_run_exclusive_canfar.sh -j 64 -p psfex -k tile -f summary/missing_job_64_all.txt -n -e
 
+## Get missing jobs that are not currently running
+stats_jobs_canfar.sh
+grep -F -v -f jobs_running.txt summary/missing_job_128_ngmix_runner_3.txt | wc > all3.txt
diff --git a/scripts/sh/stats_jobs_canfar.sh b/scripts/sh/stats_jobs_canfar.sh
index fbfbbf7fa..166292a06 100755
--- a/scripts/sh/stats_jobs_canfar.sh
+++ b/scripts/sh/stats_jobs_canfar.sh
@@ -10,6 +10,7 @@
 ## Temporary files
 tmpfile_jobs="jobinfo.txt"
 tmpfile_ids="ids.txt"
+tmpfile_running="jobs_running.txt"
 
 ## curl options
 SSL=~/.ssl/cadcproxy.pem
@@ -64,6 +65,9 @@ curl -E $SSL $SESSION &> /dev/null > $tmpfile_jobs
 # Get headless job IDs
 cat $tmpfile_jobs | grep headless -B 4 -A 12 | grep \"id | perl -F\" -ane 'print "$F[3]\n"' > $tmpfile_ids
 
+# Get running job info
+cat $tmpfile_jobs | grep Running -A 1 | grep name | perl -F\- -ane 'chomp; $F[4] =~ s/[",]//g; print "$F[3].$F[4]"' > $tmpfile_running
+
 # Number of jobs
 n_headless=`cat $tmpfile_ids | wc -l`
 

From 38719f579249b163209d3a0b2a7df958382354ae Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 11 Jun 2024 07:57:00 +0000
Subject: [PATCH 164/207] merge star cats w/o plotting; psf conv stars

---
 example/cfis/config_Ms_psfex.ini              |  2 +
 ...sfex_conv.ini => config_Ms_psfex_conv.ini} | 39 ++-----------------
 example/cfis/config_Pl_psfex.ini              |  2 +
 3 files changed, 7 insertions(+), 36 deletions(-)
 rename example/cfis/{config_MsPl_psfex_conv.ini => config_Ms_psfex_conv.ini} (63%)

diff --git a/example/cfis/config_Ms_psfex.ini b/example/cfis/config_Ms_psfex.ini
index 5a105e773..5698ee6dd 100644
--- a/example/cfis/config_Ms_psfex.ini
+++ b/example/cfis/config_Ms_psfex.ini
@@ -66,3 +66,5 @@ FILE_PATTERN = validation_psf
 
 # FILE_EXT (optional) list of string extensions to identify input files
 FILE_EXT = .fits
+
+HDU = 2
diff --git a/example/cfis/config_MsPl_psfex_conv.ini b/example/cfis/config_Ms_psfex_conv.ini
similarity index 63%
rename from example/cfis/config_MsPl_psfex_conv.ini
rename to example/cfis/config_Ms_psfex_conv.ini
index 840be689d..9c8b763e5 100644
--- a/example/cfis/config_MsPl_psfex_conv.ini
+++ b/example/cfis/config_Ms_psfex_conv.ini
@@ -1,5 +1,5 @@
 # ShapePipe configuration file for post-processing.
-# merge star cat and PSF plots.
+# merge star cat (converted to WCS)
 
 
 ## Default ShapePipe options
@@ -9,7 +9,7 @@
 VERBOSE = True
 
 # Name of run (optional) default: shapepipe_run
-RUN_NAME = run_sp_MsPl
+RUN_NAME = run_sp_Ms
 
 # Add date and time to RUN_NAME, optional, default: False
 RUN_DATETIME = False
@@ -19,7 +19,7 @@ RUN_DATETIME = False
 [EXECUTION]
 
 # Module name, single string or comma-separated list of valid module runner names
-MODULE = merge_starcat_runner, mccd_plots_runner
+MODULE = merge_starcat_runner
 
 # Parallel processing mode, SMP or MPI
 MODE = SMP
@@ -66,36 +66,3 @@ FILE_PATTERN = validation_psf_conv
 
 # FILE_EXT (optional) list of string extensions to identify input files
 FILE_EXT = .fits
-
-
-[MCCD_PLOTS_RUNNER]
-
-# NUMBERING_SCHEME (optional) string with numbering pattern for input files
-NUMBERING_SCHEME = -0000000
-
-FILE_PATTERN = full_starcat
-FILE_EXT = .fits
-
-PLOT_MEANSHAPES = True
-X_GRID = 5
-Y_GRID = 10
-
-# Optional: max values for elliptity and residual ellipticities
-MAX_E = 0.05
-MAX_DE = 0.005
-
-PSF = psfex
-PLOT_HISTOGRAMS = True
-REMOVE_OUTLIERS = False
-
-# X_GRID, Y_GRID: correspond to the number of bins in each direction of each
-# CCD from the focal plane. Ex: each CCD will be binned in 5x10 regular grids.
-#
-# REMOVE_OUTLIERS: Remove validated stars that are outliers in terms of shape
-# before drawing the plots.
-
-PLOT_RHO_STATS = True
-RHO_STATS_STYLE = HSC
-
-RHO_STATS_YLIM_L = 1e-10, 4e-5
-RHO_STATS_YLIM_R = 1e-8, 4e-5
diff --git a/example/cfis/config_Pl_psfex.ini b/example/cfis/config_Pl_psfex.ini
index c561f15a5..08ca41edd 100644
--- a/example/cfis/config_Pl_psfex.ini
+++ b/example/cfis/config_Pl_psfex.ini
@@ -60,6 +60,8 @@ NUMBERING_SCHEME = -0000000
 FILE_PATTERN = full_starcat
 FILE_EXT = .fits
 
+HDU = 1
+
 PSF = psfex
 PLOT_MEANSHAPES = True
 X_GRID = 5

From e9e76af67d3325c92a283326f4e986fde40c378e Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 11 Jun 2024 07:58:06 +0000
Subject: [PATCH 165/207] curl&init scrips: remove -k kind options, determined
 automatically according to -j job

---
 scripts/sh/curl_canfar_local.sh         | 43 ++++-------
 scripts/sh/init_run_exclusive_canfar.sh | 97 +++++++++++++++++--------
 2 files changed, 83 insertions(+), 57 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 28351b61c..af4b4399b 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -14,7 +14,6 @@ job=-1
 ID=-1
 file_IDs=-1
 N_SMP=1
-kind=-1
 version="1.1"
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 batch_max=200
@@ -33,8 +32,6 @@ usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
     \tfile containing IDs\n
    -p, --psf MODEL\n
     \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
-   -k, --kind KIND\n
-    \timage kind, allowed are 'tile' and 'exp'\n
    -N, --N_SMP N_SMOp\n
     \tnumber of jobs (SMP mode only), default=$N_SMP\n
    -V, --version\n
@@ -49,8 +46,8 @@ usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
 
 ## Help if no arguments
 if [ -z $1 ]; then
-        echo -ne $usage
-        exit 1
+  echo -ne $usage
+  exit 1
 fi
 
 ## Parse command line
@@ -76,10 +73,6 @@ while [ $# -gt 0 ]; do
       N_SMP="$2"
       shift
       ;;
-    -k|--kind)
-      kind="$2"
-      shift
-      ;;
     -b|--batch_max)
       batch_max="$2"
       shift
@@ -103,11 +96,6 @@ if [ "$ID" == "-1" ] && [ "$file_IDs" == "-1" ]; then
   exit 3                                                                        
 fi                                                                              
                                                                                 
-if [ "kind" == "-1" ]; then                                                     
-  echo "No image kind indicated, use option -k"                                 
-  exit 4                                                                        
-fi
-
 if [ "$dry_run" != 0 ] && [ "$dry_run" != 1 ] && [ "$dry_run" != 2 ]; then
   echo "Invalid dry_run option, allowed are 0, 1, and 2"
   exit 5
@@ -123,15 +111,11 @@ else
 fi
 
 RESOURCES="ram=4&cores=$N_SMP"
-
-# TODO: dir as command line argument to this script
 dir=`pwd`
-#arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
-
 
 # Return argument for local script to be called via curl
 function set_arg() {
-  my_arg="-j $job -e $ID -N $N_SMP -k $kind $arg_dry_run -d $dir"
+  my_arg="-j $job -e $ID -N $N_SMP $arg_dry_run -d $dir"
   echo $my_arg
 }
 
@@ -155,8 +139,9 @@ function submit_batch() {
 
   for ID in `cat $path`; do
     my_arg=$(set_arg)
-    MY_NAME="SP_P${patch}_J${job}_${ID}"
-    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg" &> /dev/null`
+    IDt=`echo $ID | tr "." "-"`
+    MY_NAME="SP-${patch}-J${job}-${IDt}"
+    my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg" &> /dev/null`
     update_session_logs
   done
 
@@ -175,19 +160,22 @@ if [ "$dry_run" == 2 ]; then
 
   if [ "$ID" == "-1" ]; then
 
-    MY_NAME="SP_P${patch}_J${job}_${ID}"
 
     # Submit file (dry run = 2)
     for ID in `cat $file_IDs`; do
+      IDt=`echo $ID | tr "." "-"`
+      MY_NAME="SP-${patch}-J${job}-${IDt}"
       arg=$(set_arg)
-      echo curl -b -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+      echo curl -E $SSL \"$SESSION?$RESOURCES\" -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
     done
 
   else
 
     # Submit image (dry run = 2)
     arg=$(set_arg)
-    echo curl -E $SSL $SESSION?$RESOURCES -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+    IDt=`echo $ID | tr "." "-"`
+    MY_NAME="SP-${patch}-J${job}-${IDt}"
+    echo curl -E $SSL "$SESSION?$RESOURCES" -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
 
   fi
 
@@ -239,9 +227,10 @@ else
 
     # Submit image
     arg=$(set_arg)
-    MY_NAME="SP_P${patch}_J${job}_${ID}"
-    my_session=`curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
-    echo curl -E $SSL $SESSION?$RESOURCES -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"
+    IDt=`echo $ID | tr "." "-"`
+    MY_NAME="SP-${patch}-J${job}-${IDt}"
+    my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
+    echo curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"
     update_session_logs
 
   fi
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 620e81b06..893b67f1c 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -7,7 +7,6 @@
 job=-1
 ID=-1
 N_SMP=1
-kind=-1
 dry_run=0
 nsh_jobs=8
 dir=`pwd`
@@ -29,8 +28,6 @@ usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
     \timage ID\n
    -p, --psf MODEL\n
     \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
-   -k, --kind KIND\n
-    \timage kind, allowed are 'tile' and 'exp'\n
    -N, --N_SMP N_SMOp\n
     \tnumber of jobs (SMP mode only), default from original config files\n
    -d, --directory\n
@@ -41,8 +38,8 @@ usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
 
 ## Help if no arguments                                                         
 if [ -z $1 ]; then                                                              
-        echo -ne $usage                                                         
-        exit 1                                                                  
+  echo -ne $usage                                                         
+  exit 1                                                                  
 fi 
 
 ## Parse command line                                                           
@@ -64,10 +61,6 @@ while [ $# -gt 0 ]; do
       N_SMP="$2"                                                                
       shift                                                                     
       ;;                                                                        
-    -k|--kind)                                                                 
-      kind="$2"                                                                
-      shift                                                                     
-      ;;                                                                        
     -d|--directory)
       dir="$2"
       shift
@@ -90,11 +83,6 @@ if [ "$exclusive" == "-1" ]; then
   exit 3
 fi
 
-if [ "$kind" == "-1" ]; then
-  echo "No image kind indicated, use option -k"
-  exit 4
-fi
-
 # Functions
 
 ## Print string, executes command, and prints return value.
@@ -135,6 +123,46 @@ function command () {
 
 echo "start init_run_exclusive_canfar"
 
+# Set kind
+job_to_test=16
+kind="none"
+
+# loop over possible job numbers
+while  [ $job_to_test -le 1024 ]; do
+
+  (( do_job = $job & $job_to_test ))
+  if [[ $do_job != 0 ]]; then
+    
+      if [ $job_to_test == 32 ]; then
+        if [ "$kind" == "tile" ]; then
+          echo "Error: Invalid job $job. mixing tile and exp kinds"
+          exit 6
+        fi
+
+        # job=32 -> set kind to exp
+        kind="exp"
+      else
+        if [ "$kind" == "exp" ]; then
+          echo "Error: Invalid job $job. mixing tile and exp kinds"
+          exit 6
+        fi
+
+        # job != 32 -> set kind to tile
+        kind="tile"
+      fi
+
+  fi
+
+  # Multiply job number by two to get next biwise number
+  job_to_test=$((job_to_test * 2))
+done
+
+if [ "$kind" == "none" ]; then
+  echo "Error: invalid job $job"
+  exit 5
+fi
+
+
 if [ "$dry_run" == 1 ]; then
   echo "in dry run mode"
 fi
@@ -160,23 +188,14 @@ fi
 cd $ID
 pwd
 
+
 if [ ! -d "output" ]; then
   command "mkdir output" $dry_run
 fi
 
 cd output
 
-if [ "$mh_local" == "1" ]; then
-  if [ -L log_exp_headers.sqlite ]; then
-    # Local Mh and symlink -> remove previous link to
-    # (potentially incomplete) global mh file
-    command "rm log_exp_headers.sqlite" $dry_run
-    #echo "MKDEBUG not rm hm file"
-    ls -l log_exp_headers.sqlite
-  else
-    echo "no mh link found"
-  fi
-else
+if [ "$mh_local" == "0" ]; then
   if [ ! -f log_exp_headers.sqlite ]; then
     # Global Mh and file does not exist -> symlink to
     # gllobal mh file
@@ -185,19 +204,37 @@ else
 fi
 
 
-# Update links to global run directories (GiFeGie, Uz, Ma?, combined_flag?)
-for dir in $dir/output/run_sp_*; do
-  command "ln -sf $dir" $dry_run
+# Update links to global run directories (GiFeGie, Uz)
+for my_dir in $dir/output/run_sp_[GU]*; do
+  command "ln -sf $my_dir" $dry_run
 done
+# Combined flags
+command "ln -sf $dir/output/run_sp_Ma_tile" $dry_run
+command "ln -sf $dir/output/run_sp_Ma_exp" $dry_run
+# exp Sp
+command "ln -sf $dir/output/run_sp_exp_SpMh" $dry_run
+
 
 (( do_job = $job & 16 ))
 if [ "$mh_local" == "1" ] && [ $do_job != 0 ]; then
 
+  # Remove previous Sx runs
+  command "rm -rf $dir/output/run_tile_Sx_*" $dry_run
+
   if [ "$ID" == "-1" ]; then
     echo "ID needs to be given (option -e) for mh_local and job&16"
     exit 6 
   fi
 
+  if [ -L log_exp_headers.sqlite ]; then
+    # Local Mh and symlink -> remove previous link to
+    # (potentially incomplete) global mh file
+    echo "Removing previous mh sym link"
+    command "rm log_exp_headers.sqlite" $dry_run
+  else
+    echo "no mh link found"
+  fi
+
   echo "Creating local mh file"
 
   # Remove previous Sextractor run and (local) split_exp dir
@@ -212,7 +249,7 @@ if [ "$mh_local" == "1" ] && [ $do_job != 0 ]; then
   IDs=`echo $ID | tr "." "-"`
   for exp_ID in `cat run_sp_GitFeGie_*/find_exposures_runner/output/exp_numbers-$IDs.txt` ; do
     x=`echo $exp_ID | tr -d p `
-    command "ln -s ../../../run_sp_exp_SpMh_2024-01-28_07-40-12/split_exp_runner/output/headers-$x.npy $new_dir/headers-$x.npy" $dry_run
+    command "ln -s $dir/output/run_sp_exp_SpMh/split_exp_runner/output/headers-$x.npy $new_dir/headers-$x.npy" $dry_run
   done
 
   # Run merge_headers_runner on local exposure selection
@@ -236,7 +273,7 @@ if [[ $do_job != 0 ]]; then
     if [ "$n_32" != "1" ]; then
       n_remove="$(($n_32-1))"
       echo "removing $n_remove duplicate old job-32 runs"
-      rm -rf `ls -rt1d run_sp_tile_Sx_* | head -$n_remove`
+      command "rm -rf `ls -rt1d run_sp_tile_Sx_* | head -$n_remove`" $dry_run
     fi
 
     # Remove previous runs of this job

From af5f1dbd6edc98f37d65e455ce661bbc11628946 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 11 Jun 2024 07:58:39 +0000
Subject: [PATCH 166/207] minor bug fixes, messages

---
 scripts/python/convert_psf_pix2world.py | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/scripts/python/convert_psf_pix2world.py b/scripts/python/convert_psf_pix2world.py
index 0e563ee06..9a771dc7f 100755
--- a/scripts/python/convert_psf_pix2world.py
+++ b/scripts/python/convert_psf_pix2world.py
@@ -59,7 +59,7 @@ def params_default(self):
 
         self._params = {
             "input_base_dir": ".",
-            "output_base_dir": "./psf_conv_all",
+            "output_base_dir": ".",
             "mode": "merge",
             "sub_dir_pattern" : "run_sp_exp_202",
             "file_pattern_psfint": "validation_psf",
@@ -112,7 +112,7 @@ def run(self):
         else:
             n_patch = 7                                                             
             #patch_nums = [idx for idx in np.arange(n_patch) + 1]
-            patch_nums = [1, 3]
+            patch_nums = [1, 3, 4]
 
         do_parallel = True
 
@@ -130,8 +130,7 @@ def run(self):
             exp_run_dirs = glob.glob(subdirs)
             n_exp_runs = len(exp_run_dirs)
             print(
-                pl = 's' if n_exp_runs > 1 else ''
-                f"Found {n_exp_runs} input single-exposure run{pl} for patch"
+                f"Found {n_exp_runs} input single-exposure run(s) for patch"
                 + f" {patch_dir} ({subdirs})"
             )
 
@@ -170,7 +169,10 @@ def transform_exposure(self, output_dir, patch, idx, exp_run_dir):
         Transform shapes for exposures for a given run (input exp run dir).
 
         """
-        output_path = f"{output_dir}/validation_psf-{patch}-{idx}.fits"
+        output_path = (
+            f"{output_dir}/{self._params['file_pattern_psfint']}_conv"
+            + f"-{patch}-{idx}.fits"
+        )
         if os.path.exists(output_path):
             print(f"Skipping transform_exposure, file {output_path} exists")
             return
@@ -179,8 +181,7 @@ def transform_exposure(self, output_dir, patch, idx, exp_run_dir):
         try:
             all_files = os.listdir(mccd_dir)
             if self._params["verbose"]:
-                pl = "s" if len(all_files) > 1 else ""
-                print(f"Found {len(all_files)} file{pl} in {mccd_dir}")
+                print(f"Found {len(all_files)} file(s) in {mccd_dir}")
         except Exception:
             if self._params["verbose"]:
                 print(f"Found zero PSFEx files in {mccd_dir}, skipping")

From b2ceed25fe0e56cd06e8ed7f9efdd30b7cb76d76 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 11 Jun 2024 07:59:06 +0000
Subject: [PATCH 167/207] combine run for psf_conv updated input dir

---
 scripts/sh/combine_runs.bash | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index 504b67c37..be1b4f04e 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -157,7 +157,7 @@ elif [ "$cat" == "psf" ]; then
 
 elif [ "$cat" == "psf_conv" ]; then
 
-  run_in="$pwd/psf_conv_all/P?"
+  run_in="$pwd/../P?"
   pattern="validation_psf_conv-*"
   module="psfex_interp_runner"
 

From d61e4c52698decd36387a9c5592c87e8ef6f0baa Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 11 Jun 2024 07:59:53 +0000
Subject: [PATCH 168/207] merge star cat: set SExcat to False, so output in HDU
 1

---
 shapepipe/modules/merge_starcat_package/merge_starcat.py | 7 +++++--
 shapepipe/modules/split_exp_package/split_exp.py         | 2 +-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/shapepipe/modules/merge_starcat_package/merge_starcat.py b/shapepipe/modules/merge_starcat_package/merge_starcat.py
index 005366300..e0aa9eaa7 100644
--- a/shapepipe/modules/merge_starcat_package/merge_starcat.py
+++ b/shapepipe/modules/merge_starcat_package/merge_starcat.py
@@ -582,10 +582,11 @@ def process(self):
             ] * len(data_j['RA'])
 
         # Prepare output FITS catalogue
+        # MKDEBUG: SEx_cat=True -> False
         output = file_io.FITSCatalogue(
             f'{self._output_dir}/full_starcat-0000000.fits',
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
-            SEx_catalogue=True
+            SEx_catalogue=False,
         )
 
         # Collect columns
@@ -610,11 +611,13 @@ def process(self):
         }
 
         # Write file
+        # MKDEBUG for psf conv (pix2WCS) files do not write as SExtractorCat;
+        # we do not want to copy the first input data content to HDU #1.
         output.save_as_fits(
             data,
             overwrite=True,
-            sex_cat_path=self._input_file_list[0][0],
         )
+            #sex_cat_path=self._input_file_list[0][0],
 
 
 class MergeStarCatSetools(object):
diff --git a/shapepipe/modules/split_exp_package/split_exp.py b/shapepipe/modules/split_exp_package/split_exp.py
index 58d215c62..3af708af7 100644
--- a/shapepipe/modules/split_exp_package/split_exp.py
+++ b/shapepipe/modules/split_exp_package/split_exp.py
@@ -106,7 +106,7 @@ def create_hdus(
         if len(hdu_list) != self._n_hdu + 1:
             raise ValueError(
                 f"Image {exp_path} has {len(hdu_list)} + 1 HDUs,"
-                + " expected were {self._n_hdu} + 1"
+                + f" expected were {self._n_hdu} + 1"
             )
 
         for idx in range(1, self._n_hdu + 1):

From e679935d4f7d3c0f706b530b89fb1e5889b44e81 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Tue, 11 Jun 2024 13:19:40 +0200
Subject: [PATCH 169/207] added gfortran to Docker; pytest to env

---
 Dockerfile      | 1 +
 environment.yml | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 0a5e34764..7d2785ab2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -18,6 +18,7 @@ RUN apt-get update --allow-releaseinfo-change && \
     apt-get install automake -y && \
     apt-get install autoconf -y && \
     apt-get install gcc-9 g++-9 -y && \
+    apt-get install gfortran -y && \
     apt-get install locales -y && \
     apt-get install libgl1-mesa-glx -y && \
     apt-get install xterm -y && \
diff --git a/environment.yml b/environment.yml
index 548c7e618..78082bbf8 100644
--- a/environment.yml
+++ b/environment.yml
@@ -17,7 +17,7 @@ dependencies:
   - numba
   - numpy==1.22
   - pip:
-    - cs_util
+    - cs_util==0.1
     - modopt
     - PyQt5
     - pyqtgraph

From 65d4a68445f239817a0c26574da5b263cfde2df5 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martinkilbinger@cea.fr>
Date: Fri, 14 Jun 2024 18:03:31 +0200
Subject: [PATCH 170/207] rho stats using shear_psf_leakage

---
 example/cfis/config_Pl_psfex.ini              |   6 +-
 .../mccd_package/mccd_plot_utilities.py       | 950 +++++++++---------
 2 files changed, 496 insertions(+), 460 deletions(-)

diff --git a/example/cfis/config_Pl_psfex.ini b/example/cfis/config_Pl_psfex.ini
index 08ca41edd..7685ae93e 100644
--- a/example/cfis/config_Pl_psfex.ini
+++ b/example/cfis/config_Pl_psfex.ini
@@ -35,7 +35,7 @@ LOG_NAME = log_sp
 RUN_LOG_NAME = log_run_sp
 
 # Input directory, containing input files, single string or list of names
-INPUT_DIR = .
+INPUT_DIR = $SP_RUN/output
 
 # Output directory
 OUTPUT_DIR = $SP_RUN/output
@@ -60,7 +60,7 @@ NUMBERING_SCHEME = -0000000
 FILE_PATTERN = full_starcat
 FILE_EXT = .fits
 
-HDU = 1
+HDU = 2
 
 PSF = psfex
 PLOT_MEANSHAPES = True
@@ -84,7 +84,7 @@ REMOVE_OUTLIERS = False
 # before drawing the plots.
 
 PLOT_RHO_STATS = True
-RHO_STATS_STYLE = HSC
+RHO_STATS_STYLE = UNIONS
 
 RHO_STATS_YLIM_L = 1e-10, 4e-5
 RHO_STATS_YLIM_R = 1e-8, 4e-5
diff --git a/shapepipe/modules/mccd_package/mccd_plot_utilities.py b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
index 1d3eb9f14..907709f20 100644
--- a/shapepipe/modules/mccd_package/mccd_plot_utilities.py
+++ b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
@@ -21,11 +21,13 @@
 from astropy.io import fits
 from stile.sys_tests import BaseCorrelationFunctionSysTest
 
+from shear_psf_leakage.rho_tau_stat import RhoStat
+
 # Define the backend for matplotlib
-mpl.use('agg')
+mpl.use("agg")
 
 # MegaCam -> plt.subplot correspondance, as given by:
-'''        'COMMENT Unique detector IDs for MegaCam',
+"""        'COMMENT Unique detector IDs for MegaCam',
            'COMMENT (North on top, East to the left)',
            'COMMENT    --------------------------',
            'COMMENT    ba ba ba ba ba ba ba ba ba',
@@ -40,7 +42,7 @@
            'COMMENT    27 28 29 30 31 32 33 34 35',
            'COMMENT    ab ab ab ab ab ab ab ab ab',
            'COMMENT    __________________________'
-'''
+"""
 
 
 def megacam_pos(index):
@@ -136,12 +138,7 @@ def megacam_flip_2(xbins, ybins, ccd_nb, nb_pixel):
 
 
 def mean_shapes_plot(
-    ccd_maps,
-    filename,
-    title='',
-    colorbar_ampl=1.0,
-    wind=None,
-    cmap='bwr'
+    ccd_maps, filename, title="", colorbar_ampl=1.0, wind=None, cmap="bwr"
 ):
     r"""Mean Shapes Plot.
 
@@ -166,8 +163,10 @@ def mean_shapes_plot(
     """
     # colorbar amplitude
     if wind is None:
-        vmax = max(
-            np.nanmax(ccd_maps), np.abs(np.nanmin(ccd_maps))) * colorbar_ampl
+        vmax = (
+            max(np.nanmax(ccd_maps), np.abs(np.nanmin(ccd_maps)))
+            * colorbar_ampl
+        )
         vmin = -vmax * colorbar_ampl
     else:
         vmin, vmax = wind[0] * colorbar_ampl, wind[1] * colorbar_ampl
@@ -176,24 +175,20 @@ def mean_shapes_plot(
     fig, axes = plt.subplots(nrows=4, ncols=11, figsize=(18, 12), dpi=400)
     # remove corner axes (above and below ears)
     for j in [0, 10, -1, -11]:
-        axes.flat[j].axis('off')
+        axes.flat[j].axis("off")
     for ccd_nb, ccd_map in enumerate(ccd_maps):
         ax = axes.flat[megacam_pos(ccd_nb)]
         im = ax.imshow(
-            ccd_map.T,
-            cmap=cmap,
-            interpolation='Nearest',
-            vmin=vmin,
-            vmax=vmax
+            ccd_map.T, cmap=cmap, interpolation="Nearest", vmin=vmin, vmax=vmax
         )
         ax.set_xticks([])
         ax.set_yticks([])
-        ax.set_title(f'rmse={np.sqrt(np.nanmean(ccd_map ** 2)):.3e}', size=8)
+        ax.set_title(f"rmse={np.sqrt(np.nanmean(ccd_map ** 2)):.3e}", size=8)
     plt.suptitle(title, size=20)  # TODO: fix title
     fig.subplots_adjust(right=0.8)
     cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
     fig.colorbar(im, cax=cbar_ax)
-    plt.savefig(f'{filename}.png')
+    plt.savefig(f"{filename}.png")
     plt.close()
 
 
@@ -206,7 +201,7 @@ def plot_meanshapes(
     remove_outliers=False,
     plot_meanshapes=True,
     plot_histograms=True,
-    psf_model_type='mccd',
+    psf_model_type="mccd",
     max_e=None,
     max_de=None,
     min_r2=None,
@@ -260,38 +255,43 @@ def plot_meanshapes(
     starcat = fits.open(starcat_path, memmap=False)
 
     auto_colorbar = False
-    colorbar_ampl = 1.
+    colorbar_ampl = 1.0
     loc2glob = mccd_utils.Loc2Glob()
 
     # MegaCam: each CCD is 2048x4612
-    grid = np.linspace(0, loc2glob.x_npix, nb_pixel[0] + 1), \
-        np.linspace(0, loc2glob.y_npix, nb_pixel[1] + 1)
+    grid = np.linspace(0, loc2glob.x_npix, nb_pixel[0] + 1), np.linspace(
+        0, loc2glob.y_npix, nb_pixel[1] + 1
+    )
 
     # Flag mask
-    star_flags = starcat[hdu_no].data['FLAG_STAR_HSM']
-    psf_flags = starcat[hdu_no].data['FLAG_PSF_HSM']
+    star_flags = starcat[hdu_no].data["FLAG_STAR_HSM"]
+    psf_flags = starcat[hdu_no].data["FLAG_PSF_HSM"]
     flagmask = np.abs(star_flags - 1) * np.abs(psf_flags - 1)
 
     # convert sigma to R^2's
-    all_star_shapes = np.array([
-        starcat[hdu_no].data['E1_STAR_HSM'],
-        starcat[hdu_no].data['E2_STAR_HSM'],
-        2. * starcat[hdu_no].data['SIGMA_STAR_HSM'] ** 2
-    ])
-    all_psf_shapes = np.array([
-        starcat[hdu_no].data['E1_PSF_HSM'],
-        starcat[hdu_no].data['E2_PSF_HSM'],
-        2. * starcat[hdu_no].data['SIGMA_PSF_HSM'] ** 2
-    ])
-    all_CCDs = starcat[hdu_no].data['CCD_NB']
-    all_X = starcat[hdu_no].data['X']
-    all_Y = starcat[hdu_no].data['Y']
+    all_star_shapes = np.array(
+        [
+            starcat[hdu_no].data["E1_STAR_HSM"],
+            starcat[hdu_no].data["E2_STAR_HSM"],
+            2.0 * starcat[hdu_no].data["SIGMA_STAR_HSM"] ** 2,
+        ]
+    )
+    all_psf_shapes = np.array(
+        [
+            starcat[hdu_no].data["E1_PSF_HSM"],
+            starcat[hdu_no].data["E2_PSF_HSM"],
+            2.0 * starcat[hdu_no].data["SIGMA_PSF_HSM"] ** 2,
+        ]
+    )
+    all_CCDs = starcat[hdu_no].data["CCD_NB"]
+    all_X = starcat[hdu_no].data["X"]
+    all_Y = starcat[hdu_no].data["Y"]
 
     # Remove stars/PSFs where the measured size is zero
     # Sometimes the HSM shape measurement gives objects with measured
     # size equals to zero without an error Flag.
-    bad_stars = (abs(all_star_shapes[2, :]) < 0.1)
-    bad_psfs = (abs(all_psf_shapes[2, :]) < 0.1)
+    bad_stars = abs(all_star_shapes[2, :]) < 0.1
+    bad_psfs = abs(all_psf_shapes[2, :]) < 0.1
     size_mask = np.abs(bad_stars) * np.abs(bad_psfs)
     # Remove outlier stars/PSFs
     all_star_shapes = all_star_shapes[:, ~size_mask]
@@ -304,8 +304,8 @@ def plot_meanshapes(
     # Remove stars/PSFs where the measured size is zero
     # Sometimes the HSM shape measurement gives objects with measured
     # size equals to zero without an error Flag.
-    bad_stars = (abs(all_star_shapes[2, :]) < 0.1)
-    bad_psfs = (abs(all_psf_shapes[2, :]) < 0.1)
+    bad_stars = abs(all_star_shapes[2, :]) < 0.1
+    bad_psfs = abs(all_psf_shapes[2, :]) < 0.1
     size_mask = np.abs(bad_stars) * np.abs(bad_psfs)
     # Remove outlier stars/PSFs
     all_star_shapes = all_star_shapes[:, ~size_mask]
@@ -316,14 +316,13 @@ def plot_meanshapes(
     flagmask = flagmask[~size_mask]
 
     if remove_outliers:
-        shape_std_max = 5.
+        shape_std_max = 5.0
         # Outlier rejection based on the size
-        R2_thresh = (
-            shape_std_max * np.std(all_star_shapes[2, :])
-            + np.mean(all_star_shapes[2, :])
+        R2_thresh = shape_std_max * np.std(all_star_shapes[2, :]) + np.mean(
+            all_star_shapes[2, :]
         )
-        bad_stars = (abs(all_star_shapes[2, :]) > R2_thresh)
-        w_log.info(f'Nb of outlier stars: {np.sum(bad_stars):d}')
+        bad_stars = abs(all_star_shapes[2, :]) > R2_thresh
+        w_log.info(f"Nb of outlier stars: {np.sum(bad_stars):d}")
         # Remove outlier PSFs
         all_star_shapes = all_star_shapes[:, ~bad_stars]
         all_psf_shapes = all_psf_shapes[:, ~bad_stars]
@@ -351,17 +350,17 @@ def plot_meanshapes(
     for ccd_nb, ccd_map in enumerate(ccd_maps):
 
         # handle different input catalogue types
-        if psf_model_type == 'mccd':
+        if psf_model_type == "mccd":
 
-            ccd_mask = (
-                ((all_CCDs.astype(int) == ccd_nb) * flagmask).astype(bool)
+            ccd_mask = ((all_CCDs.astype(int) == ccd_nb) * flagmask).astype(
+                bool
             )
 
             # Calculate shift to go from global coordinates to local
             # coordinates
             x_shift, y_shift = loc2glob.shift_coord(ccd_nb)
 
-        elif psf_model_type == 'psfex':
+        elif psf_model_type == "psfex":
 
             ccd_mask = ((all_CCDs == str(ccd_nb)) * flagmask).astype(bool)
 
@@ -370,14 +369,14 @@ def plot_meanshapes(
 
         else:
 
-            raise ValueError(f'Invalid psf model type {psf_model_type}')
+            raise ValueError(f"Invalid psf model type {psf_model_type}")
 
         star_shapes = all_star_shapes[:, ccd_mask]
         psf_shapes = all_psf_shapes[:, ccd_mask]
 
         xs_loc, ys_loc = all_X[ccd_mask] - x_shift, all_Y[ccd_mask] - y_shift
 
-        if psf_model_type == 'mccd':
+        if psf_model_type == "mccd":
             # swap axes to match CCD orientation and origin convention
             ys_loc = loc2glob.y_npix - ys_loc + 1
 
@@ -385,7 +384,7 @@ def plot_meanshapes(
         xbins = np.digitize(xs_loc, grid[0])
         ybins = np.digitize(ys_loc, grid[1])
 
-        if psf_model_type == 'psfex':
+        if psf_model_type == "psfex":
             xbins, ybins = megacam_flip(xbins, ybins, ccd_nb, nb_pixel)
 
         for xb in range(nb_pixel[0]):
@@ -407,38 +406,32 @@ def plot_meanshapes(
         else:
             vmax = max(
                 np.nanmax(ccd_maps[:, :, 0]),
-                np.abs(np.nanmin(ccd_maps[:, :, 0]))
+                np.abs(np.nanmin(ccd_maps[:, :, 0])),
             )
         vmin = -vmax
         wind = [vmin, vmax]
         title = (
-            f'e_1 (stars), std={np.nanstd(ccd_maps[:, 0, 0]):.5e}\n'
-            + f'vmax={np.nanmax(abs(ccd_maps[:, 0, 0])):.4e}'
+            f"e_1 (stars), std={np.nanstd(ccd_maps[:, 0, 0]):.5e}\n"
+            + f"vmax={np.nanmax(abs(ccd_maps[:, 0, 0])):.4e}"
         )
         mean_shapes_plot(
-            ccd_maps[:, 0, 0],
-            output_path + 'e1s',
-            title,
-            wind=wind
+            ccd_maps[:, 0, 0], output_path + "e1s", title, wind=wind
         )
 
         title = (
-            f'e_1 (model), std={np.nanstd(ccd_maps[:, 1, 0]):.5e}\n'
-            + f'vmax={np.nanmax(abs(ccd_maps[:, 1, 0])):.4e}'
+            f"e_1 (model), std={np.nanstd(ccd_maps[:, 1, 0]):.5e}\n"
+            + f"vmax={np.nanmax(abs(ccd_maps[:, 1, 0])):.4e}"
         )
         mean_shapes_plot(
-            ccd_maps[:, 1, 0],
-            output_path + 'e1m',
-            title,
-            wind=wind
+            ccd_maps[:, 1, 0], output_path + "e1m", title, wind=wind
         )
 
         if auto_colorbar:
             wind = None
         e1_res = ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0]
         e1_res = e1_res[~np.isnan(e1_res)]
-        rmse_e1 = np.sqrt(np.mean(e1_res ** 2))
-        w_log.info(f'Bins: e1 residual RMSE: {rmse_e1:.6f}\n')
+        rmse_e1 = np.sqrt(np.mean(e1_res**2))
+        w_log.info(f"Bins: e1 residual RMSE: {rmse_e1:.6f}\n")
         if max_de:
             vmax = max_de
         else:
@@ -446,15 +439,15 @@ def plot_meanshapes(
         vmin = -vmax
         wind = [vmin, vmax]
         title = (
-            f'e_1 res, rmse={rmse_e1:.5e}\nvmax={vmax:.4e} , '
-            + f'std={np.nanstd(ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0]):.5e}'
+            f"e_1 res, rmse={rmse_e1:.5e}\nvmax={vmax:.4e} , "
+            + f"std={np.nanstd(ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0]):.5e}"
         )
         mean_shapes_plot(
             ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0],
-            output_path + 'e1res',
+            output_path + "e1res",
             title,
             wind=wind,
-            colorbar_ampl=colorbar_ampl
+            colorbar_ampl=colorbar_ampl,
         )
 
         # e_2
@@ -463,39 +456,33 @@ def plot_meanshapes(
         else:
             vmax = max(
                 np.nanmax(ccd_maps[:, :, 1]),
-                np.abs(np.nanmin(ccd_maps[:, :, 1]))
+                np.abs(np.nanmin(ccd_maps[:, :, 1])),
             )
         vmin = -vmax
         wind = [vmin, vmax]
         title = (
-            f'e_2 (stars), std={np.nanstd(ccd_maps[:, 0, 1]):.5e}\n'
-            + f'vmax={np.nanmax(abs(ccd_maps[:, 0, 1])):.4e}'
+            f"e_2 (stars), std={np.nanstd(ccd_maps[:, 0, 1]):.5e}\n"
+            + f"vmax={np.nanmax(abs(ccd_maps[:, 0, 1])):.4e}"
         )
         mean_shapes_plot(
-            ccd_maps[:, 0, 1],
-            output_path + 'e2s',
-            title,
-            wind=wind
+            ccd_maps[:, 0, 1], output_path + "e2s", title, wind=wind
         )
         title = (
-            f'e_2 (model), std={np.nanstd(ccd_maps[:, 1, 1]):.5e}\n'
-            + f'vmax={np.nanmax(abs(ccd_maps[:, 1, 1])):.4e}'
+            f"e_2 (model), std={np.nanstd(ccd_maps[:, 1, 1]):.5e}\n"
+            + f"vmax={np.nanmax(abs(ccd_maps[:, 1, 1])):.4e}"
         )
         mean_shapes_plot(
-            ccd_maps[:, 1, 1],
-            output_path + 'e2m',
-            title,
-            wind=wind
+            ccd_maps[:, 1, 1], output_path + "e2m", title, wind=wind
         )
 
         if auto_colorbar:
             wind = None
-            colorbar_ampl = 1.
+            colorbar_ampl = 1.0
 
         e2_res = ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1]
         e2_res = e2_res[~np.isnan(e2_res)]
-        rmse_e2 = np.sqrt(np.mean(e2_res ** 2))
-        w_log.info(f'Bins: e2 residual RMSE: {rmse_e2:.6f}\n')
+        rmse_e2 = np.sqrt(np.mean(e2_res**2))
+        w_log.info(f"Bins: e2 residual RMSE: {rmse_e2:.6f}\n")
         if max_de:
             vmax = max_de
         else:
@@ -503,15 +490,15 @@ def plot_meanshapes(
         vmin = -vmax
         wind = [vmin, vmax]
         title = (
-            f'e_2 res, rmse={rmse_e2:.5e}\nvmax={vmax:.4e} , '
-            + f'std={np.nanstd(ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1]):.5e}'
+            f"e_2 res, rmse={rmse_e2:.5e}\nvmax={vmax:.4e} , "
+            + f"std={np.nanstd(ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1]):.5e}"
         )
         mean_shapes_plot(
             ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1],
-            output_path + 'e2res',
+            output_path + "e2res",
             title,
             wind=wind,
-            colorbar_ampl=colorbar_ampl
+            colorbar_ampl=colorbar_ampl,
         )
 
         # R^2
@@ -526,47 +513,48 @@ def plot_meanshapes(
         wind = [vmin, vmax]
         colorbar_ampl = 1
         title = (
-            f'R_2 (stars), std={np.nanstd(ccd_maps[:, 0, 2]):.5e}\n'
-            + f'vmax={np.nanmax(abs(ccd_maps[:, 0, 2])):.4e}'
+            f"R_2 (stars), std={np.nanstd(ccd_maps[:, 0, 2]):.5e}\n"
+            + f"vmax={np.nanmax(abs(ccd_maps[:, 0, 2])):.4e}"
         )
         mean_shapes_plot(
             ccd_maps[:, 0, 2],
-            output_path + 'R2s',
+            output_path + "R2s",
             title,
             wind=wind,
-            cmap='Reds'
+            cmap="Reds",
         )
         title = (
-            f'R_2 (model), std={np.nanstd(ccd_maps[:, 1, 2]):.5e}\n'
-            + f'vmax={np.nanmax(abs(ccd_maps[:, 1, 2])):.4e}'
+            f"R_2 (model), std={np.nanstd(ccd_maps[:, 1, 2]):.5e}\n"
+            + f"vmax={np.nanmax(abs(ccd_maps[:, 1, 2])):.4e}"
         )
         mean_shapes_plot(
             ccd_maps[:, 1, 2],
-            output_path + 'R2m',
+            output_path + "R2m",
             title,
             wind=wind,
-            cmap='Reds'
+            cmap="Reds",
         )
 
         if auto_colorbar:
             wind = [
                 0,
-                np.nanmax(np.abs(
-                    (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2]
-                ))
+                np.nanmax(
+                    np.abs(
+                        (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2])
+                        / ccd_maps[:, 0, 2]
+                    )
+                ),
             ]
-            colorbar_ampl = 1.
+            colorbar_ampl = 1.0
         R2_res = (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2]
         R2_res = R2_res[~np.isnan(R2_res)]
-        rmse_r2 = np.sqrt(np.mean(R2_res ** 2))
+        rmse_r2 = np.sqrt(np.mean(R2_res**2))
         w_log.info(f"Bins: R2 residual RMSE: {rmse_r2:.6f}\n")
         if max_dr2:
             vmax = max_dr2
         else:
             vmax = np.nanmax(
-                abs(
-                    (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2]
-                )
+                abs((ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2])
             )
         wind = [0, vmax]
         std_title = np.nanstd(
@@ -580,26 +568,23 @@ def plot_meanshapes(
             title = "Outliers removed\n" + title
 
         mean_shapes_plot(
-            np.abs(
-                (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2])
-                / ccd_maps[:, 0, 2]
-            ),
-            output_path + 'R2res',
+            np.abs((ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2]),
+            output_path + "R2res",
             title,
             wind=wind,
             colorbar_ampl=colorbar_ampl,
-            cmap='Reds'
+            cmap="Reds",
         )
 
         # nstars
         wind = (0, np.max(ccd_maps[:, 0, 3]))
-        title = f'Number of stars\nTotal={np.nansum(ccd_maps[:, 0, 3]):.0f}'
+        title = f"Number of stars\nTotal={np.nansum(ccd_maps[:, 0, 3]):.0f}"
         mean_shapes_plot(
             ccd_maps[:, 0, 3],
-            f'{output_path}nstar',
+            f"{output_path}nstar",
             title,
             wind=wind,
-            cmap='magma'
+            cmap="magma",
         )
 
     # Histograms
@@ -610,19 +595,19 @@ def plot_meanshapes(
             all_star_shapes[0, :],
             bins=hist_bins,
             range=[-0.2, 0.2],
-            label='stars',
-            alpha=0.5
+            label="stars",
+            alpha=0.5,
         )
         plt.hist(
             all_psf_shapes[0, :],
             bins=hist_bins,
             range=[-0.2, 0.2],
-            label='PSFs',
-            alpha=0.5
+            label="PSFs",
+            alpha=0.5,
         )
-        plt.legend(loc='best', fontsize=16)
-        plt.title('e1', fontsize=24)
-        plt.savefig(f'{output_path}e1_hist.png')
+        plt.legend(loc="best", fontsize=16)
+        plt.title("e1", fontsize=24)
+        plt.savefig(f"{output_path}e1_hist.png")
         plt.close()
 
         plt.figure(figsize=(12, 6), dpi=300)
@@ -631,12 +616,12 @@ def plot_meanshapes(
             data_hist,
             bins=hist_bins,
             range=[np.min(data_hist), np.max(data_hist)],
-            label='err(star - psf)',
-            alpha=0.5
+            label="err(star - psf)",
+            alpha=0.5,
         )
-        plt.legend(loc='best', fontsize=16)
-        plt.title('e1 err', fontsize=24)
-        plt.savefig(output_path + 'err_e1_hist.png')
+        plt.legend(loc="best", fontsize=16)
+        plt.title("e1 err", fontsize=24)
+        plt.savefig(output_path + "err_e1_hist.png")
         plt.close()
 
         plt.figure(figsize=(12, 6), dpi=300)
@@ -644,19 +629,19 @@ def plot_meanshapes(
             all_star_shapes[1, :],
             bins=hist_bins,
             range=[-0.2, 0.2],
-            label='stars',
-            alpha=0.5
+            label="stars",
+            alpha=0.5,
         )
         plt.hist(
             all_psf_shapes[1, :],
             bins=hist_bins,
             range=[-0.2, 0.2],
-            label='PSFs',
-            alpha=0.5
+            label="PSFs",
+            alpha=0.5,
         )
-        plt.legend(loc='best', fontsize=16)
-        plt.title('e2', fontsize=24)
-        plt.savefig(output_path + 'e2_hist.png')
+        plt.legend(loc="best", fontsize=16)
+        plt.title("e2", fontsize=24)
+        plt.savefig(output_path + "e2_hist.png")
         plt.close()
 
         plt.figure(figsize=(12, 6), dpi=300)
@@ -665,12 +650,12 @@ def plot_meanshapes(
             data_hist,
             bins=hist_bins,
             range=[np.min(data_hist), np.max(data_hist)],
-            label='err(star - psf)',
-            alpha=0.5
+            label="err(star - psf)",
+            alpha=0.5,
         )
-        plt.legend(loc='best', fontsize=16)
-        plt.title('e2 err', fontsize=24)
-        plt.savefig(output_path + 'err_e2_hist.png')
+        plt.legend(loc="best", fontsize=16)
+        plt.title("e2 err", fontsize=24)
+        plt.savefig(output_path + "err_e2_hist.png")
         plt.close()
 
         plt.figure(figsize=(12, 6), dpi=300)
@@ -680,36 +665,35 @@ def plot_meanshapes(
             all_star_shapes[2, :],
             bins=hist_bins,
             range=wind,
-            label='stars',
-            alpha=0.5
+            label="stars",
+            alpha=0.5,
         )
         plt.hist(
             all_psf_shapes[2, :],
             bins=hist_bins,
             range=wind,
-            label='PSFs',
-            alpha=0.5
+            label="PSFs",
+            alpha=0.5,
         )
-        plt.legend(loc='best', fontsize=16)
-        plt.title('R2', fontsize=24)
-        plt.savefig(output_path + 'R2_hist.png')
+        plt.legend(loc="best", fontsize=16)
+        plt.title("R2", fontsize=24)
+        plt.savefig(output_path + "R2_hist.png")
         plt.close()
 
         plt.figure(figsize=(12, 6), dpi=300)
         data_hist = (
-            (all_star_shapes[2, :] - all_psf_shapes[2, :])
-            / all_star_shapes[2, :]
-        )
+            all_star_shapes[2, :] - all_psf_shapes[2, :]
+        ) / all_star_shapes[2, :]
         plt.hist(
             data_hist,
             bins=hist_bins,
             range=[np.min(data_hist), np.max(data_hist)],
-            label='err(star - psf)/star',
-            alpha=0.5
+            label="err(star - psf)/star",
+            alpha=0.5,
         )
-        plt.legend(loc='best', fontsize=16)
-        plt.title('R2 err', fontsize=24)
-        plt.savefig(output_path + 'err_R2_hist.png')
+        plt.legend(loc="best", fontsize=16)
+        plt.title("R2 err", fontsize=24)
+        plt.savefig(output_path + "err_R2_hist.png")
         plt.close()
 
     starcat.close()
@@ -720,15 +704,15 @@ def neg_dash(
     x_in,
     y_in,
     yerr_in,
-    plot_name='',
+    plot_name="",
     vertical_lines=True,
-    xlabel='',
-    ylabel='',
-    rho_nb='',
+    xlabel="",
+    ylabel="",
+    rho_nb="",
     ylim=None,
     semilogx=False,
     semilogy=False,
-    **kwargs
+    **kwargs,
 ):
     r"""Neg Dash.
 
@@ -770,14 +754,19 @@ def neg_dash(
     # catch and separate errorbar-specific keywords from Lines2D ones
     safekwargs = dict(kwargs)
     errbkwargs = dict()
-    if 'linestyle' in kwargs.keys():
+    if "linestyle" in kwargs.keys():
         print(
-            'Warning: linestyle was provided but that would kind of defeat'
-            + 'the purpose, so I will just ignore it. Sorry.'
+            "Warning: linestyle was provided but that would kind of defeat"
+            + "the purpose, so I will just ignore it. Sorry."
         )
-        del safekwargs['linestyle']
+        del safekwargs["linestyle"]
     for errorbar_kword in [
-        'fmt', 'ecolor', 'elinewidth', 'capsize', 'barsabove', 'errorevery'
+        "fmt",
+        "ecolor",
+        "elinewidth",
+        "capsize",
+        "barsabove",
+        "errorevery",
     ]:
         if errorbar_kword in kwargs.keys():
             # posfmt = '-'+kwargs['fmt']
@@ -795,7 +784,7 @@ def neg_dash(
                 x[:first_change],
                 y[:first_change],
                 yerr=yerr[:first_change],
-                linestyle='-',
+                linestyle="-",
                 **errbkwargs,
             )
             if vertical_lines:
@@ -803,14 +792,14 @@ def neg_dash(
                     x[first_change - 1],
                     0,
                     y[first_change - 1],
-                    linestyle='-',
+                    linestyle="-",
                     **safekwargs,
                 )
                 plt.vlines(
                     x[first_change],
                     0,
                     np.abs(y[first_change]),
-                    linestyle='--',
+                    linestyle="--",
                     **safekwargs,
                 )
         else:
@@ -818,7 +807,7 @@ def neg_dash(
                 x[:first_change],
                 np.abs(y[:first_change]),
                 yerr=yerr[:first_change],
-                linestyle='--',
+                linestyle="--",
                 **errbkwargs,
             )
             if vertical_lines:
@@ -826,14 +815,14 @@ def neg_dash(
                     x[first_change - 1],
                     0,
                     np.abs(y[first_change - 1]),
-                    linestyle='--',
+                    linestyle="--",
                     **safekwargs,
                 )
                 plt.vlines(
                     x[first_change],
                     0,
                     y[first_change],
-                    linestyle='-',
+                    linestyle="-",
                     **safekwargs,
                 )
         x = x[first_change:]
@@ -843,18 +832,19 @@ def neg_dash(
         first_change = np.argmax(current_sign * y < 0)
     # one last time when `first_change'==0 ie no more changes:
     if rho_nb:
-        lab = fr'$\rho_{rho_nb}(\theta)$'
+        lab = rf"$\rho_{rho_nb}(\theta)$"
     else:
-        lab = ''
+        lab = ""
     if current_sign > 0:
-        plt.errorbar(x, y, yerr=yerr, linestyle='-', label=lab, **errbkwargs)
+        plt.errorbar(x, y, yerr=yerr, linestyle="-", label=lab, **errbkwargs)
     else:
-        plt.errorbar(x, np.abs(y), yerr=yerr, linestyle='--', label=lab,
-                     **errbkwargs)
+        plt.errorbar(
+            x, np.abs(y), yerr=yerr, linestyle="--", label=lab, **errbkwargs
+        )
     if semilogx:
-        plt.xscale('log')
+        plt.xscale("log")
     if semilogy:
-        plt.yscale('log')
+        plt.yscale("log")
     if ylim is not None:
         plt.ylim(ylim)
     plt.xlabel(xlabel)
@@ -872,11 +862,7 @@ class new_BaseCorrelationFunctionSysTest(BaseCorrelationFunctionSysTest):
     """
 
     def make_catalogue(
-        self,
-        data,
-        config=None,
-        use_as_k=None,
-        use_chip_coords=False
+        self, data, config=None, use_as_k=None, use_chip_coords=False
     ):
         """Make Catalogue.
 
@@ -911,43 +897,45 @@ def make_catalogue(
 
         catalog_kwargs = {}
         fields = data.dtype.names
-        if 'ra' in fields and 'dec' in fields:
+        if "ra" in fields and "dec" in fields:
             if not use_chip_coords:
-                catalog_kwargs['ra'] = data['ra']
-                catalog_kwargs['dec'] = data['dec']
-            elif 'x' in fields and 'y' in fields:
-                catalog_kwargs['x'] = data['x']
-                catalog_kwargs['y'] = data['y']
+                catalog_kwargs["ra"] = data["ra"]
+                catalog_kwargs["dec"] = data["dec"]
+            elif "x" in fields and "y" in fields:
+                catalog_kwargs["x"] = data["x"]
+                catalog_kwargs["y"] = data["y"]
             else:
                 raise ValueError(
                     "Chip coordinates requested, but 'x' and 'y' fields"
-                    "not found in data")
-        elif 'x' in fields and 'y' in fields:
-            catalog_kwargs['x'] = data['x']
-            catalog_kwargs['y'] = data['y']
+                    "not found in data"
+                )
+        elif "x" in fields and "y" in fields:
+            catalog_kwargs["x"] = data["x"]
+            catalog_kwargs["y"] = data["y"]
         else:
             raise ValueError(
                 "Data must contain (ra,dec) or (x,y) in order to do"
-                "correlation function tests.")
-        if 'g1' in fields and 'g2' in fields:
-            catalog_kwargs['g1'] = data['g1']
-            catalog_kwargs['g2'] = data['g2']
-        if 'w' in fields:
-            catalog_kwargs['w'] = data['w']
+                "correlation function tests."
+            )
+        if "g1" in fields and "g2" in fields:
+            catalog_kwargs["g1"] = data["g1"]
+            catalog_kwargs["g2"] = data["g2"]
+        if "w" in fields:
+            catalog_kwargs["w"] = data["w"]
         if use_as_k:
             if use_as_k in fields:
-                catalog_kwargs['k'] = data[use_as_k]
-        elif 'k' in fields:
-            catalog_kwargs['k'] = data['k']
+                catalog_kwargs["k"] = data[use_as_k]
+        elif "k" in fields:
+            catalog_kwargs["k"] = data["k"]
         # Quirk of length-1 formatted arrays: the fields will be floats, not
         # arrays, which would break the Catalog init.
         try:
             len(data)
         except Exception:
-            if not hasattr(data, 'len') and isinstance(data, np.ndarray):
+            if not hasattr(data, "len") and isinstance(data, np.ndarray):
                 for key in catalog_kwargs:
                     catalog_kwargs[key] = np.array([catalog_kwargs[key]])
-        catalog_kwargs['config'] = config
+        catalog_kwargs["config"] = config
         return treecorr.Catalog(**catalog_kwargs)
 
 
@@ -959,19 +947,13 @@ class Rho1SysTest(new_BaseCorrelationFunctionSysTest):
 
     """
 
-    short_name = 'rho1'
-    long_name = 'Rho1 statistics (Auto-correlation of star-PSF shapes)'
-    objects_list = ['star PSF']
-    required_quantities = [('ra', 'dec', 'g1', 'g2', 'psf_g1', 'psf_g2', 'w')]
+    short_name = "rho1"
+    long_name = "Rho1 statistics (Auto-correlation of star-PSF shapes)"
+    objects_list = ["star PSF"]
+    required_quantities = [("ra", "dec", "g1", "g2", "psf_g1", "psf_g2", "w")]
 
     def __call__(
-        self,
-        data,
-        data2=None,
-        random=None,
-        random2=None,
-        config=None,
-        **kwargs
+        self, data, data2=None, random=None, random2=None, config=None, **kwargs
     ):
         """Call Method.
 
@@ -996,28 +978,28 @@ def __call__(
 
         """
         new_data = data.copy()
-        new_data['g1'] = new_data['g1'] - new_data['psf_g1']
-        new_data['g2'] = new_data['g2'] - new_data['psf_g2']
+        new_data["g1"] = new_data["g1"] - new_data["psf_g1"]
+        new_data["g2"] = new_data["g2"] - new_data["psf_g2"]
         if data2 is not None:
             new_data2 = data2.copy()
-            new_data2['g1'] = new_data2['g1'] - new_data2['psf_g1']
-            new_data2['g2'] = new_data2['g2'] - new_data2['psf_g2']
+            new_data2["g1"] = new_data2["g1"] - new_data2["psf_g1"]
+            new_data2["g2"] = new_data2["g2"] - new_data2["psf_g2"]
         else:
             new_data2 = data2
         if random is not None:
             new_random = random.copy()
-            new_random['g1'] = new_random['g1'] - new_random['psf_g1']
-            new_random['g2'] = new_random['g2'] - new_random['psf_g2']
+            new_random["g1"] = new_random["g1"] - new_random["psf_g1"]
+            new_random["g2"] = new_random["g2"] - new_random["psf_g2"]
         else:
             new_random = random
         if random2 is not None:
             new_random2 = random2.copy()
-            new_random2['g1'] = new_random2['g1'] - new_random2['psf_g1']
-            new_random2['g2'] = new_random2['g2'] - new_random2['psf_g2']
+            new_random2["g1"] = new_random2["g1"] - new_random2["psf_g1"]
+            new_random2["g2"] = new_random2["g2"] - new_random2["psf_g2"]
         else:
             new_random2 = random2
         return self.getCF(
-            'gg',
+            "gg",
             new_data,
             new_data2,
             new_random,
@@ -1035,19 +1017,13 @@ class DESRho2SysTest(new_BaseCorrelationFunctionSysTest):
 
     """
 
-    short_name = 'rho2des'
-    long_name = 'Rho2 statistics (as defined in DES shape catalogue papers)'
-    objects_list = ['star PSF']
-    required_quantities = [('ra', 'dec', 'g1', 'g2', 'psf_g1', 'psf_g2', 'w')]
+    short_name = "rho2des"
+    long_name = "Rho2 statistics (as defined in DES shape catalogue papers)"
+    objects_list = ["star PSF"]
+    required_quantities = [("ra", "dec", "g1", "g2", "psf_g1", "psf_g2", "w")]
 
     def __call__(
-        self,
-        data,
-        data2=None,
-        random=None,
-        random2=None,
-        config=None,
-        **kwargs
+        self, data, data2=None, random=None, random2=None, config=None, **kwargs
     ):
         """Call Method.
 
@@ -1072,31 +1048,31 @@ def __call__(
 
         """
         new_data = np.rec.fromarrays(
-            [data['ra'], data['dec'], data['g1'], data['g2'], data['w']],
-            names=['ra', 'dec', 'g1', 'g2', 'w'],
+            [data["ra"], data["dec"], data["g1"], data["g2"], data["w"]],
+            names=["ra", "dec", "g1", "g2", "w"],
         )
         if data2 is None:
             data2 = data
         new_data2 = np.rec.fromarrays(
             [
-                data2['ra'],
-                data2['dec'],
-                data2['g1'] - data2['psf_g1'],
-                data2['g2'] - data2['psf_g2'],
-                data2['w']
+                data2["ra"],
+                data2["dec"],
+                data2["g1"] - data2["psf_g1"],
+                data2["g2"] - data2["psf_g2"],
+                data2["w"],
             ],
-            names=['ra', 'dec', 'g1', 'g2', 'w'],
+            names=["ra", "dec", "g1", "g2", "w"],
         )
         if random is not None:
             new_random = np.rec.fromarrays(
                 [
-                    random['ra'],
-                    random['dec'],
-                    random['g1'],
-                    random['g2'],
-                    random['w']
+                    random["ra"],
+                    random["dec"],
+                    random["g1"],
+                    random["g2"],
+                    random["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w'],
+                names=["ra", "dec", "g1", "g2", "w"],
             )
 
         else:
@@ -1106,24 +1082,24 @@ def __call__(
         if random2 is not None:
             new_random2 = np.rec.fromarrays(
                 [
-                    data2['ra'],
-                    data2['dec'],
-                    data2['g1'] - data2['psf_g1'],
-                    data2['g2'] - data2['psf_g2'],
-                    data2['w']
+                    data2["ra"],
+                    data2["dec"],
+                    data2["g1"] - data2["psf_g1"],
+                    data2["g2"] - data2["psf_g2"],
+                    data2["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w'],
+                names=["ra", "dec", "g1", "g2", "w"],
             )
         else:
             new_random2 = random2
         return self.getCF(
-            'gg',
+            "gg",
             new_data,
             new_data2,
             new_random,
             new_random2,
             config=config,
-            **kwargs
+            **kwargs,
         )
 
 
@@ -1134,24 +1110,16 @@ class DESRho3SysTest(new_BaseCorrelationFunctionSysTest):
 
     """
 
-    short_name = 'rho3'
+    short_name = "rho3"
     long_name = (
-        'Rho3 statistics (Auto-correlation of star shapes weighted by '
-        + 'the residual size)'
+        "Rho3 statistics (Auto-correlation of star shapes weighted by "
+        + "the residual size)"
     )
-    objects_list = ['star PSF']
-    required_quantities = [
-        ('ra', 'dec', 'sigma', 'g1', 'g2', 'psf_sigma', 'w')
-    ]
+    objects_list = ["star PSF"]
+    required_quantities = [("ra", "dec", "sigma", "g1", "g2", "psf_sigma", "w")]
 
     def __call__(
-        self,
-        data,
-        data2=None,
-        random=None,
-        random2=None,
-        config=None,
-        **kwargs
+        self, data, data2=None, random=None, random2=None, config=None, **kwargs
     ):
         """Call Method.
 
@@ -1176,24 +1144,33 @@ def __call__(
 
         """
         new_data = np.rec.fromarrays(
-            [data['ra'], data['dec'],
-             data['g1'] * (data['sigma'] - data[
-                 'psf_sigma']) / data['sigma'],
-             data['g2'] * (data['sigma'] - data[
-                 'psf_sigma']) / data['sigma'],
-             data['w']],
-            names=['ra', 'dec', 'g1', 'g2', 'w']
+            [
+                data["ra"],
+                data["dec"],
+                data["g1"]
+                * (data["sigma"] - data["psf_sigma"])
+                / data["sigma"],
+                data["g2"]
+                * (data["sigma"] - data["psf_sigma"])
+                / data["sigma"],
+                data["w"],
+            ],
+            names=["ra", "dec", "g1", "g2", "w"],
         )
         if data2 is not None:
             new_data2 = np.rec.fromarrays(
                 [
-                    data2['ra'], data2['dec'],
-                    data2['g1'] * (data2['sigma'] - data2['psf_sigma'])
-                    / data2['sigma'],
-                    data2['g2'] * (data2['sigma'] - data2['psf_sigma'])
-                    / data2['sigma'],
-                    data2['w']],
-                names=['ra', 'dec', 'g1', 'g2', 'w']
+                    data2["ra"],
+                    data2["dec"],
+                    data2["g1"]
+                    * (data2["sigma"] - data2["psf_sigma"])
+                    / data2["sigma"],
+                    data2["g2"]
+                    * (data2["sigma"] - data2["psf_sigma"])
+                    / data2["sigma"],
+                    data2["w"],
+                ],
+                names=["ra", "dec", "g1", "g2", "w"],
             )
 
         else:
@@ -1201,14 +1178,17 @@ def __call__(
         if random is not None:
             new_random = np.rec.fromarrays(
                 [
-                    random['ra'], random['dec'],
-                    random['g1'] * (random['sigma'] - random['psf_sigma'])
-                    / random['sigma'],
-                    random['g2'] * (random['sigma'] - random['psf_sigma'])
-                    / random['sigma'],
-                    random['w']
+                    random["ra"],
+                    random["dec"],
+                    random["g1"]
+                    * (random["sigma"] - random["psf_sigma"])
+                    / random["sigma"],
+                    random["g2"]
+                    * (random["sigma"] - random["psf_sigma"])
+                    / random["sigma"],
+                    random["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w']
+                names=["ra", "dec", "g1", "g2", "w"],
             )
         else:
             new_random = random
@@ -1216,27 +1196,30 @@ def __call__(
         if random2 is not None:
             new_random2 = np.rec.fromarrays(
                 [
-                    random2['ra'], random2['dec'],
-                    random2['g1'] * (random2['sigma'] - random2['psf_sigma'])
-                    / random2['sigma'],
-                    random2['g2'] * (random2['sigma'] - random2['psf_sigma'])
-                    / random2['sigma'],
-                    random2['w']
+                    random2["ra"],
+                    random2["dec"],
+                    random2["g1"]
+                    * (random2["sigma"] - random2["psf_sigma"])
+                    / random2["sigma"],
+                    random2["g2"]
+                    * (random2["sigma"] - random2["psf_sigma"])
+                    / random2["sigma"],
+                    random2["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w']
+                names=["ra", "dec", "g1", "g2", "w"],
             )
 
         else:
             new_random2 = random2
 
         return self.getCF(
-            'gg',
+            "gg",
             new_data,
             new_data2,
             new_random,
             new_random2,
             config=config,
-            **kwargs
+            **kwargs,
         )
 
 
@@ -1247,24 +1230,18 @@ class DESRho4SysTest(new_BaseCorrelationFunctionSysTest):
 
     """
 
-    short_name = 'rho4'
+    short_name = "rho4"
     long_name = (
-        'Rho4 statistics (Correlation of residual star shapes weighted '
-        + 'by residual size)'
+        "Rho4 statistics (Correlation of residual star shapes weighted "
+        + "by residual size)"
     )
-    objects_list = ['star PSF']
-    required_quantities = [(
-        'ra', 'dec', 'g1', 'g2', 'sigma', 'psf_g1', 'psf_g2', 'psf_sigma', 'w'
-    )]
+    objects_list = ["star PSF"]
+    required_quantities = [
+        ("ra", "dec", "g1", "g2", "sigma", "psf_g1", "psf_g2", "psf_sigma", "w")
+    ]
 
     def __call__(
-        self,
-        data,
-        data2=None,
-        random=None,
-        random2=None,
-        config=None,
-        **kwargs
+        self, data, data2=None, random=None, random2=None, config=None, **kwargs
     ):
         """Call Method.
 
@@ -1290,38 +1267,40 @@ def __call__(
         """
         new_data = np.rec.fromarrays(
             [
-                data['ra'],
-                data['dec'],
-                data['g1'] - data['psf_g1'],
-                data['g2'] - data['psf_g2'],
-                data['w']
+                data["ra"],
+                data["dec"],
+                data["g1"] - data["psf_g1"],
+                data["g2"] - data["psf_g2"],
+                data["w"],
             ],
-            names=['ra', 'dec', 'g1', 'g2', 'w'],
+            names=["ra", "dec", "g1", "g2", "w"],
         )
         if data2 is None:
             data2 = data
         new_data2 = np.rec.fromarrays(
             [
-                data2['ra'],
-                data2['dec'],
-                data2['g1'] * (data2['sigma'] - data2['psf_sigma'])
-                / data2['sigma'],
-                data2['g2'] * (data2['sigma'] - data2['psf_sigma'])
-                / data2['sigma'],
-                data2['w']
+                data2["ra"],
+                data2["dec"],
+                data2["g1"]
+                * (data2["sigma"] - data2["psf_sigma"])
+                / data2["sigma"],
+                data2["g2"]
+                * (data2["sigma"] - data2["psf_sigma"])
+                / data2["sigma"],
+                data2["w"],
             ],
-            names=['ra', 'dec', 'g1', 'g2', 'w'],
+            names=["ra", "dec", "g1", "g2", "w"],
         )
         if random is not None:
             new_random = np.rec.fromarrays(
                 [
-                    random['ra'],
-                    random['dec'],
-                    random['g1'] - random['psf_g1'],
-                    random['g2'] - random['psf_g2'],
-                    random['w']
+                    random["ra"],
+                    random["dec"],
+                    random["g1"] - random["psf_g1"],
+                    random["g2"] - random["psf_g2"],
+                    random["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w'],
+                names=["ra", "dec", "g1", "g2", "w"],
             )
         else:
             new_random = random
@@ -1330,25 +1309,28 @@ def __call__(
         if random2 is not None:
             new_random2 = np.rec.fromarrays(
                 [
-                    random2['ra'], random2['dec'],
-                    random2['g1'] * (random2['sigma'] - random2['psf_sigma'])
-                    / random2['sigma'],
-                    random2['g2'] * (random2['sigma'] - random2['psf_sigma'])
-                    / random2['sigma'],
-                    random2['w']
+                    random2["ra"],
+                    random2["dec"],
+                    random2["g1"]
+                    * (random2["sigma"] - random2["psf_sigma"])
+                    / random2["sigma"],
+                    random2["g2"]
+                    * (random2["sigma"] - random2["psf_sigma"])
+                    / random2["sigma"],
+                    random2["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w']
+                names=["ra", "dec", "g1", "g2", "w"],
             )
         else:
             new_random2 = random2
         return self.getCF(
-            'gg',
+            "gg",
             new_data,
             new_data2,
             new_random,
             new_random2,
             config=config,
-            **kwargs
+            **kwargs,
         )
 
 
@@ -1359,24 +1341,16 @@ class DESRho5SysTest(new_BaseCorrelationFunctionSysTest):
 
     """
 
-    short_name = 'rho5'
+    short_name = "rho5"
     long_name = (
-        'Rho5 statistics (Correlation of star and PSF shapes weighted by '
-        'residual size)'
+        "Rho5 statistics (Correlation of star and PSF shapes weighted by "
+        "residual size)"
     )
-    objects_list = ['star PSF']
-    required_quantities = [
-        ('ra', 'dec', 'sigma', 'g1', 'g2', 'psf_sigma', 'w')
-    ]
+    objects_list = ["star PSF"]
+    required_quantities = [("ra", "dec", "sigma", "g1", "g2", "psf_sigma", "w")]
 
     def __call__(
-        self,
-        data,
-        data2=None,
-        random=None,
-        random2=None,
-        config=None,
-        **kwargs
+        self, data, data2=None, random=None, random2=None, config=None, **kwargs
     ):
         """Call Method.
 
@@ -1402,34 +1376,36 @@ def __call__(
 
         """
         new_data = np.rec.fromarrays(
-            [data['ra'], data['dec'], data['g1'], data['g2'], data['w']],
-            names=['ra', 'dec', 'g1', 'g2', 'w'],
+            [data["ra"], data["dec"], data["g1"], data["g2"], data["w"]],
+            names=["ra", "dec", "g1", "g2", "w"],
         )
         if data2 is None:
             data2 = data
         new_data2 = np.rec.fromarrays(
             [
-                data2['ra'],
-                data2['dec'],
-                data2['g1'] * (data2['sigma'] - data2['psf_sigma'])
-                / data2['sigma'],
-                data2['g2'] * (data2['sigma'] - data2['psf_sigma'])
-                / data2['sigma'],
-                data2['w']
+                data2["ra"],
+                data2["dec"],
+                data2["g1"]
+                * (data2["sigma"] - data2["psf_sigma"])
+                / data2["sigma"],
+                data2["g2"]
+                * (data2["sigma"] - data2["psf_sigma"])
+                / data2["sigma"],
+                data2["w"],
             ],
-            names=['ra', 'dec', 'g1', 'g2', 'w'],
+            names=["ra", "dec", "g1", "g2", "w"],
         )
 
         if random is not None:
             new_random = np.rec.fromarrays(
                 [
-                    random['ra'],
-                    random['dec'],
-                    random['g1'],
-                    random['g2'],
-                    random['w']
+                    random["ra"],
+                    random["dec"],
+                    random["g1"],
+                    random["g2"],
+                    random["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w'],
+                names=["ra", "dec", "g1", "g2", "w"],
             )
         else:
             new_random = random
@@ -1438,38 +1414,67 @@ def __call__(
         if random2 is not None:
             new_random2 = np.rec.fromarrays(
                 [
-                    random2['ra'],
-                    random2['dec'],
-                    random2['g1'] * (random2['sigma'] - random2['psf_sigma'])
-                    / random2['sigma'],
-                    random2['g2'] * (random2['sigma'] - random2['psf_sigma'])
-                    / random2['sigma'],
-                    random2['w']
+                    random2["ra"],
+                    random2["dec"],
+                    random2["g1"]
+                    * (random2["sigma"] - random2["psf_sigma"])
+                    / random2["sigma"],
+                    random2["g2"]
+                    * (random2["sigma"] - random2["psf_sigma"])
+                    / random2["sigma"],
+                    random2["w"],
                 ],
-                names=['ra', 'dec', 'g1', 'g2', 'w'],
+                names=["ra", "dec", "g1", "g2", "w"],
             )
 
         else:
             new_random2 = random2
         return self.getCF(
-            'gg',
+            "gg",
             new_data,
             new_data2,
             new_random,
             new_random2,
             config=config,
-            **kwargs
+            **kwargs,
         )
 
 
+def get_params_rho():
+
+    params = {}
+
+    params["patch_number"] = 50
+
+    params["ra_col"] = "RA"
+    params["dec_col"] = "DEC"
+
+    pass
+    # params["dec_col"] = "DEC"
+    params["e1_PSF_col"] = "E1_PSF_HSM"
+    params["e2_PSF_col"] = "E2_PSF_HSM"
+    params["e1_star_col"] = "E1_STAR_HSM"
+    params["e2_star_col"] = "E2_STAR_HSM"
+    params["PSF_size"] = "SIGMA_PSF_HSM"
+    params["star_size"] = "SIGMA_STAR_HSM"
+    params["PSF_flag"] = "FLAG_PSF_HSM"
+    params["star_flag"] = "FLAG_STAR_HSM"
+    params["ra_units"] = "deg"
+    params["dec_units"] = "deg"
+
+    params["w_col"] = None
+
+    return params
+
+
 def rho_stats(
     starcat_path,
     output_path,
-    rho_def='HSC',
+    rho_def="HSC",
     hdu_no=2,
     ylim_l=None,
     ylim_r=None,
-    print_fun=lambda x: print(x)
+    print_fun=lambda x: print(x),
 ):
     """Rho Statistics.
 
@@ -1491,58 +1496,57 @@ def rho_stats(
         Output message function; default is ``print``
 
     """
-    # Read starcat
-    starcat = fits.open(starcat_path, memmap=False)
-
-    rho_stats_fun = None
-
-    # Convert HSM flags to 0/1 weights
-    star_flags = starcat[hdu_no].data['FLAG_STAR_HSM']
-    psf_flags = starcat[hdu_no].data['FLAG_PSF_HSM']
-    w = np.abs(star_flags - 1) * np.abs(psf_flags - 1)
-
-    # Convert to Stile-compatible and change sigmas to R^2 (up to constant)
-    stilecat = np.rec.fromarrays(
-        [
-            w,
-            starcat[hdu_no].data['RA'],
-            starcat[hdu_no].data['DEC'],
-            starcat[hdu_no].data['E1_STAR_HSM'],
-            starcat[hdu_no].data['E2_STAR_HSM'],
-            starcat[hdu_no].data['SIGMA_STAR_HSM'] ** 2,
-            starcat[hdu_no].data['E1_PSF_HSM'],
-            starcat[hdu_no].data['E2_PSF_HSM'],
-            starcat[hdu_no].data['SIGMA_PSF_HSM'] ** 2
-        ],
-        names=[
-            'w',
-            'ra',
-            'dec',
-            'g1',
-            'g2',
-            'sigma',
-            'psf_g1',
-            'psf_g2',
-            'psf_sigma'
-        ],
-    )
+    if rho_def != "UNIONS":
+        # Read starcat
+        starcat = fits.open(starcat_path, memmap=False)
+        rho_stats_fun = None
+        # Convert HSM flags to 0/1 weights
+        star_flags = starcat[hdu_no].data["FLAG_STAR_HSM"]
+        psf_flags = starcat[hdu_no].data["FLAG_PSF_HSM"]
+        w = np.abs(star_flags - 1) * np.abs(psf_flags - 1)
+
+        # Convert to Stile-compatible and change sigmas to R^2 (up to constant)
+        stilecat = np.rec.fromarrays(
+            [
+                w,
+                starcat[hdu_no].data["RA"],
+                starcat[hdu_no].data["DEC"],
+                starcat[hdu_no].data["E1_STAR_HSM"],
+                starcat[hdu_no].data["E2_STAR_HSM"],
+                starcat[hdu_no].data["SIGMA_STAR_HSM"] ** 2,
+                starcat[hdu_no].data["E1_PSF_HSM"],
+                starcat[hdu_no].data["E2_PSF_HSM"],
+                starcat[hdu_no].data["SIGMA_PSF_HSM"] ** 2,
+            ],
+            names=[
+                "w",
+                "ra",
+                "dec",
+                "g1",
+                "g2",
+                "sigma",
+                "psf_g1",
+                "psf_g2",
+                "psf_sigma",
+            ],
+        )
 
     # TreeCorr config:
     TreeCorrConfig = {
-        'ra_units': 'degrees',
-        'dec_units': 'degrees',
-        'max_sep': 3e2,
-        'min_sep': 5e-1,
-        'sep_units': 'arcmin',
-        'nbins': 32
+        "ra_units": "degrees",
+        "dec_units": "degrees",
+        "max_sep": 3e2,
+        "min_sep": 5e-1,
+        "sep_units": "arcmin",
+        "nbins": 32,
     }
 
     # Ininitialize all 5 rho stats
-    if rho_def == 'HSC':
+    if rho_def == "HSC":
         rho_stats_fun = [
-            stile.CorrelationFunctionSysTest(f'Rho{j}') for j in range(1, 6)
+            stile.CorrelationFunctionSysTest(f"Rho{j}") for j in range(1, 6)
         ]
-    elif rho_def == 'DES':
+    elif rho_def == "DES":
         rho_stats_fun = [
             Rho1SysTest(),
             DESRho2SysTest(),
@@ -1550,36 +1554,68 @@ def rho_stats(
             DESRho4SysTest(),
             DESRho5SysTest(),
         ]
+    elif rho_def == "UNIONS":
+        rho_stat_handler = RhoStat(
+            output=out_path,
+            treecorr_config=TreeCorrConfig,
+            verbose=True,
+        )
+
+        # Set parameters
+        params = get_params_rho()
+        rho_stat_handler.catalogs.set_params(params, out_path)
+
+        # Build catalogues
+        mask = True
+        square_size = True
+        ver = "id"
+        rho_stat_handler.build_cat_to_compute_rho(
+            starcat_path,
+            catalog_id=ver,
+            square_size=square_size,
+            mask=mask,
+            hdu=hdu_no,
+        )
+
+        # Compute and save rho stats
+        def only_p(corrs):
+            return np.array([corr.xip for corr in corrs]).flatten()
+
+        rho_stat_handler.compute_rho_stats(
+            ver, out_base, save_cov=True, func=only_p, var_method="bootstrap"
+        )
+
+    if rho_def == "UNIONS":
+        return
 
     for rho in rho_stats_fun:
         print_fun(rho.required_quantities)
 
     # Compute them!
-    print_fun(' > Computing rho statistics...')
+    print_fun(" > Computing rho statistics...")
     start = time.time()
     rho_results = [
-        rho_stat(stilecat, config=TreeCorrConfig)
-        for rho_stat in rho_stats_fun
+        rho_stat(stilecat, config=TreeCorrConfig) for rho_stat in rho_stats_fun
     ]
-    print_fun(f' > Done in {time.time() - start}s.')
-    np.save(output_path + 'rho_stat_results.npy', np.array(rho_results))
+    print_fun(f" > Done in {time.time() - start}s.")
+    np.save(output_path + "rho_stat_results.npy", np.array(rho_results))
 
     # Plots
     ylims = [ylim_l, ylim_r, ylim_l, ylim_l, ylim_r]
-    colors = ['blue', 'red', 'green', 'orange', 'cyan']
-    markers = ['o', 'd', 'v', '^', 's']
+    colors = ["blue", "red", "green", "orange", "cyan"]
+    markers = ["o", "d", "v", "^", "s"]
 
-    xlabel = r'$\theta$ [arcmin]'
-    ylabel = r'$\rho$-statistics'
+    xlabel = r"$\theta$ [arcmin]"
+    ylabel = r"$\rho$-statistics"
     capsize = 3
     alpha = 0.7
 
     for j, rhores in enumerate(rho_results):
         neg_dash(
-            rhores['meanr'],
-            rhores['xip'],
-            rhores['sigma_xip'],
-            f'{output_path}/rho_{j+1}.png',
+            rhores["meanr"],
+            rhores["xip"],
+            rhores["sigma_xip"],
+            f"{output_path}/rho_{j+1}.png",
             semilogx=True,
             semilogy=True,
             color=colors[j],
@@ -1588,15 +1624,15 @@ def rho_stats(
             alpha=alpha,
             ylim=ylims[j],
             xlabel=xlabel,
-            ylabel=ylabel
+            ylabel=ylabel,
         )
 
     for j, rhores in enumerate(rho_results):
         if j in [0, 2, 3]:
             neg_dash(
-                rhores['meanr'],
-                rhores['xip'],
-                rhores['sigma_xip'],
+                rhores["meanr"],
+                rhores["xip"],
+                rhores["sigma_xip"],
                 semilogx=True,
                 semilogy=True,
                 rho_nb=j + 1,
@@ -1606,18 +1642,18 @@ def rho_stats(
                 alpha=alpha,
                 ylim=ylims[j],
                 xlabel=xlabel,
-                ylabel=ylabel
+                ylabel=ylabel,
             )
     plt.legend()
-    plt.savefig(f'{output_path}/lefthand_rhos.pdf')
+    plt.savefig(f"{output_path}/lefthand_rhos.pdf")
     plt.close()
 
     for j, rhores in enumerate(rho_results):
         if j in [1, 4]:
             neg_dash(
-                rhores['meanr'],
-                rhores['xip'],
-                rhores['sigma_xip'],
+                rhores["meanr"],
+                rhores["xip"],
+                rhores["sigma_xip"],
                 semilogx=True,
                 semilogy=True,
                 rho_nb=j + 1,
@@ -1627,10 +1663,10 @@ def rho_stats(
                 alpha=alpha,
                 ylim=ylims[j],
                 xlabel=xlabel,
-                ylabel=ylabel
+                ylabel=ylabel,
             )
     plt.legend()
-    plt.savefig(f'{output_path}/righthand_rhos.pdf')
+    plt.savefig(f"{output_path}/righthand_rhos.pdf")
     plt.close()
 
     starcat.close()

From 69d78fb7f4dc42df4cec97bec02644793f8ac7c4 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 14 Jun 2024 16:05:50 +0000
Subject: [PATCH 171/207] canfar doc updated

---
 docs/source/pipeline_canfar.md | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 235c5f1de..9885efeef 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -70,7 +70,7 @@ combine_runs.bash -c flag_exp
 
 
 # Tile detection
-curl_canfar_local.sh -j 16 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
+curl_canfar_local.sh -j 16 -f tile_numbers.txt -p $psf -N $N_SMP
 
 
 # Exposure detection
@@ -78,21 +78,21 @@ curl_canfar_local.sh -j 16 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
 ~/shapepipe/scripts/python/summary_run.py
 
 cp summary/missing_job_32_sextractor.txt all.txt
-curl_canfar_local.sh -j 32 -f all.txt -k exp -p $psf -N $N_SMP
+curl_canfar_local.sh -j 32 -f all.txt -p $psf -N $N_SMP
 
 # Tile preparation
-curl_canfar_local.sh -j 64 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
+curl_canfar_local.sh -j 64 -f tile_numbers.txt -p $psf -N $N_SMP
 
 # Tile shape measurement
-curl_canfar_local.sh -j 128 -f tile_numbers.txt -k tile -p $psf -N 8
+curl_canfar_local.sh -j 128 -f tile_numbers.txt -p $psf -N 8
 
 # Merge subcatalogues
-curl_canfar_local.sh -j 256 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
+curl_canfar_local.sh -j 256 -f tile_numbers.txt -p $psf -N $N_SMP
 
 # Create final cat
-curl_canfar_local.sh -j 512 -f tile_numbers.txt -k tile -p $psf -N $N_SMP
+curl_canfar_local.sh -j 512 -f tile_numbers.txt -p $psf -N $N_SMP
 # Run in parallel
-cat mc.txt | xargs -I {} -P 16 bash -c 'init_run_exclusive_canfar.sh -p psfex -j 512 -e {} --n_smp 1 -k tile'
+cat mc.txt | xargs -I {} -P 16 bash -c 'init_run_exclusive_canfar.sh -p psfex -j 512 -e {} --n_smp 1'
 
 # Combine all final cats in common output dir as links
 combine_runs.bash -c final -p psfex
@@ -127,8 +127,8 @@ SESSION=https://ws-uv.canfar.net/skaha/v0/session
 for ID in `cat session_IDs.txt`; do echo $ID; curl -X DELETE -E $SSL $SESSION/$ID; done
 
 ## Run in terminal in parallel (-e needs to be last arg)
-cat all.txt | xargs -P 16 -n 1  init_run_exclusive_canfar.sh -j 64 -p psfex -k tile -f summary/missing_job_64_all.txt -n -e
+cat all.txt | xargs -P 16 -n 1  init_run_exclusive_canfar.sh -j 64 -p psfex -f summary/missing_job_64_all.txt -n -e
 
 ## Get missing jobs that are not currently running
 stats_jobs_canfar.sh
-grep -F -v -f jobs_running.txt summary/missing_job_128_ngmix_runner_3.txt | wc > all3.txt
+grep -F -v -f jobs_running.txt summary/missing_job_128_ngmix_runner_3.txt > all3.txt

From 2f1126075a3aa24614d73e81be692d814b3875be Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 14 Jun 2024 16:06:39 +0000
Subject: [PATCH 172/207] cleaned up rho stats code

---
 .../mccd_package/mccd_plot_utilities.py       | 27 ++++++++++++-------
 shapepipe/modules/mccd_plots_runner.py        |  8 +++---
 2 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/shapepipe/modules/mccd_package/mccd_plot_utilities.py b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
index 1d3eb9f14..e23f54879 100644
--- a/shapepipe/modules/mccd_package/mccd_plot_utilities.py
+++ b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
@@ -1496,23 +1496,30 @@ def rho_stats(
 
     rho_stats_fun = None
 
+    if len(starcat) <= hdu_no:
+        raise IndexError(
+            f"Input file {starcat_path} does not have HDU #{hdu_no}"
+        )
+    data = starcat[hdu_no].data
+
     # Convert HSM flags to 0/1 weights
-    star_flags = starcat[hdu_no].data['FLAG_STAR_HSM']
-    psf_flags = starcat[hdu_no].data['FLAG_PSF_HSM']
+    star_flags = data['FLAG_STAR_HSM']
+    psf_flags = data['FLAG_PSF_HSM']
     w = np.abs(star_flags - 1) * np.abs(psf_flags - 1)
 
+
     # Convert to Stile-compatible and change sigmas to R^2 (up to constant)
     stilecat = np.rec.fromarrays(
         [
             w,
-            starcat[hdu_no].data['RA'],
-            starcat[hdu_no].data['DEC'],
-            starcat[hdu_no].data['E1_STAR_HSM'],
-            starcat[hdu_no].data['E2_STAR_HSM'],
-            starcat[hdu_no].data['SIGMA_STAR_HSM'] ** 2,
-            starcat[hdu_no].data['E1_PSF_HSM'],
-            starcat[hdu_no].data['E2_PSF_HSM'],
-            starcat[hdu_no].data['SIGMA_PSF_HSM'] ** 2
+            data['RA'],
+            data['DEC'],
+            data['E1_STAR_HSM'],
+            data['E2_STAR_HSM'],
+            data['SIGMA_STAR_HSM'] ** 2,
+            data['E1_PSF_HSM'],
+            data['E2_PSF_HSM'],
+            data['SIGMA_PSF_HSM'] ** 2
         ],
         names=[
             'w',
diff --git a/shapepipe/modules/mccd_plots_runner.py b/shapepipe/modules/mccd_plots_runner.py
index 1c80505b7..71afe8669 100644
--- a/shapepipe/modules/mccd_plots_runner.py
+++ b/shapepipe/modules/mccd_plots_runner.py
@@ -152,11 +152,9 @@ def mccd_plots_runner(
     if plot_rho_stats:
         if has_stile is False or has_treecorr is False:
             msg = (
-                '[!] In order to calculate the Rho stats the packages '
-                + '_stile_ and _treecorr_ have to be correctly imported.'
-                + ' This was not the case, so the rho stat calculation is'
-                + 'aborted. For the next time make sure both of the'
-                + 'packages are installed.'
+                '[!] To calculate the rho stats the packages '
+                + 'stile and treecorr are required. However, '
+                + f' treecorr: {has_treecorr}, stile: {has_stile}.'
             )
             warnings.warn(msg)
             w_log.info(msg)

From a92236b42166c238a6b956d18a99242ac1e3806a Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 14 Jun 2024 16:06:56 +0000
Subject: [PATCH 173/207] rho stats testing

---
 example/cfis/config_Pl_psfex.ini | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/example/cfis/config_Pl_psfex.ini b/example/cfis/config_Pl_psfex.ini
index 08ca41edd..b78d0d42f 100644
--- a/example/cfis/config_Pl_psfex.ini
+++ b/example/cfis/config_Pl_psfex.ini
@@ -35,7 +35,7 @@ LOG_NAME = log_sp
 RUN_LOG_NAME = log_run_sp
 
 # Input directory, containing input files, single string or list of names
-INPUT_DIR = .
+INPUT_DIR = $SP_RUN/output
 
 # Output directory
 OUTPUT_DIR = $SP_RUN/output
@@ -60,10 +60,12 @@ NUMBERING_SCHEME = -0000000
 FILE_PATTERN = full_starcat
 FILE_EXT = .fits
 
-HDU = 1
+HDU = 2
 
 PSF = psfex
-PLOT_MEANSHAPES = True
+
+# was True
+PLOT_MEANSHAPES = False
 X_GRID = 5
 Y_GRID = 10
 
@@ -74,7 +76,8 @@ MIN_R2 = 4.5
 MAX_R2 = 7
 MAX_DR2 = 0.03
 
-PLOT_HISTOGRAMS = True
+#  was True
+PLOT_HISTOGRAMS = False
 REMOVE_OUTLIERS = False
 
 # X_GRID, Y_GRID: correspond to the number of bins in each direction of each
@@ -84,7 +87,7 @@ REMOVE_OUTLIERS = False
 # before drawing the plots.
 
 PLOT_RHO_STATS = True
-RHO_STATS_STYLE = HSC
+RHO_STATS_STYLE = DES
 
 RHO_STATS_YLIM_L = 1e-10, 4e-5
 RHO_STATS_YLIM_R = 1e-8, 4e-5

From 67a5d44ef004013b74c74702abe886e7d56df252 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 14 Jun 2024 16:07:45 +0000
Subject: [PATCH 174/207] added -p psf to curl and init scripts (to test\!); -m
 MH

---
 scripts/sh/curl_canfar_local.sh         | 14 ++++++++---
 scripts/sh/curl_canfar_monitor_local.sh |  4 ++--
 scripts/sh/init_canfar_remote.sh        | 13 ----------
 scripts/sh/init_run_canfar.sh           | 21 ----------------
 scripts/sh/init_run_exclusive_canfar.sh | 32 ++++++++++++++++++++-----
 scripts/sh/job_sp_canfar.bash           |  1 +
 6 files changed, 40 insertions(+), 45 deletions(-)
 delete mode 100755 scripts/sh/init_canfar_remote.sh
 delete mode 100755 scripts/sh/init_run_canfar.sh

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index af4b4399b..12e46cd35 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -11,6 +11,7 @@ NAME=shapepipe
 
 ## Default values
 job=-1
+psf="psfex"
 ID=-1
 file_IDs=-1
 N_SMP=1
@@ -19,8 +20,6 @@ cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 batch_max=200
 dry_run=0
 
-# TODO psf
-
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
 \n\nOptions:\n
@@ -61,6 +60,10 @@ while [ $# -gt 0 ]; do
       job="$2"
       shift
       ;;
+    -p|--psf)
+      job="$2"
+      shift
+      ;;
     -e|--exclusive)
       ID="$2"
       shift
@@ -95,6 +98,11 @@ if [ "$ID" == "-1" ] && [ "$file_IDs" == "-1" ]; then
   echo "No image ID(s) indicated, use option -e ID or -f file_IDs"                                   
   exit 3                                                                        
 fi                                                                              
+
+if [ "$psf" != "psfex" ] && [ "$psf" != "mccd" ]; then
+  echo "PSF (option -p) needs to be 'psfex' or 'mccd'"
+  exit 4
+fi
                                                                                 
 if [ "$dry_run" != 0 ] && [ "$dry_run" != 1 ] && [ "$dry_run" != 2 ]; then
   echo "Invalid dry_run option, allowed are 0, 1, and 2"
@@ -115,7 +123,7 @@ dir=`pwd`
 
 # Return argument for local script to be called via curl
 function set_arg() {
-  my_arg="-j $job -e $ID -N $N_SMP $arg_dry_run -d $dir"
+  my_arg="-j $job -p $psf -e $ID -N $N_SMP $arg_dry_run -d $dir"
   echo $my_arg
 }
 
diff --git a/scripts/sh/curl_canfar_monitor_local.sh b/scripts/sh/curl_canfar_monitor_local.sh
index 793d80262..d2b115c1f 100755
--- a/scripts/sh/curl_canfar_monitor_local.sh
+++ b/scripts/sh/curl_canfar_monitor_local.sh
@@ -9,7 +9,7 @@ type=$1
 
 echo "type=$type"
 
-for session_ID in `cat session_IDs.txt`; do
+for session_ID in `cat ids.txt`; do
   cmd="curl -E $SSL $SESSION/$session_ID?view=$type"
   echo $cmd
   $cmd
@@ -18,7 +18,7 @@ done
 exit 0
 
 while [ 1 ]; do
-  session_ID=`tail -n 1 session_IDs.txt`
+  session_ID=`tail -n 1 ids.txt`
   cmd="curl -E $SSL $SESSION/$session_ID?view=$type"
   echo $cmd
   $cmd
diff --git a/scripts/sh/init_canfar_remote.sh b/scripts/sh/init_canfar_remote.sh
deleted file mode 100755
index 8229aff23..000000000
--- a/scripts/sh/init_canfar_remote.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-echo "start init canfar"
-
-#echo init_canfar > ~/init_canfar.log
-#date >> ~/init_canfar.log
-
-. /opt/conda/etc/profile.d/conda.sh
-
-source activate shapepipe
-
-echo "end init canfar"
-
diff --git a/scripts/sh/init_run_canfar.sh b/scripts/sh/init_run_canfar.sh
deleted file mode 100755
index 1945d69fc..000000000
--- a/scripts/sh/init_run_canfar.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-
-echo "start init canfar"
-
-#echo init_canfar > ~/init_canfar.log
-#date >> ~/init_canfar.log
-
-. /opt/conda/etc/profile.d/conda.sh
-
-conda activate shapepipe
-
-cd cosmostat/P3_v2/psfex 
-
-tile_ID=$1
-n_SMP=$2
-echo "tile_ID=$tile_ID n_SMP=$n_SMP"
-
-job_sp $tile_ID -p psfex -j 8 -n $n_SMP
-
-echo "end init canfar"
-
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 893b67f1c..75583e5ce 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -13,12 +13,10 @@ dir=`pwd`
 
 # mh_local is 0 (1) if merge_header_runner is run on all exposures,
 # which is standard so far (run on exposures of given tile only; new)
-mh_local=1
+mh_local=0
 VERBOSE=1
 
 
-# TODO: psf
-
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
 \n\nOptions:\n
@@ -28,6 +26,8 @@ usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
     \timage ID\n
    -p, --psf MODEL\n
     \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
+   -m, --mh_local MH\n
+   \tmerged header file local (MH=0) or global (MH=1); default is $MH\n
    -N, --N_SMP N_SMOp\n
     \tnumber of jobs (SMP mode only), default from original config files\n
    -d, --directory\n
@@ -57,6 +57,14 @@ while [ $# -gt 0 ]; do
       ID="$2"                                                            
       shift                                                                     
       ;;
+    -p|--psf)                                                                   
+      psf="$2"                                                                  
+      shift                                                                     
+      ;; 
+    -m|--mh_local)                                                                   
+      mh_local="$2"                                                                  
+      shift                                                                     
+      ;; 
     -N|--N_SMP)                                                                 
       N_SMP="$2"                                                                
       shift                                                                     
@@ -72,7 +80,7 @@ while [ $# -gt 0 ]; do
   shift                                                                         
 done
 
-# Check options
+## Check options
 if [ "$job" == "-1" ]; then
   echo "No job indicated, use option -j"
   exit 2
@@ -83,6 +91,16 @@ if [ "$exclusive" == "-1" ]; then
   exit 3
 fi
 
+if [ "$psf" != "psfex" ] && [ "$psf" != "mccd" ]; then
+  echo "PSF (option -p) needs to be 'psfex' or 'mccd'"
+  exit 4
+fi
+
+if [ "$mh_local" != "0" ] && [ "$mh_local" != "1" ]; then
+  echo "MH (option -m) needs to be 0 or 1"
+  exit 5
+fi
+
 # Functions
 
 ## Print string, executes command, and prints return value.
@@ -237,8 +255,7 @@ if [ "$mh_local" == "1" ] && [ $do_job != 0 ]; then
 
   echo "Creating local mh file"
 
-  # Remove previous Sextractor run and (local) split_exp dir
-  command "rm -rf run_sp_tile_Sx_*" $dry_run
+  # Remove previous (local) split_exp dir
   command "rm -rf run_sp_exp_Sp" $dry_run
 
   # Create new split exp run dir
@@ -258,6 +275,9 @@ if [ "$mh_local" == "1" ] && [ $do_job != 0 ]; then
   export SP_RUN=`pwd`
   command "shapepipe_run -c cfis/config_exp_Mh.ini" $dry_run
   cd output
+
+  # Remove previous Sextractor run
+  command "rm -rf run_sp_tile_Sx_*" $dry_run
 fi
 
 # Update links to exposure run directories, which were created in job 32
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 88ceae36c..7c7b50681 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -164,6 +164,7 @@ export VCP="vcp --certfile=$CERTFILE"
 
 # Print string, executes command, and prints return value.
 function command () {
+   echo "MKDEBUG job_sp_canfar command ($1)"
    cmd=$1
    str=$2
 

From 5109bed8cfb0b1bd2fd15cc2e329f3b7ea864cc4 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 14 Jun 2024 17:11:11 +0000
Subject: [PATCH 175/207] cgf file INPUT updated

---
 example/cfis/config_Pl_mccd.ini | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/example/cfis/config_Pl_mccd.ini b/example/cfis/config_Pl_mccd.ini
index a666d09dd..844246019 100644
--- a/example/cfis/config_Pl_mccd.ini
+++ b/example/cfis/config_Pl_mccd.ini
@@ -35,7 +35,7 @@ LOG_NAME = log_sp
 RUN_LOG_NAME = log_run_sp
 
 # Input directory, containing input files, single string or list of names
-INPUT_DIR = .
+INPUT_DIR = $SP_RUN/output
 
 # Output directory
 OUTPUT_DIR = $SP_RUN/output

From 5226a0af3971ae440a91358d3cbeb087700c9198 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Sat, 15 Jun 2024 18:04:59 +0000
Subject: [PATCH 176/207] rho stats plots added UNIONS option
 (shear_psf_leakage)

---
 environment.yml                               |  9 ++++----
 example/cfis/config_Pl_psfex.ini              |  1 +
 .../mccd_package/mccd_plot_utilities.py       | 22 +++++++++++++------
 shapepipe/modules/mccd_plots_runner.py        |  6 ++---
 4 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/environment.yml b/environment.yml
index 548c7e618..34bb57f71 100644
--- a/environment.yml
+++ b/environment.yml
@@ -6,22 +6,23 @@ dependencies:
   - pip>=21.2.4
   - astromatic-psfex==3.21.1
   - astromatic-source-extractor==2.25.0
-  - astropy==5.1
+  - astropy==5.2
   - automake
   - autoconf
   - cmake
   - galsim
   - joblib
   - libtool
-  - matplotlib
-  - numba
-  - numpy==1.22
+  - matplotlib==3.8.4
+  - numba==0.58.1
+  - numpy==1.26.4
   - pip:
     - cs_util
     - modopt
     - PyQt5
     - pyqtgraph
     - reproject
+    - shear_psf_leakage
     - skaha
     - sip_tpv
     - sf_tools
diff --git a/example/cfis/config_Pl_psfex.ini b/example/cfis/config_Pl_psfex.ini
index 37d490777..8f078597f 100644
--- a/example/cfis/config_Pl_psfex.ini
+++ b/example/cfis/config_Pl_psfex.ini
@@ -57,6 +57,7 @@ TIMEOUT = 96:00:00
 # NUMBERING_SCHEME (optional) string with numbering pattern for input files
 NUMBERING_SCHEME = -0000000
 
+#FILE_PATTERN = test
 FILE_PATTERN = full_starcat
 FILE_EXT = .fits
 
diff --git a/shapepipe/modules/mccd_package/mccd_plot_utilities.py b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
index 907709f20..6c074cf67 100644
--- a/shapepipe/modules/mccd_package/mccd_plot_utilities.py
+++ b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
@@ -5,7 +5,7 @@
 It can also plot the rho statistics provided that the required packages are
 installed.
 
-:Author: Tobias Liaudat
+:Authors: Tobias Liaudat, Martin Kilbinger
 
 """
 
@@ -1448,9 +1448,6 @@ def get_params_rho():
 
     params["ra_col"] = "RA"
     params["dec_col"] = "DEC"
-
-    pass
-    # params["dec_col"] = "DEC"
     params["e1_PSF_col"] = "E1_PSF_HSM"
     params["e2_PSF_col"] = "E2_PSF_HSM"
     params["e1_star_col"] = "E1_STAR_HSM"
@@ -1556,19 +1553,21 @@ def rho_stats(
         ]
     elif rho_def == "UNIONS":
         rho_stat_handler = RhoStat(
-            output=out_path,
+            output=output_path,
             treecorr_config=TreeCorrConfig,
-            verbose=True,
+            verbose=False,
         )
 
         # Set parameters
         params = get_params_rho()
-        rho_stat_handler.catalogs.set_params(params, out_path)
+        rho_stat_handler.catalogs.set_params(params, output_path)
 
         # Build catalogues
         mask = True
         square_size = True
         ver = "id"
+        out_base = f"rho_stats_{ver}.fits"
+        # TODO: deal with flags 
         rho_stat_handler.build_cat_to_compute_rho(
             starcat_path,
             catalog_id=ver,
@@ -1585,6 +1584,15 @@ def only_p(corrs):
             ver, out_base, save_cov=True, func=only_p, var_method="bootstrap"
         )
 
+        rho_stat_handler.plot_rho_stats(
+            [out_base],
+            ["b"],
+            [ver],
+            abs=False,
+            savefig='rho_stats.png',
+            legend="outside",
+        )
+
     if rho_def == "UNIONS":
         return
 
diff --git a/shapepipe/modules/mccd_plots_runner.py b/shapepipe/modules/mccd_plots_runner.py
index 71afe8669..7c7644d44 100644
--- a/shapepipe/modules/mccd_plots_runner.py
+++ b/shapepipe/modules/mccd_plots_runner.py
@@ -158,10 +158,10 @@ def mccd_plots_runner(
             )
             warnings.warn(msg)
             w_log.info(msg)
-        elif rho_stat_plot_style != 'HSC' and rho_stat_plot_style != 'DES':
+        elif rho_stat_plot_style not in ("HSC", "DES", "UNIONS"):
             msg = (
-                'The rho stat definition should be HSC or DES. An unknown'
-                + ' definition was used. Rho stat calculation aborted.'
+                f"Invalid flag RHO_STAT_STYLE={rho_stat_plot_style}, allowed"
+                + " are 'HSC', 'DES', 'UNIONS'."
             )
             warnings.warn(msg)
             w_log.info(msg)

From 5a3e89ab2d1622d07099a0000fc25d16f5119437 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Sun, 16 Jun 2024 15:11:58 +0000
Subject: [PATCH 177/207] plot rho stats for converted star cat

---
 docs/source/pipeline_canfar.md        |  3 +-
 example/cfis/config_Pl_psfex.ini      |  2 +-
 example/cfis/config_Pl_psfex_conv.ini | 93 +++++++++++++++++++++++++++
 3 files changed, 96 insertions(+), 2 deletions(-)
 create mode 100644 example/cfis/config_Pl_psfex_conv.ini

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 9885efeef..6f4f4f3e0 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -104,7 +104,8 @@ merge_final_cat -i output/run_sp_combined_final/make_catalog_runner/output -p cf
 
 # Star catalogue
 combine_runs.bash  -p $psf -c psf
-shapepipe_run -c $SP_CONFIG/config_MsPl_$psf.ini
+shapepipe_run -c $SP_CONFIG/config_Ms_$psf.ini
+shapepipe_run -c $SP_CONFIG/config_Pl_$psf.ini
 
 # Convert star cat to WCS
 ## Convert all input validation psf files and create directories par patch
diff --git a/example/cfis/config_Pl_psfex.ini b/example/cfis/config_Pl_psfex.ini
index 8f078597f..932263a18 100644
--- a/example/cfis/config_Pl_psfex.ini
+++ b/example/cfis/config_Pl_psfex.ini
@@ -12,7 +12,7 @@ VERBOSE = True
 RUN_NAME = run_sp_Pl
 
 # Add date and time to RUN_NAME, optional, default: False
-RUN_DATETIME = True
+RUN_DATETIME = False
 
 
 ## ShapePipe execution options
diff --git a/example/cfis/config_Pl_psfex_conv.ini b/example/cfis/config_Pl_psfex_conv.ini
new file mode 100644
index 000000000..de2c0679d
--- /dev/null
+++ b/example/cfis/config_Pl_psfex_conv.ini
@@ -0,0 +1,93 @@
+# ShapePipe configuration file for post-processing.
+# merge star cat and PSF plots.
+
+
+## Default ShapePipe options
+[DEFAULT]
+
+# verbose mode (optional), default: True, print messages on terminal
+VERBOSE = True
+
+# Name of run (optional) default: shapepipe_run
+RUN_NAME = run_sp_Pl
+
+# Add date and time to RUN_NAME, optional, default: False
+RUN_DATETIME = False
+
+
+## ShapePipe execution options
+[EXECUTION]
+
+# Module name, single string or comma-separated list of valid module runner names
+MODULE = mccd_plots_runner
+
+# Parallel processing mode, SMP or MPI
+MODE = SMP
+
+
+## ShapePipe file handling options
+[FILE]
+
+# Log file master name, optional, default: shapepipe
+LOG_NAME = log_sp
+
+# Runner log file name, optional, default: shapepipe_runs
+RUN_LOG_NAME = log_run_sp
+
+# Input directory, containing input files, single string or list of names
+INPUT_DIR = $SP_RUN/output
+
+# Output directory
+OUTPUT_DIR = $SP_RUN/output
+
+
+## ShapePipe job handling options
+[JOB]
+
+# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
+SMP_BATCH_SIZE = 4
+
+# Timeout value (optional), default is None, i.e. no timeout limit applied
+TIMEOUT = 96:00:00
+
+
+## Module options
+[MCCD_PLOTS_RUNNER]
+
+# NUMBERING_SCHEME (optional) string with numbering pattern for input files
+NUMBERING_SCHEME = -0000000
+
+FILE_PATTERN = full_starcat
+FILE_EXT = .fits
+
+HDU = 1
+
+PSF = psfex
+
+# was True
+PLOT_MEANSHAPES = False
+X_GRID = 5
+Y_GRID = 10
+
+# Optional: max values for elliptity and residual ellipticities
+MAX_E = 0.1
+MAX_DE = 0.01
+MIN_R2 = 4.5
+MAX_R2 = 7
+MAX_DR2 = 0.03
+
+#  was True
+PLOT_HISTOGRAMS = False
+REMOVE_OUTLIERS = False
+
+# X_GRID, Y_GRID: correspond to the number of bins in each direction of each
+# CCD from the focal plane. Ex: each CCD will be binned in 5x10 regular grids.
+#
+# REMOVE_OUTLIERS: Remove validated stars that are outliers in terms of shape
+# before drawing the plots.
+
+PLOT_RHO_STATS = True
+RHO_STATS_STYLE = UNIONS
+
+RHO_STATS_YLIM_L = 1e-10, 4e-5
+RHO_STATS_YLIM_R = 1e-8, 4e-5

From f5468d796eaf3cba1320de55fbdbc0d7707023a2 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martinkilbinger@cea.fr>
Date: Wed, 19 Jun 2024 09:14:50 +0200
Subject: [PATCH 178/207] ran black; pipeline canfar minor update

---
 docs/source/conf.py                           |  99 +--
 docs/source/pipeline_canfar.md                |   2 +-
 environment.yml                               |   2 +-
 scripts/python/canfar_avail_results.py        | 184 +++--
 scripts/python/canfar_run_analyse.py          | 156 ++--
 scripts/python/cfis_field_select.py           | 402 +++++++---
 scripts/python/convert_psf_pix2world.py       | 697 +++++++++++++++---
 scripts/python/create_sample_results.py       | 140 ++--
 scripts/python/create_star_cat.py             |  78 +-
 scripts/python/get_number_objects.py          | 112 +--
 scripts/python/link_to_exp_for_tile.py        |  70 +-
 scripts/python/merge_final_cat.py             | 138 ++--
 scripts/python/stats_global.py                | 190 +++--
 scripts/python/summary_params_pre_v2.py       |  23 +-
 scripts/python/summary_run.py                 |  18 +-
 scripts/python/update_runs_log_file.py        |  65 +-
 scripts/python/vignets2image.py               |  39 +-
 setup.py                                      |  39 +-
 shapepipe/__init__.py                         |   2 +-
 shapepipe/info.py                             |  48 +-
 shapepipe/modules/__init__.py                 |   6 +-
 shapepipe/modules/execute_example_runner.py   |  16 +-
 .../find_exposures_package/__init__.py        |   2 +-
 .../find_exposures_package/find_exposures.py  |  22 +-
 shapepipe/modules/find_exposures_runner.py    |  14 +-
 .../modules/get_images_package/__init__.py    |   2 +-
 .../modules/get_images_package/get_images.py  |  95 ++-
 shapepipe/modules/get_images_runner.py        |  57 +-
 .../modules/make_cat_package/__init__.py      |   2 +-
 .../modules/make_cat_package/make_cat.py      | 284 +++----
 shapepipe/modules/make_cat_runner.py          |  52 +-
 shapepipe/modules/mask_package/__init__.py    |   2 +-
 shapepipe/modules/mask_package/mask.py        | 584 ++++++++-------
 shapepipe/modules/mask_runner.py              |  62 +-
 .../match_external_package/__init__.py        |   2 +-
 .../match_external_package/match_external.py  |  30 +-
 shapepipe/modules/match_external_runner.py    |  55 +-
 shapepipe/modules/mccd_fit_runner.py          |  26 +-
 shapepipe/modules/mccd_fit_val_runner.py      |  33 +-
 shapepipe/modules/mccd_interp_runner.py       |  83 +--
 shapepipe/modules/mccd_package/__init__.py    |   6 +-
 .../mccd_package/mccd_interpolation_script.py | 265 ++++---
 .../mccd_package/mccd_plot_utilities.py       |   4 +-
 .../mccd_package/shapepipe_auxiliary_mccd.py  | 172 +++--
 shapepipe/modules/mccd_plots_runner.py        |  72 +-
 .../modules/mccd_preprocessing_runner.py      |  48 +-
 shapepipe/modules/mccd_val_runner.py          |  28 +-
 .../modules/merge_headers_package/__init__.py |   2 +-
 .../merge_headers_package/merge_headers.py    |   8 +-
 shapepipe/modules/merge_headers_runner.py     |  20 +-
 .../merge_sep_cats_package/__init__.py        |   2 +-
 .../merge_sep_cats_package/merge_sep_cats.py  |  27 +-
 shapepipe/modules/merge_sep_cats_runner.py    |  25 +-
 .../modules/merge_starcat_package/__init__.py |   2 +-
 .../merge_starcat_package/merge_starcat.py    | 325 ++++----
 shapepipe/modules/merge_starcat_runner.py     |  34 +-
 shapepipe/modules/module_decorator.py         |  32 +-
 shapepipe/modules/module_runners.py           |  20 +-
 shapepipe/modules/ngmix_package/__init__.py   |   2 +-
 shapepipe/modules/ngmix_package/ngmix.py      | 438 +++++------
 shapepipe/modules/ngmix_runner.py             |  36 +-
 .../modules/pastecat_package/__init__.py      |   2 +-
 .../modules/pastecat_package/pastecat.py      |  18 +-
 shapepipe/modules/pastecat_runner.py          |  50 +-
 .../modules/psfex_interp_package/__init__.py  |   2 +-
 .../psfex_interp_package/psfex_interp.py      | 376 +++++-----
 shapepipe/modules/psfex_interp_runner.py      |  45 +-
 shapepipe/modules/psfex_package/__init__.py   |   2 +-
 .../modules/psfex_package/psfex_script.py     |  35 +-
 shapepipe/modules/psfex_runner.py             |  46 +-
 .../python_example_package/__init__.py        |   2 +-
 .../python_example_package/python_example.py  |   6 +-
 shapepipe/modules/python_example_runner.py    |  36 +-
 .../modules/random_cat_package/__init__.py    |   2 +-
 .../modules/random_cat_package/random_cat.py  |  51 +-
 shapepipe/modules/random_cat_runner.py        |  35 +-
 shapepipe/modules/serial_example_runner.py    |  18 +-
 shapepipe/modules/setools_package/__init__.py |   2 +-
 shapepipe/modules/setools_package/setools.py  | 521 ++++++-------
 shapepipe/modules/setools_runner.py           |  14 +-
 .../modules/sextractor_package/__init__.py    |   2 +-
 .../sextractor_package/sextractor_script.py   | 171 ++---
 shapepipe/modules/sextractor_runner.py        |  70 +-
 .../modules/split_exp_package/__init__.py     |   2 +-
 .../modules/split_exp_package/split_exp.py    |  44 +-
 shapepipe/modules/split_exp_runner.py         |  20 +-
 .../modules/spread_model_package/__init__.py  |   2 +-
 .../spread_model_package/spread_model.py      |  78 +-
 shapepipe/modules/spread_model_runner.py      |  34 +-
 .../uncompress_fits_package/__init__.py       |   2 +-
 .../uncompress_fits.py                        |   8 +-
 shapepipe/modules/uncompress_fits_runner.py   |  22 +-
 .../modules/vignetmaker_package/__init__.py   |   2 +-
 .../vignetmaker_package/vignetmaker.py        |  61 +-
 shapepipe/modules/vignetmaker_runner.py       |  57 +-
 shapepipe/pipeline/__init__.py                |  26 +-
 shapepipe/pipeline/args.py                    |  58 +-
 shapepipe/pipeline/config.py                  |  56 +-
 shapepipe/pipeline/dependency_handler.py      |  83 ++-
 shapepipe/pipeline/execute.py                 |  20 +-
 shapepipe/pipeline/file_handler.py            | 389 +++++-----
 shapepipe/pipeline/file_io.py                 | 299 ++++----
 shapepipe/pipeline/job_handler.py             | 122 ++-
 shapepipe/pipeline/mpi_run.py                 |  20 +-
 shapepipe/pipeline/run_log.py                 |  32 +-
 shapepipe/pipeline/shared.py                  |  14 +-
 shapepipe/pipeline/str_handler.py             | 192 ++---
 shapepipe/pipeline/timeout.py                 |   3 +-
 shapepipe/pipeline/worker_handler.py          |  66 +-
 shapepipe/run.py                              |  93 +--
 shapepipe/tests/test_get_images.py            |  10 +-
 shapepipe/tests/test_pipeline.py              |   8 +-
 shapepipe/tests/test_utilities.py             |   8 +-
 shapepipe/utilities/__init__.py               |   2 +-
 shapepipe/utilities/cfis.py                   | 374 +++++-----
 shapepipe/utilities/file_system.py            |   4 +-
 shapepipe/utilities/galaxy.py                 |  16 +-
 shapepipe/utilities/summary.py                |  52 +-
 118 files changed, 5026 insertions(+), 4260 deletions(-)

diff --git a/docs/source/conf.py b/docs/source/conf.py
index a191341a1..ab410f0db 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -14,18 +14,19 @@
 #
 import os
 import sys
-sys.path.insert(0, os.path.abspath('../..'))
+
+sys.path.insert(0, os.path.abspath("../.."))
 
 # -- Project information -----------------------------------------------------
 
-project = 'ShapePipe'
-copyright = '2022, CosmoStat'
-author = 'CosmoStat'
+project = "ShapePipe"
+copyright = "2022, CosmoStat"
+author = "CosmoStat"
 
 # The short X.Y version
-version = '1.0'
+version = "1.0"
 # The full version, including alpha/beta/rc tags
-release = '1.0.1'
+release = "1.0.1"
 
 
 # -- General configuration ---------------------------------------------------
@@ -38,34 +39,34 @@
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
-    'sphinx.ext.autodoc',
-    'sphinx.ext.autosummary',
-    'sphinx.ext.coverage',
-    'sphinx.ext.doctest',
-    'sphinx.ext.ifconfig',
-    'sphinx.ext.intersphinx',
-    'sphinx.ext.mathjax',
-    'sphinx.ext.napoleon',
-    'sphinx.ext.todo',
-    'sphinx.ext.viewcode',
-    'sphinxcontrib.bibtex',
-    'myst_parser',
-    'numpydoc',
+    "sphinx.ext.autodoc",
+    "sphinx.ext.autosummary",
+    "sphinx.ext.coverage",
+    "sphinx.ext.doctest",
+    "sphinx.ext.ifconfig",
+    "sphinx.ext.intersphinx",
+    "sphinx.ext.mathjax",
+    "sphinx.ext.napoleon",
+    "sphinx.ext.todo",
+    "sphinx.ext.viewcode",
+    "sphinxcontrib.bibtex",
+    "myst_parser",
+    "numpydoc",
 ]
 
 # Include module names for objects
 add_module_names = False
 
 # Include init in class documentation.
-autoclass_content = 'class'
+autoclass_content = "class"
 
 # Audodoc options
 autodoc_default_options = {
-    'member-order': 'bysource',
-    'private-members': True,
-    'special-members': '__call__',
-    'show-inheritance': True,
-    'exclude-members': 'urand,randint'
+    "member-order": "bysource",
+    "private-members": True,
+    "special-members": "__call__",
+    "show-inheritance": True,
+    "exclude-members": "urand,randint",
 }
 
 # Generate summaries
@@ -77,56 +78,56 @@
 # The suffix(es) of source filenames.
 # You can specify multiple suffix as a list of string:
 #
-source_suffix = ['.rst', '.md']
+source_suffix = [".rst", ".md"]
 
 # The master toctree document.
-master_doc = 'index'
+master_doc = "index"
 
 # If true, sectionauthor and moduleauthor directives will be shown in the
 # output. They are ignored by default.
 show_authors = True
 
 # The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'default'
+pygments_style = "default"
 
 # If true, `todo` and `todoList` produce output, else they produce nothing.
 todo_include_todos = True
 
 # -- Options for Markdown files ----------------------------------------------
 
-myst_enable_extensions = ['html_image']
+myst_enable_extensions = ["html_image"]
 
 # -- Options for HTML output -------------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
 #
-html_theme = 'sphinx_book_theme'
+html_theme = "sphinx_book_theme"
 
 # Theme options are theme-specific and customize the look and feel of a theme
 # further.  For a list of options available for each theme, see the
 # documentation.
 #
 html_theme_options = {
-    'repository_url': 'https://github.com/CosmoStat/shapepipe',
-    'use_repository_button': True,
-    'use_issues_button': True,
-    'use_download_button': False,
-    'use_fullscreen_button': False,
-    'use_edit_page_button': True,
-    'path_to_docs': 'docs/source',
-    'extra_navbar': "<p></p>",
+    "repository_url": "https://github.com/CosmoStat/shapepipe",
+    "use_repository_button": True,
+    "use_issues_button": True,
+    "use_download_button": False,
+    "use_fullscreen_button": False,
+    "use_edit_page_button": True,
+    "path_to_docs": "docs/source",
+    "extra_navbar": "<p></p>",
 }
 html_collapsible_definitions = True
 html_awesome_headerlinks = True
 
 # The name for this set of Sphinx documents.  If None, it defaults to
 # "<project> v<release> documentation".
-html_title = '{0} v{1}'.format(project, version)
+html_title = "{0} v{1}".format(project, version)
 
 # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
 # using the given strftime format.
-html_last_updated_fmt = '%d %b, %Y'
+html_last_updated_fmt = "%d %b, %Y"
 
 # If true, SmartyPants will be used to convert quotes and dashes to
 # typographically correct entities.
@@ -142,21 +143,21 @@
 # -- Options for HTMLHelp output ---------------------------------------------
 
 # Output file base name for HTML help builder.
-htmlhelp_basename = 'ShapePipedoc'
+htmlhelp_basename = "ShapePipedoc"
 
 # -- Intersphinx Mapping ----------------------------------------------
 
 # Refer to the package libraries for type definitions
 intersphinx_mapping = {
-    'python': ('http://docs.python.org/3', None),
-    'numpy': ('https://numpy.org/doc/stable/', None),
-    'scipy': ('https://docs.scipy.org/doc/scipy/reference', None),
-    'matplotlib': ('https://matplotlib.org', None),
-    'astropy': ('http://docs.astropy.org/en/latest/', None),
+    "python": ("http://docs.python.org/3", None),
+    "numpy": ("https://numpy.org/doc/stable/", None),
+    "scipy": ("https://docs.scipy.org/doc/scipy/reference", None),
+    "matplotlib": ("https://matplotlib.org", None),
+    "astropy": ("http://docs.astropy.org/en/latest/", None),
 }
 
 # -- BibTeX Setting  ----------------------------------------------
 
-bibtex_bibfiles = ['refs.bib']
-bibtex_default_style = 'unsrt'
-bibtex_reference_style = 'author_year'
+bibtex_bibfiles = ["refs.bib"]
+bibtex_default_style = "unsrt"
+bibtex_reference_style = "author_year"
diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 6f4f4f3e0..468c5bd5f 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -111,7 +111,7 @@ shapepipe_run -c $SP_CONFIG/config_Pl_$psf.ini
 ## Convert all input validation psf files and create directories par patch
 ## psf_conv_all/P?
 cd star_cat
-convert_psf_pix2world.py -i .. -s run_sp_combined_psf
+convert_psf_pix2world.py -i .. -v -p mccd
 
 # Combine previously created files within one SP run dir
 combine_runs.bash -p psfex -c psf_conv
diff --git a/environment.yml b/environment.yml
index 34bb57f71..10682d1e0 100644
--- a/environment.yml
+++ b/environment.yml
@@ -1,4 +1,4 @@
-name: shapepipe
+name: shapepipe_v1.4
 channels:
   - conda-forge
 dependencies:
diff --git a/scripts/python/canfar_avail_results.py b/scripts/python/canfar_avail_results.py
index c44c90e31..62fbf0564 100755
--- a/scripts/python/canfar_avail_results.py
+++ b/scripts/python/canfar_avail_results.py
@@ -38,10 +38,10 @@ def params_default():
     """
 
     p_def = cfis.param(
-        input_IDs  = '.',
-        input_path = 'vos:cfis/cosmostat/kilbinger/results',
-        psf = 'mccd',
-        extension = 'tgz',
+        input_IDs=".",
+        input_path="vos:cfis/cosmostat/kilbinger/results",
+        psf="mccd",
+        extension="tgz",
     )
 
     return p_def
@@ -63,25 +63,78 @@ def parse_options(p_def):
         Command line string
     """
 
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # I/O
-    parser.add_option('-i', '--input_IDs', dest='input_IDs', type='string', default=p_def.input_IDs,
-         help='input tile ID file(s) or directory path, default=\'{}\''.format(p_def.input_IDs))
-    parser.add_option('', '--input_path', dest='input_path', type='string', default=p_def.input_path,
-         help='input path, local or vos url, default=\'{}\''.format(p_def.input_path))
-    parser.add_option('-o', '--output_not_avail', dest='output_not_avail', type='string',
-         help='output file for not-available IDs, default no output')
-
-    parser.add_option('-p', '--psf', dest='psf', type='string', default=p_def.psf,
-         help='PSF model, one in [\'psfex\'|\'mccd\'], default=\'{}\''.format(p_def.psf))
-
-    parser.add_option('-f', '--final_only', dest='final_only', action='store_true', help='only check final catalogues')
-    parser.add_option('-m', '--mask_only', dest='mask_only', action='store_true', help='only check mask files (pipeline_flag)')
-    parser.add_option('-x', '--extension', dest='extension', type='string', default=p_def.extension,
-        help=f'file extension, default=\'{p_def.extension}\'')
-    parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output')
+    parser.add_option(
+        "-i",
+        "--input_IDs",
+        dest="input_IDs",
+        type="string",
+        default=p_def.input_IDs,
+        help="input tile ID file(s) or directory path, default='{}'".format(
+            p_def.input_IDs
+        ),
+    )
+    parser.add_option(
+        "",
+        "--input_path",
+        dest="input_path",
+        type="string",
+        default=p_def.input_path,
+        help="input path, local or vos url, default='{}'".format(
+            p_def.input_path
+        ),
+    )
+    parser.add_option(
+        "-o",
+        "--output_not_avail",
+        dest="output_not_avail",
+        type="string",
+        help="output file for not-available IDs, default no output",
+    )
+
+    parser.add_option(
+        "-p",
+        "--psf",
+        dest="psf",
+        type="string",
+        default=p_def.psf,
+        help="PSF model, one in ['psfex'|'mccd'], default='{}'".format(
+            p_def.psf
+        ),
+    )
+
+    parser.add_option(
+        "-f",
+        "--final_only",
+        dest="final_only",
+        action="store_true",
+        help="only check final catalogues",
+    )
+    parser.add_option(
+        "-m",
+        "--mask_only",
+        dest="mask_only",
+        action="store_true",
+        help="only check mask files (pipeline_flag)",
+    )
+    parser.add_option(
+        "-x",
+        "--extension",
+        dest="extension",
+        type="string",
+        default=p_def.extension,
+        help=f"file extension, default='{p_def.extension}'",
+    )
+    parser.add_option(
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
+    )
 
     options, args = parser.parse_args()
 
@@ -102,12 +155,12 @@ def check_options(options):
         Result of option check. False if invalid option value.
     """
 
-    if options.psf not in ['psfex', 'mccd']:
-        print('Invalid PSF model \'{}\''.format(options.psf))
+    if options.psf not in ["psfex", "mccd"]:
+        print("Invalid PSF model '{}'".format(options.psf))
         return False
 
     if options.final_only and options.mask_only:
-        print('One one of the options \'-f\' or \'-m\' can be given')
+        print("One one of the options '-f' or '-m' can be given")
         return False
 
     return True
@@ -163,25 +216,32 @@ def read_input_files(input_path, verbose=False):
     """
 
     if os.path.isdir(input_path):
-        input_files = glob.glob('{}/*'.format(input_path))
+        input_files = glob.glob("{}/*".format(input_path))
     else:
-        input_files =  cfis.my_string_split(input_path, stop=True, sep=' ')
+        input_files = cfis.my_string_split(input_path, stop=True, sep=" ")
 
     ID_files = []
     for f in input_files:
         if os.path.isdir(f):
             if verbose:
-                print('Skipping directory \'{}\''.format(f))
+                print("Skipping directory '{}'".format(f))
         else:
             ID_files.append(f)
 
     if verbose:
-        print('{} input files found'.format(len(ID_files)))
+        print("{} input files found".format(len(ID_files)))
 
     return ID_files
 
 
-def check_results(ID_files, input_path, result_base_names, n_complete, extension, verbose=False):
+def check_results(
+    ID_files,
+    input_path,
+    result_base_names,
+    n_complete,
+    extension,
+    verbose=False,
+):
     """Count the number of result files uploaded to vos for each input ID file.
 
     Parameters
@@ -207,11 +267,11 @@ def check_results(ID_files, input_path, result_base_names, n_complete, extension
         IDs that are not available on vos
     """
 
-    m = re.match('vos:', input_path)
+    m = re.match("vos:", input_path)
     if m:
         ls_tmp = dir_list(input_path)
     else:
-        ls_tmp = glob.glob(f'{input_path}/*')
+        ls_tmp = glob.glob(f"{input_path}/*")
     ls_out = [os.path.basename(path) for path in ls_tmp]
 
     n_found = {}
@@ -222,7 +282,7 @@ def check_results(ID_files, input_path, result_base_names, n_complete, extension
     for ID_list in ID_files:
         with open(ID_list) as f:
             if verbose:
-                print('Checking ID list file {}...'.format(ID_list))
+                print("Checking ID list file {}...".format(ID_list))
             n_found[ID_list] = {}
             n_IDs[ID_list] = 0
 
@@ -231,14 +291,14 @@ def check_results(ID_files, input_path, result_base_names, n_complete, extension
                 ID = line.rstrip()
                 n_found[ID_list][ID] = 0
 
-                if extension == 'fits':
-                    ID_fname = ID.replace('.', '-') 
-                    ID_fname = f'-{ID_fname}'
+                if extension == "fits":
+                    ID_fname = ID.replace(".", "-")
+                    ID_fname = f"-{ID_fname}"
                 else:
-                    ID_fname = f'_{ID}'
+                    ID_fname = f"_{ID}"
                 # Count how many result files are available
                 for base in result_base_names:
-                    name = '{}{}.{}'.format(base, ID_fname, extension)
+                    name = "{}{}.{}".format(base, ID_fname, extension)
                     if name in ls_out:
                         n_found[ID_list][ID] = n_found[ID_list][ID] + 1
                 n_IDs[ID_list] = n_IDs[ID_list] + 1
@@ -265,7 +325,14 @@ def output_summary(n_found, n_IDs, n_complete):
 
     for ID_list in n_found.keys():
         nf = sum(value == n_complete for value in n_found[ID_list].values())
-        print('{}: {}/{} ({:.1f}%) complete'.format(os.path.basename(ID_list), nf, n_IDs[ID_list],  nf/n_IDs[ID_list]*100))
+        print(
+            "{}: {}/{} ({:.1f}%) complete".format(
+                os.path.basename(ID_list),
+                nf,
+                n_IDs[ID_list],
+                nf / n_IDs[ID_list] * 100,
+            )
+        )
 
 
 def output_IDs(ID_list, output):
@@ -279,7 +346,7 @@ def output_IDs(ID_list, output):
         output file name
     """
 
-    f = open(output, 'w')
+    f = open(output, "w")
     for ID in ID_list:
         print(ID, file=f)
     f.close()
@@ -301,52 +368,57 @@ def main(argv=None):
     # Save calling command
     cfis.log_command(argv)
     if param.verbose:
-        cfis.log_command(argv, name='sys.stdout')
-
+        cfis.log_command(argv, name="sys.stdout")
 
     ### Start main program ###
 
     if param.verbose:
-        print('Start of program {}'.format(os.path.basename(argv[0])))
+        print("Start of program {}".format(os.path.basename(argv[0])))
 
     ID_files = read_input_files(param.input_IDs, verbose=param.verbose)
 
     if param.final_only:
-        result_base_names = ['final_cat']
+        result_base_names = ["final_cat"]
     elif param.mask_only:
-        result_base_names = ['pipeline_flag']
+        result_base_names = ["pipeline_flag"]
     else:
         result_base_names = []
         types = [
-            'final_cat',
-            'pipeline_flag', 
-            'logs',
-            'setools_mask', 
-            'setools_stat',
-            'setools_plot',
+            "final_cat",
+            "pipeline_flag",
+            "logs",
+            "setools_mask",
+            "setools_stat",
+            "setools_plot",
         ]
         for t in types:
             result_base_names.append(t)
 
-        if param.psf == 'psfex':
-            result_base_names.append('psfex_interp_exp')
-        elif param.psf == 'mccd':
-            result_base_names.append('mccd_fit_val_runner')
+        if param.psf == "psfex":
+            result_base_names.append("psfex_interp_exp")
+        elif param.psf == "mccd":
+            result_base_names.append("mccd_fit_val_runner")
 
     n_complete = len(result_base_names)
 
-    n_found, n_IDs, IDs_not_avail = check_results(ID_files, param.input_path, result_base_names, n_complete, param.extension, verbose=param.verbose)
+    n_found, n_IDs, IDs_not_avail = check_results(
+        ID_files,
+        param.input_path,
+        result_base_names,
+        n_complete,
+        param.extension,
+        verbose=param.verbose,
+    )
 
     output_summary(n_found, n_IDs, n_complete)
 
     if param.output_not_avail:
         output_IDs(IDs_not_avail, param.output_not_avail)
 
-
     ### End main program
 
     if param.verbose:
-        print('End of program {}'.format(os.path.basename(argv[0])))
+        print("End of program {}".format(os.path.basename(argv[0])))
 
     return 0
 
diff --git a/scripts/python/canfar_run_analyse.py b/scripts/python/canfar_run_analyse.py
index f43ef69bc..72da60474 100755
--- a/scripts/python/canfar_run_analyse.py
+++ b/scripts/python/canfar_run_analyse.py
@@ -19,8 +19,7 @@
 
 
 class param:
-    """General class to store (default) variables
-    """
+    """General class to store (default) variables"""
 
     def __init__(self, **kwds):
         self.__dict__.update(kwds)
@@ -46,7 +45,7 @@ def params_default():
     """
 
     p_def = param(
-        input_job = 'job_tile.sh',
+        input_job="job_tile.sh",
     )
 
     return p_def
@@ -68,16 +67,33 @@ def parse_options(p_def):
         Command line string
     """
 
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # I/O
-    parser.add_option('-i', '--input_job', dest='input_job', type='string', default=p_def.input_job,
-         help='input job file, default=\'{}\''.format(p_def.input_job))
-    parser.add_option('-o', '--output_fail', dest='output_fail', type='string',
-         help='output file for failed jobs, none if not given')
+    parser.add_option(
+        "-i",
+        "--input_job",
+        dest="input_job",
+        type="string",
+        default=p_def.input_job,
+        help="input job file, default='{}'".format(p_def.input_job),
+    )
+    parser.add_option(
+        "-o",
+        "--output_fail",
+        dest="output_fail",
+        type="string",
+        help="output file for failed jobs, none if not given",
+    )
 
-    parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output')
+    parser.add_option(
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
+    )
 
     options, args = parser.parse_args()
 
@@ -159,61 +175,83 @@ def update_param(p_def, options):
 
 def get_status(tile_num):
 
-    base_name = 'log_canfar_sp_'
-    #base_name = 'log_sp_tile_'
+    base_name = "log_canfar_sp_"
+    # base_name = 'log_sp_tile_'
 
-    log_name = '{}{}.log'.format(base_name, tile_num)
-    out_name = '{}{}.out'.format(base_name, tile_num)
-    err_name = '{}{}.err'.format(base_name, tile_num)
+    log_name = "{}{}.log".format(base_name, tile_num)
+    out_name = "{}{}.out".format(base_name, tile_num)
+    err_name = "{}{}.err".format(base_name, tile_num)
 
-    status = res_unk, 'unknown status'
+    status = res_unk, "unknown status"
 
     if not os.path.exists(log_name):
-        status = res_wait,  'waiting for submission'
+        status = res_wait, "waiting for submission"
     else:
         if os.path.exists(out_name):
             final_cat_found = False
             with open(out_name) as out_file:
                 for line in out_file:
-                    m = re.match('Upload.*final_cat_*', line)
+                    m = re.match("Upload.*final_cat_*", line)
                     if m:
                         final_cat_found = True
-                        status = res_ok, 'successful upload of final_cat'
+                        status = res_ok, "successful upload of final_cat"
                         # TODO: check next line for upload success
 
             if final_cat_found == False:
-                status = res_unk, 'Failed before final_cat'
+                status = res_unk, "Failed before final_cat"
 
                 # Look for known errors in error log file
                 with open(err_name) as err_file:
                     for line_err in err_file:
-                        mm = re.search('NodeNotFound', line_err)
+                        mm = re.search("NodeNotFound", line_err)
                         if mm:
-                            status = status + (fail_vos_not_found, 'vos file not found')
+                            status = status + (
+                                fail_vos_not_found,
+                                "vos file not found",
+                            )
                             break
-                        mm = re.search('Empty or corrupt FITS file', line_err)
+                        mm = re.search("Empty or corrupt FITS file", line_err)
                         if mm:
-                            status = status + (fail_corrupt_fits, 'corrupt input FITS file')
+                            status = status + (
+                                fail_corrupt_fits,
+                                "corrupt input FITS file",
+                            )
                             break
-                        mm = re.search('ERROR:: HTTPSConnectionPool.*Max retries', line_err)
+                        mm = re.search(
+                            "ERROR:: HTTPSConnectionPool.*Max retries", line_err
+                        )
                         if mm:
-                            status = status + (fail_time_out, 'vos time out')
+                            status = status + (fail_time_out, "vos time out")
                             break
-                        mm = re.search('ERROR:: __str__ returned non-string', line_err)
+                        mm = re.search(
+                            "ERROR:: __str__ returned non-string", line_err
+                        )
                         if mm:
-                            status = status + (fail_connection, 'Connection/HTTP error')
+                            status = status + (
+                                fail_connection,
+                                "Connection/HTTP error",
+                            )
                             break
-                        mm = re.search('ERROR:: 503 Server Error', line_err)
+                        mm = re.search("ERROR:: 503 Server Error", line_err)
                         if mm:
-                            status = status + (fail_server, 'server connection error')
+                            status = status + (
+                                fail_server,
+                                "server connection error",
+                            )
                             break
-                        mm = re.search('ERROR:: \[Errno 14\] vos', line_err)
+                        mm = re.search("ERROR:: \[Errno 14\] vos", line_err)
                         if mm:
-                            status = status + (fail_transient, 'TransientException')
+                            status = status + (
+                                fail_transient,
+                                "TransientException",
+                            )
                             break
-                        mm = re.search('Connection aborted', line_err)
+                        mm = re.search("Connection aborted", line_err)
                         if mm:
-                            status = status + (fail_vos_no_resp, 'vos no response')
+                            status = status + (
+                                fail_vos_no_resp,
+                                "vos no response",
+                            )
                             break
 
                 if len(status) == 2:
@@ -222,53 +260,59 @@ def get_status(tile_num):
                     module_last = None
                     with open(out_name) as out_file:
                         for line in out_file:
-                            mmm = re.search('\- Module: (.*)', line)
+                            mmm = re.search("\- Module: (.*)", line)
                             if mmm:
                                 module_last = mmm[1]
-                            mmm = re.search('A total of (\d+) errors were recorded.', line)
+                            mmm = re.search(
+                                "A total of (\d+) errors were recorded.", line
+                            )
                             if mmm and int(mmm[1]) != 0:
-                                status = status + (fail_res_err_mod, '{} errors recorded, last module was {}'.format(mmm[1], module_last))
+                                status = status + (
+                                    fail_res_err_mod,
+                                    "{} errors recorded, last module was {}".format(
+                                        mmm[1], module_last
+                                    ),
+                                )
                                 break
 
                 if len(status) == 2:
-                    status = status + (fail_unknown, 'unknown error')
-
+                    status = status + (fail_unknown, "unknown error")
 
         else:
             log_file = open(log_name)
             lines = log_file.readlines()
             log_file.close()
             for line in lines:
-                if re.match('.*aborted', line):
-                    status = res_abort, 'job aborted by user'
+                if re.match(".*aborted", line):
+                    status = res_abort, "job aborted by user"
                     return status
             for line in lines:
-                if re.match('.*executing', line):
-                    status = res_wait, 'job running'
+                if re.match(".*executing", line):
+                    status = res_wait, "job running"
                     return status
-            status = res_subm, 'job submitted, not started yet'
+            status = res_subm, "job submitted, not started yet"
 
     return status
 
 
 def output(status):
 
-    print('## Issues')
+    print("## Issues")
     n_issue = 0
     for tile_num in sorted(status.keys()):
         if status[tile_num][0] == res_noout or status[tile_num][0] == res_unk:
-            print('   ', tile_num, status[tile_num])
+            print("   ", tile_num, status[tile_num])
             n_issue = n_issue + 1
     if n_issue == 0:
-        print('   none')
+        print("   none")
 
     hist = Counter(status.values())
-    print('## Summary')
-    print('# Nb: status (code)') 
+    print("## Summary")
+    print("# Nb: status (code)")
     for s in hist:
-        print('{:6d}: {} ({})'.format(hist[s], s[1], int(s[0])), end='')
+        print("{:6d}: {} ({})".format(hist[s], s[1], int(s[0])), end="")
         if len(s) == 4:
-            print('; {} ({})'.format(s[3], int(s[2])), end='')
+            print("; {} ({})".format(s[3], int(s[2])), end="")
         print()
 
 
@@ -276,11 +320,14 @@ def output_failed(output_fail, status):
 
     if output_fail:
 
-        with open(output_fail, 'w') as f_out:
+        with open(output_fail, "w") as f_out:
             for tile_num in status.keys():
-                if status[tile_num][0] == res_noout or status[tile_num][0] == res_unk:
+                if (
+                    status[tile_num][0] == res_noout
+                    or status[tile_num][0] == res_unk
+                ):
                     print(tile_num, file=f_out)
-            
+
 
 def main(argv=None):
 
@@ -295,7 +342,6 @@ def main(argv=None):
 
     param = update_param(p_def, options)
 
-
     ### Start main program ###
 
     job_tile_path = param.input_job
@@ -303,7 +349,7 @@ def main(argv=None):
     status = {}
     with open(job_tile_path) as job_file:
         for line in job_file:
-            m = re.match('(\d{3}\.\d{3})', line)
+            m = re.match("(\d{3}\.\d{3})", line)
             if m:
                 tile_num = m[0]
 
diff --git a/scripts/python/cfis_field_select.py b/scripts/python/cfis_field_select.py
index efe961ca7..08f79d804 100755
--- a/scripts/python/cfis_field_select.py
+++ b/scripts/python/cfis_field_select.py
@@ -51,17 +51,23 @@ def get_images_used_in_tiles(images, band, image_type):
 
         try:
             hdu = fits.open(img.name)
-            hist = hdu[0].header['HISTORY']
+            hist = hdu[0].header["HISTORY"]
         except:
-            raise cfis.CfisError('Error while reading tile FITS file {}'.format(img.name))
+            raise cfis.CfisError(
+                "Error while reading tile FITS file {}".format(img.name)
+            )
 
         for h in hist:
-            temp = h.split(' ')
+            temp = h.split(" ")
 
-            pattern = r'(.*)p\.{1}.*'
+            pattern = r"(.*)p\.{1}.*"
             m = re.search(pattern, temp[3])
             if not m:
-                raise cfis.CfisError('re match \'{}\' failed for filename \'{}\''.format(pattern, temp[3]))
+                raise cfis.CfisError(
+                    "re match '{}' failed for filename '{}'".format(
+                        pattern, temp[3]
+                    )
+                )
 
             exp_name = m.group(1)
             exp_list.append(exp_name)
@@ -71,7 +77,9 @@ def get_images_used_in_tiles(images, band, image_type):
     return exp_list_uniq
 
 
-def get_coord_at_image(number, band, image_type, images, no_cuts=False, verbose=False):
+def get_coord_at_image(
+    number, band, image_type, images, no_cuts=False, verbose=False
+):
     """Return coordinate of image with given number.
 
     Parameters
@@ -97,18 +105,22 @@ def get_coord_at_image(number, band, image_type, images, no_cuts=False, verbose=
 
     img_found = None
 
-    if image_type == 'tile':
+    if image_type == "tile":
         nix, niy = cfis.my_string_split(number, num=2, stop=True)
         tile_name = cfis.get_tile_name(nix, niy, band)
 
         if verbose == True:
-            print('Looking for coordinates for tile with numbers ({},{})'.format(nix, niy))
+            print(
+                "Looking for coordinates for tile with numbers ({},{})".format(
+                    nix, niy
+                )
+            )
 
-        ra, dec   = cfis.get_tile_coord_from_nixy(nix, niy)
+        ra, dec = cfis.get_tile_coord_from_nixy(nix, niy)
         img_found = cfis.image(tile_name, ra, dec)
 
-    elif image_type == 'exposure':
-        ra  = []
+    elif image_type == "exposure":
+        ra = []
         dec = []
         for img in images:
             m = re.findall(number, img.name)
@@ -117,18 +129,19 @@ def get_coord_at_image(number, band, image_type, images, no_cuts=False, verbose=
                     img_found = img
 
     else:
-        raise cfis.CfisError('Image type \'{}\' not implemented yet'.format(image_type))
+        raise cfis.CfisError(
+            "Image type '{}' not implemented yet".format(image_type)
+        )
 
     return img_found
 
-    
 
 def test_tile_number():
 
-    #ra  = Angle(180, unit=units.deg)
-    #dec = Angle(35, unit=units.deg)
-    ra  = Angle('10:44:00.0 hours')
-    dec = Angle('30:00:00 degrees')
+    # ra  = Angle(180, unit=units.deg)
+    # dec = Angle(35, unit=units.deg)
+    ra = Angle("10:44:00.0 hours")
+    dec = Angle("30:00:00 degrees")
     print(ra, dec)
     print(ra.deg, dec.deg)
 
@@ -153,11 +166,11 @@ def params_default():
     """
 
     p_def = cfis.param(
-        input  = '.',
-        input_format = 'full',
-        mode  = 'c',
-        band  = 'r',
-        image_type  = 'tile',
+        input=".",
+        input_format="full",
+        mode="c",
+        band="r",
+        image_type="tile",
     )
 
     return p_def
@@ -179,53 +192,147 @@ def parse_options(p_def):
         Command line string
     """
 
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # I/O
-    parser.add_option('-i', '--input', dest='input', type='string', default=p_def.input,
-         help='input image list, can be ascii file or directory path')
-    parser.add_option('-c', '--column', dest='col', type='string', default=None,
-         help='column name if input is file, default=file has only one column)')
-    parser.add_option('', '--input_format', dest='input_format', type='string',
-         default=p_def.input_format,
-         help='input format, one of \'full\', \'ID_only\', default=\'{}\''.format(p_def.input_format))
-    parser.add_option('-o', '--outbase', dest='outbase', type='string', default=None,
-         help='output file name base (\'.txt\' is added), default=stdout')
-    parser.add_option('', '--plot', dest='plot', action='store_true',
-         help='create plots')
-    parser.add_option('', '--out_base_name', dest='out_base_name', action='store_true',
-         help='output base names, not entire path if input is directory')
-    parser.add_option('', '--out_name_only', dest='out_name_only', action='store_true',
-         help='output only file names, not coordinates and metainfo')
-    parser.add_option('', '--out_ID_only', dest='out_ID_only', action='store_true',
-         help='output only file IDs, not full file names')
-    parser.add_option('', '--interactive', dest='interactive', action='store_true',
-         help='interactive mode (showing plots, recommended for call from jupyer notebook)')
-    parser.add_option('-s', '--short', dest='short', action='store_true', help='short output')
+    parser.add_option(
+        "-i",
+        "--input",
+        dest="input",
+        type="string",
+        default=p_def.input,
+        help="input image list, can be ascii file or directory path",
+    )
+    parser.add_option(
+        "-c",
+        "--column",
+        dest="col",
+        type="string",
+        default=None,
+        help="column name if input is file, default=file has only one column)",
+    )
+    parser.add_option(
+        "",
+        "--input_format",
+        dest="input_format",
+        type="string",
+        default=p_def.input_format,
+        help="input format, one of 'full', 'ID_only', default='{}'".format(
+            p_def.input_format
+        ),
+    )
+    parser.add_option(
+        "-o",
+        "--outbase",
+        dest="outbase",
+        type="string",
+        default=None,
+        help="output file name base ('.txt' is added), default=stdout",
+    )
+    parser.add_option(
+        "", "--plot", dest="plot", action="store_true", help="create plots"
+    )
+    parser.add_option(
+        "",
+        "--out_base_name",
+        dest="out_base_name",
+        action="store_true",
+        help="output base names, not entire path if input is directory",
+    )
+    parser.add_option(
+        "",
+        "--out_name_only",
+        dest="out_name_only",
+        action="store_true",
+        help="output only file names, not coordinates and metainfo",
+    )
+    parser.add_option(
+        "",
+        "--out_ID_only",
+        dest="out_ID_only",
+        action="store_true",
+        help="output only file IDs, not full file names",
+    )
+    parser.add_option(
+        "",
+        "--interactive",
+        dest="interactive",
+        action="store_true",
+        help="interactive mode (showing plots, recommended for call from jupyer notebook)",
+    )
+    parser.add_option(
+        "-s", "--short", dest="short", action="store_true", help="short output"
+    )
 
     # Job control
-    parser.add_option('', '--no_cuts', dest='no_cuts', action='store_true',
-        help='output all exposures, no cuts (default: cut short and invalid exposures)')
+    parser.add_option(
+        "",
+        "--no_cuts",
+        dest="no_cuts",
+        action="store_true",
+        help="output all exposures, no cuts (default: cut short and invalid exposures)",
+    )
 
     # Field and image options
-    parser.add_option('-b', '--band', dest='band', type='string', default=p_def.band,
-        help='band, one of \'r\' (default)|\'u\'')
-    parser.add_option('-t', '--type', dest='image_type', type='string', default=p_def.image_type,
-        help='image type, one of \'tile\' (default)|\'weight\'|\'weight.fz\'|\'exposure\'|\'exposure_weight\''
-             '|\'exposure_weight.fz\'|\'exposure_flag\'|\'exposure_flag.fz\'|\'cat\'')
-
-    parser.add_option('', '--coord', dest='coord', type='string', default=None,
-        help='(white-space or \'_\' separated) string of input coordinates, as astropy.coordinates.Angle')
-    parser.add_option('', '--number', dest='number', type='string', default=None,
-        help='input image number')
-    parser.add_option('', '--area', dest='area', type='string', default=None,
-        help='area corner coordinates ra0_dec0_ra1_dec1')
-    parser.add_option('', '--tile', dest='tile', action='store_true',
-        help='return exposures used in input tile(s)')
+    parser.add_option(
+        "-b",
+        "--band",
+        dest="band",
+        type="string",
+        default=p_def.band,
+        help="band, one of 'r' (default)|'u'",
+    )
+    parser.add_option(
+        "-t",
+        "--type",
+        dest="image_type",
+        type="string",
+        default=p_def.image_type,
+        help="image type, one of 'tile' (default)|'weight'|'weight.fz'|'exposure'|'exposure_weight'"
+        "|'exposure_weight.fz'|'exposure_flag'|'exposure_flag.fz'|'cat'",
+    )
+
+    parser.add_option(
+        "",
+        "--coord",
+        dest="coord",
+        type="string",
+        default=None,
+        help="(white-space or '_' separated) string of input coordinates, as astropy.coordinates.Angle",
+    )
+    parser.add_option(
+        "",
+        "--number",
+        dest="number",
+        type="string",
+        default=None,
+        help="input image number",
+    )
+    parser.add_option(
+        "",
+        "--area",
+        dest="area",
+        type="string",
+        default=None,
+        help="area corner coordinates ra0_dec0_ra1_dec1",
+    )
+    parser.add_option(
+        "",
+        "--tile",
+        dest="tile",
+        action="store_true",
+        help="return exposures used in input tile(s)",
+    )
 
     # Monitoring
-    parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output')
+    parser.add_option(
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
+    )
 
     options, args = parser.parse_args()
 
@@ -246,34 +353,51 @@ def check_options(options):
         Result of option check. False if invalid option value.
     """
 
-    if int(options.number != None) + int(options.coord != None) \
-        + int(options.area != None) + int(options.tile != None) > 1:
-        raise cfis.CfisError('Only one option out of \'--number\', \'--coord\', \'--area\', \'--tile\' can be given')
-
-    if options.image_type != 'exposure' and options.no_cuts == True:
-        raise cfis.CfisError('option \'--no_cuts\' only possible for image_type=exposure')
-
-    if options.input in ['{}.txt'.format(options.outbase), '{}.pdf',format(options.outbase)]:
-        raise cfis.CfisError('Output base same as input, latter will be overwritten!')
-
-    if options.input_format not in ['full', 'ID_only']:
-        raise cfis.CfisError('input_format needs to be one of \'fulll\', \'ID_only\'')
-
-    see_help = 'See option \'-h\' for help.'
+    if (
+        int(options.number != None)
+        + int(options.coord != None)
+        + int(options.area != None)
+        + int(options.tile != None)
+        > 1
+    ):
+        raise cfis.CfisError(
+            "Only one option out of '--number', '--coord', '--area', '--tile' can be given"
+        )
+
+    if options.image_type != "exposure" and options.no_cuts == True:
+        raise cfis.CfisError(
+            "option '--no_cuts' only possible for image_type=exposure"
+        )
+
+    if options.input in [
+        "{}.txt".format(options.outbase),
+        "{}.pdf",
+        format(options.outbase),
+    ]:
+        raise cfis.CfisError(
+            "Output base same as input, latter will be overwritten!"
+        )
+
+    if options.input_format not in ["full", "ID_only"]:
+        raise cfis.CfisError(
+            "input_format needs to be one of 'fulll', 'ID_only'"
+        )
+
+    see_help = "See option '-h' for help."
 
     return True
 
 
 def update_param(p_def, options):
     """Return default parameter, updated and complemented according to options.
-    
+
     Parameters
     ----------
     p_def:  class param
         parameter values
     optiosn: tuple
         command line options
-    
+
     Returns
     -------
     param: class param
@@ -294,7 +418,7 @@ def update_param(p_def, options):
 
     # Do extra stuff if necessary
     if param.outbase is not None:
-        param.fout = open('{}.txt'.format(param.outbase), 'w')
+        param.fout = open("{}.txt".format(param.outbase), "w")
     else:
         param.fout = sys.stdout
 
@@ -323,70 +447,117 @@ def run_mode(images, param):
     if param.coord:
 
         # Image number search: Return name of image(s) covering input coordinate
-        images_found = cfis.find_image_at_coord(images, param.coord, param.band, param.image_type,
-                                                no_cuts=param.no_cuts, input_format=param.input_format,
-                                                verbose=param.verbose)
+        images_found = cfis.find_image_at_coord(
+            images,
+            param.coord,
+            param.band,
+            param.image_type,
+            no_cuts=param.no_cuts,
+            input_format=param.input_format,
+            verbose=param.verbose,
+        )
         if len(images_found) > 0:
             if not param.short:
                 images_found[0].print_header(file=param.fout)
             for img in images_found:
-                img.print(file=param.fout, base_name=param.out_base_name, name_only=param.out_name_only, ID_only=param.out_ID_only)
+                img.print(
+                    file=param.fout,
+                    base_name=param.out_base_name,
+                    name_only=param.out_name_only,
+                    ID_only=param.out_ID_only,
+                )
             ex = 0
 
     elif param.number:
 
         # Coordinate search: Return coordinate covered by image with input number/file name
-        img_found = get_coord_at_image(param.number, param.band, param.image_type, images, no_cuts=param.no_cuts, verbose=param.verbose)
+        img_found = get_coord_at_image(
+            param.number,
+            param.band,
+            param.image_type,
+            images,
+            no_cuts=param.no_cuts,
+            verbose=param.verbose,
+        )
         if img_found != None:
             if not param.short:
                 img_found.print_header(file=param.fout)
-            img_found.print(file=param.fout, base_name=param.out_base_name, name_only=param.out_name_only, ID_only=param.out_ID_only)
+            img_found.print(
+                file=param.fout,
+                base_name=param.out_base_name,
+                name_only=param.out_name_only,
+                ID_only=param.out_ID_only,
+            )
             ex = 0
         else:
             if param.verbose:
-                print('No image found, try with --no_cuts', file=sys.stderr)
+                print("No image found, try with --no_cuts", file=sys.stderr)
 
     elif param.area:
 
         # Area search: Return images within input area
         angles = cfis.get_Angle_arr(param.area, num=4, verbose=param.verbose)
-        images_found = cfis.find_images_in_area(images, angles, param.band, param.image_type, no_cuts=param.no_cuts, verbose=param.verbose)
+        images_found = cfis.find_images_in_area(
+            images,
+            angles,
+            param.band,
+            param.image_type,
+            no_cuts=param.no_cuts,
+            verbose=param.verbose,
+        )
         if len(images_found) > 0:
             if not param.short:
                 images_found[0].print_header(file=param.fout)
             for img in images_found:
-                img.print(file=param.fout, base_name=param.out_base_name, name_only=param.out_name_only, ID_only=param.out_ID_only)
+                img.print(
+                    file=param.fout,
+                    base_name=param.out_base_name,
+                    name_only=param.out_name_only,
+                    ID_only=param.out_ID_only,
+                )
             if param.plot == True:
                 if param.verbose == True:
-                    print('Creating plots')
-                ra_c, dec_c, radius = cfis.plot_area(images_found, angles, param.image_type, param.outbase, param.interactive, show_numbers=True)
+                    print("Creating plots")
+                ra_c, dec_c, radius = cfis.plot_area(
+                    images_found,
+                    angles,
+                    param.image_type,
+                    param.outbase,
+                    param.interactive,
+                    show_numbers=True,
+                )
 
                 if param.verbose:
-                    print('RA_c[deg] DEC_c[deg] radius[argmin] = {:.2f} {:.2f} {:.2f}'.format(ra_c.deg, dec_c.deg, radius*60))
+                    print(
+                        "RA_c[deg] DEC_c[deg] radius[argmin] = {:.2f} {:.2f} {:.2f}".format(
+                            ra_c.deg, dec_c.deg, radius * 60
+                        )
+                    )
             ex = 0
 
     elif param.tile:
 
         # Search exposures used in input tile(s)
-        images_found = get_images_used_in_tiles(images, param.band, param.image_type)
+        images_found = get_images_used_in_tiles(
+            images, param.band, param.image_type
+        )
         if len(images_found) > 0:
             for img in images_found:
                 print(img, file=param.fout)
             ex = 0
 
-
     else:
-        raise cfis.CfisError('One of \'--coord\', \'--number\', '
-                             '\'--area\', \'--tile\' needs to be specified')
+        raise cfis.CfisError(
+            "One of '--coord', '--number', "
+            "'--area', '--tile' needs to be specified"
+        )
 
     return ex
 
 
 def main(argv=None):
-    """Main program.
-    """
+    """Main program."""
 
-    
     # Set default parameters
     p_def = params_default()
 
@@ -399,54 +570,57 @@ def main(argv=None):
 
     param = update_param(p_def, options)
 
-
     # Save calling command
     cfis.log_command(argv)
     if param.verbose:
-        cfis.log_command(argv, name='sys.stdout')
-
+        cfis.log_command(argv, name="sys.stdout")
 
     if param.verbose and not param.short:
-        print('Start of program {}'.format(os.path.basename(argv[0])))
-
+        print("Start of program {}".format(os.path.basename(argv[0])))
 
     ### Start main program ###
 
     if param.tile:
         # For search of exposures in tiles, image list from directory needs to be tiles
-        image_type = 'tile'
+        image_type = "tile"
     else:
         image_type = param.image_type
-    images = cfis.get_image_list(param.input, param.band, image_type, col=param.col,
-                                 input_format=param.input_format, verbose=param.verbose)
-
+    images = cfis.get_image_list(
+        param.input,
+        param.band,
+        image_type,
+        col=param.col,
+        input_format=param.input_format,
+        verbose=param.verbose,
+    )
 
     # Check wether images have been found, if necessary
     if param.number:
         if images is None:
-            raise cfis.CfisError('Input list file \'{}\' not found, neither '
-                                 'existing file nor directory'.format(param.input))
+            raise cfis.CfisError(
+                "Input list file '{}' not found, neither "
+                "existing file nor directory".format(param.input)
+            )
         if len(images) == 0:
-            raise cfis.CfisError('No corresponding image files found in input \'{}\''.format(param.input))
-
+            raise cfis.CfisError(
+                "No corresponding image files found in input '{}'".format(
+                    param.input
+                )
+            )
 
     # Run
     ex = run_mode(images, param)
 
-
     if param.outbase is not None:
         param.fout.close()
-    
 
     ### End main program
 
     if param.verbose and not param.short:
-        print('End of program {}'.format(os.path.basename(argv[0])))
+        print("End of program {}".format(os.path.basename(argv[0])))
 
     return ex
 
 
-
 if __name__ == "__main__":
     sys.exit(main(sys.argv))
-
diff --git a/scripts/python/convert_psf_pix2world.py b/scripts/python/convert_psf_pix2world.py
index 9a771dc7f..bfe136236 100755
--- a/scripts/python/convert_psf_pix2world.py
+++ b/scripts/python/convert_psf_pix2world.py
@@ -17,11 +17,31 @@
 
 
 def transform_shape(mom_list, jac):
+    """Transform Shape.
+
+    Transform shape (ellipticity and size) using a Jacobian.
+
+    Parameters
+    ----------
+    mom_list : list
+        input moment measurements; each list element contains
+        first and second ellipticity component and size
+    jac : galsim.JacobianWCS
+        Jacobian transformation matrix information
+
+    Returns
+    -------
+    list
+        transformed shape parameters, which are
+        first and second ellipticity component and size
+
+    """
     scale, shear, theta, flip = jac.getDecomposition()
 
     sig_tmp = mom_list[2] * scale
     shape = galsim.Shear(g1=mom_list[0], g2=mom_list[1])
     if flip:
+        # The following output is not observed
         print("FLIP!")
         shape = galsim.Shear(g1=-shape.g1, g2=shape.g2)
     shape = galsim.Shear(g=shape.g, beta=shape.beta + theta)
@@ -30,6 +50,304 @@ def transform_shape(mom_list, jac):
     return shape.g1, shape.g2, sig_tmp
 
 
+class Loc2Glob(object):
+    r"""Change from local to global coordinates.
+
+    Class to pass from local coordinates to global coordinates under
+    CFIS (CFHT) MegaCam instrument. The geometrical informcation of the
+    instrument is encoded in this function.
+
+    Parameters
+    ----------
+    x_gap : int
+        Gap between the CCDs along the horizontal direction;
+        default is ``70`` (MegaCam value)
+    y_gap : int
+        Gap between the CCDs along the vertical direction;
+        Default is ``425`` (MegaCam value)
+    x_npix : int
+        Number of pixels per CCD along the horizontal direction;
+        default is ``2048`` (MegaCam value)
+    y_npix : int
+        Number of pixels per CCD along the vertical direction;
+        default to ``4612`` (MegaCam value)
+    ccd_tot : int
+        Total number of CCDs;
+        default to ``40`` (MegaCam value)
+
+    Notes
+    -----
+    This is the geometry of MegaCam. Watch out with the conventions ba,ab that means where
+    is the local coordinate system origin for each CCD.
+    For more info check out MegaCam's instrument webpage.
+
+    Examples
+    --------
+        'COMMENT (North on top, East to the left)',
+        'COMMENT    --------------------------',
+        'COMMENT    ba ba ba ba ba ba ba ba ba',
+        'COMMENT    00 01 02 03 04 05 06 07 08',
+        'COMMENT --------------------------------',
+        'COMMENT ba ba ba ba ba ba ba ba ba ba ba',
+        'COMMENT 36 09 10 11 12 13 14 15 16 17 37',
+        'COMMENT --------------*-----------------',
+        'COMMENT 38 18 19 20 21 22 23 24 25 26 39',
+        'COMMENT ab ab ab ab ab ab ab ab ab ab ab',
+        'COMMENT --------------------------------',
+        'COMMENT    27 28 29 30 31 32 33 34 35',
+        'COMMENT    ab ab ab ab ab ab ab ab ab',
+        'COMMENT    __________________________'
+    """
+
+    def __init__(
+        self, x_gap=70, y_gap=425, x_npix=2048, y_npix=4612, ccd_tot=40
+    ):
+        r"""Initialize with instrument geometry."""
+        self.x_gap = x_gap
+        self.y_gap = y_gap
+        self.x_npix = x_npix
+        self.y_npix = y_npix
+        self.ccd_tot = ccd_tot
+
+    def loc2glob_img_coord(self, ccd_n, x_coor, y_coor):
+        """loc2glob Img Coord.
+
+        Go from the local to the global img (pixel) coordinate system.
+
+        Global system with (0,0) in the intersection of ccds [12,13,21,22].
+
+        Parameters
+        ----------
+        ccd_n: int
+            CCD number of the considered positions
+        x_coor: float
+            Local coordinate system hotizontal value
+        y_coor: float
+            Local coordinate system vertical value
+
+        Returns
+        -------
+        glob_x_coor: float
+            Horizontal position in global coordinate system
+        glob_y_coor: float
+            Vertical position in global coordinate system
+
+        """
+        # Flip axes
+        x_coor, y_coor = self.flip_coord(ccd_n, x_coor, y_coor)
+
+        # Calculate the shift
+        x_shift, y_shift = self.shift_coord(ccd_n)
+
+        # Return new coordinates
+        return x_coor + x_shift, y_coor + y_shift
+
+    def flip_coord(self, ccd_n, x_coor, y_coor):
+        r"""Change of coordinate convention.
+
+        So that all of them are coherent on the global coordinate system.
+        So that the origin is on the south-west corner.
+        Positive: South to North ; West to East.
+        """
+        if ccd_n < 18 or ccd_n in [36, 37]:
+            x_coor = self.x_npix - x_coor + 1
+            y_coor = self.y_npix - y_coor + 1
+        else:
+            pass
+
+        return x_coor, y_coor
+
+    def x_coord_range(self):
+        r"""Return range of the x coordinate."""
+        max_x = self.x_npix * 6 + self.x_gap * 5
+        min_x = self.x_npix * (-5) + self.x_gap * (-5)
+        return min_x, max_x
+
+    def y_coord_range(self):
+        r"""Return range of the y coordinate."""
+        max_y = self.y_npix * 2 + self.y_gap * 1
+        min_y = self.y_npix * (-2) + self.y_gap * (-2)
+        return min_y, max_y
+
+    def shift_coord(self, ccd_n):
+        r"""Provide the shifting.
+
+        It is needed to go from the local coordinate
+        system origin to the global coordinate system origin.
+        """
+        if ccd_n < 9:
+            # first row
+            x_shift = (ccd_n - 4) * (self.x_gap + self.x_npix)
+            y_shift = self.y_gap + self.y_npix
+            return x_shift, y_shift
+
+        elif ccd_n < 18:
+            # second row, non-ears
+            x_shift = (ccd_n - 13) * (self.x_gap + self.x_npix)
+            y_shift = 0.0
+            return x_shift, y_shift
+
+        elif ccd_n < 27:
+            # third row non-ears
+            x_shift = (ccd_n - 22) * (self.x_gap + self.x_npix)
+            y_shift = -1.0 * (self.y_gap + self.y_npix)
+            return x_shift, y_shift
+
+        elif ccd_n < 36:
+            # fourth row
+            x_shift = (ccd_n - 31) * (self.x_gap + self.x_npix)
+            y_shift = -2.0 * (self.y_gap + self.y_npix)
+            return x_shift, y_shift
+
+        elif ccd_n < 37:
+            # ccd= 36 ears, second row
+            x_shift = (-5.0) * (self.x_gap + self.x_npix)
+            y_shift = 0.0
+            return x_shift, y_shift
+
+        elif ccd_n < 38:
+            # ccd= 37 ears, second row
+            x_shift = 5.0 * (self.x_gap + self.x_npix)
+            y_shift = 0.0
+            return x_shift, y_shift
+
+        elif ccd_n < 39:
+            # ccd= 38 ears, third row
+            x_shift = (-5.0) * (self.x_gap + self.x_npix)
+            y_shift = -1.0 * (self.y_gap + self.y_npix)
+            return x_shift, y_shift
+
+        elif ccd_n < 40:
+            # ccd= 39 ears, third row
+            x_shift = 5.0 * (self.x_gap + self.x_npix)
+            y_shift = -1.0 * (self.y_gap + self.y_npix)
+            return x_shift, y_shift
+
+
+class Glob2CCD(object):
+    r"""Get the CCD ID number from the global coordinate position.
+
+    The Loc2Glob() object as input is the one that defines the instrument's
+    geometry.
+
+    Parameters
+    ----------
+    loc2glob: Loc2Glob object
+        Object with the desired focal plane geometry.
+    with_gaps: bool
+        If add the gaps to the CCD area.
+    """
+
+    def __init__(self, loc2glob, with_gaps=True):
+        # Save loc2glob object
+        self.loc2glob = loc2glob
+        self.with_gaps = with_gaps
+        self.ccd_list = np.arange(self.loc2glob.ccd_tot)
+        # Init edges defininf the CCDs
+        self.edge_x_list, self.edge_y_list = self.build_all_edges()
+
+    def build_all_edges(self):
+        """Build the edges for all the CCDs in the focal plane."""
+        edge_xy_list = []
+        for idx in (0, 1):
+            edge_list = np.array(
+                [self.build_edge(ccd_n)[idx] for ccd_n in self.ccd_list]
+            )
+            edge_xy_list.append(edge_list)
+
+        return edge_xy_list
+
+    def build_edge(self, ccd_n):
+        """Build the edges of the `ccd_n` in global coordinates."""
+        if self.with_gaps:
+            corners = np.array(
+                [
+                    [-self.loc2glob.x_gap / 2, -self.loc2glob.y_gap / 2],
+                    [
+                        self.loc2glob.x_npix + self.loc2glob.x_gap / 2,
+                        -self.loc2glob.y_gap / 2,
+                    ],
+                    [
+                        -self.loc2glob.x_gap / 2,
+                        self.loc2glob.y_npix + self.loc2glob.y_gap / 2,
+                    ],
+                    [
+                        self.loc2glob.x_npix + self.loc2glob.x_gap / 2,
+                        self.loc2glob.y_npix + self.loc2glob.y_gap / 2,
+                    ],
+                ]
+            )
+        else:
+            corners = np.array(
+                [
+                    [0, 0],
+                    [self.loc2glob.x_npix, 0],
+                    [0, self.loc2glob.y_npix],
+                    [self.loc2glob.x_npix, self.loc2glob.y_npix],
+                ]
+            )
+
+        glob_corners = np.array(
+            [
+                self.loc2glob.loc2glob_img_coord(ccd_n, pos[0], pos[1])
+                for pos in corners
+            ]
+        )
+
+        edge_xy = []
+        for idx in (0, 1):
+            edge = np.array(
+                [np.min(glob_corners[:, idx]), np.max(glob_corners[:, idx])]
+            )
+            edge_xy.append(edge)
+
+        return edge_xy
+
+    def is_inside(self, x, y, edge_x, edge_y):
+        """Is the position inside the edges.
+
+        Return True if the position is within the rectangle
+        defined by the edges.
+
+        Parameters
+        ----------
+        x: float
+            Horizontal position in global coordinate system.
+        y: float
+            Vertical position in global coordinate system.
+        edge_x: np.ndarray
+            Edge defined as `np.array([min_x, max_x])`.
+        edge_y: np.ndarray
+            Edge defined as `np.array([min_y, max_y])`.
+        """
+        if (
+            (x > edge_x[0])
+            and (x < edge_x[1])
+            and (y > edge_y[0])
+            and (y < edge_y[1])
+        ):
+            return True
+        else:
+            return False
+
+    def get_ccd_n(self, x, y):
+        """Returns the CCD number from the position `(x, y)`.
+
+        Returns `None` if the position is not found.
+        """
+        bool_list = np.array(
+            [
+                self.is_inside(x, y, edge_x, edge_y)
+                for edge_x, edge_y in zip(self.edge_x_list, self.edge_y_list)
+            ]
+        )
+
+        try:
+            return self.ccd_list[bool_list][0]
+        except Exception:
+            return None
+
+
 class Convert(object):
 
     def __init__(self):
@@ -61,34 +379,31 @@ def params_default(self):
             "input_base_dir": ".",
             "output_base_dir": ".",
             "mode": "merge",
-            "sub_dir_pattern" : "run_sp_exp_202",
+            "psf": "psfex",
             "file_pattern_psfint": "validation_psf",
-            "sub_dir_psfint": "psfex_interp_runner/output/",
         }
 
         self._short_options = {
             "input_base_dir": "-i",
             "mode": "-m",
-            "sub_dir_pattern" : "-s",
+            "psf": "-p",
         }
 
         self._types = {}
 
         self._help_strings = {
-            "input_base_dir" : (
+            "input_base_dir": (
                 "input base dir, runs are expected in"
                 + " <input_base_dir>/P<patch?>/output;"
                 " default is {}"
             ),
-            "sub_dir_pattern" : (
-                "First subdir name of PSF interpolation, default is {}"
+            "mode": (
+                "run mode, allowed are 'merge', 'test'; default is" + " '{}'"
             ),
-            "mode" : (
-                "run mode, allowed are 'create', 'merge', 'test'; default is"
-                + " '{}':"
-            )
+            "psf": "PSF model, allowed are 'psfex' and 'mccd'; default is {}",
         }
 
+        # Output column names with types
         self._dt = [
             ("X", float),
             ("Y", float),
@@ -105,13 +420,41 @@ def params_default(self):
             ("CCD_NB", int),
         ]
 
+        # Extra columns for MCCD:737
+        self._dt_mccd = self._dt.copy()
+        self._dt_mccd.append(("GLOB_X", float))
+        self._dt_mccd.append(("GLOB_Y", float))
+
+    def update_params(self):
+        """Update Params.
+
+        Update parameters.
+
+        """
+        if self._params["psf"] == "psfex":
+            self._params["sub_dir_pattern"] = "run_sp_exp_202"
+            self._params["sub_dir_psfint"] = "psfex_interp_runner"
+        elif self._params["psf"] == "mccd":
+            self._params["sub_dir_pattern"] = "run_sp_exp_SxSePsf_202"
+            self._params["sub_dir_psfint"] = "mccd_fit_val_runner"
+            self._params["sub_dir_setools"] = "setools_runner/output/mask"
+        else:
+            raise ValueError(f"Invalid PSF model {self._params['psf']}")
+        self._params["sub_dir_psfint"] = (
+            f"{self._params['sub_dir_psfint']}/output"
+        )
+
     def run(self):
+        """Run.
+
+        Main processing function.
 
+        """
         if self._params["mode"] == "test":
             patch_nums = ["3", "4"]
         else:
-            n_patch = 7                                                             
-            #patch_nums = [idx for idx in np.arange(n_patch) + 1]
+            n_patch = 7
+            # patch_nums = [idx for idx in np.arange(n_patch) + 1]
             patch_nums = [1, 3, 4]
 
         do_parallel = True
@@ -145,28 +488,29 @@ def run(self):
             # Loop over exposure runs
             if not do_parallel:
                 for idx_exp, exp_run_dir in tqdm(
-                        enumerate(exp_run_dirs), total=n_exp_runs,
-                        disable=self._params["verbose"],
+                    enumerate(exp_run_dirs),
+                    total=n_exp_runs,
+                    disable=self._params["verbose"],
                 ):
-                    self.transform_exposure(
+                    self.transform_exposures(
                         output_dir, patch, idx_exp, exp_run_dir
                     )
             else:
                 res = Parallel(n_jobs=-1, backend="loky")(
-                    delayed(self.transform_exposure)(
+                    delayed(self.transform_exposures)(
                         output_dir, patch, idx_exp, exp_run_dir
                     )
                     for idx_exp, exp_run_dir in tqdm(
-                            enumerate(exp_run_dirs),
-                            total=n_exp_runs,
-                            disable=self._params["verbose"],
+                        enumerate(exp_run_dirs),
+                        total=n_exp_runs,
+                        disable=self._params["verbose"],
                     )
                 )
 
-    def transform_exposure(self, output_dir, patch, idx, exp_run_dir):
+    def transform_exposures(self, output_dir, patch, idx, exp_run_dir):
         """Transform exposures.
 
-        Transform shapes for exposures for a given run (input exp run dir).
+        Transform shapes for exposure for a given run (input exp run dir).
 
         """
         output_path = (
@@ -174,17 +518,17 @@ def transform_exposure(self, output_dir, patch, idx, exp_run_dir):
             + f"-{patch}-{idx}.fits"
         )
         if os.path.exists(output_path):
-            print(f"Skipping transform_exposure, file {output_path} exists")
+            print(f"Skipping transform_exposures, file {output_path} exists")
             return
 
-        mccd_dir = f"{exp_run_dir}/{self._params['sub_dir_psfint']}"
+        psf_dir = f"{exp_run_dir}/{self._params['sub_dir_psfint']}"
         try:
-            all_files = os.listdir(mccd_dir)
+            all_files = os.listdir(psf_dir)
             if self._params["verbose"]:
-                print(f"Found {len(all_files)} file(s) in {mccd_dir}")
+                print(f"Found {len(all_files)} file(s) in {psf_dir}")
         except Exception:
             if self._params["verbose"]:
-                print(f"Found zero PSFEx files in {mccd_dir}, skipping")
+                print(f"Found zero PSFEx files in {psf_dir}, skipping")
             return
 
         cat_list = []
@@ -193,103 +537,245 @@ def transform_exposure(self, output_dir, patch, idx, exp_run_dir):
                 continue
 
             tmp = re.findall(r"\d+", file_name)
-            exp_name, ccd_id = int(tmp[0]), int(tmp[1])
+
+            if self._params["psf"] == "psfex":
+                exp_name, ccd_id = int(tmp[0]), int(tmp[1])
+            elif self._params["psf"] == "mccd":
+                exp_name = int(tmp[0])
+                ccd_id = -1
+
             if self._params["verbose"]:
                 print("Match found ", exp_name, ccd_id)
 
-            psfex_file_path = f"{mccd_dir}/{file_name}"
+            psf_file_path = f"{psf_dir}/{file_name}"
 
             try:
-                psf_file = fits.open(psfex_file_path, memmap=False)
-                psfex_file = psf_file[2].data
-                header_file = psf_file[1].data
+                if self._params["psf"] == "psfex":
+                    psf_file_hdus = fits.open(psf_file_path, memmap=False)
+                    psf_file = psf_file_hdus[2].data
+                    header_file = psf_file_hdus[1].data
+                    psf_file_hdus.close()
+                    mod = "RA"
+                else:
+                    psf_file = fits.getdata(psf_file_path, 1, memmap=True)
+                    mod = "RA_LIST"
             except Exception:
                 continue
 
-            new_e1_psf = np.zeros_like(psfex_file["RA"])
-            new_e2_psf = np.zeros_like(psfex_file["RA"])
-            new_sig_psf = np.zeros_like(psfex_file["RA"])
-            new_e1_star = np.zeros_like(psfex_file["RA"])
-            new_e2_star = np.zeros_like(psfex_file["RA"])
-            new_sig_star = np.zeros_like(psfex_file["RA"])
+            new_e1_psf = np.zeros_like(psf_file[mod])
+            new_e2_psf = np.zeros_like(psf_file[mod])
+            new_sig_psf = np.zeros_like(psf_file[mod])
+            new_e1_star = np.zeros_like(psf_file[mod])
+            new_e2_star = np.zeros_like(psf_file[mod])
+            new_sig_star = np.zeros_like(psf_file[mod])
 
-            header = fits.Header.fromstring(
-                "\n".join(header_file[0][0]), sep="\n"
-            )
-            wcs = galsim.AstropyWCS(header=header)
-
-            k = 0
-            for ind, obj in enumerate(psfex_file):
-                try:
-                    # jac = wcs.jacobian(world_pos=galsim.CelestialCoord(
-                    #     ra=obj["RA"]*galsim.degrees,
-                    #     dec=obj["DEC"]*galsim.degrees
-                    # ))
-                    jac = wcs.jacobian(
-                        image_pos=galsim.PositionD(
-                            obj["X"],
-                            obj["Y"],
+            if self._params["psf"] == "psfex":
+                header = fits.Header.fromstring(
+                    "\n".join(header_file[0][0]), sep="\n"
+                )
+                wcs = galsim.AstropyWCS(header=header)
+
+                k = 0
+                for ind, obj in enumerate(psf_file):
+                    try:
+                        # jac = wcs.jacobian(world_pos=galsim.CelestialCoord(
+                        #     ra=obj["RA"]*galsim.degrees,
+                        #     dec=obj["DEC"]*galsim.degrees
+                        # ))
+                        jac = wcs.jacobian(
+                            image_pos=galsim.PositionD(
+                                obj["X"],
+                                obj["Y"],
+                            )
                         )
+                    except Exception:
+                        continue
+                    g1_psf_tmp, g2_psf_tmp, sig_psf_tmp = transform_shape(
+                        [
+                            obj["E1_PSF_HSM"],
+                            obj["E2_PSF_HSM"],
+                            obj["SIGMA_PSF_HSM"],
+                        ],
+                        jac,
                     )
-                except Exception:
-                    continue
-                g1_psf_tmp, g2_psf_tmp, sig_psf_tmp = transform_shape(
-                    [
-                        obj["E1_PSF_HSM"],
-                        obj["E2_PSF_HSM"],
-                        obj["SIGMA_PSF_HSM"],
-                    ],
-                    jac,
-                )
 
-                new_e1_psf[ind] = g1_psf_tmp
-                new_e2_psf[ind] = g2_psf_tmp
-                new_sig_psf[ind] = sig_psf_tmp
+                    new_e1_psf[ind] = g1_psf_tmp
+                    new_e2_psf[ind] = g2_psf_tmp
+                    new_sig_psf[ind] = sig_psf_tmp
+
+                    g1_star_tmp, g2_star_tmp, sig_star_tmp = transform_shape(
+                        [
+                            obj["E1_STAR_HSM"],
+                            obj["E2_STAR_HSM"],
+                            obj["SIGMA_STAR_HSM"],
+                        ],
+                        jac,
+                    )
+                    new_e1_star[ind] = g1_star_tmp
+                    new_e2_star[ind] = g2_star_tmp
+                    new_sig_star[ind] = sig_star_tmp
+                    k += 1
+
+                exp_cat = np.array(
+                    list(
+                        map(
+                            tuple,
+                            np.array(
+                                [
+                                    psf_file["X"],
+                                    psf_file["Y"],
+                                    psf_file["RA"],
+                                    psf_file["DEC"],
+                                    new_e1_psf,
+                                    new_e2_psf,
+                                    new_sig_psf,
+                                    psf_file["FLAG_PSF_HSM"],
+                                    new_e1_star,
+                                    new_e2_star,
+                                    new_sig_star,
+                                    psf_file["FLAG_STAR_HSM"],
+                                    np.ones_like(psf_file["RA"], dtype=int)
+                                    * ccd_id,
+                                ]
+                            ).T.tolist(),
+                        )
+                    ),
+                    dtype=self._dt,
+                )
+                cat_list.append(exp_cat)
 
-                g1_star_tmp, g2_star_tmp, sig_star_tmp = transform_shape(
+            else:
+                l2g = Loc2Glob()
+                g2c = Glob2CCD(l2g)
+                new_ccd_id = np.array(
                     [
-                        obj["E1_STAR_HSM"],
-                        obj["E2_STAR_HSM"],
-                        obj["SIGMA_STAR_HSM"],
-                    ],
-                    jac,
+                        int(
+                            g2c.get_ccd_n(
+                                psf_file["GLOB_POSITION_IMG_LIST"][ii, 0],
+                                psf_file["GLOB_POSITION_IMG_LIST"][ii, 1],
+                            )
+                        )
+                        for ii in range(len(psf_file))
+                    ]
                 )
-                new_e1_star[ind] = g1_star_tmp
-                new_e2_star[ind] = g2_star_tmp
-                new_sig_star[ind] = sig_star_tmp
-                k += 1
-
-            exp_cat = np.array(
-                list(
-                    map(
-                        tuple,
-                        np.array(
-                            [
-                                psfex_file["X"],
-                                psfex_file["Y"],
-                                psfex_file["RA"],
-                                psfex_file["DEC"],
-                                new_e1_psf,
-                                new_e2_psf,
-                                new_sig_psf,
-                                psfex_file["FLAG_PSF_HSM"],
-                                new_e1_star,
-                                new_e2_star,
-                                new_sig_star,
-                                psfex_file["FLAG_STAR_HSM"],
-                                np.ones_like(psfex_file["RA"], dtype=int)
-                                * ccd_id,
-                            ]
-                        ).T.tolist(),
+
+                new_x = np.zeros_like(psf_file[mod])
+                new_y = np.zeros_like(psf_file[mod])
+                new_flag_psf = np.zeros_like(psf_file[mod])
+                new_flag_star = np.zeros_like(psf_file[mod])
+                for ccd_id in range(40):
+                    m_ccd_id = new_ccd_id == ccd_id
+                    if sum(m_ccd_id) == 0:
+                        continue
+
+                    x_shift, y_shift = l2g.shift_coord(ccd_id)
+
+                    new_x[m_ccd_id] = (
+                        psf_file["GLOB_POSITION_IMG_LIST"][:, 0][m_ccd_id]
+                        - x_shift
                     )
-                ),
-                dtype=self._dt,
-            )
-            cat_list.append(exp_cat)
+                    new_y[m_ccd_id] = (
+                        psf_file["GLOB_POSITION_IMG_LIST"][:, 1][m_ccd_id]
+                        - y_shift
+                    )
+
+                    header_file_path = (
+                        self._params["sub_dir_setools"]
+                        + self._params["file_pattern_psfint"]
+                        + f"{exp_name}-{ccd_id}.fits"
+                    )
+                    try:
+                        header_file = fits.getdata(header_file_path, 1)
+                    except Exception:
+                        continue
+                    header = fits.Header.fromstring(
+                        "\n".join(header_file[0][0]), sep="\n"
+                    )
+                    wcs = galsim.AstropyWCS(header=header)
+
+                    g1_psf_tmp_l = []
+                    g2_psf_tmp_l = []
+                    sig_psf_tmp_l = []
+                    g1_star_tmp_l = []
+                    g2_star_tmp_l = []
+                    sig_star_tmp_l = []
+                    flag_psf_tmp_l = []
+                    flag_star_tmp_l = []
+
+                    for obj in psf_file[m_ccd_id]:
+                        try:
+                            jac = wcs.jacobian(
+                                world_pos=galsim.CelestialCoord(
+                                    ra=obj["RA_LIST"] * galsim.degrees,
+                                    dec=obj["DEC_LIST"] * galsim.degrees,
+                                )
+                            )
+                        except Exception:
+                            flag_star_tmp_l.append(16)
+                            flag_psf_tmp_l.append(16)
+                            g1_psf_tmp_l.append(0)
+                            g2_psf_tmp_l.append(0)
+                            sig_psf_tmp_l.append(0)
+                            g1_star_tmp_l.append(0)
+                            g2_star_tmp_l.append(0)
+                            sig_star_tmp_l.append(0)
+                            continue
+                        g1_psf_tmp, g2_psf_tmp, sig_psf_tmp = transform_shape(
+                            obj["PSF_MOM_LIST"], jac
+                        )
+
+                        g1_psf_tmp_l.append(g1_psf_tmp)
+                        g2_psf_tmp_l.append(g2_psf_tmp)
+                        sig_psf_tmp_l.append(sig_psf_tmp)
+                        flag_psf_tmp_l.append(obj["PSF_MOM_LIST"][3])
+
+                        g1_star_tmp, g2_star_tmp, sig_star_tmp = (
+                            transform_shape(obj["STAR_MOM_LIST"], jac)
+                        )
+                        g1_star_tmp_l.append(g1_star_tmp)
+                        g2_star_tmp_l.append(g2_star_tmp)
+                        sig_star_tmp_l.append(sig_star_tmp)
+                        flag_star_tmp_l.append(obj["STAR_MOM_LIST"][3])
+
+                    new_e1_psf[m_ccd_id] = g1_psf_tmp_l
+                    new_e2_psf[m_ccd_id] = g2_psf_tmp_l
+                    new_sig_psf[m_ccd_id] = sig_psf_tmp_l
+                    new_flag_psf[m_ccd_id] = flag_psf_tmp_l
+                    new_e1_star[m_ccd_id] = g1_star_tmp_l
+                    new_e2_star[m_ccd_id] = g2_star_tmp_l
+                    new_sig_star[m_ccd_id] = sig_star_tmp_l
+                    new_flag_star[m_ccd_id] = flag_star_tmp_l
+
+                exp_cat = np.array(
+                    list(
+                        map(
+                            tuple,
+                            np.array(
+                                [
+                                    new_x,
+                                    new_y,
+                                    psf_file["RA_LIST"],
+                                    psf_file["DEC_LIST"],
+                                    new_e1_psf,
+                                    new_e2_psf,
+                                    new_sig_psf,
+                                    psf_file["PSF_MOM_LIST"][:, 3],
+                                    new_e1_star,
+                                    new_e2_star,
+                                    new_sig_star,
+                                    psf_file["STAR_MOM_LIST"][:, 3],
+                                    new_ccd_id,
+                                    psf_file["GLOB_POSITION_IMG_LIST"][:, 0],
+                                    psf_file["GLOB_POSITION_IMG_LIST"][:, 1],
+                                ]
+                            ).T.tolist(),
+                        )
+                    ),
+                    dtype=self._dt_mccd,
+                )
+                cat_list.append(exp_cat)
 
-            psf_file.close()
             del psf_file
-            gc.collect()
 
         if len(cat_list) == 0:
             return
@@ -317,6 +803,7 @@ def run_convert(*args):
     obj = Convert()
 
     obj.set_params_from_command_line(args)
+    obj.update_params()
 
     obj.run()
 
diff --git a/scripts/python/create_sample_results.py b/scripts/python/create_sample_results.py
index 25e00ec39..0e0223ffe 100755
--- a/scripts/python/create_sample_results.py
+++ b/scripts/python/create_sample_results.py
@@ -34,9 +34,7 @@ def params_default():
         parameter values
     """
 
-    p_def = cfis.param(
-        psf = 'mccd'
-    )
+    p_def = cfis.param(psf="mccd")
 
     return p_def
 
@@ -57,49 +55,49 @@ def parse_options(p_def):
         Command line string
     """
 
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # I/O
     parser.add_option(
-        '',
-        '--input_IDs',
-        dest='input_IDs',
-        type='string',
-        help='input tile ID file specifying sample'
+        "",
+        "--input_IDs",
+        dest="input_IDs",
+        type="string",
+        help="input tile ID file specifying sample",
     )
     parser.add_option(
-        '-i',
-        '--input_dir',
-        dest='input_dir',
-        type='string',
-        help='input directory name'
+        "-i",
+        "--input_dir",
+        dest="input_dir",
+        type="string",
+        help="input directory name",
     )
     parser.add_option(
-        '-o',
-        '--output_dir',
-        dest='output_dir',
-        type='string',
-        help='output directory name'
+        "-o",
+        "--output_dir",
+        dest="output_dir",
+        type="string",
+        help="output directory name",
     )
 
     # Misc
     parser.add_option(
-        '-p',
-        '--psf',
-        dest='psf',
-        type='string',
+        "-p",
+        "--psf",
+        dest="psf",
+        type="string",
         default=p_def.psf,
-        help=f'PSF model, one in [\'psfex\'|\'mccd\'], default=\'{p_def.psf}\''
+        help=f"PSF model, one in ['psfex'|'mccd'], default='{p_def.psf}'",
     )
 
     # Control
     parser.add_option(
-        '-v',
-        '--verbose',
-        dest='verbose',
-        action='store_true',
-        help='verbose output'
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
     )
 
     options, args = parser.parse_args()
@@ -122,13 +120,13 @@ def check_options(options):
     """
 
     if options.input_IDs is None:
-        print('No input ID file list given (option \'--input_IDs\')')
+        print("No input ID file list given (option '--input_IDs')")
         return False
     if options.input_dir is None:
-        print('No input directory name given (option \'--input_dir\')')
+        print("No input directory name given (option '--input_dir')")
         return False
     if options.output_dir is None:
-        print('No output directory name given (option \'--output_dir\')')
+        print("No output directory name given (option '--output_dir')")
         return False
 
     return True
@@ -184,7 +182,7 @@ def read_ID_list(input_ID_path, verbose=False):
     """
 
     if verbose:
-        print('Reading input ID list...')
+        print("Reading input ID list...")
 
     input_IDs = []
     with open(input_ID_path) as f:
@@ -192,12 +190,14 @@ def read_ID_list(input_ID_path, verbose=False):
             input_IDs.append(line.rstrip())
 
     if verbose:
-        print('{} IDs found in input file'.format(len(input_IDs)))
+        print("{} IDs found in input file".format(len(input_IDs)))
 
     return input_IDs
 
 
-def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=False):
+def create_links(
+    input_dir, output_dir, input_IDs, result_base_names, verbose=False
+):
     """Create symbolic links to result files corresponding to (sub-)sample.
 
     Parameters
@@ -215,7 +215,7 @@ def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=Fa
     """
 
     if verbose:
-        print('Creating links...')
+        print("Creating links...")
 
     n_total = {}
     n_created = 0
@@ -223,16 +223,16 @@ def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=Fa
     for ID in input_IDs:
         n_total[ID] = 0
         for base in result_base_names:
-            name = '{}_{}.tgz'.format(base, ID)
-            src = '{}/{}'.format(os.path.abspath(input_dir), name)
-            link_name = '{}/{}'.format(output_dir, name)
+            name = "{}_{}.tgz".format(base, ID)
+            src = "{}/{}".format(os.path.abspath(input_dir), name)
+            link_name = "{}/{}".format(output_dir, name)
 
-            #if verbose:
-                #print('Creating link {} <- {}'.format(src, link_name))
+            # if verbose:
+            # print('Creating link {} <- {}'.format(src, link_name))
 
             if not os.path.exists(src):
-                #raise IOError('Source file \'{}\' does not exist'.format(src))
-                print('Source file \'{}\' does not exist, skipping'.format(src))
+                # raise IOError('Source file \'{}\' does not exist'.format(src))
+                print("Source file '{}' does not exist, skipping".format(src))
             elif not os.path.exists(link_name):
                 os.symlink(src, link_name)
                 n_created = n_created + 1
@@ -243,11 +243,15 @@ def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=Fa
 
     n_expected = len(input_IDs) * len(result_base_names)
     if verbose:
-        print('{:5d} links created'.format(n_created))
-        print('{:5d} links existed already'.format(n_existed))
-        print('{:5d}/{} links available now'.format(n_created + n_existed, n_expected))
+        print("{:5d} links created".format(n_created))
+        print("{:5d} links existed already".format(n_existed))
+        print(
+            "{:5d}/{} links available now".format(
+                n_created + n_existed, n_expected
+            )
+        )
         n_tot = sum(n_total.values())
-        print('{:5d} as cross-check'.format(n_tot))
+        print("{:5d} as cross-check".format(n_tot))
 
 
 def main(argv=None):
@@ -267,42 +271,50 @@ def main(argv=None):
     # Save calling command
     cfis.log_command(argv)
     if param.verbose:
-        cfis.log_command(argv, name='sys.stdout')
-
+        cfis.log_command(argv, name="sys.stdout")
 
     ### Start main program ###
 
     if param.verbose:
-        print('Start of program {}'.format(os.path.basename(argv[0])))
+        print("Start of program {}".format(os.path.basename(argv[0])))
 
     input_IDs = read_ID_list(param.input_IDs, verbose=param.verbose)
 
     result_base_names = [
-        'final_cat',
-        'logs',
-        'setools_mask',
-        'setools_stat',
-        'setools_plot',
-        'pipeline_flag',
+        "final_cat",
+        "logs",
+        "setools_mask",
+        "setools_stat",
+        "setools_plot",
+        "pipeline_flag",
     ]
-    if param.psf == 'psfex':
-        result_base_names.append('psfex_interp_exp')
-    elif param.psf == 'mccd':
-        result_base_names.append('mccd_fit_val_runner')
+    if param.psf == "psfex":
+        result_base_names.append("psfex_interp_exp")
+    elif param.psf == "mccd":
+        result_base_names.append("mccd_fit_val_runner")
 
     if os.path.isdir(param.output_dir):
         if param.verbose:
-            print('Directory {} already exists, continuing...'.format(param.output_dir))
+            print(
+                "Directory {} already exists, continuing...".format(
+                    param.output_dir
+                )
+            )
     else:
         mkdir(param.output_dir)
 
-    create_links(param.input_dir, param.output_dir, input_IDs, result_base_names, verbose=param.verbose)
-
+    create_links(
+        param.input_dir,
+        param.output_dir,
+        input_IDs,
+        result_base_names,
+        verbose=param.verbose,
+    )
 
     ### End main program
 
     if param.verbose:
-        print('End of program {}'.format(os.path.basename(argv[0])))
+        print("End of program {}".format(os.path.basename(argv[0])))
 
     return 0
 
diff --git a/scripts/python/create_star_cat.py b/scripts/python/create_star_cat.py
index 2c87d3f8d..f990942f7 100755
--- a/scripts/python/create_star_cat.py
+++ b/scripts/python/create_star_cat.py
@@ -45,16 +45,16 @@ def _get_wcs(header):
 
     """
     final_wcs = WCS(naxis=2)
-    final_wcs.wcs.ctype = [header['CTYPE1'], header['CTYPE2']]
+    final_wcs.wcs.ctype = [header["CTYPE1"], header["CTYPE2"]]
     try:
-        final_wcs.wcs.cunit = [header['CUNIT1'], header['CUNIT2']]
+        final_wcs.wcs.cunit = [header["CUNIT1"], header["CUNIT2"]]
     except:
-        final_wcs.wcs.cunit = ['deg', 'deg']
-    final_wcs.wcs.crpix = [header['CRPIX1'], header['CRPIX2']]
-    final_wcs.wcs.crval = [header['CRVAL1'], header['CRVAL2']]
+        final_wcs.wcs.cunit = ["deg", "deg"]
+    final_wcs.wcs.crpix = [header["CRPIX1"], header["CRPIX2"]]
+    final_wcs.wcs.crval = [header["CRVAL1"], header["CRVAL2"]]
     final_wcs.wcs.cd = [
-        [header['CD1_1'], header['CD1_2']],
-        [header['CD2_1'], header['CD2_2']]
+        [header["CD1_1"], header["CD1_2"]],
+        [header["CD2_1"], header["CD2_2"]],
     ]
 
     return final_wcs
@@ -79,17 +79,17 @@ def _get_image_radius(center, wcs):
 
     """
     if center is None:
-        raise ValueError('center cannot be None')
+        raise ValueError("center cannot be None")
     else:
         if type(center) is np.ndarray:
             return SphereDist(center, np.zeros(2), wcs) / 60.0
         else:
-            raise TypeError('center has to be a numpy.ndarray')
+            raise TypeError("center has to be a numpy.ndarray")
 
 
 def SphereDist(position1, position2, wcs):
     """Sphere Dist.
-    
+
     Compute distance between two points on the sphere.
 
     Parameters
@@ -105,11 +105,10 @@ def SphereDist(position1, position2, wcs):
         distance (in degrees)
     """
 
-    if (
-        (type(position1) is not np.ndarray)
-        & (type(position2) is not np.ndarray)
+    if (type(position1) is not np.ndarray) & (
+        type(position2) is not np.ndarray
     ):
-        raise ValueError('Positions need to be of type numpy.ndarray')
+        raise ValueError("Positions need to be of type numpy.ndarray")
 
     rad2deg = np.pi / 180.0
     p1 = rad2deg * np.hstack(wcs.all_pix2world(position1[0], position1[1], 1))
@@ -120,10 +119,13 @@ def SphereDist(position1, position2, wcs):
     dLat = dTheta[1]
 
     dist = 2 * np.arcsin(
-        np.sqrt(np.sin(dLat/2.0)**2 + np.cos(p1[1])*np.cos(p2[1])*np.sin(dLong/2.0)**2)
+        np.sqrt(
+            np.sin(dLat / 2.0) ** 2
+            + np.cos(p1[1]) * np.cos(p2[1]) * np.sin(dLong / 2.0) ** 2
+        )
     )
 
-    return dist*(180./np.pi)*3600.
+    return dist * (180.0 / np.pi) * 3600.0
 
 
 def find_stars(position, output_name, radius=None):
@@ -145,16 +147,16 @@ def find_stars(position, output_name, radius=None):
 
     # check ra dec types
 
-    if dec > 0.:
-        sign = '+'
+    if dec > 0.0:
+        sign = "+"
     else:
-        sign = ''
+        sign = ""
 
-    cmd_line = f'findgsc2.2 {ra} {sign}{dec} -r {radius} -n 1000000'
+    cmd_line = f"findgsc2.2 {ra} {sign}{dec} -r {radius} -n 1000000"
 
     CDS_stdout, CDS_stderr = execute(cmd_line)
 
-    output_file = open(output_name, 'w')
+    output_file = open(output_name, "w")
     output_file.write(CDS_stdout)
     output_file.close()
 
@@ -164,38 +166,36 @@ def main(input_dir, output_dir, kind):
     file_list = os.listdir(input_dir)
 
     for f in file_list:
-        if 'image' not in f:
+        if "image" not in f:
             continue
 
-        if kind == 'exp':
+        if kind == "exp":
             list_ind = range(1, 41)
         else:
             list_ind = [0]
 
         for ind in list_ind:
 
-            if kind == 'exp':
-                exp_suff = '-{}'.format(ind-1)
+            if kind == "exp":
+                exp_suff = "-{}".format(ind - 1)
             else:
-                exp_suff = ''
+                exp_suff = ""
 
-            img_number = re.split('image', os.path.splitext(f)[0])[1]
-            output_name = f'{output_dir}/star_cat{img_number}{exp_suff}.cat'
+            img_number = re.split("image", os.path.splitext(f)[0])[1]
+            output_name = f"{output_dir}/star_cat{img_number}{exp_suff}.cat"
 
             if os.path.isfile(output_name):
                 continue
 
-            h = fits.getheader(input_dir + '/' + f, ind)
+            h = fits.getheader(input_dir + "/" + f, ind)
 
             w = _get_wcs(h)
 
-            img_shape = (h['NAXIS2'], h['NAXIS1'])
-            img_center = np.array([img_shape[1]/2., img_shape[0]/2.])
+            img_shape = (h["NAXIS2"], h["NAXIS1"])
+            img_center = np.array([img_shape[1] / 2.0, img_shape[0] / 2.0])
             wcs_center = w.all_pix2world([img_center], 1)[0]
             astropy_center = SkyCoord(
-                ra=wcs_center[0],
-                dec=wcs_center[1],
-                unit='deg'
+                ra=wcs_center[0], dec=wcs_center[1], unit="deg"
             )
 
             rad = _get_image_radius(img_center, w)
@@ -203,29 +203,29 @@ def main(input_dir, output_dir, kind):
             find_stars(
                 np.array([astropy_center.ra.value, astropy_center.dec.value]),
                 output_name,
-                rad
+                rad,
             )
 
     return 0
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
 
     argv = sys.argv
 
     try:
         input_path = argv[1]
     except:
-        input_path = '.'
+        input_path = "."
 
     try:
         output_path = argv[2]
     except:
-        output_path = '.'
+        output_path = "."
 
     try:
         kind = argv[3]
     except:
-        kind = ''
+        kind = ""
 
     main(input_path, output_path, kind)
diff --git a/scripts/python/get_number_objects.py b/scripts/python/get_number_objects.py
index 0f3ae41b1..232810ffd 100755
--- a/scripts/python/get_number_objects.py
+++ b/scripts/python/get_number_objects.py
@@ -14,15 +14,16 @@
 import copy
 import glob
 
-from optparse import OptionParser                                               
+from optparse import OptionParser
 from astropy.io import fits
 
 from shapepipe.pipeline.run_log import get_last_dir, get_all_dirs
-from shapepipe.utilities import cfis                                            
+from shapepipe.utilities import cfis
 
 
 class param:
     """General class to store (default) variables"""
+
     def __init__(self, **kwds):
         self.__dict__.update(kwds)
 
@@ -43,8 +44,8 @@ class param
 
     """
     p_def = param(
-        input_path='.',
-        input_name_base='final_cat',
+        input_path=".",
+        input_name_base="final_cat",
         hdu_num=1,
     )
 
@@ -66,60 +67,60 @@ def parse_options(p_def):
         command line str
 
     """
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # IO
     parser.add_option(
-        '-i',
-        '--input_path',
-        dest='input_path',
-        type='string',
+        "-i",
+        "--input_path",
+        dest="input_path",
+        type="string",
         default=p_def.input_path,
-        help=f'input path, default=\'{p_def.input_path}\''
+        help=f"input path, default='{p_def.input_path}'",
     )
     parser.add_option(
-        '-n',
-        '--input_name_base',
-        dest='input_name_base',
-        type='string',
+        "-n",
+        "--input_name_base",
+        dest="input_name_base",
+        type="string",
         default=p_def.input_name_base,
-        help=f'input name base, default=\'{p_def.input_name_base}\''
+        help=f"input name base, default='{p_def.input_name_base}'",
     )
     parser.add_option(
-        '-l',
-        '--list_tile_ID_path',
-        dest='tile_ID_list_path',
-        type='string',
+        "-l",
+        "--list_tile_ID_path",
+        dest="tile_ID_list_path",
+        type="string",
         default=None,
-        help=f'tile ID list, default: Use all data in input files'
+        help=f"tile ID list, default: Use all data in input files",
     )
 
     # Control
     parser.add_option(
-        '-p',
-        '--param_path',
-        dest='param_path',
-        type='string',
+        "-p",
+        "--param_path",
+        dest="param_path",
+        type="string",
         default=None,
-        help='parameter file path, default=None'
+        help="parameter file path, default=None",
     )
 
     parser.add_option(
-        '',
-        '--hdu_num',
-        dest='hdu_num',
-        type='int',
+        "",
+        "--hdu_num",
+        dest="hdu_num",
+        type="int",
         default=p_def.hdu_num,
-        help=f'input HDU number, default=\'{p_def.hdu_num}\''
+        help=f"input HDU number, default='{p_def.hdu_num}'",
     )
 
     parser.add_option(
-        '-v',
-        '--verbose',
-        dest='verbose',
-        action='store_true',
-        help='verbose output'
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
     )
 
     options, args = parser.parse_args()
@@ -199,19 +200,19 @@ def read_param_file(path, verbose=False):
 
         with open(path) as f:
             for line in f:
-                if line.startswith('#'):
-                    continue 
+                if line.startswith("#"):
+                    continue
                 entry = line.rstrip()
-                if not entry or entry == '':
+                if not entry or entry == "":
                     continue
                 param_list.append(entry)
 
     if verbose:
-        if len(param_list) > 0: 
-            print(f'Copying {len(param_list)} columns', end='')
+        if len(param_list) > 0:
+            print(f"Copying {len(param_list)} columns", end="")
         else:
-            print('Copying all columns', end='')
-        print(' into merged catalogue')
+            print("Copying all columns", end="")
+        print(" into merged catalogue")
 
     # Check for multiples
     multiples = []
@@ -220,15 +221,18 @@ def read_param_file(path, verbose=False):
             multiples.append(param)
 
     if len(multiples) > 0:
-        print('The following parameters are more than one times '
-              'in the parameter file: ', end='')
+        print(
+            "The following parameters are more than one times "
+            "in the parameter file: ",
+            end="",
+        )
         for m in multiples:
-            print(m, end=' ')
+            print(m, end=" ")
         print()
-        raise ValueError('Multiple identical keys found')
+        raise ValueError("Multiple identical keys found")
 
     return param_list
-                            
+
 
 def get_data(path, hdu_num, param_list):
     """Return data of selected columns from FITS file.
@@ -255,7 +259,7 @@ def get_data(path, hdu_num, param_list):
     if param_list:
         cols = []
         for p in param_list:
-            cols.append(hdu.columns[p]) 
+            cols.append(hdu.columns[p])
         coldefs = fits.ColDefs(cols)
         hdu_new = fits.BinTableHDU.from_columns(coldefs)
         d = hdu_new.data
@@ -281,11 +285,11 @@ def main(argv=None):
     # Save command line arguments to log file
     f_log = cfis.log_command(argv, close_no_return=False)
 
-    pattern = 'sexcat'
-    run_log_file = 'output/log_run_sp.txt'
+    pattern = "sexcat"
+    run_log_file = "output/log_run_sp.txt"
 
     # For v1
-    #module = 'sextractor_runner_run_1'
+    # module = 'sextractor_runner_run_1'
 
     # For v2
     module = "sextractor_runner"
@@ -297,16 +301,16 @@ def main(argv=None):
     paths = sorted(paths)
     last_dir = paths[-1]
 
-    file_list = glob.glob(f'{last_dir}/{pattern}*.fits')
+    file_list = glob.glob(f"{last_dir}/{pattern}*.fits")
     if len(file_list) == 0:
-        raise ValueError(f'No files {last_dir}/{pattern}*.fits found')
+        raise ValueError(f"No files {last_dir}/{pattern}*.fits found")
 
     n_obj = 0
     hdu_no = -1
     for fpath in file_list:
         hdu_list = fits.open(fpath)
         header = hdu_list[-1].header
-        n_obj += int(header['NAXIS2'])
+        n_obj += int(header["NAXIS2"])
 
     n_obj = int(n_obj / len(file_list))
 
diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py
index 929c90940..069121740 100755
--- a/scripts/python/link_to_exp_for_tile.py
+++ b/scripts/python/link_to_exp_for_tile.py
@@ -20,9 +20,8 @@
 
 
 class param:
-    """General class to store (default) variables
+    """General class to store (default) variables"""
 
-    """
     def __init__(self, **kwds):
         self.__dict__.update(kwds)
 
@@ -35,7 +34,7 @@ def var_list(self, **kwds):
 
 def params_default():
     """Params Default.
-    
+
     Set default parameter values.
 
     Returns
@@ -45,8 +44,8 @@ class param
 
     """
     p_def = param(
-        tile_base_dir  = '.',
-        exp_base_dir = '.',
+        tile_base_dir=".",
+        exp_base_dir=".",
     )
 
     return p_def
@@ -54,7 +53,7 @@ class param
 
 def parse_options(p_def):
     """Parse Options.
-    
+
     Parse command line options.
 
     Parameters
@@ -69,39 +68,39 @@ def parse_options(p_def):
         command line str
 
     """
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # IO
     parser.add_option(
-        '-i',
-        '--input_tile_dir',
-        dest='tile_base_dir',
-        type='string',
+        "-i",
+        "--input_tile_dir",
+        dest="tile_base_dir",
+        type="string",
         default=p_def.tile_base_dir,
-        help=f'input tile base directory, default=\'{p_def.tile_base_dir}\''
+        help=f"input tile base directory, default='{p_def.tile_base_dir}'",
     )
     parser.add_option(
-        '-t',
-        '--tile_ID',
-        dest='tile_ID',
-        type='string',
+        "-t",
+        "--tile_ID",
+        dest="tile_ID",
+        type="string",
         help=f"input tile ID",
     )
     parser.add_option(
-        '-I',
-        '--input_exp_dir',
-        dest='exp_base_dir',
-        type='string',
+        "-I",
+        "--input_exp_dir",
+        dest="exp_base_dir",
+        type="string",
         default=p_def.exp_base_dir,
-        help=f'input exposure base directory, default=\'{p_def.exp_base_dir}\''
+        help=f"input exposure base directory, default='{p_def.exp_base_dir}'",
     )
     parser.add_option(
-        '-v',
-        '--verbose',
-        dest='verbose',
-        action='store_true',
-        help='verbose output'
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
     )
 
     options, args = parser.parse_args()
@@ -111,7 +110,7 @@ def parse_options(p_def):
 
 def check_options(options):
     """Check Options.
-    
+
     Check command line options.
 
     Parameters
@@ -130,7 +129,7 @@ def check_options(options):
 
 def update_param(p_def, options):
     """Update Param.
-    
+
     Return default parameter, updated and complemented according to options.
 
     Parameters
@@ -163,7 +162,7 @@ class param
     return param
 
 
-# TODO: move to cs_util                                                          
+# TODO: move to cs_util
 def matching_subdirs(base_dir, pattern):
 
     # Find all matching subdirectories
@@ -218,7 +217,7 @@ def get_exp_IDs(tile_base_dir, tile_ID, verbose=False):
         for line in f_in:
             name = line.strip()
             # Remove any letter
-            ID = re.sub("[a-zA-Z]", "", name) 
+            ID = re.sub("[a-zA-Z]", "", name)
             exp_IDs.append(ID)
 
     if verbose:
@@ -236,7 +235,7 @@ def get_exp_single_HDU_IDs(exp_IDs, n_CPU):
 
     return exp_shdu_IDs
 
-    
+
 def get_paths(exp_base_dir, exp_shdu_IDs, pattern):
 
     number = {}
@@ -259,7 +258,7 @@ def get_paths(exp_base_dir, exp_shdu_IDs, pattern):
                 + f"  not {n_subdirs}"
             )
             print(msg)
-            # More than one match: sort according to name = creation time 
+            # More than one match: sort according to name = creation time
             subdirs = sorted(subdirs)
             if n_subdirs == 0:
                 continue
@@ -283,9 +282,9 @@ def create_links_paths(tile_base_dir, tile_ID, paths, verbose=False):
             src_existing = os.readlink(dst)
             if src_existing == src:
                 if verbose:
-                    #print("link {src} <- {dst}")
+                    # print("link {src} <- {dst}")
                     f"Warning: {src} <- {dst} already exists, no link created"
-                #)
+                # )
                 continue
             else:
                 idx = 1
@@ -328,13 +327,12 @@ def main(argv=None):
     exp_shdu_IDs = get_exp_single_HDU_IDs(exp_IDs, n_CPU)
 
     # Note: psfex P3 is mostly run_sp_exp_SxSePsf
-    patterns = ["run_sp_exp_SxSePsfPi"] #, "run_sp_exp_Pi"]
+    patterns = ["run_sp_exp_SxSePsfPi"]  # , "run_sp_exp_Pi"]
     for pattern in patterns:
         paths, number = get_paths(exp_base_dir, exp_shdu_IDs, pattern)
 
         create_links_paths(tile_base_dir, tile_ID, paths, verbose=verbose)
 
-
     return 0
 
 
diff --git a/scripts/python/merge_final_cat.py b/scripts/python/merge_final_cat.py
index 076f5c935..e634cd723 100755
--- a/scripts/python/merge_final_cat.py
+++ b/scripts/python/merge_final_cat.py
@@ -24,9 +24,8 @@
 
 
 class param:
-    """General class to store (default) variables
+    """General class to store (default) variables"""
 
-    """
     def __init__(self, **kwds):
         self.__dict__.update(kwds)
 
@@ -39,7 +38,7 @@ def var_list(self, **kwds):
 
 def params_default():
     """Params Default.
-    
+
     Set default parameter values.
 
     Returns
@@ -49,9 +48,9 @@ class param
 
     """
     p_def = param(
-        input_path  = '.',
-        input_name_base = 'final_cat',
-        hdu_num = 1,
+        input_path=".",
+        input_name_base="final_cat",
+        hdu_num=1,
     )
 
     return p_def
@@ -59,7 +58,7 @@ class param
 
 def parse_options(p_def):
     """Parse Options.
-    
+
     Parse command line options.
 
     Parameters
@@ -74,60 +73,60 @@ def parse_options(p_def):
         command line str
 
     """
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # IO
     parser.add_option(
-        '-i',
-        '--input_path',
-        dest='input_path',
-        type='string',
+        "-i",
+        "--input_path",
+        dest="input_path",
+        type="string",
         default=p_def.input_path,
-        help=f'input path, default=\'{p_def.input_path}\''
+        help=f"input path, default='{p_def.input_path}'",
     )
     parser.add_option(
-        '-n',
-        '--input_name_base',
-        dest='input_name_base',
-        type='string',
+        "-n",
+        "--input_name_base",
+        dest="input_name_base",
+        type="string",
         default=p_def.input_name_base,
-        help=f'input name base, default=\'{p_def.input_name_base}\''
+        help=f"input name base, default='{p_def.input_name_base}'",
     )
     parser.add_option(
-        '-l',
-        '--list_tile_ID_path',
-        dest='tile_ID_list_path',
-        type='string',
+        "-l",
+        "--list_tile_ID_path",
+        dest="tile_ID_list_path",
+        type="string",
         default=None,
-        help=f'tile ID list, default: Use all data in input files'
+        help=f"tile ID list, default: Use all data in input files",
     )
 
     # Control
     parser.add_option(
-        '-p',
-        '--param_path',
-        dest='param_path',
-        type='string',
+        "-p",
+        "--param_path",
+        dest="param_path",
+        type="string",
         default=None,
-        help='parameter file path, default=None'
+        help="parameter file path, default=None",
     )
 
     parser.add_option(
-        '',
-        '--hdu_num',
-        dest='hdu_num',
-        type='int',
+        "",
+        "--hdu_num",
+        dest="hdu_num",
+        type="int",
         default=p_def.hdu_num,
-        help=f'input HDU number, default=\'{p_def.hdu_num}\''
+        help=f"input HDU number, default='{p_def.hdu_num}'",
     )
 
     parser.add_option(
-        '-v',
-        '--verbose',
-        dest='verbose',
-        action='store_true',
-        help='verbose output'
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
     )
 
     options, args = parser.parse_args()
@@ -137,7 +136,7 @@ def parse_options(p_def):
 
 def check_options(options):
     """Check Options.
-    
+
     Check command line options.
 
     Parameters
@@ -156,7 +155,7 @@ def check_options(options):
 
 def update_param(p_def, options):
     """Update Param.
-    
+
     Return default parameter, updated and complemented according to options.
 
     Parameters
@@ -191,7 +190,7 @@ class param
 
 def read_param_file(path, verbose=False):
     """Read Param File.
-    
+
     Return parameter list read from file.
 
     Parameters
@@ -213,19 +212,19 @@ def read_param_file(path, verbose=False):
 
         with open(path) as f:
             for line in f:
-                if line.startswith('#'):
-                    continue 
+                if line.startswith("#"):
+                    continue
                 entry = line.rstrip()
-                if not entry or entry == '':
+                if not entry or entry == "":
                     continue
                 param_list.append(entry)
 
     if verbose:
-        if len(param_list) > 0: 
-            print(f'Copying {len(param_list)} columns', end='')
+        if len(param_list) > 0:
+            print(f"Copying {len(param_list)} columns", end="")
         else:
-            print('Copying all columns', end='')
-        print(' into merged catalogue')
+            print("Copying all columns", end="")
+        print(" into merged catalogue")
 
     # Check for multiples
     multiples = []
@@ -234,19 +233,22 @@ def read_param_file(path, verbose=False):
             multiples.append(param)
 
     if len(multiples) > 0:
-        print('The following parameters are more than one times '
-              'in the parameter file: ', end='')
+        print(
+            "The following parameters are more than one times "
+            "in the parameter file: ",
+            end="",
+        )
         for m in multiples:
-            print(m, end=' ')
+            print(m, end=" ")
         print()
-        raise ValueError('Multiple identical keys found')
+        raise ValueError("Multiple identical keys found")
 
     return param_list
-                            
+
 
 def get_data(path, hdu_num, param_list):
     """Get Data.
-    
+
     Return data of selected columns from FITS file.
 
     Parameters
@@ -271,7 +273,7 @@ def get_data(path, hdu_num, param_list):
     if param_list:
         cols = []
         for p in param_list:
-            cols.append(hdu.columns[p]) 
+            cols.append(hdu.columns[p])
         coldefs = fits.ColDefs(cols)
         hdu_new = fits.BinTableHDU.from_columns(coldefs)
         d = hdu_new.data
@@ -307,7 +309,7 @@ def main(argv=None):
 
     # find input catalogue FITS files
     l = os.listdir(path=path)
-    ext = 'fits'
+    ext = "fits"
     lpath = []
     for this_l in l:
 
@@ -316,22 +318,22 @@ def main(argv=None):
         # mark to add if correct extension, matches input pattern,
         if (
             this_l.endswith(ext)
-            and (f'{param.input_name_base}' in this_l)
-            and ('.npy' not in this_l)
+            and (f"{param.input_name_base}" in this_l)
+            and (".npy" not in this_l)
         ):
             add_this_l = True
 
             # unmark to add if no in (optional) input tile ID file
-            if param.tile_ID_list_path: 
+            if param.tile_ID_list_path:
                 nix, niy = cfis.get_tile_number(this_l)
-                tile_ID = f'{nix}.{niy}'
+                tile_ID = f"{nix}.{niy}"
                 if tile_ID not in tile_ID_list:
                     add_this_l = False
             if add_this_l:
                 lpath.append(os.path.join(path, this_l))
 
     if param.verbose:
-        print(f'{len(lpath)} files files to merge found')
+        print(f"{len(lpath)} files files to merge found")
 
     count = 0
 
@@ -342,7 +344,7 @@ def main(argv=None):
         d[key] = d_tmp[key]
     count = count + 1
     if param.verbose:
-        print(f'File \'{lpath[0]}\' copied ({count}/{len(lpath)})')
+        print(f"File '{lpath[0]}' copied ({count}/{len(lpath)})")
 
     # merge remaining catalogue files
     for fname in lpath[1:]:
@@ -356,21 +358,21 @@ def main(argv=None):
 
             count = count + 1
             if param.verbose:
-                print(f'File \'{fname}\' copied ({count}/{len(lpath)})')
+                print(f"File '{fname}' copied ({count}/{len(lpath)})")
 
             d = np.concatenate((d, dd))
         except:
             print(
-                f'Error while adding file \'{fname}\', {len(dd)} objects'
-                ' not in final cat'
+                f"Error while adding file '{fname}', {len(dd)} objects"
+                " not in final cat"
             )
 
     # Save merged catalogue as numpy binary file
     if param.verbose:
-        print('Saving merged catalogue')
-    np.save(f'{param.input_name_base}.npy', d)
+        print("Saving merged catalogue")
+    np.save(f"{param.input_name_base}.npy", d)
 
-    msg = f'{count} catalog files merged with success'
+    msg = f"{count} catalog files merged with success"
     if param.verbose:
         print(msg)
     print(msg, file=f_log)
diff --git a/scripts/python/stats_global.py b/scripts/python/stats_global.py
index 950abba78..b3a6964b7 100755
--- a/scripts/python/stats_global.py
+++ b/scripts/python/stats_global.py
@@ -40,9 +40,9 @@ def params_default():
     """
 
     p_def = cfis.param(
-        input_dir = '.',
-        output_dir = '.',
-        pattern = 'star_stat-',
+        input_dir=".",
+        output_dir=".",
+        pattern="star_stat-",
     )
 
     return p_def
@@ -64,23 +64,49 @@ def parse_options(p_def):
         Command line string
     """
 
-    usage  = "%prog [OPTIONS]"
+    usage = "%prog [OPTIONS]"
     parser = OptionParser(usage=usage)
 
     # I/O
-    parser.add_option('-i', '--input_dir', dest='input_dir', type='string', \
-         default=p_def.input_dir, \
-         help='input directory, default=\'{}\''.format(p_def.input_dir))
-    parser.add_option('-o', '--output_dir', dest='output_dir', type='string', \
-         default=p_def.output_dir, \
-         help='output directory, default=\'{}\''.format(p_def.output_dir))
-    parser.add_option('-c', '--config', dest='config', type='string', \
-         help='configuration file, default=none')
-    parser.add_option('-p', '--pattern', dest='pattern', type='string', \
-         default=p_def.pattern, \
-         help='input file pattern, default=\'{}\''.format(p_def.pattern))
-
-    parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output')
+    parser.add_option(
+        "-i",
+        "--input_dir",
+        dest="input_dir",
+        type="string",
+        default=p_def.input_dir,
+        help="input directory, default='{}'".format(p_def.input_dir),
+    )
+    parser.add_option(
+        "-o",
+        "--output_dir",
+        dest="output_dir",
+        type="string",
+        default=p_def.output_dir,
+        help="output directory, default='{}'".format(p_def.output_dir),
+    )
+    parser.add_option(
+        "-c",
+        "--config",
+        dest="config",
+        type="string",
+        help="configuration file, default=none",
+    )
+    parser.add_option(
+        "-p",
+        "--pattern",
+        dest="pattern",
+        type="string",
+        default=p_def.pattern,
+        help="input file pattern, default='{}'".format(p_def.pattern),
+    )
+
+    parser.add_option(
+        "-v",
+        "--verbose",
+        dest="verbose",
+        action="store_true",
+        help="verbose output",
+    )
 
     options, args = parser.parse_args()
 
@@ -106,14 +132,14 @@ def check_options(options):
 
 def update_param(p_def, options):
     """Return default parameter, updated and complemented according to options.
-    
+
     Parameters
     ----------
     p_def:  class param
         parameter values
     options: tuple
         command line options
-    
+
     Returns
     -------
     param: class param
@@ -152,8 +178,11 @@ def get_stats_file_list(param):
     """
 
     # Full paths
-    paths = glob.glob('{}/output/*/setools_runner/output/stat/{}*'.
-                      format(param.input_dir, param.pattern))
+    paths = glob.glob(
+        "{}/output/*/setools_runner/output/stat/{}*".format(
+            param.input_dir, param.pattern
+        )
+    )
 
     # File names w/o directories
     names = []
@@ -170,8 +199,11 @@ def get_stats_file_list(param):
             paths_unq.append(paths[i])
 
     if param.verbose:
-        print('{} files in total, {} unique files found'.
-              format(len(paths), len(paths_unq)))
+        print(
+            "{} files in total, {} unique files found".format(
+                len(paths), len(paths_unq)
+            )
+        )
 
     return paths_unq
 
@@ -196,11 +228,11 @@ def gather_values(paths, verbose=False):
     for path in paths:
         with open(path) as f:
             lines = f.readlines()
-        for line in lines: 
+        for line in lines:
             m = re.search("#", line)
             if m:
                 continue
-            m = re.search('(.*) = (\S*)', line)
+            m = re.search("(.*) = (\S*)", line)
             if m:
                 key = m[1]
                 val = float(m[2])
@@ -210,13 +242,14 @@ def gather_values(paths, verbose=False):
                     values[key].append(val)
                 else:
                     if verbose:
-                        print('NaN found in file \'{}\', key \'{}\''
-                              .format(path, key))
+                        print(
+                            "NaN found in file '{}', key '{}'".format(path, key)
+                        )
 
     if verbose:
-        print('{} keys created'.format(len(values)))
+        print("{} keys created".format(len(values)))
         for key in values:
-            print('#{{values[{}]}} = {}'.format(key, len(values[key])))
+            print("#{{values[{}]}} = {}".format(key, len(values[key])))
 
     return values
 
@@ -239,12 +272,12 @@ def compute_histograms(values, config=None, verbose=False):
         histograms for all keys
     """
 
-    if config and config.has_option('ALL', 'nbins'):
-        nbins_global = config.getint('ALL', 'nbins')
+    if config and config.has_option("ALL", "nbins"):
+        nbins_global = config.getint("ALL", "nbins")
     else:
         nbins_global = 50
 
-    print('nbins_global = {}'.format(nbins_global))
+    print("nbins_global = {}".format(nbins_global))
 
     hists = {}
     i = 0
@@ -252,22 +285,22 @@ def compute_histograms(values, config=None, verbose=False):
 
         si = str(i)
 
-        if config and config.has_option(si, 'nbins'):
-            nbins = config.getint(si, 'nbins')
+        if config and config.has_option(si, "nbins"):
+            nbins = config.getint(si, "nbins")
         else:
             nbins = nbins_global
 
         try:
             hists[key] = np.histogram(values[key], bins=nbins)
         except ValueError as err:
-            print('Skipping histogram #{}: {}'.format(i, err))
+            print("Skipping histogram #{}: {}".format(i, err))
 
         i = i + 1
 
     return hists
 
 
-def plot_histograms(hists, config=None, output_dir='.', verbose=False):
+def plot_histograms(hists, config=None, output_dir=".", verbose=False):
     """Create histogram plots.
 
     Parameters
@@ -285,9 +318,9 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False):
     fig, (ax) = plt.subplots()
     plt.tight_layout()
 
-    if config and config.has_option('ALL', 'fontsize'):
-        fontsize = config.getint('ALL', 'fontsize')
-        plt.rcParams.update({'font.size': fontsize})
+    if config and config.has_option("ALL", "fontsize"):
+        fontsize = config.getint("ALL", "fontsize")
+        plt.rcParams.update({"font.size": fontsize})
 
     xlim_fac = 0.05
 
@@ -296,11 +329,13 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False):
 
         si = str(i)
 
-        if config and \
-            config.has_option(si, 'plot') and \
-            config.getboolean(si, 'plot') == False:
+        if (
+            config
+            and config.has_option(si, "plot")
+            and config.getboolean(si, "plot") == False
+        ):
             if verbose:
-                print('Skipping histogram #{} {}'.format(i, key))
+                print("Skipping histogram #{} {}".format(i, key))
 
         else:
 
@@ -314,12 +349,12 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False):
 
             # Overwrite limits if found in config file.
             # If not stretch bin boundaries
-            if config and config.has_option(si, 'xmin'):
-                xmin = config.getfloat(si, 'xmin')
+            if config and config.has_option(si, "xmin"):
+                xmin = config.getfloat(si, "xmin")
             else:
                 xmin = min(bins)
-            if config and config.has_option(si, 'xmax'):
-                xmax = config.getfloat(si, 'xmax')
+            if config and config.has_option(si, "xmax"):
+                xmax = config.getfloat(si, "xmax")
             else:
                 xmax = max(bins)
 
@@ -327,19 +362,19 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False):
 
             # If limits from bin boundaries: extend by small
             # amount
-            if config and config.has_option(si, 'xmin'):
+            if config and config.has_option(si, "xmin"):
                 xxmin = xmin
             else:
                 xxmin = xmin - dx * xlim_fac
-            if config and config.has_option(si, 'xmax'):
+            if config and config.has_option(si, "xmax"):
                 xxmax = xmax
             else:
                 xxmax = xmax + dx * xlim_fac
 
             plt.xlim(xxmin, xxmax)
 
-            if config and config.has_option(si, 'xlabel'):
-                xlabel = config.get(si, 'xlabel')
+            if config and config.has_option(si, "xlabel"):
+                xlabel = config.get(si, "xlabel")
             else:
                 xlabel = key
             plt.xlabel(xlabel)
@@ -347,28 +382,33 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False):
             ymin = min(freq)
             ymax = max(freq)
             plt.ylim(ymin, ymax)
-            ylabel = 'frequency'
+            ylabel = "frequency"
             plt.ylabel(ylabel)
 
-            if config and config.has_option(si, 'title'):
-                plt.title(config.get(si, 'title'))
+            if config and config.has_option(si, "title"):
+                plt.title(config.get(si, "title"))
 
-            if config and config.has_option(si, 'fname'):
-                file_base = config.getexpanded(si, 'fname')
+            if config and config.has_option(si, "fname"):
+                file_base = config.getexpanded(si, "fname")
             else:
-                file_base = 'hist_{}'.format(i)
+                file_base = "hist_{}".format(i)
 
             if verbose:
-                print('Creating files \'{}.*\''.format(file_base))
-
-            plt.savefig('{}/{}.png'.format(output_dir, file_base), bbox_inches='tight')
-            np.savetxt('{}/{}.txt'.format(output_dir, file_base), np.transpose([bins, freq]),
-                       fmt='%10g', header='[{}] [{}]'.format(xlabel, ylabel)),
+                print("Creating files '{}.*'".format(file_base))
+
+            plt.savefig(
+                "{}/{}.png".format(output_dir, file_base), bbox_inches="tight"
+            )
+            np.savetxt(
+                "{}/{}.txt".format(output_dir, file_base),
+                np.transpose([bins, freq]),
+                fmt="%10g",
+                header="[{}] [{}]".format(xlabel, ylabel),
+            ),
 
         i = i + 1
 
 
-
 def get_config(config_path, verbose=False):
     """Return configuration file values.
 
@@ -391,10 +431,12 @@ def get_config(config_path, verbose=False):
     from shapepipe.pipeline.config import CustomParser
 
     if verbose:
-        print('Reading configuration file \'{}\''.format(config_path))
+        print("Reading configuration file '{}'".format(config_path))
 
     if not os.path.exists(config_path):
-        raise OSError('Configuration file \'{}\' does not exist'.format(config_path))
+        raise OSError(
+            "Configuration file '{}' does not exist".format(config_path)
+        )
 
     conf = CustomParser()
     conf.read(config_path)
@@ -419,13 +461,12 @@ def main(argv=None):
     # Save calling command
     cfis.log_command(argv)
     if param.verbose:
-        cfis.log_command(argv, name='sys.stdout')
-
+        cfis.log_command(argv, name="sys.stdout")
 
     ### Start main program ###
 
     if param.verbose:
-        print('Start of program {}'.format(os.path.basename(argv[0])))
+        print("Start of program {}".format(os.path.basename(argv[0])))
 
     files = get_stats_file_list(param)
 
@@ -436,22 +477,23 @@ def main(argv=None):
     hists = compute_histograms(values, config=config, verbose=param.verbose)
 
     if os.path.isfile(param.output_dir):
-        raise OSError('Output path \'{}\' is a regular file'
-                      ''.format(param.output_dir))
+        raise OSError(
+            "Output path '{}' is a regular file" "".format(param.output_dir)
+        )
     if not os.path.isdir(param.output_dir):
         os.mkdir(param.output_dir)
 
-    plot_histograms(hists, config=config, output_dir=param.output_dir,
-                    verbose=param.verbose)
+    plot_histograms(
+        hists, config=config, output_dir=param.output_dir, verbose=param.verbose
+    )
 
     ### End main program
 
     if param.verbose:
-        print('End of program {}'.format(os.path.basename(argv[0])))
+        print("End of program {}".format(os.path.basename(argv[0])))
 
     return 0
 
 
 if __name__ == "__main__":
     sys.exit(main(sys.argv))
-
diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index d640c8ab1..411053b3e 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -5,9 +5,7 @@
 
 
 def set_jobs_v2_pre_v2(patch, verbose):
-    """ Return information about shapepipe jobs
-    
-    """
+    """Return information about shapepipe jobs"""
     print(f"Set job info for patch {patch}")
 
     # Main input and output directory
@@ -20,7 +18,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     log_file_name = f"{path}/summary_log.txt"
     handlers = [
         logging.FileHandler(log_file_name, mode="w"),
-        logging.StreamHandler()
+        logging.StreamHandler(),
     ]
     logging.basicConfig(
         level=logging.INFO, format="%(message)s", handlers=handlers
@@ -37,7 +35,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     jobs = {}
 
     # Set the first job (retrieve images)
-    
+
     # With "CFIS_" only the linked images are counted. The original
     # ones do not match the IDdash pattern.
     # If images were downloaded in several runs:
@@ -46,8 +44,8 @@ def set_jobs_v2_pre_v2(patch, verbose):
     # - remove previous output dirs since only last is searched
     jobs["1"] = job_data(
         1,
-         "run_sp_GitFeGie",
-       [
+        "run_sp_GitFeGie",
+        [
             "get_images_runner_run_1",
             "find_exposures_runner",
             "get_images_runner_run_2",
@@ -111,7 +109,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
-            #"run_sp_exp_Pi"
+            # "run_sp_exp_Pi"
         ],
         [
             "sextractor_runner",
@@ -129,7 +127,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     )
 
     # For P3
-    #jobs["33"] = job_data(
+    # jobs["33"] = job_data(
     #    33,
     #    "run_sp_exp_Pi",
     #    ["psfex_interp_runner"],
@@ -139,7 +137,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     #    output_subdirs="shdus",
     #    path_right="output",
     #    verbose=verbose,
-    #)
+    # )
 
     jobs["64"] = job_data(
         "64",
@@ -161,7 +159,8 @@ def set_jobs_v2_pre_v2(patch, verbose):
     n_sh = 8
     run_dirs = [f"run_sp_tile_ngmix_Ng{idx+1}u" for idx in range(n_sh)]
     output_path_missing_IDs = [
-        f"{path_main}/summary/missing_job_128_ngmix_runner_{idx+1}.txt" for idx in range(n_sh)
+        f"{path_main}/summary/missing_job_128_ngmix_runner_{idx+1}.txt"
+        for idx in range(n_sh)
     ]
     jobs["128"] = job_data(
         "128",
@@ -217,5 +216,5 @@ def set_jobs_v2_pre_v2(patch, verbose):
         path_left="output",
         verbose=verbose,
     )
-    
+
     return jobs, list_tile_IDs_dot
diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py
index 0039ff628..f24d6574d 100755
--- a/scripts/python/summary_run.py
+++ b/scripts/python/summary_run.py
@@ -20,19 +20,21 @@ def main(argv=None):
     verbose = False
 
     jobs, list_tile_IDs_dot = set_jobs_v2_pre_v2(patch, verbose)
-    
+
     list_tile_IDs = job_data.replace_dot_dash(list_tile_IDs_dot)
-    
+
     # Numbers updated at runtime
     par_runtime = init_par_runtime(list_tile_IDs)
-    
+
     job_data.print_stats_header()
 
     exp_IDs_path = "exp_numbers.txt"
     if os.path.exists(exp_IDs_path):
         # Read exposure ID list if file exists
         all_exposures = get_IDs_from_file(exp_IDs_path)
-        par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)
+        par_runtime = update_par_runtime_after_find_exp(
+            par_runtime, all_exposures
+        )
 
     if (
         not os.path.exists(exp_IDs_path)
@@ -46,10 +48,11 @@ def main(argv=None):
         jobs[key].check_numbers(par_runtime=par_runtime, indices=[0, 1])
 
         all_exposures = get_all_exposures(
-            jobs[key]._paths_in_dir[1],
-            verbose=True
+            jobs[key]._paths_in_dir[1], verbose=True
+        )
+        par_runtime = update_par_runtime_after_find_exp(
+            par_runtime, all_exposures
         )
-        par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)
 
         jobs[key].write_IDs_to_file("exp_numbers.txt", all_exposures)
 
@@ -57,7 +60,6 @@ def main(argv=None):
 
     print_par_runtime(par_runtime, verbose=verbose)
 
-
     # Get all keys after "1"
     keys = sorted(jobs.keys(), key=int)
     _ = keys.pop(0)
diff --git a/scripts/python/update_runs_log_file.py b/scripts/python/update_runs_log_file.py
index a08890117..6cd1fde63 100644
--- a/scripts/python/update_runs_log_file.py
+++ b/scripts/python/update_runs_log_file.py
@@ -4,24 +4,25 @@
 import sys
 import os
 
+
 # TODO: move to cs_util
-def matching_subdirs(base_dir, pattern, tail=False):                                         
-                                                                                 
-    # Find all matching subdirectories                                           
-    subdirs = []                                                                 
-    for entry in os.listdir(base_dir):                                           
-        full_path = os.path.join(base_dir, entry)                                
+def matching_subdirs(base_dir, pattern, tail=False):
+
+    # Find all matching subdirectories
+    subdirs = []
+    for entry in os.listdir(base_dir):
+        full_path = os.path.join(base_dir, entry)
         if os.path.isdir(full_path):
             found = False
 
             # Look for pattern at start or end
-            if pattern in entry:               
+            if pattern in entry:
 
                 # Get full path or last part ("tail")
                 if not tail:
                     path = full_path
                 else:
-                    head, tail = os.path.split(full_path) 
+                    head, tail = os.path.split(full_path)
                     path = tail
 
                 # Remove postfix in case of multiple runs of same module
@@ -29,11 +30,11 @@ def matching_subdirs(base_dir, pattern, tail=False):
 
                 # Append to result
                 subdirs.append(path)
-                                                                                 
-    # Sort according to creation date                                            
+
+    # Sort according to creation date
     if not tail:
-        subdirs.sort(key=os.path.getctime)                                           
-                                                                                 
+        subdirs.sort(key=os.path.getctime)
+
     return subdirs
 
 
@@ -50,36 +51,36 @@ def get_module_runs(subdirs):
 
 def update_log_file(module_runs, log_name):
 
-    with open(log_name, "w") as f_out: 
+    with open(log_name, "w") as f_out:
         for key in module_runs:
             print(key, file=f_out, end=" ")
             print(",".join(module_runs[key]), file=f_out)
 
 
-def main(argv=None):                                                             
-                                                                                 
-    # Set default parameters                                                     
-    #p_def = params_default()                                                     
-                                                                                 
-    # Command line options                                                       
-    #options, args = parse_options(p_def)                                         
-                                                                                 
-    #if check_options(options) is False:                                          
-        #return 1                                                                 
-                                                                                 
-    #param = update_param(p_def, options)                                         
-                                                                                 
+def main(argv=None):
+
+    # Set default parameters
+    # p_def = params_default()
+
+    # Command line options
+    # options, args = parse_options(p_def)
+
+    # if check_options(options) is False:
+    # return 1
+
+    # param = update_param(p_def, options)
+
     base_dir = "./output"
     pattern = "run_sp_"
     log_name = f"{base_dir}/log_run_sp.txt"
 
     subdirs = matching_subdirs(base_dir, pattern)
     module_runs = get_module_runs(subdirs)
-    #save_prev(log_name)
+    # save_prev(log_name)
     update_log_file(module_runs, log_name)
-                                                                                 
-    return 0                                                                     
-                                                                                 
-                                                                                 
-if __name__ == "__main__":                                                       
+
+    return 0
+
+
+if __name__ == "__main__":
     sys.exit(main(sys.argv))
diff --git a/scripts/python/vignets2image.py b/scripts/python/vignets2image.py
index 7fb444246..60933173c 100755
--- a/scripts/python/vignets2image.py
+++ b/scripts/python/vignets2image.py
@@ -35,48 +35,47 @@ def map_vignet(img_arr, dtype):
     ys = img_arr[0].shape[1]
 
     nx = int(np.sqrt(n_obj))
-    if nx*nx != n_obj:
+    if nx * nx != n_obj:
         nx += 1
     ny = nx
 
-    img_map=np.ones((xs*nx,ys*ny), dtype=dtype)
+    img_map = np.ones((xs * nx, ys * ny), dtype=dtype)
 
-    ii=0
-    jj=0
+    ii = 0
+    jj = 0
     for i in range(n_obj):
-        if jj>nx-1:
-            jj=0
-            ii+=1
-        img_map[ii*xs:(ii+1)*xs,jj*ys:(jj+1)*ys]=img_arr[i]
-        jj+=1
+        if jj > nx - 1:
+            jj = 0
+            ii += 1
+        img_map[ii * xs : (ii + 1) * xs, jj * ys : (jj + 1) * ys] = img_arr[i]
+        jj += 1
 
     return img_map, nx
 
 
-
 def main(argv=None):
 
-    path = '.'
-    pattern = 'UNIONS_'
-    prefix_out = 'img_'
+    path = "."
+    pattern = "UNIONS_"
+    prefix_out = "img_"
 
-    files = glob.glob('{}/{}*.fits'.format(path, pattern))
+    files = glob.glob("{}/{}*.fits".format(path, pattern))
 
     for input_path in files:
-        output_path = '{}{}'.format(prefix_out, os.path.basename(input_path))
+        output_path = "{}{}".format(prefix_out, os.path.basename(input_path))
 
         hdu = fits.open(input_path)
 
-        image, nx = map_vignet(hdu[2].data['VIGNET'], 'float32')
-        print('file = {}, nx = {}'.format(input_path, nx))
+        image, nx = map_vignet(hdu[2].data["VIGNET"], "float32")
+        print("file = {}, nx = {}".format(input_path, nx))
 
-        fout = io.FITSCatalog(output_path, open_mode=io.BaseCatalog.OpenMode.ReadWrite)
+        fout = io.FITSCatalog(
+            output_path, open_mode=io.BaseCatalog.OpenMode.ReadWrite
+        )
         fout.save_as_fits(image, image=True)
 
     return 0
 
 
-
 if __name__ == "__main__":
     sys.exit(main(sys.argv))
-
diff --git a/setup.py b/setup.py
index e5610581e..0d4c5c4c9 100644
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@
 
 package_info = {}
 infopath = os.path.abspath(
-    os.path.join(os.path.dirname(__file__), 'shapepipe', 'info.py')
+    os.path.join(os.path.dirname(__file__), "shapepipe", "info.py")
 )
 with open(infopath) as open_file:
     exec(open_file.read(), package_info)
@@ -15,8 +15,8 @@
 def find_scripts():
 
     scripts = []
-    scripts_dir = package_info['__scripts_dir__']
-    valid_extensions = package_info['__scripts_ext__']
+    scripts_dir = package_info["__scripts_dir__"]
+    valid_extensions = package_info["__scripts_ext__"]
 
     sub_dirs = (
         os.path.join(scripts_dir, sub_dir)
@@ -25,26 +25,29 @@ def find_scripts():
     )
 
     for sub_dir in sub_dirs:
-        scripts.extend([
-            os.path.join(sub_dir, val) for val in os.listdir(sub_dir)
-            if os.path.isfile(os.path.join(sub_dir, val))
-            and '__init__' not in val
-            and val.endswith(valid_extensions)
-        ])
+        scripts.extend(
+            [
+                os.path.join(sub_dir, val)
+                for val in os.listdir(sub_dir)
+                if os.path.isfile(os.path.join(sub_dir, val))
+                and "__init__" not in val
+                and val.endswith(valid_extensions)
+            ]
+        )
 
     return scripts
 
 
 setup(
-    name=package_info['__name__'],
-    author=package_info['__author__'],
-    author_email=package_info['__email__'],
-    version=package_info['__version__'],
+    name=package_info["__name__"],
+    author=package_info["__author__"],
+    author_email=package_info["__email__"],
+    version=package_info["__version__"],
     packages=find_packages(),
     scripts=find_scripts(),
-    setup_requires=package_info['__setups__'],
-    install_requires=package_info['__installs__'],
-    description='Galaxy shape measurement pipeline.',
-    long_description=package_info['__about__'],
-    tests_require=package_info['__tests__'],
+    setup_requires=package_info["__setups__"],
+    install_requires=package_info["__installs__"],
+    description="Galaxy shape measurement pipeline.",
+    long_description=package_info["__about__"],
+    tests_require=package_info["__tests__"],
 )
diff --git a/shapepipe/__init__.py b/shapepipe/__init__.py
index 88d7a1dfd..1957a353f 100644
--- a/shapepipe/__init__.py
+++ b/shapepipe/__init__.py
@@ -6,7 +6,7 @@
 
 """
 
-__all__ = ['modules', 'pipeline', 'utilities']
+__all__ = ["modules", "pipeline", "utilities"]
 
 from . import *
 from .info import __about__, __version__
diff --git a/shapepipe/info.py b/shapepipe/info.py
index d230bcd7f..7ce7f1d77 100644
--- a/shapepipe/info.py
+++ b/shapepipe/info.py
@@ -16,28 +16,24 @@
 
 # Package Info
 version_info = (1, 0, 1)
-__version__ = '.'.join(str(c) for c in version_info)
-__name__ = 'shapepipe'
-__author__ = 'Samuel Farrens'
-__email__ = 'samuel.farrens@cea.fr'
+__version__ = ".".join(str(c) for c in version_info)
+__name__ = "shapepipe"
+__author__ = "Samuel Farrens"
+__email__ = "samuel.farrens@cea.fr"
 __about__ = (
-    'ShapePipe is a shape measurement pipeline developed with the'
-    + 'CosmoStat lab at CEA Paris-Saclay.'
+    "ShapePipe is a shape measurement pipeline developed with the"
+    + "CosmoStat lab at CEA Paris-Saclay."
 )
-__setups__ = ['pytest-runner']
-__installs__ = [
-    'joblib>=0.13',
-    'modopt>=1.2',
-    'numpy>=1.14'
-]
+__setups__ = ["pytest-runner"]
+__installs__ = ["joblib>=0.13", "modopt>=1.2", "numpy>=1.14"]
 __tests__ = [
-    'pytest',
-    'pytest-cov',
-    'pytest-pycodestyle',
-    'pytest-pydocstyle',
+    "pytest",
+    "pytest-cov",
+    "pytest-pycodestyle",
+    "pytest-pydocstyle",
 ]
-__scripts_dir__ = 'scripts'
-__scripts_ext__ = ('.py', '.sh', '.bash')
+__scripts_dir__ = "scripts"
+__scripts_ext__ = (".py", ".sh", ".bash")
 
 
 def shapepipe_logo(colour=False):
@@ -48,7 +44,7 @@ def shapepipe_logo(colour=False):
     str logo string
 
     """
-    shape = r'''
+    shape = r"""
  _______  __   __  _______  _______  _______  _______  ___   _______  _______
 |       ||  | |  ||   _   ||       ||       ||       ||   | |       ||       |
 |  _____||  |_|  ||  |_|  ||    _  ||    ___||    _  ||   | |    _  ||    ___|
@@ -56,12 +52,12 @@ def shapepipe_logo(colour=False):
 |_____  ||       ||       ||    ___||    ___||    ___||   | |    ___||    ___|
  _____| ||   _   ||   _   ||   |    |   |___ |   |    |   | |   |    |   |___
 |_______||__| |__||__| |__||___|    |_______||___|    |___| |___|    |_______|
-    '''
+    """
 
     if not import_fail and colour:
-        shape = colored(shape, 'cyan', attrs=['bold'])
+        shape = colored(shape, "cyan", attrs=["bold"])
 
-    logo = r'''
+    logo = r"""
 -------------------------------------------------------------------------------
 {}
 
@@ -82,7 +78,9 @@ def shapepipe_logo(colour=False):
     Version: {}
 
 -------------------------------------------------------------------------------
-    '''.format(shape, __version__)
+    """.format(
+        shape, __version__
+    )
 
     return logo
 
@@ -95,8 +93,8 @@ def line():
     str a horizontal line
 
     """
-    line = r'''
+    line = r"""
 -------------------------------------------------------------------------------
-    '''
+    """
 
     return line
diff --git a/shapepipe/modules/__init__.py b/shapepipe/modules/__init__.py
index c440b44cf..5f3847899 100644
--- a/shapepipe/modules/__init__.py
+++ b/shapepipe/modules/__init__.py
@@ -11,8 +11,6 @@
 # Get a list of all files and directories in the modules directory
 modules_dir = os.listdir(os.path.dirname(os.path.abspath(__file__)))
 # List all ShapePipe module packages
-__all__ = [dir for dir in modules_dir if dir.endswith('_package')]
+__all__ = [dir for dir in modules_dir if dir.endswith("_package")]
 # List all ShapePipe module runners
-__module_list__ = [
-    file for file in modules_dir if file.endswith('_runner.py')
-]
+__module_list__ = [file for file in modules_dir if file.endswith("_runner.py")]
diff --git a/shapepipe/modules/execute_example_runner.py b/shapepipe/modules/execute_example_runner.py
index d1555ea5d..2872d608c 100644
--- a/shapepipe/modules/execute_example_runner.py
+++ b/shapepipe/modules/execute_example_runner.py
@@ -11,12 +11,12 @@
 
 
 @module_runner(
-    input_module='python_example_runner',
-    version='1.0',
-    file_pattern='pyex_output',
-    file_ext='.cat',
-    executes='head',
-    run_method='parallel',
+    input_module="python_example_runner",
+    version="1.0",
+    file_pattern="pyex_output",
+    file_ext=".cat",
+    executes="head",
+    run_method="parallel",
 )
 def execute_example_runner(
     input_file_list,
@@ -27,14 +27,14 @@ def execute_example_runner(
     w_log,
 ):
     """Define The Execute Example Runner."""
-    command_line = f'head {input_file_list[0]}'
+    command_line = f"head {input_file_list[0]}"
     output_file_name = (
         f'{run_dirs["output"]}/head_output{file_number_string}.txt'
     )
 
     stdout, stderr = execute(command_line)
 
-    text_file = open(output_file_name, 'w')
+    text_file = open(output_file_name, "w")
     text_file.write(stdout)
 
     return stdout, stderr
diff --git a/shapepipe/modules/find_exposures_package/__init__.py b/shapepipe/modules/find_exposures_package/__init__.py
index 00653bf0b..6bb5d6344 100644
--- a/shapepipe/modules/find_exposures_package/__init__.py
+++ b/shapepipe/modules/find_exposures_package/__init__.py
@@ -32,4 +32,4 @@
    Prefix of exposures 
 """
 
-__all__ = ['find_exposures.py']
+__all__ = ["find_exposures.py"]
diff --git a/shapepipe/modules/find_exposures_package/find_exposures.py b/shapepipe/modules/find_exposures_package/find_exposures.py
index a3c8f7928..eab72801e 100644
--- a/shapepipe/modules/find_exposures_package/find_exposures.py
+++ b/shapepipe/modules/find_exposures_package/find_exposures.py
@@ -12,7 +12,7 @@
 import astropy.io.fits as fits
 
 
-class FindExposures():
+class FindExposures:
     """Find Exposures.
 
     This class finds exposures that are used for a given tile.
@@ -49,7 +49,7 @@ def process(self):
         exp_list_uniq = self.get_exposure_list()
 
         # Write list to output ascii file
-        f_out = open(self._output_path, 'w')
+        f_out = open(self._output_path, "w")
         if len(exp_list_uniq) > 0:
             for exp in exp_list_uniq:
                 print(exp, file=f_out)
@@ -70,13 +70,13 @@ def get_exposure_list(self):
         try:
             # Get history from tiles FITS header
             hdu = fits.open(self._img_tile_path)
-            hist = hdu[0].header['HISTORY']
+            hist = hdu[0].header["HISTORY"]
 
         except Exception:
             # Key word not found -> raise error
             self._w_log.info(
-                'Error while reading tile image FITS file '
-                + f'{self._img_tile_path}, continuing...'
+                "Error while reading tile image FITS file "
+                + f"{self._img_tile_path}, continuing..."
             )
 
         exp_list = []
@@ -85,14 +85,14 @@ def get_exposure_list(self):
         # History entries have format as the following example:
         # "input image 2243881p.fits 6 extension(s)"
         for _hist in hist:
-            temp = _hist.split(' ')
+            temp = _hist.split(" ")
 
-            pattern = r'(.*)\.{1}.*'
+            pattern = r"(.*)\.{1}.*"
             pattern_match = re.search(pattern, temp[self._colnum])
             if not pattern_match:
                 raise IndexError(
-                    f're match \'{pattern}\' failed for filename'
-                    + f' \'{temp[self._colnum]}\''
+                    f"re match '{pattern}' failed for filename"
+                    + f" '{temp[self._colnum]}'"
                 )
 
             exp_name = pattern_match.group(1)
@@ -108,7 +108,7 @@ def get_exposure_list(self):
         # For log output
         n_exp_uniq = len(exp_list_uniq)
         n_duplicate = len(exp_list) - n_exp_uniq
-        self._w_log.info(f'Found {n_exp_uniq} exposures used in tile')
-        self._w_log.info(f'{n_duplicate} duplicates were removed')
+        self._w_log.info(f"Found {n_exp_uniq} exposures used in tile")
+        self._w_log.info(f"{n_duplicate} duplicates were removed")
 
         return exp_list_uniq
diff --git a/shapepipe/modules/find_exposures_runner.py b/shapepipe/modules/find_exposures_runner.py
index a7ea6b0be..a54d59dae 100644
--- a/shapepipe/modules/find_exposures_runner.py
+++ b/shapepipe/modules/find_exposures_runner.py
@@ -11,11 +11,11 @@
 
 
 @module_runner(
-    version='1.1',
-    file_pattern=['image'],
-    file_ext='.fits',
-    depends=['numpy', 'astropy', 'sip_tpv'],
-    numbering_scheme='_0',
+    version="1.1",
+    file_pattern=["image"],
+    file_ext=".fits",
+    depends=["numpy", "astropy", "sip_tpv"],
+    numbering_scheme="_0",
 )
 def find_exposures_runner(
     input_file_list,
@@ -33,10 +33,10 @@ def find_exposures_runner(
     output_path = f'{run_dirs["output"]}/exp_numbers{file_number_string}.txt'
 
     # Give column number for exposure name in fits header
-    colnum = config.getint(module_config_sec, 'COLNUM')
+    colnum = config.getint(module_config_sec, "COLNUM")
 
     # Give the prefix of exposures
-    exp_prefix = config.get(module_config_sec, 'EXP_PREFIX')
+    exp_prefix = config.get(module_config_sec, "EXP_PREFIX")
     # Create find exposures class instance
     find_exp_inst = find_exposures.FindExposures(
         input_file_name,
diff --git a/shapepipe/modules/get_images_package/__init__.py b/shapepipe/modules/get_images_package/__init__.py
index 2c0b6b69c..d887b9f78 100644
--- a/shapepipe/modules/get_images_package/__init__.py
+++ b/shapepipe/modules/get_images_package/__init__.py
@@ -52,4 +52,4 @@
 
 """
 
-__all__ = ['get_images.py']
+__all__ = ["get_images.py"]
diff --git a/shapepipe/modules/get_images_package/get_images.py b/shapepipe/modules/get_images_package/get_images.py
index d465d0719..631a876f2 100644
--- a/shapepipe/modules/get_images_package/get_images.py
+++ b/shapepipe/modules/get_images_package/get_images.py
@@ -58,12 +58,12 @@ def in2out_pattern(number):
     """
     # replace dots ('.') with dashes ('-') to avoid confusion
     # with file extension delimiters
-    number_final = re.sub(r'\.', '-', number)
+    number_final = re.sub(r"\.", "-", number)
 
     # remove letters in number
-    number_final = re.sub('[a-zA-Z]', '', number_final)
+    number_final = re.sub("[a-zA-Z]", "", number_final)
     # make robust for more generalized file names
-    number_final = re.sub(r'_', '', number_final)
+    number_final = re.sub(r"_", "", number_final)
     return number_final
 
 
@@ -149,12 +149,12 @@ def process(self, input_dir, output_dir):
 
         # List of unique input images
         flat_list = [item for sublist in all_image_numbers for item in sublist]
-        self._w_log.info(f'Number of total image IDs = {len(flat_list)}')
+        self._w_log.info(f"Number of total image IDs = {len(flat_list)}")
 
         # Get unique number list
         image_number_list = list(set(flat_list))
         self._w_log.info(
-            f'Number of unique image IDs = {len(image_number_list)}'
+            f"Number of unique image IDs = {len(image_number_list)}"
         )
 
         # Create array to make it compatible with input dir
@@ -165,36 +165,31 @@ def process(self, input_dir, output_dir):
 
         # Check consistency of list lengths
         if any(
-            len(lst) != nitem for lst in [
+            len(lst) != nitem
+            for lst in [
                 input_dir,
                 self._input_file_pattern,
                 self._input_file_ext,
-                self._output_file_pattern
+                self._output_file_pattern,
             ]
         ):
             raise ValueError(
-                f'Lists INPUT_PATH ({len(input_dir)}), '
-                + f'INPUT_FILE_PATTERN ({len(self._input_file_pattern)}), '
-                + f'INPUT_FILE_EXT ({len(self._input_file_ext)}), '
-                + f'OUTPUT_FILE_PATTERN ({len(self._output_file_pattern)}) '
-                + 'need to have equal length'
+                f"Lists INPUT_PATH ({len(input_dir)}), "
+                + f"INPUT_FILE_PATTERN ({len(self._input_file_pattern)}), "
+                + f"INPUT_FILE_EXT ({len(self._input_file_ext)}), "
+                + f"OUTPUT_FILE_PATTERN ({len(self._output_file_pattern)}) "
+                + "need to have equal length"
             )
 
         # Assemble input and output file lists
         all_inputs = self.get_file_list(
-            image_number_list,
-            input_dir,
-            use_output_file_pattern=False
+            image_number_list, input_dir, use_output_file_pattern=False
         )
         all_outputs_orig = self.get_file_list(
-            image_number_list,
-            output_dir,
-            use_output_file_pattern=False
+            image_number_list, output_dir, use_output_file_pattern=False
         )
         all_outputs_renamed = self.get_file_list(
-            image_number_list,
-            output_dir,
-            use_output_file_pattern=True
+            image_number_list, output_dir, use_output_file_pattern=True
         )
 
         # Retrieve files
@@ -242,24 +237,22 @@ def get_file_list(
 
                     # Keep initial dot in extension
                     x = in_ext[1:]
-                    x2 = re.sub(r'\.', '', x)
+                    x2 = re.sub(r"\.", "", x)
                     ext_final = in_ext[0] + x2
-                    fbase = (
-                        f'{self._output_file_pattern[idx]}{number_final}'
-                    )
+                    fbase = f"{self._output_file_pattern[idx]}{number_final}"
                 else:
                     fbase = re.sub(self._input_numbering, number, in_pattern)
                     ext_final = in_ext
 
                 if (
                     use_output_file_pattern
-                    and self._output_file_pattern[idx] == '*'
+                    and self._output_file_pattern[idx] == "*"
                 ):
                     # retrieve all input files to output dir, do not append
                     # extension
                     fpath = in_path
                 else:
-                    fpath = f'{in_path}/{fbase}{ext_final}'
+                    fpath = f"{in_path}/{fbase}{ext_final}"
 
                 list_files_per_type.append(fpath)
             list_all_files.append(list_files_per_type)
@@ -280,40 +273,38 @@ def retrieve(self, all_inputs, all_outputs_orig, all_outputs_renamed):
 
         """
         for in_per_type, out_per_type_orig, out_per_type_renamed in zip(
-            all_inputs,
-            all_outputs_orig,
-            all_outputs_renamed
+            all_inputs, all_outputs_orig, all_outputs_renamed
         ):
             for idx in range(len(in_per_type)):
                 if self._check_existing_dir:
                     out_base = os.path.basename(out_per_type_orig[idx])
                     path = glob.glob(
-                        f'{self._check_existing_dir}/**/{out_base}',
+                        f"{self._check_existing_dir}/**/{out_base}",
                         recursive=True,
                     )
                     if path:
                         if len(path) == self._n_expected:
                             self._w_log.info(
-                                f'{path[0]} found, skipping download'
+                                f"{path[0]} found, skipping download"
                             )
                             continue
                         else:
                             self._w_log.info(
-                                f'{len(path)} instead of {self._n_expected} '
-                                + 'existing files found at'
-                                + f' {self._check_existing_dir}'
-                                + ', downloading images'
+                                f"{len(path)} instead of {self._n_expected} "
+                                + "existing files found at"
+                                + f" {self._check_existing_dir}"
+                                + ", downloading images"
                             )
                     else:
                         self._w_log.info(
-                            'No existing images found at'
-                            + f' {self._check_existing_dir},'
-                            + ' downloading images'
+                            "No existing images found at"
+                            + f" {self._check_existing_dir},"
+                            + " downloading images"
                         )
                 self.retrieve_one(
                     in_per_type[idx],
                     out_per_type_orig[idx],
-                    out_per_type_renamed[idx]
+                    out_per_type_renamed[idx],
                 )
 
     def retrieve_one(self, in_path, out_path_orig, out_path_renamed):
@@ -329,17 +320,17 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed):
             Output path
 
         """
-        if self._retrieve_method == 'vos':
+        if self._retrieve_method == "vos":
             sys.argv = []
-            sys.argv.append('vcp')
+            sys.argv.append("vcp")
             if self._retrieve_options:
-                for opt in self._retrieve_options.split(' '):
+                for opt in self._retrieve_options.split(" "):
                     sys.argv.append(opt)
             sys.argv.append(in_path)
             sys.argv.append(out_path_orig)
 
-            log_cmd = ' '.join(sys.argv)
-            vcp = vosHandler('vcp')
+            log_cmd = " ".join(sys.argv)
+            vcp = vosHandler("vcp")
             self._w_log.info(log_cmd)
 
             # Download file from VOSpace
@@ -348,15 +339,15 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed):
                 try:
                     vcp()
                     self._w_log.info(
-                        'Success of command vcp after '
-                        + f'{attempt}/{self._n_try} attempts'
+                        "Success of command vcp after "
+                        + f"{attempt}/{self._n_try} attempts"
                     )
                     break
                 except Exception:
                     attempt += 1
                     self._w_log.info(
-                        'Error with command vcp, attempt '
-                        + f'{attempt}/{self._n_try}'
+                        "Error with command vcp, attempt "
+                        + f"{attempt}/{self._n_try}"
                     )
 
             sys.argv = None
@@ -365,14 +356,14 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed):
             # link name in ShapePipe numbering format
             os.symlink(out_path_orig, out_path_renamed)
 
-        elif self._retrieve_method == 'symlink':
+        elif self._retrieve_method == "symlink":
             src = in_path
 
             # Get all input file names if INPUT_FILE_PATTERN contains '*'
             all_src = glob.glob(src)
             if len(all_src) == 0:
                 raise IndexError(
-                    f'No input file found corresponding to \'{src}\''
+                    f"No input file found corresponding to '{src}'"
                 )
 
             dst = out_path_renamed
@@ -380,7 +371,7 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed):
                 if os.path.isdir(dst):
                     # OUTPUT_FILE_PATTERN is '*', so dst is not regular file
                     # but directory. Append input file name
-                    dst_name = f'{dst}/{os.path.basename(src)}'
+                    dst_name = f"{dst}/{os.path.basename(src)}"
                 else:
                     # dst is regular file
                     dst_name = dst
diff --git a/shapepipe/modules/get_images_runner.py b/shapepipe/modules/get_images_runner.py
index 2f5dbd1eb..fb25e0e8b 100644
--- a/shapepipe/modules/get_images_runner.py
+++ b/shapepipe/modules/get_images_runner.py
@@ -11,10 +11,10 @@
 
 
 @module_runner(
-    version='1.1',
-    depends=['numpy'],
-    run_method='serial',
-    numbering_scheme='_0',
+    version="1.1",
+    depends=["numpy"],
+    run_method="serial",
+    numbering_scheme="_0",
 )
 def get_images_runner(
     input_file_list,
@@ -28,57 +28,48 @@ def get_images_runner(
     # Read config file section
 
     # Copy/download method
-    retrieve_method = config.get(module_config_sec, 'RETRIEVE')
-    retrieve_ok = ['vos', 'symlink']
+    retrieve_method = config.get(module_config_sec, "RETRIEVE")
+    retrieve_ok = ["vos", "symlink"]
     if retrieve_method not in retrieve_ok:
         raise ValueError(
-            f'key RETRIEVE={retrieve_method} is invalid, '
-            + f'must be in {retrieve_ok}'
+            f"key RETRIEVE={retrieve_method} is invalid, "
+            + f"must be in {retrieve_ok}"
         )
 
-    if config.has_option(module_config_sec, 'RETRIEVE_OPTIONS'):
+    if config.has_option(module_config_sec, "RETRIEVE_OPTIONS"):
         retrieve_options = config.getexpanded(
-            module_config_sec,
-            'RETRIEVE_OPTIONS'
+            module_config_sec, "RETRIEVE_OPTIONS"
         )
     else:
         retrieve_options = None
 
-    if config.has_option(module_config_sec, 'N_TRY'):
-        n_try = config.getint(module_config_sec, 'N_TRY')
+    if config.has_option(module_config_sec, "N_TRY"):
+        n_try = config.getint(module_config_sec, "N_TRY")
     else:
         n_try = 3
 
     # Paths
-    input_dir = config.getlist(module_config_sec, 'INPUT_PATH')
-    input_file_pattern = config.getlist(
-        module_config_sec,
-        'INPUT_FILE_PATTERN'
-    )
-    input_file_ext = config.getlist(
-        module_config_sec,
-        'INPUT_FILE_EXT'
-    )
+    input_dir = config.getlist(module_config_sec, "INPUT_PATH")
+    input_file_pattern = config.getlist(module_config_sec, "INPUT_FILE_PATTERN")
+    input_file_ext = config.getlist(module_config_sec, "INPUT_FILE_EXT")
     output_file_pattern = config.getlist(
-        module_config_sec,
-        'OUTPUT_FILE_PATTERN'
+        module_config_sec, "OUTPUT_FILE_PATTERN"
     )
 
-    input_numbering = config.get(module_config_sec, 'INPUT_NUMBERING')
+    input_numbering = config.get(module_config_sec, "INPUT_NUMBERING")
 
-    if config.has_option(module_config_sec, 'OUTPUT_PATH'):
-        output_dir = config.getexpanded(module_config_sec, 'OUTPUT_PATH')
+    if config.has_option(module_config_sec, "OUTPUT_PATH"):
+        output_dir = config.getexpanded(module_config_sec, "OUTPUT_PATH")
     else:
-        output_dir = run_dirs['output']
+        output_dir = run_dirs["output"]
 
     # Flags to check for already retrieved files
-    if config.has_option(module_config_sec, 'CHECK_EXISTING_DIR'):
+    if config.has_option(module_config_sec, "CHECK_EXISTING_DIR"):
         check_existing_dir = config.getexpanded(
-            module_config_sec,
-            'CHECK_EXISTING_DIR'
+            module_config_sec, "CHECK_EXISTING_DIR"
         )
-        if config.has_option(module_config_sec, 'N_EXPECTED'):
-            n_expected = config.getint(module_config_sec, 'N_EXPECTED')
+        if config.has_option(module_config_sec, "N_EXPECTED"):
+            n_expected = config.getint(module_config_sec, "N_EXPECTED")
         else:
             n_expected = 1
     else:
diff --git a/shapepipe/modules/make_cat_package/__init__.py b/shapepipe/modules/make_cat_package/__init__.py
index 53d802a9d..1bd1cee5b 100644
--- a/shapepipe/modules/make_cat_package/__init__.py
+++ b/shapepipe/modules/make_cat_package/__init__.py
@@ -52,4 +52,4 @@
 
 """
 
-__all__ = ['make_cat']
+__all__ = ["make_cat"]
diff --git a/shapepipe/modules/make_cat_package/make_cat.py b/shapepipe/modules/make_cat_package/make_cat.py
index 4e30e3552..e9b246a74 100644
--- a/shapepipe/modules/make_cat_package/make_cat.py
+++ b/shapepipe/modules/make_cat_package/make_cat.py
@@ -37,9 +37,7 @@ def prepare_final_cat_file(output_path, file_number_string):
         Output FITS file
 
     """
-    output_name = (
-        f'{output_path}/final_cat{file_number_string}.fits'
-    )
+    output_name = f"{output_path}/final_cat{file_number_string}.fits"
 
     return file_io.FITSCatalogue(
         output_name,
@@ -91,19 +89,23 @@ def save_sextractor_data(final_cat_file, sexcat_path, remove_vignet=True):
     sexcat_file.open()
     data = np.copy(sexcat_file.get_data())
     if remove_vignet:
-        data = remove_field_name(data, 'VIGNET')
+        data = remove_field_name(data, "VIGNET")
 
-    final_cat_file.save_as_fits(data, ext_name='RESULTS')
+    final_cat_file.save_as_fits(data, ext_name="RESULTS")
 
     cat_size = len(data)
 
-    tile_id = float('.'.join(
-        re.split('-', os.path.splitext(os.path.split(sexcat_path)[1])[0])[1:]
-    ))
+    tile_id = float(
+        ".".join(
+            re.split("-", os.path.splitext(os.path.split(sexcat_path)[1])[0])[
+                1:
+            ]
+        )
+    )
     tile_id_array = np.ones(cat_size) * tile_id
 
     final_cat_file.open()
-    final_cat_file.add_col('TILE_ID', tile_id_array)
+    final_cat_file.add_col("TILE_ID", tile_id_array)
 
     sexcat_file.close()
 
@@ -142,21 +144,21 @@ def save_sm_data(
     sexcat_sm_file = file_io.FITSCatalogue(sexcat_sm_path, SEx_catalogue=True)
     sexcat_sm_file.open()
 
-    sm = np.copy(sexcat_sm_file.get_data()['SPREAD_MODEL'])
-    sm_err = np.copy(sexcat_sm_file.get_data()['SPREADERR_MODEL'])
+    sm = np.copy(sexcat_sm_file.get_data()["SPREAD_MODEL"])
+    sm_err = np.copy(sexcat_sm_file.get_data()["SPREADERR_MODEL"])
 
     sexcat_sm_file.close()
 
-    final_cat_file.add_col('SPREAD_MODEL', sm)
-    final_cat_file.add_col('SPREADERR_MODEL', sm_err)
+    final_cat_file.add_col("SPREAD_MODEL", sm)
+    final_cat_file.add_col("SPREADERR_MODEL", sm_err)
 
     if do_classif:
-        obj_flag = np.ones_like(sm, dtype='int16') * 2
+        obj_flag = np.ones_like(sm, dtype="int16") * 2
         classif = sm + 2.0 * sm_err
         obj_flag[np.where(np.abs(classif) < star_thresh)] = 0
         obj_flag[np.where(classif > gal_thresh)] = 1
 
-        final_cat_file.add_col('SPREAD_CLASS', obj_flag)
+        final_cat_file.add_col("SPREAD_CLASS", obj_flag)
 
     final_cat_file.close()
 
@@ -179,7 +181,7 @@ def __init__(self, final_cat_file):
 
     def process(
         self,
-        mode='',
+        mode="",
         cat_path=None,
         moments=False,
     ):
@@ -198,17 +200,17 @@ def process(
         self._output_dict = {}
 
         self.final_cat_file.open()
-        self._obj_id = np.copy(self.final_cat_file.get_data()['NUMBER'])
+        self._obj_id = np.copy(self.final_cat_file.get_data()["NUMBER"])
 
-        if mode == 'ngmix':
+        if mode == "ngmix":
             self._save_ngmix_data(cat_path, moments)
-        elif mode == 'galsim':
+        elif mode == "galsim":
             self._save_galsim_shapes(cat_path)
-        elif mode == 'psf':
+        elif mode == "psf":
             self._save_psf_data(cat_path)
         else:
             raise ValueError(
-                f'Invalid process mode ({mode}) for '
+                f"Invalid process mode ({mode}) for "
                 + '``make_cat.Savecatalogue``. Options are "ngmix", '
                 + '"galsim" or "psf".'
             )
@@ -234,9 +236,9 @@ def _update_dict(self, key_string, value):
         self._output_dict = {
             **self._output_dict,
             **{
-                f'{key_string}{key_end}': np.copy(value)
+                f"{key_string}{key_end}": np.copy(value)
                 for key_end in self._key_ends
-            }
+            },
         }
 
     def _add2dict(self, key, value, index=None):
@@ -270,55 +272,55 @@ def _save_ngmix_data(self, ngmix_cat_path, moments=False):
             Path to NGMIX catalogue
 
         """
-        self._key_ends = ['1M', '1P', '2M', '2P', 'NOSHEAR']
+        self._key_ends = ["1M", "1P", "2M", "2P", "NOSHEAR"]
 
         ngmix_cat_file = file_io.FITSCatalogue(ngmix_cat_path)
         ngmix_cat_file.open()
 
-        ngmix_n_epoch = ngmix_cat_file.get_data()['n_epoch_model']
-        ngmix_mom_fail = ngmix_cat_file.get_data()['moments_fail']
+        ngmix_n_epoch = ngmix_cat_file.get_data()["n_epoch_model"]
+        ngmix_mom_fail = ngmix_cat_file.get_data()["moments_fail"]
 
         if moments:
-            m = 'm'
+            m = "m"
         else:
-            m = ''
+            m = ""
 
-            ngmix_mcal_flags = ngmix_cat_file.get_data()['mcal_flags']
-            ngmix_id = ngmix_cat_file.get_data()['id']
+            ngmix_mcal_flags = ngmix_cat_file.get_data()["mcal_flags"]
+            ngmix_id = ngmix_cat_file.get_data()["id"]
 
-            self._add2dict('NGMIX_N_EPOCH', np.zeros(len(self._obj_id)))
-            self._add2dict('NGMIX_MOM_FAIL', np.zeros(len(self._obj_id)))
+            self._add2dict("NGMIX_N_EPOCH", np.zeros(len(self._obj_id)))
+            self._add2dict("NGMIX_MOM_FAIL", np.zeros(len(self._obj_id)))
 
-        prefix = f'NGMIX{m}'
+        prefix = f"NGMIX{m}"
 
         for key_str in (
-            f'{prefix}_T_',
-            f'{prefix}_Tpsf_',
-            f'{prefix}_SNR_',
-            f'{prefix}_FLUX_',
-            f'{prefix}_MAG_',
-            f'{prefix}_FLAGS_',
-            f'{prefix}_T_PSFo_',
+            f"{prefix}_T_",
+            f"{prefix}_Tpsf_",
+            f"{prefix}_SNR_",
+            f"{prefix}_FLUX_",
+            f"{prefix}_MAG_",
+            f"{prefix}_FLAGS_",
+            f"{prefix}_T_PSFo_",
         ):
             self._update_dict(key_str, np.zeros(len(self._obj_id)))
-        for key_str in (f'NGMIX{m}_FLUX_ERR_', f'NGMIX{m}_MAG_ERR_'):
+        for key_str in (f"NGMIX{m}_FLUX_ERR_", f"NGMIX{m}_MAG_ERR_"):
             self._update_dict(key_str, np.ones(len(self._obj_id)) * -1)
         for key_str in (
-            f'NGMIX{m}_ELL_',
-            f'NGMIX{m}_ELL_ERR_',
-            f'NGMIX{m}_ELL_PSFo_'
+            f"NGMIX{m}_ELL_",
+            f"NGMIX{m}_ELL_ERR_",
+            f"NGMIX{m}_ELL_PSFo_",
         ):
             self._update_dict(key_str, np.ones((len(self._obj_id), 2)) * -10.0)
         self._update_dict(
-            f'NGMIX{m}_T_ERR_',
+            f"NGMIX{m}_T_ERR_",
             np.ones(len(self._obj_id)) * 1e30,
         )
-        self._add2dict(f'NGMIX{m}_MCAL_FLAGS', np.zeros(len(self._obj_id)))
+        self._add2dict(f"NGMIX{m}_MCAL_FLAGS", np.zeros(len(self._obj_id)))
 
         for idx, _ in enumerate(self._obj_id):
             for key in self._key_ends:
-                x = self._output_dict[f'NGMIX{m}_ELL_{key}'][idx]
-                if np.all(x != np.array([-10., -10.])):
+                x = self._output_dict[f"NGMIX{m}_ELL_{key}"][idx]
+                if np.all(x != np.array([-10.0, -10.0])):
                     print(x)
 
         for idx, id_tmp in enumerate(self._obj_id):
@@ -329,61 +331,61 @@ def _save_ngmix_data(self, ngmix_cat_path, moments=False):
 
                     ncf_data = ngmix_cat_file.get_data(key)
 
-                    g = (ncf_data['g1'][ind[0]], ncf_data['g2'][ind[0]])
+                    g = (ncf_data["g1"][ind[0]], ncf_data["g2"][ind[0]])
                     g_err = (
-                        ncf_data['g1_err'][ind[0]],
-                        ncf_data['g2_err'][ind[0]]
+                        ncf_data["g1_err"][ind[0]],
+                        ncf_data["g2_err"][ind[0]],
                     )
 
-                    self._add2dict(f'NGMIX{m}_ELL_{key}', g, idx)
-                    self._add2dict(f'NGMIX{m}_ELL_ERR_{key}', g_err, idx)
+                    self._add2dict(f"NGMIX{m}_ELL_{key}", g, idx)
+                    self._add2dict(f"NGMIX{m}_ELL_ERR_{key}", g_err, idx)
 
-                    t = ncf_data['T'][ind[0]]
-                    t_err = ncf_data['T_err'][ind[0]]
-                    tpsf = ncf_data['Tpsf'][ind[0]]
-                    self._add2dict(f'NGMIX{m}_T_{key}', t, idx)
-                    self._add2dict(f'NGMIX{m}_T_ERR_{key}', t_err, idx)
-                    self._add2dict(f'NGMIX{m}_Tpsf_{key}', tpsf, idx)
+                    t = ncf_data["T"][ind[0]]
+                    t_err = ncf_data["T_err"][ind[0]]
+                    tpsf = ncf_data["Tpsf"][ind[0]]
+                    self._add2dict(f"NGMIX{m}_T_{key}", t, idx)
+                    self._add2dict(f"NGMIX{m}_T_ERR_{key}", t_err, idx)
+                    self._add2dict(f"NGMIX{m}_Tpsf_{key}", tpsf, idx)
 
-                    s2n = ncf_data['s2n'][ind[0]]
-                    self._add2dict(f'NGMIX{m}_SNR_{key}', s2n, idx)
+                    s2n = ncf_data["s2n"][ind[0]]
+                    self._add2dict(f"NGMIX{m}_SNR_{key}", s2n, idx)
 
-                    flux = ncf_data['flux'][ind[0]]
-                    flux_err = ncf_data['flux_err'][ind[0]]
-                    self._add2dict(f'NGMIX{m}_FLUX_{key}', flux, idx)
-                    self._add2dict(f'NGMIX{m}_FLUX_ERR_{key}', flux_err, idx)
+                    flux = ncf_data["flux"][ind[0]]
+                    flux_err = ncf_data["flux_err"][ind[0]]
+                    self._add2dict(f"NGMIX{m}_FLUX_{key}", flux, idx)
+                    self._add2dict(f"NGMIX{m}_FLUX_ERR_{key}", flux_err, idx)
 
-                    mag = ncf_data['mag'][ind[0]]
-                    mag_err = ncf_data['mag_err'][ind[0]]
-                    self._add2dict(f'NGMIX{m}_MAG_{key}', mag, idx)
-                    self._add2dict(f'NGMIX{m}_MAG_ERR_{key}', mag_err, idx)
+                    mag = ncf_data["mag"][ind[0]]
+                    mag_err = ncf_data["mag_err"][ind[0]]
+                    self._add2dict(f"NGMIX{m}_MAG_{key}", mag, idx)
+                    self._add2dict(f"NGMIX{m}_MAG_ERR_{key}", mag_err, idx)
 
-                    flags = ncf_data['flags'][ind[0]]
-                    self._add2dict(f'NGMIX{m}_FLAGS_{key}', flags, idx)
+                    flags = ncf_data["flags"][ind[0]]
+                    self._add2dict(f"NGMIX{m}_FLAGS_{key}", flags, idx)
 
                     g_psf = (
-                        ncf_data['g1_psfo_ngmix'][ind[0]],
-                        ncf_data['g2_psfo_ngmix'][ind[0]]
+                        ncf_data["g1_psfo_ngmix"][ind[0]],
+                        ncf_data["g2_psfo_ngmix"][ind[0]],
                     )
-                    self._add2dict(f'NGMIX{m}_ELL_PSFo_{key}', g_psf, idx)
+                    self._add2dict(f"NGMIX{m}_ELL_PSFo_{key}", g_psf, idx)
 
-                    t_psfo = ncf_data['T_psfo_ngmix'][ind[0]]
-                    self._add2dict(f'NGMIX{m}_T_PSFo_{key}', t_psfo, idx)
+                    t_psfo = ncf_data["T_psfo_ngmix"][ind[0]]
+                    self._add2dict(f"NGMIX{m}_T_PSFo_{key}", t_psfo, idx)
 
                 self._add2dict(
-                    f'NGMIX{m}_MCAL_FLAGS',
+                    f"NGMIX{m}_MCAL_FLAGS",
                     ngmix_mcal_flags[ind[0]],
                     idx,
                 )
 
                 if not moments:
                     self._add2dict(
-                        f'NGMIX{m}_N_EPOCH',
+                        f"NGMIX{m}_N_EPOCH",
                         ngmix_n_epoch[ind[0]],
                         idx,
                     )
                     self._add2dict(
-                        f'NGMIX{m}_MOM_FAIL',
+                        f"NGMIX{m}_MOM_FAIL",
                         ngmix_mom_fail[ind[0]],
                         idx,
                     )
@@ -406,27 +408,27 @@ def _save_galsim_shapes(self, galsim_cat_path):
 
         self._key_ends = galsim_cat_file.get_ext_name()[1:]
 
-        galsim_id = galsim_cat_file.get_data()['id']
+        galsim_id = galsim_cat_file.get_data()["id"]
 
         for key_str in (
-            'GALSIM_GAL_SIGMA_',
-            'GALSIM_PSF_SIGMA_',
-            'GALSIM_FLUX_',
-            'GALSIM_MAG_',
+            "GALSIM_GAL_SIGMA_",
+            "GALSIM_PSF_SIGMA_",
+            "GALSIM_FLUX_",
+            "GALSIM_MAG_",
         ):
             self._update_dict(key_str, np.zeros(len(self._obj_id)))
-        for key_str in ('GALSIM_FLUX_ERR_', 'GALSIM_MAG_ERR_', 'GALSIM_RES_'):
+        for key_str in ("GALSIM_FLUX_ERR_", "GALSIM_MAG_ERR_", "GALSIM_RES_"):
             self._update_dict(key_str, np.ones(len(self._obj_id)) * -1)
         for key_str in (
-            'GALSIM_GAL_ELL_',
-            'GALSIM_GAL_ELL_ERR_',
-            'GALSIM_GAL_ELL_UNCORR_',
-            'GALSIM_PSF_ELL_'
+            "GALSIM_GAL_ELL_",
+            "GALSIM_GAL_ELL_ERR_",
+            "GALSIM_GAL_ELL_UNCORR_",
+            "GALSIM_PSF_ELL_",
         ):
             self._update_dict(key_str, np.ones((len(self._obj_id), 2)) * -10.0)
         self._update_dict(
-            'GALSIM_FLAGS_',
-            np.ones(len(self._obj_id), dtype='int16'),
+            "GALSIM_FLAGS_",
+            np.ones(len(self._obj_id), dtype="int16"),
         )
 
         for idx, id_tmp in enumerate(self._obj_id):
@@ -437,69 +439,69 @@ def _save_galsim_shapes(self, galsim_cat_path):
 
                     gcf_data = galsim_cat_file.get_data(key)
 
-                    if key == 'ORIGINAL_PSF':
+                    if key == "ORIGINAL_PSF":
 
                         uncorr_g = (
-                            gcf_data['gal_uncorr_g1'][ind[0]],
-                            gcf_data['gal_uncorr_g2'][ind[0]]
+                            gcf_data["gal_uncorr_g1"][ind[0]],
+                            gcf_data["gal_uncorr_g2"][ind[0]],
                         )
-                        psf_sig = gcf_data['gal_sigma'][ind[0]]
-                        self._add2dict(f'GALSIM_PSF_ELL_{key}', uncorr_g, idx)
-                        self._add2dict(f'GALSIM_PSF_SIGMA_{key}', psf_sig, idx)
+                        psf_sig = gcf_data["gal_sigma"][ind[0]]
+                        self._add2dict(f"GALSIM_PSF_ELL_{key}", uncorr_g, idx)
+                        self._add2dict(f"GALSIM_PSF_SIGMA_{key}", psf_sig, idx)
 
                     else:
 
                         g = (
-                            gcf_data['gal_g1'][ind[0]],
-                            gcf_data['gal_g2'][ind[0]]
+                            gcf_data["gal_g1"][ind[0]],
+                            gcf_data["gal_g2"][ind[0]],
                         )
                         g_err = (
-                            gcf_data['gal_g1_err'][ind[0]],
-                            gcf_data['gal_g2_err'][ind[0]]
+                            gcf_data["gal_g1_err"][ind[0]],
+                            gcf_data["gal_g2_err"][ind[0]],
                         )
-                        self._add2dict(f'GALSIM_GAL_ELL_{key}', g, idx)
-                        self._add2dict(f'GALSIM_GAL_ELL_ERR_{key}', g_err, idx)
+                        self._add2dict(f"GALSIM_GAL_ELL_{key}", g, idx)
+                        self._add2dict(f"GALSIM_GAL_ELL_ERR_{key}", g_err, idx)
 
                         uncorr_g = (
-                            gcf_data['gal_uncorr_g1'][ind[0]],
-                            gcf_data['gal_uncorr_g2'][ind[0]],
+                            gcf_data["gal_uncorr_g1"][ind[0]],
+                            gcf_data["gal_uncorr_g2"][ind[0]],
                         )
                         self._add2dict(
-                            f'GALSIM_GAL_ELL_UNCORR_{key}',
+                            f"GALSIM_GAL_ELL_UNCORR_{key}",
                             uncorr_g,
                             idx,
                         )
 
-                        sigma = gcf_data['gal_sigma'][ind[0]]
-                        self._add2dict(f'GALSIM_GAL_SIGMA_{key}', sigma, idx)
+                        sigma = gcf_data["gal_sigma"][ind[0]]
+                        self._add2dict(f"GALSIM_GAL_SIGMA_{key}", sigma, idx)
 
                         psf_g = (
-                            gcf_data['psf_g1'][ind[0]],
-                            gcf_data['psf_g2'][ind[0]]
+                            gcf_data["psf_g1"][ind[0]],
+                            gcf_data["psf_g2"][ind[0]],
                         )
-                        psf_sigma = gcf_data['psf_sigma'][ind[0]]
-                        self._add2dict(f'GALSIM_PSF_ELL_{key}', psf_g, idx)
+                        psf_sigma = gcf_data["psf_sigma"][ind[0]]
+                        self._add2dict(f"GALSIM_PSF_ELL_{key}", psf_g, idx)
                         self._add2dict(
-                            f'GALSIM_PSF_SIGMA_{key}',
+                            f"GALSIM_PSF_SIGMA_{key}",
                             psf_sigma,
                             idx,
                         )
 
-                        flux = gcf_data['gal_flux'][ind[0]]
-                        flux_err = gcf_data['gal_flux_err'][ind[0]]
-                        self._add2dict(f'GALSIM_FLUX_{key}', flux, idx)
-                        self._add2dict(f'GALSIM_FLUX_ERR_{key}', flux_err, idx)
+                        flux = gcf_data["gal_flux"][ind[0]]
+                        flux_err = gcf_data["gal_flux_err"][ind[0]]
+                        self._add2dict(f"GALSIM_FLUX_{key}", flux, idx)
+                        self._add2dict(f"GALSIM_FLUX_ERR_{key}", flux_err, idx)
 
-                        mag = gcf_data['gal_mag'][ind[0]]
-                        mag_err = gcf_data['gal_mag_err'][ind[0]]
-                        self._add2dict(f'GALSIM_MAG_{key}', mag, idx)
-                        self._add2dict(f'GALSIM_MAG_ERR_{key}', mag_err, idx)
+                        mag = gcf_data["gal_mag"][ind[0]]
+                        mag_err = gcf_data["gal_mag_err"][ind[0]]
+                        self._add2dict(f"GALSIM_MAG_{key}", mag, idx)
+                        self._add2dict(f"GALSIM_MAG_ERR_{key}", mag_err, idx)
 
-                        flags = gcf_data['gal_flag'][ind[0]]
-                        self._add2dict(f'GALSIM_FLAGS_{key}', flags, idx)
+                        flags = gcf_data["gal_flag"][ind[0]]
+                        self._add2dict(f"GALSIM_FLAGS_{key}", flags, idx)
 
-                        res = gcf_data['gal_resolution'][ind[0]]
-                        self._add2dict(f'GALSIM_RES_{key}', res, idx)
+                        res = gcf_data["gal_resolution"][ind[0]]
+                        self._add2dict(f"GALSIM_RES_{key}", res, idx)
 
         galsim_cat_file.close()
 
@@ -516,53 +518,51 @@ def _save_psf_data(self, galaxy_psf_path):
         """
         galaxy_psf_cat = SqliteDict(galaxy_psf_path)
 
-        max_epoch = np.max(self.final_cat_file.get_data()['N_EPOCH']) + 1
+        max_epoch = np.max(self.final_cat_file.get_data()["N_EPOCH"]) + 1
 
         self._output_dict = {
-            f'PSF_ELL_{idx + 1}': np.ones((len(self._obj_id), 2)) * -10.
+            f"PSF_ELL_{idx + 1}": np.ones((len(self._obj_id), 2)) * -10.0
             for idx in range(max_epoch)
         }
         self._output_dict = {
             **self._output_dict,
             **{
-                f'PSF_FWHM_{idx + 1}': np.zeros(len(self._obj_id))
+                f"PSF_FWHM_{idx + 1}": np.zeros(len(self._obj_id))
                 for idx in range(max_epoch)
-            }
+            },
         }
         self._output_dict = {
             **self._output_dict,
             **{
-                f'PSF_FLAG_{idx + 1}': np.ones(
-                    len(self._obj_id), dtype='int16'
-                )
+                f"PSF_FLAG_{idx + 1}": np.ones(len(self._obj_id), dtype="int16")
                 for idx in range(max_epoch)
-            }
+            },
         }
 
         for idx, id_tmp in enumerate(self._obj_id):
 
-            if galaxy_psf_cat[str(id_tmp)] == 'empty':
+            if galaxy_psf_cat[str(id_tmp)] == "empty":
                 continue
 
             for epoch, key in enumerate(galaxy_psf_cat[str(id_tmp)].keys()):
 
                 gpc_data = galaxy_psf_cat[str(id_tmp)][key]
 
-                if gpc_data['SHAPES']['FLAG_PSF_HSM'] != 0:
+                if gpc_data["SHAPES"]["FLAG_PSF_HSM"] != 0:
                     continue
 
                 e_psf = (
-                    gpc_data['SHAPES']['E1_PSF_HSM'],
-                    gpc_data['SHAPES']['E2_PSF_HSM']
+                    gpc_data["SHAPES"]["E1_PSF_HSM"],
+                    gpc_data["SHAPES"]["E2_PSF_HSM"],
                 )
-                self._add2dict(f'PSF_ELL_{epoch + 1}', e_psf, idx)
+                self._add2dict(f"PSF_ELL_{epoch + 1}", e_psf, idx)
 
                 psf_fwhm = galaxy.sigma_to_fwhm(
-                    gpc_data['SHAPES']['SIGMA_PSF_HSM']
+                    gpc_data["SHAPES"]["SIGMA_PSF_HSM"]
                 )
-                self._add2dict(f'PSF_FWHM_{epoch + 1}', psf_fwhm, idx)
+                self._add2dict(f"PSF_FWHM_{epoch + 1}", psf_fwhm, idx)
 
-                flag_psf = gpc_data['SHAPES']['FLAG_PSF_HSM']
-                self._add2dict(f'PSF_FLAG_{epoch + 1}', flag_psf, idx)
+                flag_psf = gpc_data["SHAPES"]["FLAG_PSF_HSM"]
+                self._add2dict(f"PSF_FLAG_{epoch + 1}", flag_psf, idx)
 
         galaxy_psf_cat.close()
diff --git a/shapepipe/modules/make_cat_runner.py b/shapepipe/modules/make_cat_runner.py
index 8b6351e2e..f36209f42 100644
--- a/shapepipe/modules/make_cat_runner.py
+++ b/shapepipe/modules/make_cat_runner.py
@@ -11,21 +11,21 @@
 
 
 @module_runner(
-    version='1.1',
+    version="1.1",
     input_module=[
-        'sextractor_runner',
-        'spread_model_runner',
-        'psfex_interp_runner',
-        'ngmix_runner',
+        "sextractor_runner",
+        "spread_model_runner",
+        "psfex_interp_runner",
+        "ngmix_runner",
     ],
     file_pattern=[
-        'tile_sexcat',
-        'sexcat_sm',
-        'galaxy_psf',
-        'ngmix',
+        "tile_sexcat",
+        "sexcat_sm",
+        "galaxy_psf",
+        "ngmix",
     ],
-    file_ext=['.fits', '.fits', '.sqlite', '.fits'],
-    depends=['numpy', 'sqlitedict'],
+    file_ext=[".fits", ".fits", ".sqlite", ".fits"],
+    depends=["numpy", "sqlitedict"],
 )
 def make_cat_runner(
     input_file_list,
@@ -49,11 +49,11 @@ def make_cat_runner(
     # Fetch classification options
     do_classif = config.getboolean(
         module_config_sec,
-        'SM_DO_CLASSIFICATION',
+        "SM_DO_CLASSIFICATION",
     )
     if do_classif:
-        star_thresh = config.getfloat(module_config_sec, 'SM_STAR_THRESH')
-        gal_thresh = config.getfloat(module_config_sec, 'SM_GAL_THRESH')
+        star_thresh = config.getfloat(module_config_sec, "SM_STAR_THRESH")
+        gal_thresh = config.getfloat(module_config_sec, "SM_GAL_THRESH")
     else:
         star_thresh = None
         gal_thresh = None
@@ -61,32 +61,32 @@ def make_cat_runner(
     # Fetch shape measurement type
     shape_type_list = config.getlist(
         module_config_sec,
-        'SHAPE_MEASUREMENT_TYPE',
+        "SHAPE_MEASUREMENT_TYPE",
     )
     for shape_type in shape_type_list:
-        if shape_type.lower() not in ['ngmix', 'galsim']:
+        if shape_type.lower() not in ["ngmix", "galsim"]:
             raise ValueError(
-                'SHAPE_MEASUREMENT_TYPE must be in [ngmix, galsim]'
+                "SHAPE_MEASUREMENT_TYPE must be in [ngmix, galsim]"
             )
 
     # Fetch PSF data option
-    if config.has_option(module_config_sec, 'SAVE_PSF_DATA'):
-        save_psf = config.getboolean(module_config_sec, 'SAVE_PSF_DATA')
+    if config.has_option(module_config_sec, "SAVE_PSF_DATA"):
+        save_psf = config.getboolean(module_config_sec, "SAVE_PSF_DATA")
     else:
         save_psf = False
 
     # Set final output file
     final_cat_file = make_cat.prepare_final_cat_file(
-        run_dirs['output'],
+        run_dirs["output"],
         file_number_string,
     )
 
     # Save SExtractor data
-    w_log.info('Save SExtractor data')
+    w_log.info("Save SExtractor data")
     make_cat.save_sextractor_data(final_cat_file, tile_sexcat_path)
 
     # Save spread-model data
-    w_log.info('Save spread-model data')
+    w_log.info("Save spread-model data")
     make_cat.save_sm_data(
         final_cat_file,
         sexcat_sm_path,
@@ -97,15 +97,15 @@ def make_cat_runner(
 
     # Save shape data
     sc_inst = make_cat.SaveCatalogue(final_cat_file)
-    w_log.info('Save shape measurement data')
+    w_log.info("Save shape measurement data")
     for shape_type in shape_type_list:
-        w_log.info(f'Save {shape_type.lower()} data')
+        w_log.info(f"Save {shape_type.lower()} data")
         cat_path = (
-            shape2_cat_path if shape_type == 'galsim' else shape1_cat_path
+            shape2_cat_path if shape_type == "galsim" else shape1_cat_path
         )
         sc_inst.process(shape_type.lower(), cat_path)
     if save_psf:
-        sc_inst.process('psf', galaxy_psf_path)
+        sc_inst.process("psf", galaxy_psf_path)
 
     # No return objects
     return None, None
diff --git a/shapepipe/modules/mask_package/__init__.py b/shapepipe/modules/mask_package/__init__.py
index ccd55fa9a..bdfece65b 100644
--- a/shapepipe/modules/mask_package/__init__.py
+++ b/shapepipe/modules/mask_package/__init__.py
@@ -182,4 +182,4 @@
 
 """
 
-__all__ = ['mask']
+__all__ = ["mask"]
diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py
index 23ca9f034..dfd68e4e3 100644
--- a/shapepipe/modules/mask_package/mask.py
+++ b/shapepipe/modules/mask_package/mask.py
@@ -65,7 +65,7 @@ def __init__(
         output_dir,
         w_log,
         path_external_flag=None,
-        outname_base='flag',
+        outname_base="flag",
         check_existing_dir=None,
         star_cat_path=None,
         hdu=0,
@@ -78,10 +78,10 @@ def __init__(
         self._weight_fullpath = weight_path
 
         # Input image prefix
-        if (image_prefix.lower() != 'none') and (image_prefix != ''):
-            self._img_prefix = f'{image_prefix}_'
+        if (image_prefix.lower() != "none") and (image_prefix != ""):
+            self._img_prefix = f"{image_prefix}_"
         else:
-            self._img_prefix = ''
+            self._img_prefix = ""
 
         # File number identified
         self._img_number = image_num
@@ -119,7 +119,6 @@ def __init__(
         # Set error flag
         self._err = False
 
-
     def _get_config(self):
         """Get Config.
 
@@ -134,141 +133,136 @@ def _get_config(self):
 
         """
         if self._config_filepath is None:
-            raise ValueError('No path to config file given')
+            raise ValueError("No path to config file given")
 
         if not os.path.exists(self._config_filepath):
-            raise IOError(
-                f'Config file "{self._config_filepath}" not found'
-            )
+            raise IOError(f'Config file "{self._config_filepath}" not found')
 
         conf = CustomParser()
         conf.read(self._config_filepath)
 
         self._config = {
-            'PATH': {},
-            'BORDER': {},
-            'HALO': {},
-            'SPIKE': {},
-            'MESSIER': {},
-            'NGC': {},
-            'MD': {},
+            "PATH": {},
+            "BORDER": {},
+            "HALO": {},
+            "SPIKE": {},
+            "MESSIER": {},
+            "NGC": {},
+            "MD": {},
         }
 
-        if conf.has_option('PROGRAM_PATH', 'WW_PATH'):
-            self._config['PATH']['WW'] = (
-                conf.getexpanded('PROGRAM_PATH', 'WW_PATH')
+        if conf.has_option("PROGRAM_PATH", "WW_PATH"):
+            self._config["PATH"]["WW"] = conf.getexpanded(
+                "PROGRAM_PATH", "WW_PATH"
             )
         else:
-            self._config['PATH']['WW'] = 'ww'
-        self._config['PATH']['WW_configfile'] = (
-            conf.getexpanded('PROGRAM_PATH', 'WW_CONFIG_FILE')
+            self._config["PATH"]["WW"] = "ww"
+        self._config["PATH"]["WW_configfile"] = conf.getexpanded(
+            "PROGRAM_PATH", "WW_CONFIG_FILE"
         )
-        if conf.has_option('PROGRAM_PATH', 'CDSCLIENT_PATH'):
-            self._config['PATH']['CDSclient'] = (
-                conf.getexpanded('PROGRAM_PATH', 'CDSCLIENT_PATH')
+        if conf.has_option("PROGRAM_PATH", "CDSCLIENT_PATH"):
+            self._config["PATH"]["CDSclient"] = conf.getexpanded(
+                "PROGRAM_PATH", "CDSCLIENT_PATH"
             )
         elif self._star_cat_path is not None:
-            self._config['PATH']['star_cat'] = self._star_cat_path
+            self._config["PATH"]["star_cat"] = self._star_cat_path
         else:
             raise ValueError(
-                'Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file '
-                + ' or a star catalogue as module input needs to be present'
+                "Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file "
+                + " or a star catalogue as module input needs to be present"
             )
 
-        self._config['PATH']['temp_dir'] = self._get_temp_dir_path(
-            conf.getexpanded('OTHER', 'TEMP_DIRECTORY')
+        self._config["PATH"]["temp_dir"] = self._get_temp_dir_path(
+            conf.getexpanded("OTHER", "TEMP_DIRECTORY")
         )
-        self._config['BORDER']['make'] = (
-            conf.getboolean('BORDER_PARAMETERS', 'BORDER_MAKE')
+        self._config["BORDER"]["make"] = conf.getboolean(
+            "BORDER_PARAMETERS", "BORDER_MAKE"
         )
-        if self._config['BORDER']['make']:
-            self._config['BORDER']['width'] = (
-                conf.getint('BORDER_PARAMETERS', 'BORDER_WIDTH')
+        if self._config["BORDER"]["make"]:
+            self._config["BORDER"]["width"] = conf.getint(
+                "BORDER_PARAMETERS", "BORDER_WIDTH"
             )
-            self._config['BORDER']['flag'] = (
-                conf.get('BORDER_PARAMETERS', 'BORDER_FLAG_VALUE')
+            self._config["BORDER"]["flag"] = conf.get(
+                "BORDER_PARAMETERS", "BORDER_FLAG_VALUE"
             )
 
-        for mask_shape in ['HALO', 'SPIKE']:
+        for mask_shape in ["HALO", "SPIKE"]:
 
-            self._config[mask_shape]['make'] = conf.getboolean(
-                f'{mask_shape}_PARAMETERS',
-                f'{mask_shape}_MAKE',
+            self._config[mask_shape]["make"] = conf.getboolean(
+                f"{mask_shape}_PARAMETERS",
+                f"{mask_shape}_MAKE",
             )
-            self._config[mask_shape]['individual'] = (
-                conf.getboolean('OTHER', 'KEEP_INDIVIDUAL_MASK')
+            self._config[mask_shape]["individual"] = conf.getboolean(
+                "OTHER", "KEEP_INDIVIDUAL_MASK"
             )
 
-            if self._config[mask_shape]['make']:
+            if self._config[mask_shape]["make"]:
 
-                self._config[mask_shape]['maskmodel_path'] = conf.getexpanded(
-                    f'{mask_shape}_PARAMETERS',
-                    f'{mask_shape}_MASKMODEL_PATH',
+                self._config[mask_shape]["maskmodel_path"] = conf.getexpanded(
+                    f"{mask_shape}_PARAMETERS",
+                    f"{mask_shape}_MASKMODEL_PATH",
                 )
-                self._config[mask_shape]['mag_lim'] = conf.getfloat(
-                    f'{mask_shape}_PARAMETERS',
-                    f'{mask_shape}_MAG_LIM',
+                self._config[mask_shape]["mag_lim"] = conf.getfloat(
+                    f"{mask_shape}_PARAMETERS",
+                    f"{mask_shape}_MAG_LIM",
                 )
-                self._config[mask_shape]['scale_factor'] = conf.getfloat(
-                    f'{mask_shape}_PARAMETERS',
-                    f'{mask_shape}_SCALE_FACTOR',
+                self._config[mask_shape]["scale_factor"] = conf.getfloat(
+                    f"{mask_shape}_PARAMETERS",
+                    f"{mask_shape}_SCALE_FACTOR",
                 )
-                self._config[mask_shape]['mag_pivot'] = conf.getfloat(
-                    f'{mask_shape}_PARAMETERS',
-                    f'{mask_shape}_MAG_PIVOT',
+                self._config[mask_shape]["mag_pivot"] = conf.getfloat(
+                    f"{mask_shape}_PARAMETERS",
+                    f"{mask_shape}_MAG_PIVOT",
                 )
-                self._config[mask_shape]['flag'] = conf.getint(
-                    f'{mask_shape}_PARAMETERS',
-                    f'{mask_shape}_FLAG_VALUE',
+                self._config[mask_shape]["flag"] = conf.getint(
+                    f"{mask_shape}_PARAMETERS",
+                    f"{mask_shape}_FLAG_VALUE",
                 )
 
-                if conf.getboolean('OTHER', 'KEEP_REG_FILE'):
+                if conf.getboolean("OTHER", "KEEP_REG_FILE"):
                     reg_file = conf.getexpanded(
-                        f'{mask_shape}_PARAMETERS',
-                        f'{mask_shape}_REG_FILE',
+                        f"{mask_shape}_PARAMETERS",
+                        f"{mask_shape}_REG_FILE",
                     )
-                    self._config[mask_shape]['reg_file'] = (
+                    self._config[mask_shape]["reg_file"] = (
                         f'{self._config["PATH"]["temp_dir"]}/'
                         + f'{re.split(".reg", reg_file)[0]}'
-                        + f'{self._img_number}.reg'
+                        + f"{self._img_number}.reg"
                     )
                 else:
-                    self._config[mask_shape]['reg_file'] = None
+                    self._config[mask_shape]["reg_file"] = None
 
-        for mask_type in ['MESSIER', 'NGC']:
+        for mask_type in ["MESSIER", "NGC"]:
 
-            self._config[mask_type]['make'] = conf.getboolean(
-                f'{mask_type}_PARAMETERS',
-                f'{mask_type}_MAKE'
+            self._config[mask_type]["make"] = conf.getboolean(
+                f"{mask_type}_PARAMETERS", f"{mask_type}_MAKE"
             )
 
-            if self._config[mask_type]['make']:
-                self._config[mask_type]['cat_path'] = conf.getexpanded(
-                    f'{mask_type}_PARAMETERS',
-                    f'{mask_type}_CAT_PATH',
+            if self._config[mask_type]["make"]:
+                self._config[mask_type]["cat_path"] = conf.getexpanded(
+                    f"{mask_type}_PARAMETERS",
+                    f"{mask_type}_CAT_PATH",
                 )
-                self._config[mask_type]['size_plus'] = conf.getfloat(
-                    f'{mask_type}_PARAMETERS',
-                    f'{mask_type}_SIZE_PLUS',
+                self._config[mask_type]["size_plus"] = conf.getfloat(
+                    f"{mask_type}_PARAMETERS",
+                    f"{mask_type}_SIZE_PLUS",
                 )
-                self._config[mask_type]['flag'] = conf.getint(
-                    f'{mask_type}_PARAMETERS',
-                    f'{mask_type}_FLAG_VALUE',
+                self._config[mask_type]["flag"] = conf.getint(
+                    f"{mask_type}_PARAMETERS",
+                    f"{mask_type}_FLAG_VALUE",
                 )
 
-        self._config['MD']['make'] = (
-            conf.getboolean('MD_PARAMETERS', 'MD_MAKE')
-        )
+        self._config["MD"]["make"] = conf.getboolean("MD_PARAMETERS", "MD_MAKE")
 
-        if self._config['MD']['make']:
-            self._config['MD']['thresh_flag'] = (
-                conf.getfloat('MD_PARAMETERS', 'MD_THRESH_FLAG')
+        if self._config["MD"]["make"]:
+            self._config["MD"]["thresh_flag"] = conf.getfloat(
+                "MD_PARAMETERS", "MD_THRESH_FLAG"
             )
-            self._config['MD']['thresh_remove'] = (
-                conf.getfloat('MD_PARAMETERS', 'MD_THRESH_REMOVE')
+            self._config["MD"]["thresh_remove"] = conf.getfloat(
+                "MD_PARAMETERS", "MD_THRESH_REMOVE"
             )
-            self._config['MD']['remove'] = (
-                conf.getboolean('MD_PARAMETERS', 'MD_REMOVE')
+            self._config["MD"]["remove"] = conf.getboolean(
+                "MD_PARAMETERS", "MD_REMOVE"
             )
 
     def _set_image_coordinates(self):
@@ -293,9 +287,9 @@ def _set_image_coordinates(self):
         pix_center = [img_shape[1] / 2.0, img_shape[0] / 2.0]
         wcs_center = self._wcs.all_pix2world([pix_center], 1)[0]
         self._fieldcenter = {}
-        self._fieldcenter['pix'] = np.array(pix_center)
-        self._fieldcenter['wcs'] = (
-            SkyCoord(ra=wcs_center[0], dec=wcs_center[1], unit='deg')
+        self._fieldcenter["pix"] = np.array(pix_center)
+        self._fieldcenter["wcs"] = SkyCoord(
+            ra=wcs_center[0], dec=wcs_center[1], unit="deg"
         )
 
         # Get the four corners of the image
@@ -315,77 +309,77 @@ def make_mask(self):
 
         """
         output_file_name = (
-            f'{self._img_prefix}'
-            + f'{self._outname_base}{self._img_number}.fits'
+            f"{self._img_prefix}"
+            + f"{self._outname_base}{self._img_number}.fits"
         )
-        if (
-            os.path.exists(f"{self._check_existing_dir}//{output_file_name}")
-        ):
+        if os.path.exists(f"{self._check_existing_dir}//{output_file_name}"):
             return None, None
 
-        if self._config['MD']['make']:
+        if self._config["MD"]["make"]:
             self.missing_data()
 
-        if self._config['HALO']['make'] or self._config['SPIKE']['make']:
+        if self._config["HALO"]["make"] or self._config["SPIKE"]["make"]:
             stars = self.find_stars(
-                np.array([
-                    self._fieldcenter['wcs'].ra.value,
-                    self._fieldcenter['wcs'].dec.value
-                ]),
+                np.array(
+                    [
+                        self._fieldcenter["wcs"].ra.value,
+                        self._fieldcenter["wcs"].dec.value,
+                    ]
+                ),
                 radius=self._img_radius,
             )
 
         if not self._err:
-            for _type in ('HALO', 'SPIKE'):
-                if self._config[_type]['make']:
+            for _type in ("HALO", "SPIKE"):
+                if self._config[_type]["make"]:
                     self._create_mask(
                         stars=stars,
                         types=_type,
-                        mag_limit=self._config[_type]['mag_lim'],
-                        scale_factor=self._config[_type]['scale_factor'],
-                        mag_pivot=self._config[_type]['mag_pivot'],
+                        mag_limit=self._config[_type]["mag_lim"],
+                        scale_factor=self._config[_type]["scale_factor"],
+                        mag_pivot=self._config[_type]["mag_pivot"],
                     )
 
         if not self._err:
             mask_name = []
-            if self._config['HALO']['make'] and self._config['SPIKE']['make']:
-                self._exec_WW(types='ALL')
+            if self._config["HALO"]["make"] and self._config["SPIKE"]["make"]:
+                self._exec_WW(types="ALL")
                 mask_name.append(
                     f'{self._config["PATH"]["temp_dir"]}halo_spike_flag'
-                    + f'{self._img_number}.fits'
+                    + f"{self._img_number}.fits"
                 )
                 mask_name.append(None)
             else:
-                for _type in ('HALO', 'SPIKE'):
-                    if self._config[_type]['make']:
+                for _type in ("HALO", "SPIKE"):
+                    if self._config[_type]["make"]:
                         self._exec_WW(types=_type)
                         mask_name.append(
                             f'{self._config["PATH"]["temp_dir"]}'
-                            + f'{_type.lower()}_flag{self._img_number}.fits'
+                            + f"{_type.lower()}_flag{self._img_number}.fits"
                         )
                     else:
                         mask_name.append(None)
 
         masks_internal = {}
         if not self._err:
-            if self._config['BORDER']['make']:
-                masks_internal['BORDER'] = self.mask_border(
-                    width=self._config['BORDER']['width']
+            if self._config["BORDER"]["make"]:
+                masks_internal["BORDER"] = self.mask_border(
+                    width=self._config["BORDER"]["width"]
                 )
 
         if not self._err:
-            for _type in ('MESSIER', 'NGC'):
-                if self._config[_type]['make']:
+            for _type in ("MESSIER", "NGC"):
+                if self._config[_type]["make"]:
                     masks_internal[_type] = self.mask_dso(
-                        self._config[_type]['cat_path'],
-                        size_plus=self._config[_type]['size_plus'],
-                        flag_value=self._config[_type]['flag'],
+                        self._config[_type]["cat_path"],
+                        size_plus=self._config[_type]["size_plus"],
+                        flag_value=self._config[_type]["flag"],
                         obj_type=_type,
                     )
 
         if not self._err:
             try:
-                im_pass = self._config['MD']['im_remove']
+                im_pass = self._config["MD"]["im_remove"]
             except Exception:
                 im_pass = True
 
@@ -401,19 +395,19 @@ def make_mask(self):
                     path_external_flag=path_external_flag,
                 )
 
-                if not self._config['HALO']['individual']:
+                if not self._config["HALO"]["individual"]:
                     if mask_name[0] is not None:
-                        self._rm_fits1_stdout, self._rm_fits1_stderr = (
-                            execute(f'rm {mask_name[0]}')
+                        self._rm_fits1_stdout, self._rm_fits1_stderr = execute(
+                            f"rm {mask_name[0]}"
                         )
                     if mask_name[1] is not None:
-                        self._rm_fits2_stdout, self._rm_fits2_stderr = (
-                            execute(f'rm {mask_name[1]}')
+                        self._rm_fits2_stdout, self._rm_fits2_stderr = execute(
+                            f"rm {mask_name[1]}"
                         )
 
                 output_file_name = (
-                    f'{self._output_dir}/{self._img_prefix}'
-                    + f'{self._outname_base}{self._img_number}.fits'
+                    f"{self._output_dir}/{self._img_prefix}"
+                    + f"{self._outname_base}{self._img_number}.fits"
                 )
 
                 self._mask_to_file(
@@ -422,32 +416,30 @@ def make_mask(self):
                 )
 
         # Handle stdout / stderr
-        general_stdout = f'\nCDSClient\n{self._CDS_stdout}'
-        general_stderr = ''
-        if self._CDS_stderr != '':
-            general_stderr += f'\nCDSClient\n{self._CDS_stderr}'
-        if hasattr(self, '_WW_stdout') or hasattr(self, '_WW_stdout'):
-            general_stdout += f'\n\nWeightWatcher\n{self._WW_stdout}'
-            if self._WW_stderr != '':
-                general_stderr += f'\n\nWeightWatcher\n{self._WW_stderr}'
-        if hasattr(self, '_rm_reg_stderr') or hasattr(self, '_rm_reg_stdout'):
-            general_stdout += f'\n\nrm reg file\n{self._rm_reg_stdout}'
-            if self._rm_reg_stderr != '':
-                general_stderr += f'\n\nrm reg file\n{self._rm_reg_stderr}'
-        if (
-            hasattr(self, '_rm_fits1_stderr')
-            or hasattr(self, '_rm_fits1_stdout')
+        general_stdout = f"\nCDSClient\n{self._CDS_stdout}"
+        general_stderr = ""
+        if self._CDS_stderr != "":
+            general_stderr += f"\nCDSClient\n{self._CDS_stderr}"
+        if hasattr(self, "_WW_stdout") or hasattr(self, "_WW_stdout"):
+            general_stdout += f"\n\nWeightWatcher\n{self._WW_stdout}"
+            if self._WW_stderr != "":
+                general_stderr += f"\n\nWeightWatcher\n{self._WW_stderr}"
+        if hasattr(self, "_rm_reg_stderr") or hasattr(self, "_rm_reg_stdout"):
+            general_stdout += f"\n\nrm reg file\n{self._rm_reg_stdout}"
+            if self._rm_reg_stderr != "":
+                general_stderr += f"\n\nrm reg file\n{self._rm_reg_stderr}"
+        if hasattr(self, "_rm_fits1_stderr") or hasattr(
+            self, "_rm_fits1_stdout"
         ):
-            general_stdout += f'\n\nrm fits1 file\n{self._rm_fits1_stdout}'
-            if self._rm_fits1_stderr != '':
-                general_stderr += f'\n\nrm fits1 file\n{self._rm_fits1_stderr}'
-        if (
-            hasattr(self, '_rm_fits2_stderr')
-            or hasattr(self, '_rm_fits2_stdout')
+            general_stdout += f"\n\nrm fits1 file\n{self._rm_fits1_stdout}"
+            if self._rm_fits1_stderr != "":
+                general_stderr += f"\n\nrm fits1 file\n{self._rm_fits1_stderr}"
+        if hasattr(self, "_rm_fits2_stderr") or hasattr(
+            self, "_rm_fits2_stdout"
         ):
-            general_stdout += f'\n\nrm fits2 file\n{self._rm_fits2_stdout}'
-            if self._rm_fits2_stderr != '':
-                general_stderr += f'\n\nrm fits2 file\n{self._rm_fits2_stderr}'
+            general_stdout += f"\n\nrm fits2 file\n{self._rm_fits2_stdout}"
+            if self._rm_fits2_stderr != "":
+                general_stderr += f"\n\nrm fits2 file\n{self._rm_fits2_stderr}"
 
         return general_stdout, general_stderr
 
@@ -475,35 +467,35 @@ def find_stars(self, position, radius):
             For invalid configuration options
 
         """
-        if 'CDSclient' in self._config['PATH']:
+        if "CDSclient" in self._config["PATH"]:
             ra = position[0]
             dec = position[1]
 
             if dec > 0.0:
-                sign = '+'
+                sign = "+"
             else:
-                sign = ''
+                sign = ""
 
             cmd_line = (
                 f'{self._config["PATH"]["CDSclient"]} {ra} {sign}{dec} '
-                + f'-r {radius} -n 1000000'
+                + f"-r {radius} -n 1000000"
             )
 
             self._CDS_stdout, self._CDS_stderr = execute(cmd_line)
 
-        elif 'star_cat' in self._config['PATH']:
-            f = open(self._config['PATH']['star_cat'], 'r')
+        elif "star_cat" in self._config["PATH"]:
+            f = open(self._config["PATH"]["star_cat"], "r")
             self._CDS_stdout = f.read()
-            self._CDS_stderr = ''
+            self._CDS_stderr = ""
             f.close()
 
         else:
             raise ValueError(
-                'Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file '
-                + ' or a star catalogue as module input needs to be present'
+                "Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file "
+                + " or a star catalogue as module input needs to be present"
             )
 
-        if self._CDS_stderr != '':
+        if self._CDS_stderr != "":
             self._err = True
             return None
 
@@ -533,15 +525,15 @@ def mask_border(self, width=100, flag_value=4):
 
         """
         if width is None:
-            raise ValueError('Width for border mask not provided')
+            raise ValueError("Width for border mask not provided")
 
         # Note that python image array is [y, x]
         flag = np.zeros(
             (
-                int(self._fieldcenter['pix'][1] * 2),
-                int(self._fieldcenter['pix'][0] * 2)
+                int(self._fieldcenter["pix"][1] * 2),
+                int(self._fieldcenter["pix"][0] * 2),
             ),
-            dtype='uint16',
+            dtype="uint16",
         )
 
         flag[0:width, :] = flag_value
@@ -556,7 +548,7 @@ def mask_dso(
         cat_path,
         size_plus=0.1,
         flag_value=8,
-        obj_type='Messier',
+        obj_type="Messier",
     ):
         """Mask DSO.
 
@@ -591,23 +583,23 @@ def mask_dso(
         """
         if size_plus < 0:
             raise ValueError(
-                'deep-sky mask size increase variable cannot be negative'
+                "deep-sky mask size increase variable cannot be negative"
             )
 
         if cat_path is None:
-            raise ValueError('Path to deep-sky object catalogue not provided')
+            raise ValueError("Path to deep-sky object catalogue not provided")
 
         m_cat, header = fits.getdata(cat_path, header=True)
 
-        unit_ra = file_io.get_unit_from_fits_header(header, 'ra')
-        unit_dec = file_io.get_unit_from_fits_header(header, 'dec')
+        unit_ra = file_io.get_unit_from_fits_header(header, "ra")
+        unit_dec = file_io.get_unit_from_fits_header(header, "dec")
         m_sc = SkyCoord(
-            ra=m_cat['ra'] * unit_ra,
-            dec=m_cat['dec'] * unit_dec,
+            ra=m_cat["ra"] * unit_ra,
+            dec=m_cat["dec"] * unit_dec,
         )
 
-        unit_size_X = file_io.get_unit_from_fits_header(header, 'size_X')
-        unit_size_Y = file_io.get_unit_from_fits_header(header, 'size_Y')
+        unit_size_X = file_io.get_unit_from_fits_header(header, "size_X")
+        unit_size_Y = file_io.get_unit_from_fits_header(header, "size_Y")
 
         # Loop through all deep-sky objects and check whether any corner is
         # closer than the object's radius
@@ -618,8 +610,8 @@ def mask_dso(
             # DSO size
             # r = max(m_obj['size']) * units.arcmin
             r = max(
-                m_obj['size_X'] * unit_size_X,
-                m_obj['size_Y'] * unit_size_Y,
+                m_obj["size_X"] * unit_size_X,
+                m_obj["size_Y"] * unit_size_Y,
             )
             r_deg = r.to(units.degree)
             size_max_deg.append(r_deg)
@@ -630,8 +622,7 @@ def mask_dso(
                 indices.append(idx)
 
         self._w_log.info(
-            f'Found {len(indices)} {obj_type} objects overlapping with'
-            ' image'
+            f"Found {len(indices)} {obj_type} objects overlapping with" " image"
         )
 
         if len(indices) == 0:
@@ -644,42 +635,44 @@ def mask_dso(
         for idx in indices:
             in_img = self._wcs.footprint_contains(m_sc[idx])
             self._w_log.info(
-                '(obj_type, ra, dec, in_img) = '
-                + f'({obj_type}, '
+                "(obj_type, ra, dec, in_img) = "
+                + f"({obj_type}, "
                 + f'{m_cat["ra"][idx]}, '
                 + f'{m_cat["dec"][idx]}, '
-                + f'{in_img})'
+                + f"{in_img})"
             )
 
         # Note: python image array is [y, x]
         flag = np.zeros(
             (
-                int(self._fieldcenter['pix'][1] * 2),
-                int(self._fieldcenter['pix'][0] * 2)
+                int(self._fieldcenter["pix"][1] * 2),
+                int(self._fieldcenter["pix"][0] * 2),
             ),
-            dtype='uint16',
+            dtype="uint16",
         )
 
-        nx = self._fieldcenter['pix'][0] * 2
-        ny = self._fieldcenter['pix'][1] * 2
+        nx = self._fieldcenter["pix"][0] * 2
+        ny = self._fieldcenter["pix"][1] * 2
         for idx in indices:
-            m_center = np.hstack(self._wcs.all_world2pix(
-                m_cat['ra'][idx],
-                m_cat['dec'][idx],
-                0,
-            ))
+            m_center = np.hstack(
+                self._wcs.all_world2pix(
+                    m_cat["ra"][idx],
+                    m_cat["dec"][idx],
+                    0,
+                )
+            )
             r_pix = (
-                size_max_deg[idx].to(units.deg).value * (1 + size_plus)
+                size_max_deg[idx].to(units.deg).value
+                * (1 + size_plus)
                 / np.abs(self._wcs.pixel_scale_matrix[0][0])
             )
 
             # The following accounts for deep-sky centers outside of image,
             # without creating masks for coordinates out of range
             y_c, x_c = np.ogrid[0:ny, 0:nx]
-            mask_tmp = (
-                (x_c - m_center[0]) ** 2 + (y_c - m_center[1]) ** 2
-                <= r_pix ** 2
-            )
+            mask_tmp = (x_c - m_center[0]) ** 2 + (
+                y_c - m_center[1]
+            ) ** 2 <= r_pix**2
 
             flag[mask_tmp] = flag_value
 
@@ -700,26 +693,26 @@ def missing_data(self):
         tot = float(im_shape[0] * im_shape[1])
 
         # Compute number and ratio of missing data (zero-valued pixels)
-        missing = float(len(np.where(img.get_data() == 0.)[0]))
+        missing = float(len(np.where(img.get_data() == 0.0)[0]))
         self._ratio = missing / tot
 
         # Mark image as to be flagged if ratio larger than 'flag' threshold
-        if self._ratio >= self._config['MD']['thresh_flag']:
-            self._config['MD']['im_flagged'] = True
+        if self._ratio >= self._config["MD"]["thresh_flag"]:
+            self._config["MD"]["im_flagged"] = True
         else:
-            self._config['MD']['im_flagged'] = False
+            self._config["MD"]["im_flagged"] = False
 
         # Mark image as to be removed if flag is True and
         # ratio large than 'remove' threshold.
         # Reset all other mask 'make' flags to False (no other mask needs
         # to be created)
-        if self._config['MD']['remove']:
-            if self._ratio >= self._config['MD']['thresh_remove']:
-                self._config['MD']['im_remove'] = True
-                for idx in ['HALO', 'SPIKE', 'MESSIER', 'BORDER']:
-                    self._config[idx]['make'] = False
+        if self._config["MD"]["remove"]:
+            if self._ratio >= self._config["MD"]["thresh_remove"]:
+                self._config["MD"]["im_remove"] = True
+                for idx in ["HALO", "SPIKE", "MESSIER", "BORDER"]:
+                    self._config[idx]["make"] = False
             else:
-                self._config['MD']['im_remove'] = False
+                self._config["MD"]["im_remove"] = False
 
         img.close()
 
@@ -750,7 +743,7 @@ def sphere_dist(self, position1, position2):
             type(position1) is not np.ndarray
             or type(position2) is not np.ndarray
         ):
-            raise ValueError('Object coordinates need to be a numpy.ndarray')
+            raise ValueError("Object coordinates need to be a numpy.ndarray")
 
         p1 = (np.pi / 180.0) * np.hstack(
             self._wcs.all_pix2world(position1[0], position1[1], 1)
@@ -763,10 +756,12 @@ def sphere_dist(self, position1, position2):
         dLong = dTheta[0]
         dLat = dTheta[1]
 
-        dist = 2 * np.arcsin(np.sqrt(
-            np.sin(dLat / 2.0) ** 2.0 + np.cos(p1[1]) * np.cos(p2[1])
-            * np.sin(dLong / 2.0) ** 2.0
-        ))
+        dist = 2 * np.arcsin(
+            np.sqrt(
+                np.sin(dLat / 2.0) ** 2.0
+                + np.cos(p1[1]) * np.cos(p2[1]) * np.sin(dLong / 2.0) ** 2.0
+            )
+        )
 
         return dist * (180.0 / np.pi) * 3600.0
 
@@ -793,7 +788,7 @@ def _get_image_radius(self, center=None):
         """
         if center is None:
             return (
-                self.sphere_dist(self._fieldcenter['pix'], np.zeros(2)) / 60.0
+                self.sphere_dist(self._fieldcenter["pix"], np.zeros(2)) / 60.0
             )
 
         else:
@@ -801,7 +796,7 @@ def _get_image_radius(self, center=None):
                 return self.sphere_dist(center, np.zeros(2)) / 60.0
             else:
                 raise TypeError(
-                    'Image center coordinates has to be a numpy.ndarray'
+                    "Image center coordinates has to be a numpy.ndarray"
                 )
 
     def _make_star_cat(self, CDSclient_output):
@@ -824,12 +819,12 @@ def _make_star_cat(self, CDSclient_output):
         stars = {}
 
         # get header
-        for key in CDSclient_output.splitlines()[3].split(' '):
-            if (key != '') and (key != ';'):
+        for key in CDSclient_output.splitlines()[3].split(" "):
+            if (key != "") and (key != ";"):
                 # cleaning output
-                key = key.replace(' ', '')
-                for key_split in re.split(',|#|;', key):
-                    if key_split != '':
+                key = key.replace(" ", "")
+                for key_split in re.split(",|#|;", key):
+                    if key_split != "":
                         key = key_split
                 header.append(key)
                 stars[key] = []
@@ -837,19 +832,19 @@ def _make_star_cat(self, CDSclient_output):
         # get data
         for elem in range(4, len(CDSclient_output.splitlines()) - 5):
             idx = 0
-            for key in CDSclient_output.splitlines()[elem].split(' '):
-                if (key != '') and (key != ';'):
+            for key in CDSclient_output.splitlines()[elem].split(" "):
+                if (key != "") and (key != ";"):
                     # cleaning output
-                    key = key.replace(' ', '')
-                    for key_split in re.split(',|#|;', key):
-                        if key_split != '':
+                    key = key.replace(" ", "")
+                    for key_split in re.split(",|#|;", key):
+                        if key_split != "":
                             key = key_split
                     # handle missing data
                     try:
                         key = float(key)
                         stars[header[idx]].append(key)
                     except Exception:
-                        if key == '---':
+                        if key == "---":
                             stars[header[idx]].append(None)
                         else:
                             stars[header[idx]].append(key)
@@ -860,7 +855,7 @@ def _make_star_cat(self, CDSclient_output):
     def _create_mask(
         self,
         stars,
-        types='HALO',
+        types="HALO",
         mag_limit=18.0,
         mag_pivot=13.8,
         scale_factor=0.3,
@@ -891,34 +886,34 @@ def _create_mask(
 
         """
         if stars is None:
-            raise ValueError('Star catalogue dictionary not provided')
+            raise ValueError("Star catalogue dictionary not provided")
 
-        if types not in ('HALO', 'SPIKE'):
+        if types not in ("HALO", "SPIKE"):
             raise ValueError('Mask types need to be in ["HALO", "SPIKE"]')
 
-        if self._config[types]['reg_file'] is None:
+        if self._config[types]["reg_file"] is None:
             reg = (
                 f'{self._config["PATH"]["temp_dir"]}{types.lower()}'
-                + f'{self._img_number}.reg'
+                + f"{self._img_number}.reg"
             )
         else:
-            reg = self._config[types]['reg_file']
+            reg = self._config[types]["reg_file"]
 
         mask_model = np.loadtxt(
-            self._config[types]['maskmodel_path']
+            self._config[types]["maskmodel_path"]
         ).transpose()
-        mask_reg = open(reg, 'w')
+        mask_reg = open(reg, "w")
 
         stars_used = [[], [], []]
 
         star_zip = zip(
-            stars['RA(J2000)'],
-            stars['Dec(J2000)'],
-            stars['Fmag'],
-            stars['Jmag'],
-            stars['Vmag'],
-            stars['Nmag'],
-            stars['Clas'],
+            stars["RA(J2000)"],
+            stars["Dec(J2000)"],
+            stars["Fmag"],
+            stars["Jmag"],
+            stars["Vmag"],
+            stars["Nmag"],
+            stars["Clas"],
         )
 
         for ra, dec, Fmag, Jmag, Vmag, Nmag, clas in star_zip:
@@ -943,7 +938,9 @@ def _create_mask(
                 mag /= idx
 
             if (
-                ra is not None and dec is not None and mag is not None
+                ra is not None
+                and dec is not None
+                and mag is not None
                 and clas is not None
             ):
                 if (mag < mag_limit) and (clas == 0):
@@ -954,22 +951,22 @@ def _create_mask(
                     stars_used[2].append(scaling)
 
         for idx in range(len(stars_used[0])):
-            poly = 'polygon('
+            poly = "polygon("
             for x, y in zip(mask_model[0], mask_model[1]):
                 angle = np.arctan2(y, x)
-                ll = stars_used[2][idx] * np.sqrt(x ** 2 + y ** 2)
+                ll = stars_used[2][idx] * np.sqrt(x**2 + y**2)
                 xnew = ll * np.cos(angle)
                 ynew = ll * np.sin(angle)
                 poly = (
-                    f'{poly}{str(stars_used[0][idx] + xnew + 0.5)} '
-                    + f'{str(stars_used[1][idx] + ynew + 0.5)} '
+                    f"{poly}{str(stars_used[0][idx] + xnew + 0.5)} "
+                    + f"{str(stars_used[1][idx] + ynew + 0.5)} "
                 )
-            poly = f'{poly})\n'
+            poly = f"{poly})\n"
             mask_reg.write(poly)
 
         mask_reg.close()
 
-    def _exec_WW(self, types='HALO'):
+    def _exec_WW(self, types="HALO"):
         """Execute WeightWatcher.
 
         Execute WeightWatcher to transform ``.reg`` to ``.fits`` flag map.
@@ -986,18 +983,18 @@ def _exec_WW(self, types='HALO'):
             If catalogue file not found
 
         """
-        if types in ('HALO', 'SPIKE'):
+        if types in ("HALO", "SPIKE"):
 
             default_reg = (
                 f'{self._config["PATH"]["temp_dir"]}{types.lower()}'
-                + f'{self._img_number}.reg'
+                + f"{self._img_number}.reg"
             )
             default_out = (
                 f'{self._config["PATH"]["temp_dir"]}{types.lower()}_flag'
-                + f'{self._img_number}.fits'
+                + f"{self._img_number}.fits"
             )
 
-            if self._config[types]['reg_file'] is None:
+            if self._config[types]["reg_file"] is None:
                 reg = default_reg
 
                 if not file_io.BaseCatalogue(reg)._file_exists(reg):
@@ -1006,20 +1003,18 @@ def _exec_WW(self, types='HALO'):
                 cmd = (
                     f'{self._config["PATH"]["WW"]} '
                     + f'-c {self._config["PATH"]["WW_configfile"]} '
-                    + f'-WEIGHT_NAMES {self._weight_fullpath} '
-                    + f'-POLY_NAMES {reg} '
+                    + f"-WEIGHT_NAMES {self._weight_fullpath} "
+                    + f"-POLY_NAMES {reg} "
                     + f'-POLY_OUTFLAGS {self._config[types]["flag"]} '
                     + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} '
                     + '-OUTWEIGHT_NAME ""'
                 )
 
                 self._WW_stdout, self._WW_stderr = execute(cmd)
-                self._rm_reg_stdout, self._rm_reg_stderr = (
-                    execute(f'rm {reg}')
-                )
+                self._rm_reg_stdout, self._rm_reg_stderr = execute(f"rm {reg}")
 
             else:
-                reg = self._config[types]['reg_file']
+                reg = self._config[types]["reg_file"]
 
                 if not file_io.BaseCatalogue(reg)._file_exists(reg):
                     raise file_io.BaseCatalogue.CatalogFileNotFound(reg)
@@ -1027,8 +1022,8 @@ def _exec_WW(self, types='HALO'):
                 cmd = (
                     f'{self._config["PATH"]["WW"]} '
                     + f'-c {self._config["PATH"]["WW_configfile"]} '
-                    + f'-WEIGHT_NAMES {self._weight_fullpath} '
-                    + f'-POLY_NAMES {reg} '
+                    + f"-WEIGHT_NAMES {self._weight_fullpath} "
+                    + f"-POLY_NAMES {reg} "
                     + f'-POLY_OUTFLAGS {self._config[types]["flag"]} '
                     + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} '
                     + '-OUTWEIGHT_NAME ""'
@@ -1036,24 +1031,24 @@ def _exec_WW(self, types='HALO'):
 
                 self._WW_stdout, self._WW_stderr = execute(cmd)
 
-        elif types == 'ALL':
+        elif types == "ALL":
 
             default_reg = [
                 (
                     f'{self._config["PATH"]["temp_dir"]}'
-                    + f'halo{self._img_number}.reg'
+                    + f"halo{self._img_number}.reg"
                 ),
                 (
                     f'{self._config["PATH"]["temp_dir"]}'
-                    + f'spike{self._img_number}.reg'
-                )
+                    + f"spike{self._img_number}.reg"
+                ),
             ]
             default_out = (
                 f'{self._config["PATH"]["temp_dir"]}'
-                + f'halo_spike_flag{self._img_number}.fits'
+                + f"halo_spike_flag{self._img_number}.fits"
             )
 
-            if self._config['HALO']['reg_file'] is None:
+            if self._config["HALO"]["reg_file"] is None:
                 reg = default_reg
 
                 for idx in range(2):
@@ -1067,8 +1062,8 @@ def _exec_WW(self, types='HALO'):
                 cmd = (
                     f'{self._config["PATH"]["WW"]} '
                     + f'-c {self._config["PATH"]["WW_configfile"]} '
-                    + f'-WEIGHT_NAMES {self._weight_fullpath} '
-                    + f'-POLY_NAMES {reg[0]},{reg[1]} '
+                    + f"-WEIGHT_NAMES {self._weight_fullpath} "
+                    + f"-POLY_NAMES {reg[0]},{reg[1]} "
                     + f'-POLY_OUTFLAGS {self._config["HALO"]["flag"]},'
                     + f'{self._config["SPIKE"]["flag"]} '
                     + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} '
@@ -1076,14 +1071,14 @@ def _exec_WW(self, types='HALO'):
                 )
 
                 self._WW_stdout, self._WW_stderr = execute(cmd)
-                self._rm_reg_stdout, self._rm_reg_stderr = (
-                    execute(f'rm {reg[0]} {reg[1]}')
+                self._rm_reg_stdout, self._rm_reg_stderr = execute(
+                    f"rm {reg[0]} {reg[1]}"
                 )
 
             else:
                 reg = [
-                    self._config['HALO']['reg_file'],
-                    self._config['SPIKE']['reg_file']
+                    self._config["HALO"]["reg_file"],
+                    self._config["SPIKE"]["reg_file"],
                 ]
 
                 for idx in range(2):
@@ -1097,8 +1092,8 @@ def _exec_WW(self, types='HALO'):
                 cmd = (
                     f'{self._config["PATH"]["WW"]} '
                     + f'-c {self._config["PATH"]["WW_configfile"]} '
-                    + f'-WEIGHT_NAMES {self._weight_fullpath} '
-                    + f'-POLY_NAMES {reg[0]},{reg[1]} '
+                    + f"-WEIGHT_NAMES {self._weight_fullpath} "
+                    + f"-POLY_NAMES {reg[0]},{reg[1]} "
                     + f'-POLY_OUTFLAGS {self._config["HALO"]["flag"]},'
                     + f'{self._config["SPIKE"]["flag"]} '
                     + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} '
@@ -1110,7 +1105,7 @@ def _exec_WW(self, types='HALO'):
         else:
             ValueError("Types must be in ['HALO','SPIKE','ALL']")
 
-        if (self._WW_stderr != '') or (self._rm_reg_stderr != ''):
+        if (self._WW_stderr != "") or (self._rm_reg_stderr != ""):
             self._err = True
 
     def _build_final_mask(
@@ -1152,13 +1147,10 @@ def _build_final_mask(
         """
         final_mask = None
 
-        if (
-            path_mask1 is None and path_mask2 is None
-            and not masks_internal
-        ):
+        if path_mask1 is None and path_mask2 is None and not masks_internal:
             raise ValueError(
-                'No paths to mask files containing halos and/or spikes,'
-                + ' borders, or deep-sky objects provided'
+                "No paths to mask files containing halos and/or spikes,"
+                + " borders, or deep-sky objects provided"
             )
 
         if path_mask1 is not None:
@@ -1184,8 +1176,8 @@ def _build_final_mask(
                         final_mask = masks_internal[typ]
                 else:
                     raise TypeError(
-                        f'internally created mask of type {typ} '
-                        + 'has to be numpy.ndarray'
+                        f"internally created mask of type {typ} "
+                        + "has to be numpy.ndarray"
                     )
 
         if path_external_flag is not None:
@@ -1224,9 +1216,9 @@ def _mask_to_file(self, input_mask, output_fullpath):
 
         """
         if input_mask is None:
-            raise ValueError('input mask file path not provided')
+            raise ValueError("input mask file path not provided")
         if output_fullpath is None:
-            raise ValueError('output mask file path not provided')
+            raise ValueError("output mask file path not provided")
 
         out = file_io.FITSCatalogue(
             output_fullpath,
@@ -1235,16 +1227,16 @@ def _mask_to_file(self, input_mask, output_fullpath):
         )
         out.save_as_fits(data=input_mask, image=True)
 
-        if self._config['MD']['make']:
+        if self._config["MD"]["make"]:
             out.open()
             out.add_header_card(
-                'MRATIO',
+                "MRATIO",
                 self._ratio,
-                'ratio missing_pixels/all_pixels',
+                "ratio missing_pixels/all_pixels",
             )
             out.add_header_card(
-                'MFLAG',
-                self._config['MD']['im_flagged'],
+                "MFLAG",
+                self._config["MD"]["im_flagged"],
                 f'threshold value {self._config["MD"]["thresh_flag"]:.3}',
             )
 
@@ -1282,14 +1274,14 @@ def _get_temp_dir_path(self, temp_dir_path):
 
         """
         if temp_dir_path is None:
-            raise ValueError('Temporary directory path not provided')
+            raise ValueError("Temporary directory path not provided")
 
-        path = temp_dir_path.replace(' ', '')
+        path = temp_dir_path.replace(" ", "")
 
-        if path == 'OUTPUT':
-            path = f'{self._output_dir}/temp'
+        if path == "OUTPUT":
+            path = f"{self._output_dir}/temp"
 
-        path += '/'
+        path += "/"
         if not os.path.isdir(path):
             mkdir(path)
 
diff --git a/shapepipe/modules/mask_runner.py b/shapepipe/modules/mask_runner.py
index c3215107c..0cbec20e2 100644
--- a/shapepipe/modules/mask_runner.py
+++ b/shapepipe/modules/mask_runner.py
@@ -11,12 +11,12 @@
 
 
 @module_runner(
-    version='1.0',
-    file_pattern=['image', 'weight', 'flag'],
-    file_ext=['.fits', '.fits', '.fits'],
-    depends=['numpy', 'astropy'],
-    executes=['ww', 'findgsc2.2'],
-    numbering_scheme='_0',
+    version="1.0",
+    file_pattern=["image", "weight", "flag"],
+    file_ext=[".fits", ".fits", ".fits"],
+    depends=["numpy", "astropy"],
+    executes=["ww", "findgsc2.2"],
+    numbering_scheme="_0",
 )
 def mask_runner(
     input_file_list,
@@ -37,32 +37,31 @@ def mask_runner(
 
     # Set options for 3 inputs
     elif n_inputs == 3:
-        if config.getboolean(module_config_sec, 'USE_EXT_FLAG'):
+        if config.getboolean(module_config_sec, "USE_EXT_FLAG"):
             ext_flag_name = input_file_list[2]
             ext_star_cat = None
-        elif config.getboolean(module_config_sec, 'USE_EXT_STAR'):
+        elif config.getboolean(module_config_sec, "USE_EXT_STAR"):
             ext_flag_name = None
             ext_star_cat = input_file_list[2]
         else:
             raise ValueError(
-                f'Found {n_inputs} inputs but was expecting external flag or '
-                + 'external star catalogue in the MASK_RUNNER section of the '
-                + 'config file.'
+                f"Found {n_inputs} inputs but was expecting external flag or "
+                + "external star catalogue in the MASK_RUNNER section of the "
+                + "config file."
             )
 
     # Set options for 4 inputs
     elif n_inputs == 4:
-        if (
-            config.getboolean(module_config_sec, 'USE_EXT_FLAG')
-            and config.getboolean(module_config_sec, 'USE_EXT_STAR')
-        ):
+        if config.getboolean(
+            module_config_sec, "USE_EXT_FLAG"
+        ) and config.getboolean(module_config_sec, "USE_EXT_STAR"):
             ext_flag_name = input_file_list[2]
             ext_star_cat = input_file_list[3]
         else:
             raise ValueError(
-                f'Found {n_inputs} inputs but was expecting external flag and '
-                + 'external star catalogue in the MASK_RUNNER section of the '
-                + 'config file.'
+                f"Found {n_inputs} inputs but was expecting external flag and "
+                + "external star catalogue in the MASK_RUNNER section of the "
+                + "config file."
             )
 
     # Raise error for invalid settings
@@ -70,32 +69,31 @@ def mask_runner(
         raise ValueError(
             f'Found {n_inputs} inputs and these must be "image", "weight" and '
             + '"ext_flags", "ext_star_cat" (optional). Check the MASK_RUNNER '
-            + 'section of the config file to make sure you have the '
-            + 'appropriate settings.'
+            + "section of the config file to make sure you have the "
+            + "appropriate settings."
         )
 
     # Get path to mask configuration options
-    config_file = config.getexpanded(module_config_sec, 'MASK_CONFIG_PATH')
+    config_file = config.getexpanded(module_config_sec, "MASK_CONFIG_PATH")
 
     # Get mask HDU number
-    if config.has_option(module_config_sec, 'HDU'):
-        hdu = config.getint(module_config_sec, 'HDU')
+    if config.has_option(module_config_sec, "HDU"):
+        hdu = config.getint(module_config_sec, "HDU")
     else:
         hdu = 0
 
     # Get mask mask file name prefix
-    if config.has_option(module_config_sec, 'PREFIX'):
-        prefix = config.get(module_config_sec, 'PREFIX')
+    if config.has_option(module_config_sec, "PREFIX"):
+        prefix = config.get(module_config_sec, "PREFIX")
     else:
-        prefix = ''
+        prefix = ""
 
-    outname_base = 'flag'
+    outname_base = "flag"
 
     # Path to check for already created mask files
-    if config.has_option(module_config_sec, 'CHECK_EXISTING_DIR'):
+    if config.has_option(module_config_sec, "CHECK_EXISTING_DIR"):
         check_existing_dir = config.getexpanded(
-            module_config_sec,
-            'CHECK_EXISTING_DIR'
+            module_config_sec, "CHECK_EXISTING_DIR"
         )
     else:
         check_existing_dir = None
@@ -103,10 +101,10 @@ def mask_runner(
     # Create instance of Mask
     mask_inst = Mask(
         *input_file_list[:2],
-        image_prefix=prefix.replace(' ', ''),
+        image_prefix=prefix.replace(" ", ""),
         image_num=file_number_string,
         config_filepath=config_file,
-        output_dir=run_dirs['output'],
+        output_dir=run_dirs["output"],
         path_external_flag=ext_flag_name,
         outname_base=outname_base,
         star_cat_path=ext_star_cat,
diff --git a/shapepipe/modules/match_external_package/__init__.py b/shapepipe/modules/match_external_package/__init__.py
index 950d84ca8..7fa68545c 100644
--- a/shapepipe/modules/match_external_package/__init__.py
+++ b/shapepipe/modules/match_external_package/__init__.py
@@ -46,4 +46,4 @@
 
 """
 
-__all__ = ['match_external']
+__all__ = ["match_external"]
diff --git a/shapepipe/modules/match_external_package/match_external.py b/shapepipe/modules/match_external_package/match_external.py
index 520bbb318..218a231e7 100644
--- a/shapepipe/modules/match_external_package/match_external.py
+++ b/shapepipe/modules/match_external_package/match_external.py
@@ -175,14 +175,14 @@ def process(self):
             self._external_col_match[0],
             self._external_col_match[1],
         )
-        external_coord = SkyCoord(ra=external_ra, dec=external_dec, unit='deg')
+        external_coord = SkyCoord(ra=external_ra, dec=external_dec, unit="deg")
 
         data, col_names, ext_names = get_data(
             self._input_file_list[0],
             self._hdu_no,
         )
         ra, dec = get_ra_dec(data, self._col_match[0], self._col_match[1])
-        coord = SkyCoord(ra=ra, dec=dec, unit='deg')
+        coord = SkyCoord(ra=ra, dec=dec, unit="deg")
 
         # Match objects in external cat to internal cat. indices=indices to
         # external object for each object in internal cat e.g.
@@ -198,17 +198,20 @@ def process(self):
 
         if not any(indices_close):
             self._w_log.info(
-                f'No match for {self._input_file_list[0]} with distance < '
-                + f'{self._tolerance} arcsec found, no output created.'
+                f"No match for {self._input_file_list[0]} with distance < "
+                + f"{self._tolerance} arcsec found, no output created."
             )
 
         else:
             # Get indices in internal and external catalogues of pair-wise
             # matches
-            w = np.array([
-                (idx, ide) for (idx, ide) in enumerate(indices)
-                if indices_close[idx]
-            ])
+            w = np.array(
+                [
+                    (idx, ide)
+                    for (idx, ide) in enumerate(indices)
+                    if indices_close[idx]
+                ]
+            )
             id_sub = w[:, 0]
             id_ext_sub = w[:, 1]
             id_all = np.arange(len(indices))
@@ -223,7 +226,7 @@ def process(self):
                 id_ext = id_ext_sub
 
             self._w_log.info(
-                f'{len(id_sub)} objects matched out of {len(indices)}.'
+                f"{len(id_sub)} objects matched out of {len(indices)}."
             )
 
             # Copy matched objects from internal catalogue to output data
@@ -242,7 +245,7 @@ def process(self):
             # Output distance if desired
             if self._output_distance:
                 # Output distance in arcsec
-                matched['distance'] = d2d[id_data].to('arcsec').value
+                matched["distance"] = d2d[id_data].to("arcsec").value
 
             # Write FITS file
             out_cat = file_io.FITSCatalogue(
@@ -252,14 +255,13 @@ def process(self):
             )
             out_cat.save_as_fits(
                 data=matched,
-                ext_name='MATCHED',
+                ext_name="MATCHED",
             )
 
             # Write all extensions if in multi-epoch mode
-            if self._mode == 'MULTI-EPOCH':
+            if self._mode == "MULTI-EPOCH":
                 hdu_me_list = [
-                    idx for idx, name in enumerate(ext_names)
-                    if 'EPOCH' in name
+                    idx for idx, name in enumerate(ext_names) if "EPOCH" in name
                 ]
                 for hdu_me in hdu_me_list:
                     data_me, col_names_me, dummy = get_data(
diff --git a/shapepipe/modules/match_external_runner.py b/shapepipe/modules/match_external_runner.py
index 9f1060c11..4df5ac0c2 100644
--- a/shapepipe/modules/match_external_runner.py
+++ b/shapepipe/modules/match_external_runner.py
@@ -11,12 +11,12 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module='sextractor_runner',
-    file_pattern='tile_sexcat',
-    file_ext='.fits',
-    depends=['numpy', 'astropy'],
-    run_method='parallel',
+    version="1.1",
+    input_module="sextractor_runner",
+    file_pattern="tile_sexcat",
+    file_ext=".fits",
+    depends=["numpy", "astropy"],
+    run_method="parallel",
 )
 def match_external_runner(
     input_file_list,
@@ -28,72 +28,71 @@ def match_external_runner(
 ):
     """Define The Match External Runner."""
     # Get processing tolerance
-    tolerance = config.getfloat(module_config_sec, 'TOLERANCE')
+    tolerance = config.getfloat(module_config_sec, "TOLERANCE")
 
     # Internal data
-    col_match = config.getlist(module_config_sec, 'COL_MATCH')
-    if config.has_option(module_config_sec, 'HDU'):
-        hdu_no = config.getint(module_config_sec, 'HDU')
+    col_match = config.getlist(module_config_sec, "COL_MATCH")
+    if config.has_option(module_config_sec, "HDU"):
+        hdu_no = config.getint(module_config_sec, "HDU")
     else:
         hdu_no = 2
 
     # Set run mode
-    mode = config.get(module_config_sec, 'MODE')
-    valid_modes = ('CLASSIC', 'MULTI-EPOCH')
+    mode = config.get(module_config_sec, "MODE")
+    valid_modes = ("CLASSIC", "MULTI-EPOCH")
     if mode not in valid_modes:
         raise ValueError(
-            f'mode \'{mode}\' is invalid, must be one of {valid_modes}.'
+            f"mode '{mode}' is invalid, must be one of {valid_modes}."
         )
 
     # External data
     external_cat_path = config.getexpanded(
         module_config_sec,
-        'EXTERNAL_CAT_PATH',
+        "EXTERNAL_CAT_PATH",
     )
     external_col_match = config.getlist(
         module_config_sec,
-        'EXTERNAL_COL_MATCH',
+        "EXTERNAL_COL_MATCH",
     )
 
     # TODO: optional or 'none', 'all'
     # Also TODO: change column name if already present in internal cat
-    external_col_copy = config.getlist(module_config_sec, 'EXTERNAL_COL_COPY')
+    external_col_copy = config.getlist(module_config_sec, "EXTERNAL_COL_COPY")
 
-    if config.has_option(module_config_sec, 'EXTERNAL_HDU'):
-        external_hdu_no = config.getint(module_config_sec, 'EXTERNAL_HDU')
+    if config.has_option(module_config_sec, "EXTERNAL_HDU"):
+        external_hdu_no = config.getint(module_config_sec, "EXTERNAL_HDU")
     else:
         external_hdu_no = 1
 
     # Output
-    if config.has_option(module_config_sec, 'PREFIX'):
+    if config.has_option(module_config_sec, "PREFIX"):
         prefix = config.get(
             module_config_sec,
-            'PREFIX',
+            "PREFIX",
         )
     else:
-        prefix = 'cat_matched'
+        prefix = "cat_matched"
 
-    if config.has_option(module_config_sec, 'MARK_NON_MATCHED'):
+    if config.has_option(module_config_sec, "MARK_NON_MATCHED"):
         mark_non_matched = config.getfloat(
             module_config_sec,
-            'MARK_NON_MATCHED',
+            "MARK_NON_MATCHED",
         )
     else:
         mark_non_matched = None
 
-    if config.has_option(module_config_sec, 'OUTPUT_DISTANCE'):
+    if config.has_option(module_config_sec, "OUTPUT_DISTANCE"):
         output_distance = config.getboolean(
             module_config_sec,
-            'OUTPUT_DISTANCE',
+            "OUTPUT_DISTANCE",
         )
     else:
         output_distance = False
 
     # Set output file path
-    file_ext = 'fits'
+    file_ext = "fits"
     output_path = (
-        f'{run_dirs["output"]}/{prefix}{file_number_string}.'
-        + f'{file_ext}'
+        f'{run_dirs["output"]}/{prefix}{file_number_string}.' + f"{file_ext}"
     )
 
     # Create instance of MatchCats
diff --git a/shapepipe/modules/mccd_fit_runner.py b/shapepipe/modules/mccd_fit_runner.py
index 512364338..58e367231 100644
--- a/shapepipe/modules/mccd_fit_runner.py
+++ b/shapepipe/modules/mccd_fit_runner.py
@@ -13,13 +13,13 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module=['mccd_preprocessing_runner'],
-    file_pattern=['train_star_selection'],
-    file_ext=['.fits'],
-    numbering_scheme='-0000000',
-    depends=['numpy', 'mccd', 'galsim'],
-    run_method='parallel',
+    version="1.1",
+    input_module=["mccd_preprocessing_runner"],
+    file_pattern=["train_star_selection"],
+    file_ext=[".fits"],
+    numbering_scheme="-0000000",
+    depends=["numpy", "mccd", "galsim"],
+    run_method="parallel",
 )
 def mccd_fit_runner(
     input_file_list,
@@ -31,9 +31,9 @@ def mccd_fit_runner(
 ):
     """Define The MCCD Fit Runner."""
     # Recover the MCCD config file and its params
-    config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH')
-    mccd_mode = config.get(module_config_sec, 'MODE')
-    verbose = config.getboolean(module_config_sec, 'VERBOSE')
+    config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH")
+    mccd_mode = config.get(module_config_sec, "MODE")
+    verbose = config.getboolean(module_config_sec, "VERBOSE")
 
     # Parse MCCD config file
     mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path)
@@ -41,10 +41,10 @@ def mccd_fit_runner(
 
     # Prepare inputs to run the main fit function
     trainstar_path = input_file_list[0]
-    output_dir = run_dirs['output'] + '/'
-    saving_name = 'fitted_model'
+    output_dir = run_dirs["output"] + "/"
+    saving_name = "fitted_model"
 
-    if mccd_mode == 'FIT':
+    if mccd_mode == "FIT":
         aux_mccd.mccd_fit_pipeline(
             trainstar_path=trainstar_path,
             file_number_string=file_number_string,
diff --git a/shapepipe/modules/mccd_fit_val_runner.py b/shapepipe/modules/mccd_fit_val_runner.py
index cb959e31c..26623c2a7 100644
--- a/shapepipe/modules/mccd_fit_val_runner.py
+++ b/shapepipe/modules/mccd_fit_val_runner.py
@@ -13,13 +13,13 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module=['mccd_preprocessing_runner'],
-    file_pattern=['train_star_selection', 'test_star_selection'],
-    file_ext=['.fits', '.fits'],
-    numbering_scheme='-0000000',
-    depends=['numpy', 'mccd', 'galsim'],
-    run_method='parallel',
+    version="1.1",
+    input_module=["mccd_preprocessing_runner"],
+    file_pattern=["train_star_selection", "test_star_selection"],
+    file_ext=[".fits", ".fits"],
+    numbering_scheme="-0000000",
+    depends=["numpy", "mccd", "galsim"],
+    run_method="parallel",
 )
 def mccd_fit_val_runner(
     input_file_list,
@@ -31,24 +31,24 @@ def mccd_fit_val_runner(
 ):
     """Define The MCCD Fit Validation Runner."""
     # Recover the MCCD config file and its params
-    config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH')
-    mccd_mode = config.get(module_config_sec, 'MODE')
-    verbose = config.getboolean(module_config_sec, 'VERBOSE')
+    config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH")
+    mccd_mode = config.get(module_config_sec, "MODE")
+    verbose = config.getboolean(module_config_sec, "VERBOSE")
 
     # Parse MCCD config file
     mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path)
     mccd_parser.parse_document()
 
     # Prepare inputs to run the main fit function
-    output_dir = run_dirs['output'] + '/'
-    fit_saving_name = 'fitted_model'
-    val_saving_name = 'validation_psf'
+    output_dir = run_dirs["output"] + "/"
+    fit_saving_name = "fitted_model"
+    val_saving_name = "validation_psf"
     # Extract the training star catalog
     trainstar_path = input_file_list[0]
     # Validation stars are in the second position of the list
     teststar_path = input_file_list[1]
 
-    if mccd_mode == 'FIT_VALIDATION':
+    if mccd_mode == "FIT_VALIDATION":
 
         aux_mccd.mccd_fit_pipeline(
             trainstar_path=trainstar_path,
@@ -61,8 +61,9 @@ def mccd_fit_val_runner(
         )
 
         # Fitted model is found in the output directory
-        mccd_model_path = output_dir + fit_saving_name + file_number_string \
-            + '.npy'
+        mccd_model_path = (
+            output_dir + fit_saving_name + file_number_string + ".npy"
+        )
 
         aux_mccd.mccd_validation_pipeline(
             teststar_path=teststar_path,
diff --git a/shapepipe/modules/mccd_interp_runner.py b/shapepipe/modules/mccd_interp_runner.py
index 4856e562f..1428e44d6 100644
--- a/shapepipe/modules/mccd_interp_runner.py
+++ b/shapepipe/modules/mccd_interp_runner.py
@@ -10,19 +10,20 @@
 
 from shapepipe.pipeline.run_log import get_last_dir
 
-from shapepipe.modules.mccd_package import \
-    mccd_interpolation_script as mccd_interp
+from shapepipe.modules.mccd_package import (
+    mccd_interpolation_script as mccd_interp,
+)
 from shapepipe.modules.mccd_package import shapepipe_auxiliary_mccd as aux_mccd
 from shapepipe.modules.module_decorator import module_runner
 
 
 @module_runner(
-    version='1.0',
-    input_module=['setools_runner'],
-    file_pattern=['galaxy_selection'],
-    file_ext=['.npy'],
-    depends=['numpy', 'astropy', 'galsim', 'sqlitedict', 'mccd'],
-    run_method='parallel',
+    version="1.0",
+    input_module=["setools_runner"],
+    file_pattern=["galaxy_selection"],
+    file_ext=[".npy"],
+    depends=["numpy", "astropy", "galsim", "sqlitedict", "mccd"],
+    run_method="parallel",
 )
 def mccd_interp_runner(
     input_file_list,
@@ -33,37 +34,32 @@ def mccd_interp_runner(
     w_log,
 ):
     """Define The MCCD Interpolation Runner."""
-    mode = config.getexpanded(module_config_sec, 'MODE')
-    pos_params = config.getlist(module_config_sec, 'POSITION_PARAMS')
-    get_shapes = config.getboolean(module_config_sec, 'GET_SHAPES')
-    mccd_model_extension = '.npy'
-    output_dir = run_dirs['output']
-
-    if mode == 'CLASSIC':
-        module = config.getexpanded(
-            module_config_sec,
-            'PSF_MODEL_DIR'
-        )
-        psf_model_dir = get_last_dir(run_dirs['run_log'], module)
-        psf_model_pattern = config.get(
-            module_config_sec,
-            'PSF_MODEL_PATTERN'
-        )
-        psf_separator = config.get(
-            module_config_sec,
-            'PSF_MODEL_SEPARATOR'
-        )
+    mode = config.getexpanded(module_config_sec, "MODE")
+    pos_params = config.getlist(module_config_sec, "POSITION_PARAMS")
+    get_shapes = config.getboolean(module_config_sec, "GET_SHAPES")
+    mccd_model_extension = ".npy"
+    output_dir = run_dirs["output"]
+
+    if mode == "CLASSIC":
+        module = config.getexpanded(module_config_sec, "PSF_MODEL_DIR")
+        psf_model_dir = get_last_dir(run_dirs["run_log"], module)
+        psf_model_pattern = config.get(module_config_sec, "PSF_MODEL_PATTERN")
+        psf_separator = config.get(module_config_sec, "PSF_MODEL_SEPARATOR")
         galcat_path = input_file_list[0]
 
         # verify that the MCCD model exists
         ccd_id = file_number_string.split(psf_separator)[-1]
         exposure_id = file_number_string.split(psf_separator)[-2]
 
-        psf_model_path = psf_model_dir + psf_model_pattern + psf_separator +\
-            exposure_id + mccd_model_extension
+        psf_model_path = (
+            psf_model_dir
+            + psf_model_pattern
+            + psf_separator
+            + exposure_id
+            + mccd_model_extension
+        )
 
-        saving_path = output_dir + '/galaxy_psf' + file_number_string +\
-            '.fits'
+        saving_path = output_dir + "/galaxy_psf" + file_number_string + ".fits"
 
         if not os.path.exists(psf_model_path):
             error_msg = "The corresponding PSF model was not not found."
@@ -74,7 +70,7 @@ def mccd_interp_runner(
 
             return None, None
 
-        w_log.info('Interpolating catalogue %s..' % file_number_string)
+        w_log.info("Interpolating catalogue %s.." % file_number_string)
         output_msg = aux_mccd.mccd_interpolation_pipeline(
             mccd_model_path=psf_model_path,
             galcat_path=galcat_path,
@@ -90,20 +86,11 @@ def mccd_interp_runner(
                 + f" id: {file_number_string}."
             )
 
-    elif mode == 'MULTI-EPOCH':
-        module = config.getexpanded(
-            module_config_sec,
-            'PSF_MODEL_DIR'
-        )
-        psf_model_dir = get_last_dir(run_dirs['run_log'], module)
-        psf_model_pattern = config.get(
-            module_config_sec,
-            'PSF_MODEL_PATTERN'
-        )
-        f_wcs_path = config.getexpanded(
-            module_config_sec,
-            'ME_LOG_WCS'
-        )
+    elif mode == "MULTI-EPOCH":
+        module = config.getexpanded(module_config_sec, "PSF_MODEL_DIR")
+        psf_model_dir = get_last_dir(run_dirs["run_log"], module)
+        psf_model_pattern = config.get(module_config_sec, "PSF_MODEL_PATTERN")
+        f_wcs_path = config.getexpanded(module_config_sec, "ME_LOG_WCS")
 
         galcat_path = input_file_list[0]
 
@@ -119,7 +106,7 @@ def mccd_interp_runner(
 
         inst.process_me(psf_model_dir, psf_model_pattern, f_wcs_path)
 
-    elif mode == 'VALIDATION':
+    elif mode == "VALIDATION":
         ValueError(
             "MODE has to be in MULTI-EPOCH or CLASSIC. For validation"
             + " use MCCD validation runner."
diff --git a/shapepipe/modules/mccd_package/__init__.py b/shapepipe/modules/mccd_package/__init__.py
index dc6416c43..115cc0f86 100644
--- a/shapepipe/modules/mccd_package/__init__.py
+++ b/shapepipe/modules/mccd_package/__init__.py
@@ -190,7 +190,7 @@
 """
 
 __all__ = [
-    'shapepipe_auxiliary_mccd',
-    'mccd_interpolation_script',
-    'mccd_plot_utilities',
+    "shapepipe_auxiliary_mccd",
+    "mccd_interpolation_script",
+    "mccd_plot_utilities",
 ]
diff --git a/shapepipe/modules/mccd_package/mccd_interpolation_script.py b/shapepipe/modules/mccd_package/mccd_interpolation_script.py
index c899b2b8f..4d3f776fa 100644
--- a/shapepipe/modules/mccd_package/mccd_interpolation_script.py
+++ b/shapepipe/modules/mccd_package/mccd_interpolation_script.py
@@ -23,9 +23,9 @@
     import_fail = False
 
 
-NOT_ENOUGH_STARS = 'Fail_stars'
-BAD_CHI2 = 'Fail_chi2'
-FILE_NOT_FOUND = 'File_not_found'
+NOT_ENOUGH_STARS = "Fail_stars"
+BAD_CHI2 = "Fail_chi2"
+FILE_NOT_FOUND = "File_not_found"
 
 
 def interp_MCCD(mccd_model_path, positions, ccd):
@@ -62,10 +62,12 @@ def interp_MCCD(mccd_model_path, positions, ccd):
 
     # Positions to global coordinates
     loc2glob = mccd.mccd_utils.Loc2Glob()
-    glob_pos = np.array([
-        loc2glob.loc2glob_img_coord(_ccd, _pos[0], _pos[1])
-        for _ccd, _pos in zip(ccd_list, positions)
-    ])
+    glob_pos = np.array(
+        [
+            loc2glob.loc2glob_img_coord(_ccd, _pos[0], _pos[1])
+            for _ccd, _pos in zip(ccd_list, positions)
+        ]
+    )
 
     # Interpolate the model
     PSFs = mccd_instance.interpolate_psf_pipeline(glob_pos, ccd)
@@ -116,16 +118,16 @@ def __init__(
         img_number,
         w_log,
         pos_params=None,
-        get_shapes=True
+        get_shapes=True,
     ):
         # Path to PSFEx output file
         self._dotpsf_path = dotpsf_path
         # Path to catalogue containing galaxy positions
         self._galcat_path = galcat_path
         # Path to output file to be written
-        self._output_path = output_path + '/galaxy_psf'
+        self._output_path = output_path + "/galaxy_psf"
         # Path to output file to be written for validation
-        self._output_path_validation = output_path + '/validation_psf'
+        self._output_path_validation = output_path + "/validation_psf"
         # if required, compute and save shapes
         self._compute_shape = get_shapes
 
@@ -142,8 +144,8 @@ def __init__(
         if pos_params:
             if not len(pos_params) == 2:
                 raise ValueError(
-                    f'{len(pos_params)} position parameters were passed on;'
-                    + f' there should be exactly two.'
+                    f"{len(pos_params)} position parameters were passed on;"
+                    + f" there should be exactly two."
                 )
             self._pos_params = pos_params
         else:
@@ -162,8 +164,8 @@ def _get_position_parameters(self):
         dotpsf = file_io.FITSCatalogue(self._dotpsf_path)
         dotpsf.open()
         self._pos_params = [
-            dotpsf.get_header()['POLNAME1'],
-            dotpsf.get_header()['POLNAME2']
+            dotpsf.get_header()["POLNAME1"],
+            dotpsf.get_header()["POLNAME2"],
         ]
         dotpsf.close()
 
@@ -180,20 +182,23 @@ def _get_galaxy_positions(self):
         galcat.open()
         try:
             self.gal_pos = np.array(
-                [[x, y] for x, y in zip(
-                    galcat.get_data()[self._pos_params[0]],
-                    galcat.get_data()[self._pos_params[1]]
-                )]
+                [
+                    [x, y]
+                    for x, y in zip(
+                        galcat.get_data()[self._pos_params[0]],
+                        galcat.get_data()[self._pos_params[1]],
+                    )
+                ]
             )
 
         except KeyError as detail:
             # extract erroneous position parameter from original exception
             err_pos_param = detail.args[0][4:-15]
             pos_param_err = (
-                f'Required position parameter {err_pos_param}'
-                + 'was not found in galaxy catalog. Leave '
-                + 'pos_params (or EXTRA_CODE_OPTION) blank to '
-                + 'read them from .psf file.'
+                f"Required position parameter {err_pos_param}"
+                + "was not found in galaxy catalog. Leave "
+                + "pos_params (or EXTRA_CODE_OPTION) blank to "
+                + "read them from .psf file."
             )
             raise KeyError(pos_param_err)
         galcat.close()
@@ -205,22 +210,24 @@ def _get_psfshapes(self):
 
         """
         if import_fail:
-            raise ImportError('Galsim is required to get shapes information')
+            raise ImportError("Galsim is required to get shapes information")
 
         psf_moms = [
             hsm.FindAdaptiveMom(Image(psf), strict=False)
             for psf in self.interp_PSFs
         ]
 
-        self.psf_shapes = np.array([
+        self.psf_shapes = np.array(
             [
-                moms.observed_shape.g1,
-                moms.observed_shape.g2,
-                moms.moments_sigma,
-                int(bool(moms.error_message))
+                [
+                    moms.observed_shape.g1,
+                    moms.observed_shape.g2,
+                    moms.moments_sigma,
+                    int(bool(moms.error_message)),
+                ]
+                for moms in psf_moms
             ]
-            for moms in psf_moms
-        ])
+        )
 
     def _write_output(self):
         """Write Output.
@@ -229,21 +236,21 @@ def _write_output(self):
 
         """
         output = file_io.FITSCatalogue(
-            self._output_path + self._img_number + '.fits',
+            self._output_path + self._img_number + ".fits",
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
-            SEx_catalogue=True
+            SEx_catalogue=True,
         )
 
         if self._compute_shape:
             data = {
-                'VIGNET': self.interp_PSFs,
-                'E1_PSF_HSM': self.psf_shapes[:, 0],
-                'E2_PSF_HSM': self.psf_shapes[:, 1],
-                'SIGMA_PSF_HSM': self.psf_shapes[:, 2],
-                'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int)
+                "VIGNET": self.interp_PSFs,
+                "E1_PSF_HSM": self.psf_shapes[:, 0],
+                "E2_PSF_HSM": self.psf_shapes[:, 1],
+                "SIGMA_PSF_HSM": self.psf_shapes[:, 2],
+                "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int),
             }
         else:
-            data = {'VIGNET': self.interp_PSFs}
+            data = {"VIGNET": self.interp_PSFs}
         output.save_as_fits(data, sex_cat_path=self._galcat_path)
 
     def _get_starshapes(self, star_vign):
@@ -258,27 +265,27 @@ def _get_starshapes(self, star_vign):
 
         """
         if import_fail:
-            raise ImportError('Galsim is required to get shapes information')
+            raise ImportError("Galsim is required to get shapes information")
 
         masks = np.zeros_like(star_vign)
         masks[np.where(star_vign == -1e30)] = 1
 
-        star_moms = [hsm.FindAdaptiveMom(
-            Image(star),
-            badpix=Image(mask),
-            strict=False)
+        star_moms = [
+            hsm.FindAdaptiveMom(Image(star), badpix=Image(mask), strict=False)
             for star, mask in zip(star_vign, masks)
         ]
 
-        self.star_shapes = np.array([
+        self.star_shapes = np.array(
             [
-                moms.observed_shape.g1,
-                moms.observed_shape.g2,
-                moms.moments_sigma,
-                int(bool(moms.error_message))
+                [
+                    moms.observed_shape.g1,
+                    moms.observed_shape.g2,
+                    moms.moments_sigma,
+                    int(bool(moms.error_message)),
+                ]
+                for moms in star_moms
             ]
-            for moms in star_moms
-        ])
+        )
 
     def _get_psfexcatdict(self, psfex_cat_path):
         """Get PSFEx Catalogue Dictionary.
@@ -300,13 +307,16 @@ def _get_psfexcatdict(self, psfex_cat_path):
         psfex_cat.open()
 
         psfex_cat_dict = {}
-        psfex_cat_dict['SOURCE_NUMBER'] = np.copy(
-            psfex_cat.get_data()['SOURCE_NUMBER'])
-        psfex_cat_dict['DELTAX_IMAGE'] = np.copy(
-            psfex_cat.get_data()['DELTAX_IMAGE'])
-        psfex_cat_dict['DELTAY_IMAGE'] = np.copy(
-            psfex_cat.get_data()['DELTAY_IMAGE'])
-        psfex_cat_dict['CHI2_PSF'] = np.copy(psfex_cat.get_data()['CHI2_PSF'])
+        psfex_cat_dict["SOURCE_NUMBER"] = np.copy(
+            psfex_cat.get_data()["SOURCE_NUMBER"]
+        )
+        psfex_cat_dict["DELTAX_IMAGE"] = np.copy(
+            psfex_cat.get_data()["DELTAX_IMAGE"]
+        )
+        psfex_cat_dict["DELTAY_IMAGE"] = np.copy(
+            psfex_cat.get_data()["DELTAY_IMAGE"]
+        )
+        psfex_cat_dict["CHI2_PSF"] = np.copy(psfex_cat.get_data()["CHI2_PSF"])
 
         return psfex_cat_dict
 
@@ -324,28 +334,29 @@ def _write_output_validation(self, star_dict, psfex_cat_dict):
 
         """
         output = file_io.FITSCatalogue(
-            self._output_path_validation + self._img_number + '.fits',
+            self._output_path_validation + self._img_number + ".fits",
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
-            SEx_catalogue=True)
+            SEx_catalogue=True,
+        )
 
         data = {
-            'E1_PSF_HSM': self.psf_shapes[:, 0],
-            'E2_PSF_HSM': self.psf_shapes[:, 1],
-            'SIGMA_PSF_HSM': self.psf_shapes[:, 2],
-            'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int),
-            'E1_STAR_HSM': self.star_shapes[:, 0],
-            'E2_STAR_HSM': self.star_shapes[:, 1],
-            'SIGMA_STAR_HSM': self.star_shapes[:, 2],
-            'FLAG_STAR_HSM': self.star_shapes[:, 3].astype(int)
+            "E1_PSF_HSM": self.psf_shapes[:, 0],
+            "E2_PSF_HSM": self.psf_shapes[:, 1],
+            "SIGMA_PSF_HSM": self.psf_shapes[:, 2],
+            "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int),
+            "E1_STAR_HSM": self.star_shapes[:, 0],
+            "E2_STAR_HSM": self.star_shapes[:, 1],
+            "SIGMA_STAR_HSM": self.star_shapes[:, 2],
+            "FLAG_STAR_HSM": self.star_shapes[:, 3].astype(int),
         }
         data = {**data, **star_dict}
 
-        data['ACCEPTED'] = np.ones_like(data['NUMBER'], dtype='int16')
-        star_used = psfex_cat_dict.pop('SOURCE_NUMBER')
+        data["ACCEPTED"] = np.ones_like(data["NUMBER"], dtype="int16")
+        star_used = psfex_cat_dict.pop("SOURCE_NUMBER")
 
-        for i in range(len(data['NUMBER'])):
+        for i in range(len(data["NUMBER"])):
             if i + 1 not in star_used:
-                data['ACCEPTED'][i] = 0
+                data["ACCEPTED"][i] = 0
 
         output.save_as_fits(data, sex_cat_path=self._galcat_path)
 
@@ -393,24 +404,25 @@ def _interpolate_me(self):
         cat = file_io.FITSCatalogue(self._galcat_path, SEx_catalogue=True)
         cat.open()
 
-        all_id = np.copy(cat.get_data()['NUMBER'])
-        key_ne = 'N_EPOCH'
+        all_id = np.copy(cat.get_data()["NUMBER"])
+        key_ne = "N_EPOCH"
         if key_ne not in cat.get_data():
             raise KeyError(
-                f'Key {key_ne} not found in input galaxy catalogue, needed for'
-                + ' PSF interpolation to multi-epoch data; run previous module'
-                + ' (SExtractor) in multi-epoch mode'
+                f"Key {key_ne} not found in input galaxy catalogue, needed for"
+                + " PSF interpolation to multi-epoch data; run previous module"
+                + " (SExtractor) in multi-epoch mode"
             )
         n_epoch = np.copy(cat.get_data()[key_ne])
 
         list_ext_name = cat.get_ext_name()
-        hdu_ind = [i for i in range(len(list_ext_name)) if
-                   'EPOCH' in list_ext_name[i]]
+        hdu_ind = [
+            i for i in range(len(list_ext_name)) if "EPOCH" in list_ext_name[i]
+        ]
 
         final_list = []
         for hdu_index in hdu_ind:
-            exp_name = cat.get_data(hdu_index)['EXP_NAME'][0]
-            ccd_list = list(set(cat.get_data(hdu_index)['CCD_N']))
+            exp_name = cat.get_data(hdu_index)["EXP_NAME"][0]
+            ccd_list = list(set(cat.get_data(hdu_index)["CCD_N"]))
             array_psf = None
             array_id = None
             array_shape = None
@@ -421,51 +433,54 @@ def _interpolate_me(self):
                 # dot_psf_path = self._dot_psf_dir + '/' +\
                 # self._dot_psf_pattern + '-' + exp_name + '-' + str(ccd) +\
                 # '.psf'
-                mccd_model_path = self._dot_psf_dir + '/' +\
-                    self._dot_psf_pattern + '-' + exp_name + '.npy'
+                mccd_model_path = (
+                    self._dot_psf_dir
+                    + "/"
+                    + self._dot_psf_pattern
+                    + "-"
+                    + exp_name
+                    + ".npy"
+                )
 
-                ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0]
+                ind_obj = np.where(cat.get_data(hdu_index)["CCD_N"] == ccd)[0]
                 obj_id = all_id[ind_obj]
                 gal_pos = np.array(
-                    self._f_wcs_file[exp_name][ccd]['WCS'].all_world2pix(
+                    self._f_wcs_file[exp_name][ccd]["WCS"].all_world2pix(
                         self.gal_pos[:, 0][ind_obj],
                         self.gal_pos[:, 1][ind_obj],
-                        0
+                        0,
                     )
                 ).T
 
                 self.interp_PSFs = interp_MCCD(mccd_model_path, gal_pos, ccd)
 
-                if (
-                    isinstance(self.interp_PSFs, str)
-                    and (self.interp_PSFs == NOT_ENOUGH_STARS)
+                if isinstance(self.interp_PSFs, str) and (
+                    self.interp_PSFs == NOT_ENOUGH_STARS
                 ):
                     self._w_log.info(
-                        f'Not enough stars find in the ccd {ccd} of the'
-                        + f' exposure {exp_name}. Object inside this '
-                        + f'ccd will lose an epoch.'
+                        f"Not enough stars find in the ccd {ccd} of the"
+                        + f" exposure {exp_name}. Object inside this "
+                        + f"ccd will lose an epoch."
                     )
                     continue
 
-                if (
-                    isinstance(self.interp_PSFs, str)
-                    and (self.interp_PSFs == BAD_CHI2)
+                if isinstance(self.interp_PSFs, str) and (
+                    self.interp_PSFs == BAD_CHI2
                 ):
                     self._w_log.info(
-                        f'Bad chi2 for the psf model in the ccd {ccd} of the'
-                        + f' exposure {exp_name}. Object inside this ccd'
-                        + f' will lose an epoch.'
+                        f"Bad chi2 for the psf model in the ccd {ccd} of the"
+                        + f" exposure {exp_name}. Object inside this ccd"
+                        + f" will lose an epoch."
                     )
 
                     continue
 
-                if (
-                    isinstance(self.interp_PSFs, str)
-                    and (self.interp_PSFs == FILE_NOT_FOUND)
+                if isinstance(self.interp_PSFs, str) and (
+                    self.interp_PSFs == FILE_NOT_FOUND
                 ):
                     self._w_log.info(
-                        f'Psf model file {self._dotpsf_path} not found.'
-                        + f' Object inside this ccd will lose an epoch.'
+                        f"Psf model file {self._dotpsf_path} not found."
+                        + f" Object inside this ccd will lose an epoch."
                     )
                     continue
 
@@ -473,7 +488,8 @@ def _interpolate_me(self):
                     array_psf = np.copy(self.interp_PSFs)
                 else:
                     array_psf = np.concatenate(
-                        (array_psf, np.copy(self.interp_PSFs)))
+                        (array_psf, np.copy(self.interp_PSFs))
+                    )
 
                 if array_id is None:
                     array_id = np.copy(obj_id)
@@ -486,20 +502,24 @@ def _interpolate_me(self):
                         array_shape = np.copy(self.psf_shapes)
                     else:
                         array_shape = np.concatenate(
-                            (array_shape, np.copy(self.psf_shapes)))
+                            (array_shape, np.copy(self.psf_shapes))
+                        )
                 else:
                     array_shape = None
 
                 exp_name_tmp = np.array(
-                    [exp_name + '-' + str(ccd) for i in range(len(obj_id))])
+                    [exp_name + "-" + str(ccd) for i in range(len(obj_id))]
+                )
                 if array_exp_name is None:
                     array_exp_name = exp_name_tmp
                 else:
                     array_exp_name = np.concatenate(
-                        (array_exp_name, exp_name_tmp))
+                        (array_exp_name, exp_name_tmp)
+                    )
 
             final_list.append(
-                [array_id, array_psf, array_shape, array_exp_name])
+                [array_id, array_psf, array_shape, array_exp_name]
+            )
 
         self._f_wcs_file.close()
         cat.close()
@@ -513,22 +533,28 @@ def _interpolate_me(self):
                 if len(where_res) != 0:
                     output_dict[id_tmp][final_list[j][3][where_res[0]]] = {}
                     output_dict[id_tmp][final_list[j][3][where_res[0]]][
-                        'VIGNET'] = final_list[j][1][where_res[0]]
+                        "VIGNET"
+                    ] = final_list[j][1][where_res[0]]
                     if self._compute_shape:
                         shape_dict = {}
-                        shape_dict['E1_PSF_HSM'] = \
-                            final_list[j][2][where_res[0]][0]
-                        shape_dict['E2_PSF_HSM'] = \
-                            final_list[j][2][where_res[0]][1]
-                        shape_dict['SIGMA_PSF_HSM'] = \
-                            final_list[j][2][where_res[0]][2]
-                        shape_dict['FLAG_PSF_HSM'] = \
-                            final_list[j][2][where_res[0]][3]
+                        shape_dict["E1_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][0]
+                        shape_dict["E2_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][1]
+                        shape_dict["SIGMA_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][2]
+                        shape_dict["FLAG_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][3]
                         output_dict[id_tmp][final_list[j][3][where_res[0]]][
-                            'SHAPES'] = shape_dict
+                            "SHAPES"
+                        ] = shape_dict
                     counter += 1
             if counter == 0:
-                output_dict[id_tmp] = 'empty'
+                output_dict[id_tmp] = "empty"
 
         return output_dict
 
@@ -546,7 +572,8 @@ def _write_output_me(self, output_dict):
         # np.save(self._output_path+self._img_number, output_dict)
 
         output_file = SqliteDict(
-            self._output_path + self._img_number + '.sqlite')
+            self._output_path + self._img_number + ".sqlite"
+        )
         for i in output_dict.keys():
             output_file[str(i)] = output_dict[i]
         output_file.commit()
diff --git a/shapepipe/modules/mccd_package/mccd_plot_utilities.py b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
index 6c074cf67..c7a65b5bd 100644
--- a/shapepipe/modules/mccd_package/mccd_plot_utilities.py
+++ b/shapepipe/modules/mccd_package/mccd_plot_utilities.py
@@ -1567,7 +1567,7 @@ def rho_stats(
         square_size = True
         ver = "id"
         out_base = f"rho_stats_{ver}.fits"
-        # TODO: deal with flags 
+        # TODO: deal with flags
         rho_stat_handler.build_cat_to_compute_rho(
             starcat_path,
             catalog_id=ver,
@@ -1589,7 +1589,7 @@ def only_p(corrs):
             ["b"],
             [ver],
             abs=False,
-            savefig='rho_stats.png',
+            savefig="rho_stats.png",
             legend="outside",
         )
 
diff --git a/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py b/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py
index 1877719fa..44b7cf55b 100644
--- a/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py
+++ b/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py
@@ -17,7 +17,7 @@
 
 from shapepipe.pipeline import file_io
 
-NOT_ENOUGH_STARS = 'Not enough stars to train the model.'
+NOT_ENOUGH_STARS = "Not enough stars to train the model."
 
 
 def mccd_preprocessing_pipeline(
@@ -25,14 +25,14 @@ def mccd_preprocessing_pipeline(
     output_path,
     input_file_position=0,
     min_n_stars=20,
-    separator='-',
+    separator="-",
     CCD_id_filter_list=None,
-    outlier_std_max=100.,
+    outlier_std_max=100.0,
     save_masks=True,
-    save_name='train_star_selection',
-    save_extension='.fits',
+    save_name="train_star_selection",
+    save_extension=".fits",
     verbose=True,
-    print_fun=None
+    print_fun=None,
 ):
     r"""Preprocess Input Catalogue.
 
@@ -86,38 +86,55 @@ def mccd_preprocessing_pipeline(
 
     if verbose:
         if print_fun is None:
+
             def print_fun(x):
                 print(x)
+
     else:
+
         def print_fun(x):
             pass
 
-    print_fun('Processing dataset..')
+    print_fun("Processing dataset..")
     mccd_inputs = mccd.mccd_utils.MccdInputs(separator=separator)
     catalog_ids = mccd_inputs.proprocess_pipeline_data(
-        input_file_list,
-        element_position=input_file_position
+        input_file_list, element_position=input_file_position
     )
 
     # Loop over the catalogs
     for it in range(catalog_ids.shape[0]):
         # For each observation position
         catalog_id = catalog_ids[it]
-        star_list, pos_list, mask_list, ccd_list, SNR_list, RA_list, \
-            DEC_list = mccd_inputs.get_inputs(catalog_id)
-
-        star_list, pos_list, mask_list, ccd_list, SNR_list, RA_list, \
-            DEC_list, _ = mccd_inputs.outlier_rejection(
-                star_list,
-                pos_list,
-                mask_list,
-                ccd_list,
-                SNR_list,
-                RA_list,
-                DEC_list,
-                shape_std_max=outlier_std_max,
-                print_fun=print_fun
-            )
+        (
+            star_list,
+            pos_list,
+            mask_list,
+            ccd_list,
+            SNR_list,
+            RA_list,
+            DEC_list,
+        ) = mccd_inputs.get_inputs(catalog_id)
+
+        (
+            star_list,
+            pos_list,
+            mask_list,
+            ccd_list,
+            SNR_list,
+            RA_list,
+            DEC_list,
+            _,
+        ) = mccd_inputs.outlier_rejection(
+            star_list,
+            pos_list,
+            mask_list,
+            ccd_list,
+            SNR_list,
+            RA_list,
+            DEC_list,
+            shape_std_max=outlier_std_max,
+            print_fun=print_fun,
+        )
 
         mccd_star_list = []
         mccd_pos_list = []
@@ -163,13 +180,15 @@ def print_fun(x):
             # Concatenate, as fits can't handle list of numpy arrays and
             # turn into reg format
             mccd_stars = mccd.utils.reg_format(
-                np.concatenate(mccd_star_list, axis=2))
+                np.concatenate(mccd_star_list, axis=2)
+            )
             mccd_poss = np.concatenate(mccd_pos_list, axis=0)
             mccd_ccds = np.concatenate(mccd_ccd_list, axis=0)
 
             if save_masks is True:
                 mccd_masks = mccd.utils.reg_format(
-                    np.concatenate(mccd_mask_list, axis=2))
+                    np.concatenate(mccd_mask_list, axis=2)
+                )
             else:
                 # Send an array of False (None cannot be used in .fits)
                 mccd_masks = np.zeros((mccd_poss.shape[0]), dtype=bool)
@@ -191,20 +210,25 @@ def print_fun(x):
 
             # Save the fits file
             train_dic = {
-                'VIGNET_LIST': mccd_stars,
-                'GLOB_POSITION_IMG_LIST': mccd_poss,
-                'MASK_LIST': mccd_masks,
-                'CCD_ID_LIST': mccd_ccds,
-                'SNR_WIN_LIST': mccd_SNRs,
-                'RA_LIST': mccd_RAs,
-                'DEC_LIST': mccd_DECs
+                "VIGNET_LIST": mccd_stars,
+                "GLOB_POSITION_IMG_LIST": mccd_poss,
+                "MASK_LIST": mccd_masks,
+                "CCD_ID_LIST": mccd_ccds,
+                "SNR_WIN_LIST": mccd_SNRs,
+                "RA_LIST": mccd_RAs,
+                "DEC_LIST": mccd_DECs,
             }
 
-            saving_path = output_path + save_name + separator \
-                + catalog_id + save_extension
+            saving_path = (
+                output_path
+                + save_name
+                + separator
+                + catalog_id
+                + save_extension
+            )
             mccd.mccd_utils.save_to_fits(train_dic, saving_path)
 
-    print_fun('Finished the training dataset processing.')
+    print_fun("Finished the training dataset processing.")
     print_fun(f"Total stars processed = {mccd_star_nb:d}")
 
     return mccd_inputs
@@ -216,8 +240,8 @@ def mccd_fit_pipeline(
     mccd_parser,
     output_dir,
     verbose,
-    saving_name='fitted_model',
-    w_log=None
+    saving_name="fitted_model",
+    w_log=None,
 ):
     r"""Fit MCCD Model.
 
@@ -244,20 +268,20 @@ def mccd_fit_pipeline(
     # Extract the MCCD parameters from the parser
     mccd_inst_kw = mccd_parser.get_instance_kw()
     mccd_fit_kw = mccd_parser.get_fit_kw()
-    use_SNR_weight = mccd_parser.get_extra_kw('use_SNR_weight')
+    use_SNR_weight = mccd_parser.get_extra_kw("use_SNR_weight")
 
     # Print the model configuration so that it is saved in log files
-    w_log.info('MCCD configuration parameters:')
-    w_log.info('[INPUTS]')
-    inputs_dict_str = pprint.pformat({'use_SNR_weight': use_SNR_weight})
+    w_log.info("MCCD configuration parameters:")
+    w_log.info("[INPUTS]")
+    inputs_dict_str = pprint.pformat({"use_SNR_weight": use_SNR_weight})
     w_log.info(inputs_dict_str)
-    w_log.info('[INSTANCE]')
+    w_log.info("[INSTANCE]")
     inst_dict_str = pprint.pformat(mccd_inst_kw)
     w_log.info(inst_dict_str)
-    w_log.info('[FIT]')
+    w_log.info("[FIT]")
     fit_dict_str = pprint.pformat(mccd_fit_kw)
     w_log.info(fit_dict_str)
-    w_log.info('End of MCCD configuration parameters.')
+    w_log.info("End of MCCD configuration parameters.")
 
     # Open fits file
     starcat = fits.open(trainstar_path, memmap=False)
@@ -271,7 +295,7 @@ def mccd_fit_pipeline(
         sex_thresh=-1e5,
         use_SNR_weight=use_SNR_weight,
         verbose=verbose,
-        saving_name=saving_name
+        saving_name=saving_name,
     )
 
     starcat.close()
@@ -284,7 +308,7 @@ def mccd_validation_pipeline(
     output_dir,
     file_number_string,
     w_log,
-    val_saving_name
+    val_saving_name,
 ):
     r"""Validate MCCD Pipeline.
 
@@ -311,7 +335,7 @@ def mccd_validation_pipeline(
     w_log.info(f"Validating catalogue {file_number_string}..")
 
     # Get MCCD parameters
-    save_extension = '.fits'
+    save_extension = ".fits"
     mccd_val_kw = mccd_parser.get_val_kw()
     testcat = fits.open(teststar_path, memmap=False)
 
@@ -322,13 +346,14 @@ def mccd_validation_pipeline(
             mccd_model_path=mccd_model_path,
             testcat=testcat[1],
             **mccd_val_kw,
-            sex_thresh=-1e5
+            sex_thresh=-1e5,
         )
 
         testcat.close()
 
-        val_saving_path = output_dir + val_saving_name + \
-            file_number_string + save_extension
+        val_saving_path = (
+            output_dir + val_saving_name + file_number_string + save_extension
+        )
 
         # Save validation dictionary to fits file
         mccd.mccd_utils.save_to_fits(val_dict, val_saving_path)
@@ -343,12 +368,7 @@ def mccd_validation_pipeline(
 
 
 def mccd_interpolation_pipeline(
-    mccd_model_path,
-    galcat_path,
-    pos_params,
-    ccd_id,
-    saving_path,
-    get_shapes
+    mccd_model_path, galcat_path, pos_params, ccd_id, saving_path, get_shapes
 ):
     r"""Interpolate the MCCD Model.
 
@@ -395,22 +415,24 @@ def mccd_interpolation_pipeline(
                 for psf in interp_PSFs
             ]
 
-            PSF_shapes = np.array([
+            PSF_shapes = np.array(
                 [
-                    moms.observed_shape.g1,
-                    moms.observed_shape.g2,
-                    moms.moments_sigma,
-                    int(bool(moms.error_message))
+                    [
+                        moms.observed_shape.g1,
+                        moms.observed_shape.g2,
+                        moms.moments_sigma,
+                        int(bool(moms.error_message)),
+                    ]
+                    for moms in PSF_moms
                 ]
-                for moms in PSF_moms
-            ])
+            )
 
         shapepipe_write_output(
             saving_path=saving_path,
             example_fits_path=galcat_path,
             get_shapes=get_shapes,
             interp_PSFs=interp_PSFs,
-            PSF_shapes=PSF_shapes
+            PSF_shapes=PSF_shapes,
         )
 
         return None
@@ -419,11 +441,7 @@ def mccd_interpolation_pipeline(
 
 
 def shapepipe_write_output(
-    saving_path,
-    example_fits_path,
-    get_shapes,
-    interp_PSFs,
-    PSF_shapes=None
+    saving_path, example_fits_path, get_shapes, interp_PSFs, PSF_shapes=None
 ):
     r"""Write ShapePipe Output.
 
@@ -447,18 +465,18 @@ def shapepipe_write_output(
     output = file_io.FITSCatalogue(
         saving_path,
         open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
-        SEx_catalogue=True
+        SEx_catalogue=True,
     )
 
     if get_shapes:
         data = {
-            'VIGNET': interp_PSFs,
-            'E1_PSF_HSM': PSF_shapes[:, 0],
-            'E2_PSF_HSM': PSF_shapes[:, 1],
-            'SIGMA_PSF_HSM': PSF_shapes[:, 2],
-            'FLAG_PSF_HSM': PSF_shapes[:, 3].astype(int)
+            "VIGNET": interp_PSFs,
+            "E1_PSF_HSM": PSF_shapes[:, 0],
+            "E2_PSF_HSM": PSF_shapes[:, 1],
+            "SIGMA_PSF_HSM": PSF_shapes[:, 2],
+            "FLAG_PSF_HSM": PSF_shapes[:, 3].astype(int),
         }
     else:
-        data = {'VIGNET': interp_PSFs}
+        data = {"VIGNET": interp_PSFs}
 
     output.save_as_fits(data, sex_cat_path=example_fits_path)
diff --git a/shapepipe/modules/mccd_plots_runner.py b/shapepipe/modules/mccd_plots_runner.py
index 7c7644d44..9c23537d3 100644
--- a/shapepipe/modules/mccd_plots_runner.py
+++ b/shapepipe/modules/mccd_plots_runner.py
@@ -19,6 +19,7 @@
     import stile
     import stile.stile_utils
     from stile.sys_tests import BaseCorrelationFunctionSysTest
+
     has_stile = True
 
 except ImportError:
@@ -27,6 +28,7 @@
 try:
     import treecorr
     from treecorr.corr2 import corr2_valid_params
+
     has_treecorr = True
 
 except ImportError:
@@ -37,7 +39,7 @@
     import matplotlib.pyplot as plt
 
     # Define the backend for matplotlib
-    mpl.use('agg')
+    mpl.use("agg")
     has_mpl = True
 
 except ImportError:
@@ -45,13 +47,13 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module=['merge_starcat_runner'],
-    file_pattern=['full_starcat'],
-    file_ext=['.fits'],
-    numbering_scheme='-0000000',
-    depends=['numpy', 'mccd', 'astropy', 'matplotlib', 'stile', 'treecorr'],
-    run_method='serial',
+    version="1.1",
+    input_module=["merge_starcat_runner"],
+    file_pattern=["full_starcat"],
+    file_ext=[".fits"],
+    numbering_scheme="-0000000",
+    depends=["numpy", "mccd", "astropy", "matplotlib", "stile", "treecorr"],
+    run_method="serial",
 )
 def mccd_plots_runner(
     input_file_list,
@@ -63,63 +65,63 @@ def mccd_plots_runner(
 ):
     """Define The MCCD Plots Runner."""
     # Input parameters
-    if config.has_option(module_config_sec, 'HDU'):
-        hdu_no = config.getint(module_config_sec, 'HDU')
+    if config.has_option(module_config_sec, "HDU"):
+        hdu_no = config.getint(module_config_sec, "HDU")
     else:
         hdu_no = 2
 
     # Get parameters for meanshapes plots
-    psf_model_type = config.get(module_config_sec, 'PSF')
+    psf_model_type = config.get(module_config_sec, "PSF")
 
-    if config.has_option(module_config_sec, 'MAX_E'):
+    if config.has_option(module_config_sec, "MAX_E"):
         max_e = config.getfloat(module_config_sec, "MAX_E")
     else:
         max_e = None
 
-    if config.has_option(module_config_sec, 'MAX_DE'):
+    if config.has_option(module_config_sec, "MAX_DE"):
         max_de = config.getfloat(module_config_sec, "MAX_DE")
     else:
         max_de = None
 
-    if config.has_option(module_config_sec, 'MIN_R2'):
+    if config.has_option(module_config_sec, "MIN_R2"):
         min_r2 = config.getfloat(module_config_sec, "MIN_R2")
     else:
         min_r2 = None
 
-    if config.has_option(module_config_sec, 'MAX_R2'):
+    if config.has_option(module_config_sec, "MAX_R2"):
         max_r2 = config.getfloat(module_config_sec, "MAX_R2")
     else:
         max_r2 = None
 
-    if config.has_option(module_config_sec, 'MAX_DR2'):
+    if config.has_option(module_config_sec, "MAX_DR2"):
         max_dr2 = config.getfloat(module_config_sec, "MAX_DR2")
     else:
         max_dr2 = None
 
-    x_nb_bins = config.getint(module_config_sec, 'X_GRID')
-    y_nb_bins = config.getint(module_config_sec, 'Y_GRID')
-    remove_outliers = config.getboolean(module_config_sec, 'REMOVE_OUTLIERS')
-    plot_meanshapes = config.getboolean(module_config_sec, 'PLOT_MEANSHAPES')
-    plot_histograms = config.getboolean(module_config_sec, 'PLOT_HISTOGRAMS')
+    x_nb_bins = config.getint(module_config_sec, "X_GRID")
+    y_nb_bins = config.getint(module_config_sec, "Y_GRID")
+    remove_outliers = config.getboolean(module_config_sec, "REMOVE_OUTLIERS")
+    plot_meanshapes = config.getboolean(module_config_sec, "PLOT_MEANSHAPES")
+    plot_histograms = config.getboolean(module_config_sec, "PLOT_HISTOGRAMS")
 
     # Get parameters for rho stats plots
-    plot_rho_stats = config.getboolean(module_config_sec, 'PLOT_RHO_STATS')
-    rho_stat_plot_style = config.get(module_config_sec, 'RHO_STATS_STYLE')
+    plot_rho_stats = config.getboolean(module_config_sec, "PLOT_RHO_STATS")
+    rho_stat_plot_style = config.get(module_config_sec, "RHO_STATS_STYLE")
 
-    if config.has_option(module_config_sec, 'RHO_STATS_YLIM_L'):
-        str_list = config.getlist(module_config_sec, 'RHO_STATS_YLIM_L')
+    if config.has_option(module_config_sec, "RHO_STATS_YLIM_L"):
+        str_list = config.getlist(module_config_sec, "RHO_STATS_YLIM_L")
         ylim_l = [float(s) for s in str_list]
     else:
         ylim_l = None
-    if config.has_option(module_config_sec, 'RHO_STATS_YLIM_R'):
-        str_list = config.getlist(module_config_sec, 'RHO_STATS_YLIM_R')
+    if config.has_option(module_config_sec, "RHO_STATS_YLIM_R"):
+        str_list = config.getlist(module_config_sec, "RHO_STATS_YLIM_R")
         ylim_r = [float(s) for s in str_list]
     else:
         ylim_r = None
 
     nb_pixel = x_nb_bins, y_nb_bins
     starcat_path = input_file_list[0][0]
-    output_path = run_dirs['output'] + '/'
+    output_path = run_dirs["output"] + "/"
 
     if plot_meanshapes or plot_histograms:
         if has_mpl:
@@ -141,10 +143,10 @@ def mccd_plots_runner(
             )
         else:
             msg = (
-                '[!] In order to plot the Meanshapes the package '
-                + '_matplotlib_ has to be correctly imported. This was not'
-                + ' the case, so the task is aborted. For the next time make'
-                + ' sure the package is installed.'
+                "[!] In order to plot the Meanshapes the package "
+                + "_matplotlib_ has to be correctly imported. This was not"
+                + " the case, so the task is aborted. For the next time make"
+                + " sure the package is installed."
             )
             warnings.warn(msg)
             w_log.info(msg)
@@ -152,9 +154,9 @@ def mccd_plots_runner(
     if plot_rho_stats:
         if has_stile is False or has_treecorr is False:
             msg = (
-                '[!] To calculate the rho stats the packages '
-                + 'stile and treecorr are required. However, '
-                + f' treecorr: {has_treecorr}, stile: {has_stile}.'
+                "[!] To calculate the rho stats the packages "
+                + "stile and treecorr are required. However, "
+                + f" treecorr: {has_treecorr}, stile: {has_stile}."
             )
             warnings.warn(msg)
             w_log.info(msg)
diff --git a/shapepipe/modules/mccd_preprocessing_runner.py b/shapepipe/modules/mccd_preprocessing_runner.py
index 7a5ac53cb..f15287cf5 100644
--- a/shapepipe/modules/mccd_preprocessing_runner.py
+++ b/shapepipe/modules/mccd_preprocessing_runner.py
@@ -6,6 +6,7 @@
 :Author: Tobias Liaudat
 
 """
+
 import mccd
 
 from shapepipe.modules.mccd_package import shapepipe_auxiliary_mccd as aux_mccd
@@ -13,12 +14,12 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module=['setools_runner'],
-    file_pattern=['star_split_ratio_80', 'star_split_ratio_20'],
-    file_ext=['.fits', '.fits'],
-    depends=['numpy', 'mccd', 'galsim', 'astropy'],
-    run_method='serial',
+    version="1.1",
+    input_module=["setools_runner"],
+    file_pattern=["star_split_ratio_80", "star_split_ratio_20"],
+    file_ext=[".fits", ".fits"],
+    depends=["numpy", "mccd", "galsim", "astropy"],
+    run_method="serial",
 )
 def mccd_preprocessing_runner(
     input_file_list,
@@ -30,9 +31,9 @@ def mccd_preprocessing_runner(
 ):
     """Define The MCCD Pre-processing Runner."""
     # Recover the MCCD config file and its params
-    config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH')
-    mccd_mode = config.get(module_config_sec, 'MODE')
-    verbose = config.getboolean(module_config_sec, 'VERBOSE')
+    config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH")
+    mccd_mode = config.get(module_config_sec, "MODE")
+    verbose = config.getboolean(module_config_sec, "VERBOSE")
 
     # Parse MCCD config file
     mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path)
@@ -40,28 +41,28 @@ def mccd_preprocessing_runner(
     input_dict = mccd_parser.get_inputs_kw()
 
     # Extract useful parameters
-    separator = input_dict['separator']
-    min_n_stars = input_dict['min_n_stars']
-    outlier_std_max = input_dict['outlier_std_max']
+    separator = input_dict["separator"]
+    min_n_stars = input_dict["min_n_stars"]
+    outlier_std_max = input_dict["outlier_std_max"]
 
-    if mccd_mode == 'FIT':
+    if mccd_mode == "FIT":
         input_file_pos_list = [0]
-        save_name_list = ['train_star_selection']
+        save_name_list = ["train_star_selection"]
         min_n_stars_list = [min_n_stars]
 
-    elif mccd_mode == 'FIT_VALIDATION':
+    elif mccd_mode == "FIT_VALIDATION":
         if len(input_file_list[0]) == 1:
             input_file_pos_list = [0]
-            save_name_list = ['train_star_selection']
+            save_name_list = ["train_star_selection"]
             min_n_stars_list = [min_n_stars]
         else:
             input_file_pos_list = [0, 1]
-            save_name_list = ['train_star_selection', 'test_star_selection']
+            save_name_list = ["train_star_selection", "test_star_selection"]
             min_n_stars_list = [min_n_stars, 1]
 
-    elif mccd_mode == 'VALIDATION':
+    elif mccd_mode == "VALIDATION":
         input_file_pos_list = [0]
-        save_name_list = ['test_star_selection']
+        save_name_list = ["test_star_selection"]
         min_n_stars_list = [1]
 
     else:
@@ -72,7 +73,7 @@ def mccd_preprocessing_runner(
     # Use the outfile from the pipeline and ignore the output directory from
     # the MCCD config file
     # Output paths for both newly generates datasets
-    output_mccd_path = run_dirs['output'] + '/'
+    output_mccd_path = run_dirs["output"] + "/"
 
     [
         aux_mccd.mccd_preprocessing_pipeline(
@@ -85,12 +86,13 @@ def mccd_preprocessing_runner(
             outlier_std_max=outlier_std_max,
             save_masks=False,
             save_name=_save_name,
-            save_extension='.fits',
+            save_extension=".fits",
             verbose=verbose,
             print_fun=w_log.info,
         )
-        for _input_pos, _save_name, _min_stars in
-        zip(input_file_pos_list, save_name_list, min_n_stars_list)
+        for _input_pos, _save_name, _min_stars in zip(
+            input_file_pos_list, save_name_list, min_n_stars_list
+        )
     ]
 
     # No return objects
diff --git a/shapepipe/modules/mccd_val_runner.py b/shapepipe/modules/mccd_val_runner.py
index 73f1bcd07..dc0811fc1 100644
--- a/shapepipe/modules/mccd_val_runner.py
+++ b/shapepipe/modules/mccd_val_runner.py
@@ -13,13 +13,13 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module=['mccd_preprocessing_runner'],
-    file_pattern=['fitted_model', 'test_star_selection'],
-    file_ext=['.npy', '.fits'],
-    numbering_scheme='-0000000',
-    depends=['numpy', 'mccd', 'galsim'],
-    run_method='parallel',
+    version="1.1",
+    input_module=["mccd_preprocessing_runner"],
+    file_pattern=["fitted_model", "test_star_selection"],
+    file_ext=[".npy", ".fits"],
+    numbering_scheme="-0000000",
+    depends=["numpy", "mccd", "galsim"],
+    run_method="parallel",
 )
 def mccd_val_runner(
     input_file_list,
@@ -31,24 +31,24 @@ def mccd_val_runner(
 ):
     """Define The MCCD Validation Runner."""
     # Recover the MCCD config file and its params
-    config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH')
-    mccd_mode = config.get(module_config_sec, 'MODE')
-    verbose = config.getboolean(module_config_sec, 'VERBOSE')
+    config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH")
+    mccd_mode = config.get(module_config_sec, "MODE")
+    verbose = config.getboolean(module_config_sec, "VERBOSE")
 
     # Parse MCCD config file
     mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path)
     mccd_parser.parse_document()
 
     # Prepare inputs to run the main fit function
-    output_dir = run_dirs['output'] + '/'
-    val_saving_name = 'validation_psf'
+    output_dir = run_dirs["output"] + "/"
+    val_saving_name = "validation_psf"
 
     # Extract the MCCD model path
     mccd_model_path = input_file_list[0]
     # Validation stars are in the second position of the list
     teststar_path = input_file_list[1]
 
-    if mccd_mode == 'VALIDATION':
+    if mccd_mode == "VALIDATION":
 
         aux_mccd.mccd_validation_pipeline(
             teststar_path=teststar_path,
@@ -62,7 +62,7 @@ def mccd_val_runner(
 
     else:
         raise ValueError(
-            'The mccd_val_runner should only be called when the MODE is '
+            "The mccd_val_runner should only be called when the MODE is "
             + '"VALIDATION".'
         )
 
diff --git a/shapepipe/modules/merge_headers_package/__init__.py b/shapepipe/modules/merge_headers_package/__init__.py
index 48a972c14..ed8416790 100644
--- a/shapepipe/modules/merge_headers_package/__init__.py
+++ b/shapepipe/modules/merge_headers_package/__init__.py
@@ -25,4 +25,4 @@
 
 """
 
-__all__ = ['merge_headers']
+__all__ = ["merge_headers"]
diff --git a/shapepipe/modules/merge_headers_package/merge_headers.py b/shapepipe/modules/merge_headers_package/merge_headers.py
index 95d3e9acc..5c0a2213e 100644
--- a/shapepipe/modules/merge_headers_package/merge_headers.py
+++ b/shapepipe/modules/merge_headers_package/merge_headers.py
@@ -36,14 +36,14 @@ def merge_headers(input_file_list, output_dir):
     """
     if not isinstance(output_dir, str):
         raise TypeError(
-            'Output directory for merge headers must be a string '
-            + f'not {type(output_dir)}.'
+            "Output directory for merge headers must be a string "
+            + f"not {type(output_dir)}."
         )
 
     # Open SqliteDict file
-    final_file = SqliteDict(f'{output_dir}/log_exp_headers.sqlite')
+    final_file = SqliteDict(f"{output_dir}/log_exp_headers.sqlite")
     # Set matching pattern
-    pattern = 'headers-'
+    pattern = "headers-"
 
     for file_path in input_file_list:
         # Extract file path
diff --git a/shapepipe/modules/merge_headers_runner.py b/shapepipe/modules/merge_headers_runner.py
index 9f64d6788..bfedc8a89 100644
--- a/shapepipe/modules/merge_headers_runner.py
+++ b/shapepipe/modules/merge_headers_runner.py
@@ -11,12 +11,12 @@
 
 
 @module_runner(
-    input_module='split_exp_runner',
-    version='1.1',
-    file_pattern=['headers'],
-    file_ext=['.npy'],
-    depends=['numpy', 'sqlitedict'],
-    run_method='serial',
+    input_module="split_exp_runner",
+    version="1.1",
+    file_pattern=["headers"],
+    file_ext=[".npy"],
+    depends=["numpy", "sqlitedict"],
+    run_method="serial",
 )
 def merge_headers_runner(
     input_file_list,
@@ -28,12 +28,12 @@ def merge_headers_runner(
 ):
     """Define The Merge Headers Runner."""
     # Set output directory
-    output_dir = run_dirs['output']
-    if config.has_option(module_config_sec, 'OUTPUT_PATH'):
-        output_dir = config.getexpanded(module_config_sec, 'OUTPUT_PATH')
+    output_dir = run_dirs["output"]
+    if config.has_option(module_config_sec, "OUTPUT_PATH"):
+        output_dir = config.getexpanded(module_config_sec, "OUTPUT_PATH")
 
     # Log output directory
-    w_log.info(f'output_dir = {output_dir}')
+    w_log.info(f"output_dir = {output_dir}")
 
     # Merge header files
     merge_headers(input_file_list, output_dir)
diff --git a/shapepipe/modules/merge_sep_cats_package/__init__.py b/shapepipe/modules/merge_sep_cats_package/__init__.py
index d99553bf4..333e3d24c 100644
--- a/shapepipe/modules/merge_sep_cats_package/__init__.py
+++ b/shapepipe/modules/merge_sep_cats_package/__init__.py
@@ -34,4 +34,4 @@
 
 """
 
-__all__ = ['merge_sep_cats.py']
+__all__ = ["merge_sep_cats.py"]
diff --git a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
index 1cc3c2131..5ecdb6fb0 100644
--- a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
+++ b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py
@@ -51,7 +51,7 @@ def __init__(
         output_dir,
         n_split_max,
         warning,
-        w_log
+        w_log,
     ):
 
         self._input_file_list = input_file_list
@@ -79,7 +79,7 @@ def process(self):
             input_path_n = []
             input_path_n.append(input_file)
             for n in range(2, self._n_split_max + 1):
-                res = re.sub('1', str(n), input_file, 1)
+                res = re.sub("1", str(n), input_file, 1)
                 input_path_n.append(res)
 
             # Open first catalogue, read number of extensions and columns
@@ -111,7 +111,7 @@ def process(self):
             # data dimension = n_extension x n_column x n_obj
             data = {}
             for hdu_ind, ext_name in enumerate(list_ext_name):
-                if ext_name == 'PRIMARY':
+                if ext_name == "PRIMARY":
                     continue
                 data[ext_name] = {}
                 for col_name in list_col_name:
@@ -131,7 +131,7 @@ def process(self):
                             + f" {len(list_ext_name_n)} HDUs, required are 6"
                         )
                     for hdu_ind, ext_name in enumerate(list_ext_name):
-                        if ext_name == 'PRIMARY':
+                        if ext_name == "PRIMARY":
                             continue
                         if not ext_name in data:
                             raise IndexError(
@@ -139,35 +139,32 @@ def process(self):
                                 + f"{cat_path}"
                             )
                         for col_name in list_col_name:
-                            #print("MKDEBUG ", cat_path, ext_name, col_name)
+                            # print("MKDEBUG ", cat_path, ext_name, col_name)
                             data[ext_name][col_name] += list(
                                 cat.get_data(hdu_ind)[col_name]
                             )
 
                     cat.close()
                 else:
-                    msg = f'Input catalogue \'{cat_path}\' not found'
+                    msg = f"Input catalogue '{cat_path}' not found"
                     warnings.warn(msg)
-                    wmsg = f'Warning: {msg}'
+                    wmsg = f"Warning: {msg}"
                     self._w_log.info(wmsg)
                     print(wmsg)
 
             # Save combined catalogue
             output_name = (
-                f'{self._output_dir}/{self._file_pattern[idx]}'
-                + f'{self._file_number_string}{self._file_ext[idx]}'
+                f"{self._output_dir}/{self._file_pattern[idx]}"
+                + f"{self._file_number_string}{self._file_ext[idx]}"
             )
             output = file_io.FITSCatalogue(
-                output_name,
-                open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
+                output_name, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
             )
             for hdu_ind, ext_name in enumerate(list_ext_name):
-                if ext_name == 'PRIMARY':
+                if ext_name == "PRIMARY":
                     continue
                 output.save_as_fits(
-                    data[ext_name],
-                    names=list_col_name,
-                    ext_name=ext_name
+                    data[ext_name], names=list_col_name, ext_name=ext_name
                 )
 
         return None, None
diff --git a/shapepipe/modules/merge_sep_cats_runner.py b/shapepipe/modules/merge_sep_cats_runner.py
index 5cae71a2a..927c79b76 100644
--- a/shapepipe/modules/merge_sep_cats_runner.py
+++ b/shapepipe/modules/merge_sep_cats_runner.py
@@ -12,11 +12,12 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module='ngmix_runner',
-    file_pattern=['ngmix'],
-    file_ext=['.fits'],
-    depends=['numpy'])
+    version="1.1",
+    input_module="ngmix_runner",
+    file_pattern=["ngmix"],
+    file_ext=[".fits"],
+    depends=["numpy"],
+)
 def merge_sep_cats_runner(
     input_file_list,
     run_dirs,
@@ -27,15 +28,15 @@ def merge_sep_cats_runner(
 ):
     """Define The Merge SEP Catalogues Runner."""
     # Get config entries
-    n_split_max = config.getint(module_config_sec, 'N_SPLIT_MAX')
+    n_split_max = config.getint(module_config_sec, "N_SPLIT_MAX")
 
-    file_pattern = config.getlist(module_config_sec, 'FILE_PATTERN')
-    file_ext = config.getlist(module_config_sec, 'FILE_EXT')
+    file_pattern = config.getlist(module_config_sec, "FILE_PATTERN")
+    file_ext = config.getlist(module_config_sec, "FILE_EXT")
 
-    if config.has_option(module_config_sec, 'WARNING'):
-        warning = config.get(module_config_sec, 'WARNING')
+    if config.has_option(module_config_sec, "WARNING"):
+        warning = config.get(module_config_sec, "WARNING")
     else:
-        warning = 'error'
+        warning = "error"
 
     # Create merge sep cat class instance
     merge_sep_inst = MergeSep(
@@ -43,7 +44,7 @@ def merge_sep_cats_runner(
         file_number_string,
         file_pattern,
         file_ext,
-        run_dirs['output'],
+        run_dirs["output"],
         n_split_max,
         warning,
         w_log,
diff --git a/shapepipe/modules/merge_starcat_package/__init__.py b/shapepipe/modules/merge_starcat_package/__init__.py
index d7657b46a..f407ac72c 100644
--- a/shapepipe/modules/merge_starcat_package/__init__.py
+++ b/shapepipe/modules/merge_starcat_package/__init__.py
@@ -28,4 +28,4 @@
 
 """
 
-__all__ = ['merge_starcat']
+__all__ = ["merge_starcat"]
diff --git a/shapepipe/modules/merge_starcat_package/merge_starcat.py b/shapepipe/modules/merge_starcat_package/merge_starcat.py
index e0aa9eaa7..884c45498 100644
--- a/shapepipe/modules/merge_starcat_package/merge_starcat.py
+++ b/shapepipe/modules/merge_starcat_package/merge_starcat.py
@@ -45,7 +45,7 @@ def __init__(
         w_log,
         stamp_size=51,
         rad=10,
-        hdu_table=1
+        hdu_table=1,
     ):
 
         self._input_file_list = input_file_list
@@ -136,9 +136,7 @@ def mean_calc(values, sizes):
             Mean
 
         """
-        mean = (
-            np.nansum(np.array(values)) / np.nansum(np.array(sizes))
-        )
+        mean = np.nansum(np.array(values)) / np.nansum(np.array(sizes))
 
         return mean
 
@@ -186,7 +184,7 @@ def stats_calculator(val_ref, val_model):
         """
         residual = val_ref - val_model
 
-        rmse = np.sqrt(np.mean(residual ** 2))
+        rmse = np.sqrt(np.mean(residual**2))
         mean = np.mean(residual)
         std_dev = np.std(residual)
 
@@ -227,22 +225,25 @@ def process(self):
 
         idx = np.arange(0, shap[0])
         jdx = np.arange(0, shap[1])
-        inside_circle = np.sqrt(
-            (idx[np.newaxis, :] - cent[0]) ** 2
-            + (jdx[:, np.newaxis] - cent[1]) ** 2
-        ) <= self._rad
+        inside_circle = (
+            np.sqrt(
+                (idx[np.newaxis, :] - cent[0]) ** 2
+                + (jdx[:, np.newaxis] - cent[1]) ** 2
+            )
+            <= self._rad
+        )
         my_mask[inside_circle] = True
 
         for name in self._input_file_list:
             starcat_j = fits.open(name[0], memmap=False)
 
             try:
-                stars = np.copy(starcat_j[self._hdu_table].data['VIGNET_LIST'])
+                stars = np.copy(starcat_j[self._hdu_table].data["VIGNET_LIST"])
             except ValueError:
-                print(f'Error for file {name[0]}, check FITS file integrity')
+                print(f"Error for file {name[0]}, check FITS file integrity")
                 raise
             stars[stars < -1e6] = 0
-            psfs = np.copy(starcat_j[self._hdu_table].data['PSF_VIGNET_LIST'])
+            psfs = np.copy(starcat_j[self._hdu_table].data["PSF_VIGNET_LIST"])
 
             # Pixel mse calculation
             pix_val = np.sum((stars - psfs) ** 2)
@@ -250,7 +251,7 @@ def process(self):
             masked_diffs = np.array(
                 [(_star - _psf)[my_mask] for _star, _psf in zip(stars, psfs)]
             )
-            masked_pix_val = np.sum(masked_diffs ** 2)
+            masked_pix_val = np.sum(masked_diffs**2)
             masked_pix_sum = np.sum(masked_diffs)
 
             # Star noise variance (using masked stars)
@@ -268,12 +269,11 @@ def process(self):
 
             # if pix_val < 1e20:
             # Normalised pixel mse calculation
-            stars_norm_vals = np.sqrt(np.sum(stars ** 2, axis=(1, 2)))
-            psfs_norm_vals = np.sqrt(np.sum(psfs ** 2, axis=(1, 2)))
+            stars_norm_vals = np.sqrt(np.sum(stars**2, axis=(1, 2)))
+            psfs_norm_vals = np.sqrt(np.sum(psfs**2, axis=(1, 2)))
             # Select non zero stars & psfs
             non_zero_elems = np.logical_and(
-                (psfs_norm_vals != 0),
-                (stars_norm_vals != 0)
+                (psfs_norm_vals != 0), (stars_norm_vals != 0)
             )
             # Calculate the filtered mse calculation
             pix_filt_val = np.sum(
@@ -286,7 +286,8 @@ def process(self):
                 (
                     stars[non_zero_elems] / stars_norm_vals
                     - psfs[non_zero_elems] / psfs_norm_vals
-                ) ** 2
+                )
+                ** 2
             )
             # Calculate sizes
             filt_size = stars[non_zero_elems].size
@@ -313,56 +314,60 @@ def process(self):
 
             # positions
             x += list(
-                starcat_j[self._hdu_table].data['GLOB_POSITION_IMG_LIST'][:, 0]
+                starcat_j[self._hdu_table].data["GLOB_POSITION_IMG_LIST"][:, 0]
             )
             y += list(
-                starcat_j[self._hdu_table].data['GLOB_POSITION_IMG_LIST'][:, 1]
+                starcat_j[self._hdu_table].data["GLOB_POSITION_IMG_LIST"][:, 1]
             )
 
             # RA and DEC positions
             try:
-                ra += list(starcat_j[self._hdu_table].data['RA_LIST'][:])
-                dec += list(starcat_j[self._hdu_table].data['DEC_LIST'][:])
+                ra += list(starcat_j[self._hdu_table].data["RA_LIST"][:])
+                dec += list(starcat_j[self._hdu_table].data["DEC_LIST"][:])
             except Exception:
-                ra += list(np.zeros(
-                    starcat_j[self._hdu_table].data[
-                        'GLOB_POSITION_IMG_LIST'
-                    ][:, 0].shape,
-                    dtype=int,
-                ))
-                dec += list(np.zeros(
-                    starcat_j[self._hdu_table].data[
-                        'GLOB_POSITION_IMG_LIST'
-                    ][:, 0].shape,
-                    dtype=int,
-                ))
+                ra += list(
+                    np.zeros(
+                        starcat_j[self._hdu_table]
+                        .data["GLOB_POSITION_IMG_LIST"][:, 0]
+                        .shape,
+                        dtype=int,
+                    )
+                )
+                dec += list(
+                    np.zeros(
+                        starcat_j[self._hdu_table]
+                        .data["GLOB_POSITION_IMG_LIST"][:, 0]
+                        .shape,
+                        dtype=int,
+                    )
+                )
 
             # shapes (convert sigmas to R^2)
             g1_psf += list(
-                starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 0]
+                starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 0]
             )
             g2_psf += list(
-                starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 1]
+                starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 1]
             )
             size_psf += list(
-                starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 2] ** 2
+                starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 2] ** 2
             )
-            g1 += list(starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 0])
-            g2 += list(starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 1])
+            g1 += list(starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 0])
+            g2 += list(starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 1])
             size += list(
-                starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 2] ** 2
+                starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 2] ** 2
             )
 
             # flags
             flag_psf += list(
-                starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 3]
+                starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 3]
             )
             flag_star += list(
-                starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 3]
+                starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 3]
             )
 
             # ccd id list
-            ccd_nb += list(starcat_j[self._hdu_table].data['CCD_ID_LIST'])
+            ccd_nb += list(starcat_j[self._hdu_table].data["CCD_ID_LIST"])
 
             starcat_j.close()
 
@@ -372,43 +377,43 @@ def process(self):
         # Regular pixel RMSE
         tot_pixel_rmse = MSC.rmse_calc(pixel_mse, size_mse)
         self._w_log.info(
-            f'MCCD_merge_starcat: Regular Total pixel RMSE ='
-            + f' {tot_pixel_rmse:.5e}\n'
+            f"MCCD_merge_starcat: Regular Total pixel RMSE ="
+            + f" {tot_pixel_rmse:.5e}\n"
         )
 
         # Regular Total pixel mean
         tot_pixel_mean = MSC.mean_calc(pixel_sum, size_mse)
         self._w_log.info(
-            f'MCCD_merge_starcat: Regular Total pixel mean ='
-            + f' {tot_pixel_mean:.5e}\n'
+            f"MCCD_merge_starcat: Regular Total pixel mean ="
+            + f" {tot_pixel_mean:.5e}\n"
         )
 
         # Regular Total MASKED pixel RMSE
         tot_masked_pixel_rmse = MSC.rmse_calc(masked_pixel_mse, masked_size)
         self._w_log.info(
-            f'MCCD_merge_starcat: Regular Total MASKED pixel RMSE ='
-            + f' {tot_masked_pixel_rmse:.5e}\n'
+            f"MCCD_merge_starcat: Regular Total MASKED pixel RMSE ="
+            + f" {tot_masked_pixel_rmse:.5e}\n"
         )
 
         # Regular Total MASKED pixel mean
         tot_masked_pixel_mean = MSC.mean_calc(masked_pixel_sum, masked_size)
         self._w_log.info(
-            f'MCCD_merge_starcat: Regular Total MASKED pixel mean ='
-            + f' {tot_masked_pixel_mean:.5e}\n'
+            f"MCCD_merge_starcat: Regular Total MASKED pixel mean ="
+            + f" {tot_masked_pixel_mean:.5e}\n"
         )
 
         # Normalized pixel RMSE
         tot_pix_norm_rmse = MSC.rmse_calc(pix_norm_mse, size_norm_mse)
         self._w_log.info(
-            'MCCD_merge_starcat: Normalized Total pixel RMSE ='
-            + f' {tot_pix_norm_rmse:.5e}\n'
+            "MCCD_merge_starcat: Normalized Total pixel RMSE ="
+            + f" {tot_pix_norm_rmse:.5e}\n"
         )
 
         # Normalized filtered pixel RMSE
         tot_pix_filt_rmse = MSC.rmse_calc(pix_filt_mse, size_filt_mse)
         self._w_log.info(
-            'MCCD_merge_starcat: Filtered Total pixel RMSE ='
-            + f' {tot_pix_filt_rmse:.5e}\n'
+            "MCCD_merge_starcat: Filtered Total pixel RMSE ="
+            + f" {tot_pix_filt_rmse:.5e}\n"
         )
 
         concat_model_var = np.concatenate(np.array(model_var))
@@ -419,9 +424,9 @@ def process(self):
         std_model_var = MSC.std_calc(concat_model_var)
         rmse_model_var = MSC.rmse_calc_2(concat_model_var, model_var_size)
         self._w_log.info(
-            f'MCCD-RCA variance:\nMean Variance= {mean_model_var:.5e}\n'
-            + f'Std Variance= {std_model_var:.5e}\n'
-            + f'RMSE Variance= {rmse_model_var:.5e}\n'
+            f"MCCD-RCA variance:\nMean Variance= {mean_model_var:.5e}\n"
+            + f"Std Variance= {std_model_var:.5e}\n"
+            + f"RMSE Variance= {rmse_model_var:.5e}\n"
         )
 
         # Star Noise Variance
@@ -429,14 +434,14 @@ def process(self):
         std_star_var = MSC.std_calc(concat_star_noise_var)
         rmse_star_var = MSC.rmse_calc_2(concat_star_noise_var, star_noise_size)
         self._w_log.info(
-            f'Masked stars variance:\nMean Variance= {mean_star_var:.5e}\n'
-            + f'Std Variance= {std_star_var:.5e}\n'
-            + f'RMSE Variance= {rmse_star_var:.5e}\n'
+            f"Masked stars variance:\nMean Variance= {mean_star_var:.5e}\n"
+            + f"Std Variance= {std_star_var:.5e}\n"
+            + f"RMSE Variance= {rmse_star_var:.5e}\n"
         )
 
         # Mask and transform to numpy arrays
-        flagmask = (
-            np.abs(np.array(flag_star) - 1) * np.abs(np.array(flag_psf) - 1)
+        flagmask = np.abs(np.array(flag_star) - 1) * np.abs(
+            np.array(flag_psf) - 1
         )
         psf_e1 = np.array(g1_psf)[flagmask.astype(bool)]
         psf_e2 = np.array(g2_psf)[flagmask.astype(bool)]
@@ -447,47 +452,47 @@ def process(self):
 
         rmse, mean, std_dev = MSC.stats_calculator(star_e1, psf_e1)
         self._w_log.info(
-            f'Moment residual e1:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n'
-            + f'RMSE= {rmse:.5e}\n'
+            f"Moment residual e1:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n"
+            + f"RMSE= {rmse:.5e}\n"
         )
 
         rmse, mean, std_dev = MSC.stats_calculator(star_e2, psf_e2)
         self._w_log.info(
-            f'Moment residual e2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n'
-            + f'RMSE= {rmse:.5e}\n'
+            f"Moment residual e2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n"
+            + f"RMSE= {rmse:.5e}\n"
         )
 
         rmse, mean, std_dev = MSC.stats_calculator(star_r2, psf_r2)
         self._w_log.info(
-            f'Moment residual R2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n'
-            + f'RMSE= {rmse:.5e}\n'
+            f"Moment residual R2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n"
+            + f"RMSE= {rmse:.5e}\n"
         )
 
-        self._w_log.info(f'MCCD: Number of stars: {star_e1.shape[0]:d}')
+        self._w_log.info(f"MCCD: Number of stars: {star_e1.shape[0]:d}")
 
         # Prepare output FITS catalogue
         output = file_io.FITSCatalogue(
-            f'{self._output_dir}/full_starcat-0000000.fits',
+            f"{self._output_dir}/full_starcat-0000000.fits",
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
-            SEx_catalogue=True
+            SEx_catalogue=True,
         )
 
         # Collect columns
         # convert back to sigma for consistency
         data = {
-            'X': x,
-            'Y': y,
-            'RA': ra,
-            'DEC': dec,
-            'E1_PSF_HSM': g1_psf,
-            'E2_PSF_HSM': g2_psf,
-            'SIGMA_PSF_HSM': np.sqrt(size_psf),
-            'E1_STAR_HSM': g1,
-            'E2_STAR_HSM': g2,
-            'SIGMA_STAR_HSM': np.sqrt(size),
-            'FLAG_PSF_HSM': flag_psf,
-            'FLAG_STAR_HSM': flag_star,
-            'CCD_NB': ccd_nb
+            "X": x,
+            "Y": y,
+            "RA": ra,
+            "DEC": dec,
+            "E1_PSF_HSM": g1_psf,
+            "E2_PSF_HSM": g2_psf,
+            "SIGMA_PSF_HSM": np.sqrt(size_psf),
+            "E1_STAR_HSM": g1,
+            "E2_STAR_HSM": g2,
+            "SIGMA_STAR_HSM": np.sqrt(size),
+            "FLAG_PSF_HSM": flag_psf,
+            "FLAG_STAR_HSM": flag_star,
+            "CCD_NB": ccd_nb,
         }
 
         # Write file
@@ -533,7 +538,7 @@ def process(self):
         ccd_nb = []
 
         self._w_log.info(
-            f'Merging {len(self._input_file_list)} star catalogues'
+            f"Merging {len(self._input_file_list)} star catalogues"
         )
 
         for name in self._input_file_list:
@@ -542,49 +547,49 @@ def process(self):
             data_j = starcat_j[self._hdu_table].data
 
             # positions
-            x += list(data_j['X'])
-            y += list(data_j['Y'])
-            ra += list(data_j['RA'])
-            dec += list(data_j['DEC'])
+            x += list(data_j["X"])
+            y += list(data_j["Y"])
+            ra += list(data_j["RA"])
+            dec += list(data_j["DEC"])
 
             # shapes (convert sigmas to R^2)
-            g1_psf += list(data_j['E1_PSF_HSM'])
-            g2_psf += list(data_j['E2_PSF_HSM'])
-            size_psf += list(data_j['SIGMA_PSF_HSM']**2)
-            g1 += list(data_j['E1_STAR_HSM'])
-            g2 += list(data_j['E2_STAR_HSM'])
-            size += list(data_j['SIGMA_STAR_HSM']**2)
+            g1_psf += list(data_j["E1_PSF_HSM"])
+            g2_psf += list(data_j["E2_PSF_HSM"])
+            size_psf += list(data_j["SIGMA_PSF_HSM"] ** 2)
+            g1 += list(data_j["E1_STAR_HSM"])
+            g2 += list(data_j["E2_STAR_HSM"])
+            size += list(data_j["SIGMA_STAR_HSM"] ** 2)
 
             # flags
-            flag_psf += list(data_j['FLAG_PSF_HSM'])
-            flag_star += list(data_j['FLAG_STAR_HSM'])
+            flag_psf += list(data_j["FLAG_PSF_HSM"])
+            flag_star += list(data_j["FLAG_STAR_HSM"])
 
             # misc
 
             # MKDEBUG: The following columns do not exist (yet)
             # for psf converted (pix2wcs) files.
             try:
-                mag += list(data_j['MAG'])
+                mag += list(data_j["MAG"])
             except:
                 mag += list(np.zeros_like(data_j["X"]))
             try:
-                snr += list(data_j['SNR'])
+                snr += list(data_j["SNR"])
             except:
                 snr += list(np.zeros_like(data_j["X"]))
             try:
-                psfex_acc += list(data_j['ACCEPTED'])
+                psfex_acc += list(data_j["ACCEPTED"])
             except:
                 psfex_acc += list(np.zeros_like(data_j["X"]))
 
             # CCD number
-            ccd_nb += [
-                re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2]
-            ] * len(data_j['RA'])
+            ccd_nb += [re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2]] * len(
+                data_j["RA"]
+            )
 
         # Prepare output FITS catalogue
         # MKDEBUG: SEx_cat=True -> False
         output = file_io.FITSCatalogue(
-            f'{self._output_dir}/full_starcat-0000000.fits',
+            f"{self._output_dir}/full_starcat-0000000.fits",
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
             SEx_catalogue=False,
         )
@@ -592,22 +597,22 @@ def process(self):
         # Collect columns
         # convert back to sigma for consistency
         data = {
-            'X': x,
-            'Y': y,
-            'RA': ra,
-            'DEC': dec,
-            'E1_PSF_HSM': g1_psf,
-            'E2_PSF_HSM': g2_psf,
-            'SIGMA_PSF_HSM': np.sqrt(size_psf),
-            'E1_STAR_HSM': g1,
-            'E2_STAR_HSM': g2,
-            'SIGMA_STAR_HSM': np.sqrt(size),
-            'FLAG_PSF_HSM': flag_psf,
-            'FLAG_STAR_HSM': flag_star,
-            'MAG': mag,
-            'SNR': snr,
-            'ACCEPTED': psfex_acc,
-            'CCD_NB': ccd_nb
+            "X": x,
+            "Y": y,
+            "RA": ra,
+            "DEC": dec,
+            "E1_PSF_HSM": g1_psf,
+            "E2_PSF_HSM": g2_psf,
+            "SIGMA_PSF_HSM": np.sqrt(size_psf),
+            "E1_STAR_HSM": g1,
+            "E2_STAR_HSM": g2,
+            "SIGMA_STAR_HSM": np.sqrt(size),
+            "FLAG_PSF_HSM": flag_psf,
+            "FLAG_STAR_HSM": flag_star,
+            "MAG": mag,
+            "SNR": snr,
+            "ACCEPTED": psfex_acc,
+            "CCD_NB": ccd_nb,
         }
 
         # Write file
@@ -617,7 +622,7 @@ def process(self):
             data,
             overwrite=True,
         )
-            #sex_cat_path=self._input_file_list[0][0],
+        # sex_cat_path=self._input_file_list[0][0],
 
 
 class MergeStarCatSetools(object):
@@ -668,9 +673,9 @@ def get_moments(cls, data):
         """
         # SExtractor output. First and second moments are normalised.
         # Second moments are centred.
-        q11 = 'X2WIN_IMAGE'
-        q22 = 'Y2WIN_IMAGE'
-        q12 = 'XYWIN_IMAGE'
+        q11 = "X2WIN_IMAGE"
+        q22 = "Y2WIN_IMAGE"
+        q12 = "XYWIN_IMAGE"
 
         # Second moments
         m11 = data[q12]
@@ -702,13 +707,13 @@ def get_ellipticity(cls, m11, m20, m02, typ):
             ellipticity components
 
         """
-        if typ == 'epsilon':
+        if typ == "epsilon":
             # Determinant = (Q_11 Q_22 - Q_12^2)^(1/2)
             det = np.sqrt(m20 * m02 - m11 * m11)
-        elif typ == 'chi':
+        elif typ == "chi":
             det = 0
         else:
-            raise ValueError(f'Invalid ellipticity type {type}')
+            raise ValueError(f"Invalid ellipticity type {type}")
 
         # Denominator = Q_11 + Q_22 [ + 2 * det]
         den = m20 + m02 + 2 * det
@@ -716,7 +721,7 @@ def get_ellipticity(cls, m11, m20, m02, typ):
         # Ellipticity = (Q_11 - Q_22 + 2 i Q_12) / den
         ell = (m20 - m02 + 1j * 2 * m11) / den
 
-        if type == 'chi':
+        if type == "chi":
             # chi estimates 2*g, so to get g we have to divide by 2
             ell = ell / 2
 
@@ -735,7 +740,7 @@ def process(self):
         ccd_nb = []
 
         self._w_log.info(
-            f'Merging {len(self._input_file_list)} star catalogues'
+            f"Merging {len(self._input_file_list)} star catalogues"
         )
 
         for name in self._input_file_list:
@@ -744,54 +749,54 @@ def process(self):
             data_j = starcat_j[self._hdu_table].data
 
             # positions
-            x += list(data_j['XWIN_IMAGE'])
-            y += list(data_j['YWIN_IMAGE'])
-            ra += list(data_j['XWIN_WORLD'])
-            dec += list(data_j['YWIN_WORLD'])
+            x += list(data_j["XWIN_IMAGE"])
+            y += list(data_j["YWIN_IMAGE"])
+            ra += list(data_j["XWIN_WORLD"])
+            dec += list(data_j["YWIN_WORLD"])
 
             m11, m20, m02 = self.get_moments(data_j)
-            eps1, eps2 = self.get_ellipticity(m11, m20, m02, 'epsilon')
-            chi1, chi2 = self.get_ellipticity(m11, m20, m02, 'chi')
+            eps1, eps2 = self.get_ellipticity(m11, m20, m02, "epsilon")
+            chi1, chi2 = self.get_ellipticity(m11, m20, m02, "chi")
 
-            size += list(data_j['FLUX_RADIUS'])
+            size += list(data_j["FLUX_RADIUS"])
 
             # flags
-            flags += list(data_j['FLAGS_WIN'])
-            flags_ext += list(data_j['IMAFLAGS_ISO'])
+            flags += list(data_j["FLAGS_WIN"])
+            flags_ext += list(data_j["IMAFLAGS_ISO"])
 
             # misc
-            mag += list(data_j['MAG_WIN'])
-            snr += list(data_j['SNR_WIN'])
+            mag += list(data_j["MAG_WIN"])
+            snr += list(data_j["SNR_WIN"])
 
             # CCD number
-            ccd_nb += [
-                re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2]
-            ] * len(data_j['XWIN_IMAGE'])
+            ccd_nb += [re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2]] * len(
+                data_j["XWIN_IMAGE"]
+            )
 
         # Prepare output FITS catalogue
         output = file_io.FITSCatalogue(
-            f'{self._output_dir}/full_starcat-0000000.fits',
+            f"{self._output_dir}/full_starcat-0000000.fits",
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
-            SEx_catalogue=True
+            SEx_catalogue=True,
         )
 
         # Collect columns
         # convert back to sigma for consistency
         data = {
-            'X': x,
-            'Y': y,
-            'RA': ra,
-            'DEC': dec,
-            'EPS1': eps1,
-            'EPS2': eps2,
-            'CHI1': chi1,
-            'CHI2': chi2,
-            'SIZE': size,
-            'FLAGS': flags,
-            'FLAGS_EXT': flags_ext,
-            'MAG': mag,
-            'SNR': snr,
-            'CCD_NB': ccd_nb,
+            "X": x,
+            "Y": y,
+            "RA": ra,
+            "DEC": dec,
+            "EPS1": eps1,
+            "EPS2": eps2,
+            "CHI1": chi1,
+            "CHI2": chi2,
+            "SIZE": size,
+            "FLAGS": flags,
+            "FLAGS_EXT": flags_ext,
+            "MAG": mag,
+            "SNR": snr,
+            "CCD_NB": ccd_nb,
         }
 
         # Write file
diff --git a/shapepipe/modules/merge_starcat_runner.py b/shapepipe/modules/merge_starcat_runner.py
index d1f388a96..5213809a6 100644
--- a/shapepipe/modules/merge_starcat_runner.py
+++ b/shapepipe/modules/merge_starcat_runner.py
@@ -11,13 +11,13 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module=['mccd_fit_val_runner'],
-    file_pattern=['validation_psf'],
-    file_ext=['.fits'],
-    numbering_scheme='-0000000',
-    depends=['numpy', 'astropy'],
-    run_method='serial',
+    version="1.1",
+    input_module=["mccd_fit_val_runner"],
+    file_pattern=["validation_psf"],
+    file_ext=[".fits"],
+    numbering_scheme="-0000000",
+    depends=["numpy", "astropy"],
+    run_method="serial",
 )
 def merge_starcat_runner(
     input_file_list,
@@ -29,29 +29,29 @@ def merge_starcat_runner(
 ):
     """Define The Merge Star Catalogues Runner."""
     # Read config file options
-    psf_model = config.get(module_config_sec, 'PSF_MODEL')
-    allowed_psf_models = ('psfex', 'mccd', 'setools')
+    psf_model = config.get(module_config_sec, "PSF_MODEL")
+    allowed_psf_models = ("psfex", "mccd", "setools")
     if psf_model not in allowed_psf_models:
         raise ValueError(
-            f'Invalid config entry PSF_MODEL={psf_model} found, '
-            + f'needs to be one of {allowed_psf_models}'
+            f"Invalid config entry PSF_MODEL={psf_model} found, "
+            + f"needs to be one of {allowed_psf_models}"
         )
 
     # Get input catalogue HDU number
-    if config.has_option(module_config_sec, 'HDU'):
-        hdu = config.getint(module_config_sec, 'HDU')
+    if config.has_option(module_config_sec, "HDU"):
+        hdu = config.getint(module_config_sec, "HDU")
     else:
         hdu = 1
 
     # Set output directory
-    output_dir = run_dirs['output']
+    output_dir = run_dirs["output"]
 
     # Set merge class to use
-    if psf_model == 'mccd':
+    if psf_model == "mccd":
         MSC = merge_starcat.MergeStarCatMCCD
-    elif psf_model == 'psfex':
+    elif psf_model == "psfex":
         MSC = merge_starcat.MergeStarCatPSFEX
-    elif psf_model == 'setools':
+    elif psf_model == "setools":
         MSC = merge_starcat.MergeStarCatSetools
 
     # Create instance of merge class
diff --git a/shapepipe/modules/module_decorator.py b/shapepipe/modules/module_decorator.py
index 17911b49d..1ad480465 100644
--- a/shapepipe/modules/module_decorator.py
+++ b/shapepipe/modules/module_decorator.py
@@ -8,14 +8,14 @@
 
 
 def module_runner(
-    version='0.0',
+    version="0.0",
     input_module=None,
-    file_pattern='',
-    file_ext='',
+    file_pattern="",
+    file_ext="",
     depends=[],
     executes=[],
     numbering_scheme=None,
-    run_method='parallel',
+    run_method="parallel",
 ):
     """Wrap Module Runners.
 
@@ -63,41 +63,39 @@ def module_runner(
 
     """
     if not isinstance(version, str):
-        raise TypeError('Module version must be a string.')
+        raise TypeError("Module version must be a string.")
 
     if isinstance(input_module, str):
         input_module = [input_module]
     elif not isinstance(input_module, (list, type(None))):
-        raise TypeError('Input module must be a list or a string.')
+        raise TypeError("Input module must be a list or a string.")
 
     if isinstance(file_pattern, str):
         file_pattern = [file_pattern]
     elif not isinstance(file_pattern, list):
-        raise TypeError('File pattern must be a string or a list of strings.')
+        raise TypeError("File pattern must be a string or a list of strings.")
 
     if isinstance(file_ext, str):
         file_ext = [file_ext]
     elif not isinstance(file_ext, list):
-        raise TypeError(
-            'File extension must be a string or a list of strings.'
-        )
+        raise TypeError("File extension must be a string or a list of strings.")
 
     if isinstance(depends, str):
         depends = [depends]
     elif not isinstance(depends, list):
-        raise TypeError('Dependencies must be a string or a list of strings.')
+        raise TypeError("Dependencies must be a string or a list of strings.")
 
     if isinstance(executes, str):
         executes = [executes]
     elif not isinstance(executes, list):
-        raise TypeError('Executables must be a string or a list of strings.')
+        raise TypeError("Executables must be a string or a list of strings.")
 
     if not isinstance(numbering_scheme, (str, type(None))):
         raise TypeError(
-            f'Numbering scheme must be a string, found \'{numbering_scheme}\'.'
+            f"Numbering scheme must be a string, found '{numbering_scheme}'."
         )
 
-    if run_method not in {'parallel', 'serial'}:
+    if run_method not in {"parallel", "serial"}:
         raise ValueError('Run method must be a "parallel" or "serial".')
 
     if (len(file_ext) == 1) and (len(file_pattern) > 1):
@@ -105,9 +103,9 @@ def module_runner(
 
     if len(file_ext) != len(file_pattern):
         raise ValueError(
-            f'The number of file_ext values ({len(file_ext)}) does not match '
-            + f'the number of file_pattern values ({len(file_pattern)}) in '
-            + 'the module decorator.'
+            f"The number of file_ext values ({len(file_ext)}) does not match "
+            + f"the number of file_pattern values ({len(file_pattern)}) in "
+            + "the module decorator."
         )
 
     def decorator(func):
diff --git a/shapepipe/modules/module_runners.py b/shapepipe/modules/module_runners.py
index 74a48ce50..eddee6eb0 100644
--- a/shapepipe/modules/module_runners.py
+++ b/shapepipe/modules/module_runners.py
@@ -25,17 +25,19 @@ def get_module_runners(modules):
         Dictionary of module runners
 
     """
-    package = 'shapepipe.modules'
+    package = "shapepipe.modules"
 
-    module_runners = dict([
-        (
-            module,
-            getattr(
-                import_module(f'.{module}', package=package),
+    module_runners = dict(
+        [
+            (
                 module,
+                getattr(
+                    import_module(f".{module}", package=package),
+                    module,
+                ),
             )
-        )
-        for module in modules
-    ])
+            for module in modules
+        ]
+    )
 
     return module_runners
diff --git a/shapepipe/modules/ngmix_package/__init__.py b/shapepipe/modules/ngmix_package/__init__.py
index e74d71f76..909631097 100644
--- a/shapepipe/modules/ngmix_package/__init__.py
+++ b/shapepipe/modules/ngmix_package/__init__.py
@@ -41,4 +41,4 @@
 
 """
 
-__all__ = ['ngmix']
+__all__ = ["ngmix"]
diff --git a/shapepipe/modules/ngmix_package/ngmix.py b/shapepipe/modules/ngmix_package/ngmix.py
index 7cb614a42..bbecafe8a 100644
--- a/shapepipe/modules/ngmix_package/ngmix.py
+++ b/shapepipe/modules/ngmix_package/ngmix.py
@@ -66,13 +66,13 @@ def __init__(
         f_wcs_path,
         w_log,
         id_obj_min=-1,
-        id_obj_max=-1
+        id_obj_max=-1,
     ):
 
         if len(input_file_list) != 6:
             raise IndexError(
-                f'Input file list has length {len(input_file_list)},'
-                + ' required is 6'
+                f"Input file list has length {len(input_file_list)},"
+                + " required is 6"
             )
 
         self._tile_cat_path = input_file_list[0]
@@ -95,9 +95,9 @@ def __init__(
         self._w_log = w_log
 
         # Initiatlise random generator
-        seed = int(''.join(re.findall(r'\d+', self._file_number_string)))
+        seed = int("".join(re.findall(r"\d+", self._file_number_string)))
         np.random.seed(seed)
-        self._w_log.info(f'Random generator initialisation seed = {seed}')
+        self._w_log.info(f"Random generator initialisation seed = {seed}")
 
     @classmethod
     def MegaCamFlip(self, vign, ccd_nb):
@@ -153,21 +153,18 @@ def get_prior(self):
         # Size prior. Instead of flat, two-sided error function (TwoSidedErf)
         # could be used
         Tminval = -10.0  # arcsec squared
-        Tmaxval = 1.e6
+        Tmaxval = 1.0e6
         T_prior = ngmix.priors.FlatPrior(Tminval, Tmaxval)
 
         # Flux prior. Bounds need to make sense for
         # images in question
-        Fminval = -1.e4
-        Fmaxval = 1.e9
+        Fminval = -1.0e4
+        Fmaxval = 1.0e9
         F_prior = ngmix.priors.FlatPrior(Fminval, Fmaxval)
 
         # Joint prior, combine all individual priors
         prior = ngmix.joint_prior.PriorSimpleSep(
-            cen_prior,
-            g_prior,
-            T_prior,
-            F_prior
+            cen_prior, g_prior, T_prior, F_prior
         )
 
         return prior
@@ -193,112 +190,107 @@ def compile_results(self, results):
             If SNR key not found
 
         """
-        names = ['1m', '1p', '2m', '2p', 'noshear']
+        names = ["1m", "1p", "2m", "2p", "noshear"]
         names2 = [
-            'id',
-            'n_epoch_model',
-            'moments_fail',
-            'ntry_fit',
-            'g1_psfo_ngmix',
-            'g2_psfo_ngmix',
-            'T_psfo_ngmix',
-            'g1_err_psfo_ngmix',
-            'g2_err_psfo_ngmix',
-            'T_err_psfo_ngmix',
-            'g1',
-            'g1_err',
-            'g2',
-            'g2_err',
-            'T',
-            'T_err',
-            'Tpsf',
-            'g1_psf',
-            'g2_psf',
-            'flux',
-            'flux_err',
-            's2n',
-            'mag',
-            'mag_err',
-            'flags',
-            'mcal_flags'
+            "id",
+            "n_epoch_model",
+            "moments_fail",
+            "ntry_fit",
+            "g1_psfo_ngmix",
+            "g2_psfo_ngmix",
+            "T_psfo_ngmix",
+            "g1_err_psfo_ngmix",
+            "g2_err_psfo_ngmix",
+            "T_err_psfo_ngmix",
+            "g1",
+            "g1_err",
+            "g2",
+            "g2_err",
+            "T",
+            "T_err",
+            "Tpsf",
+            "g1_psf",
+            "g2_psf",
+            "flux",
+            "flux_err",
+            "s2n",
+            "mag",
+            "mag_err",
+            "flags",
+            "mcal_flags",
         ]
         output_dict = {k: {kk: [] for kk in names2} for k in names}
         for idx in range(len(results)):
             for name in names:
 
                 mag = (
-                    -2.5 * np.log10(results[idx][name]['flux'])
+                    -2.5 * np.log10(results[idx][name]["flux"])
                     + self._zero_point
                 )
                 mag_err = np.abs(
-                    -2.5 * results[idx][name]['flux_err']
-                    / (results[idx][name]['flux'] * np.log(10))
+                    -2.5
+                    * results[idx][name]["flux_err"]
+                    / (results[idx][name]["flux"] * np.log(10))
                 )
 
-                output_dict[name]['id'].append(results[idx]['obj_id'])
-                output_dict[name]['n_epoch_model'].append(
-                    results[idx]['n_epoch_model']
+                output_dict[name]["id"].append(results[idx]["obj_id"])
+                output_dict[name]["n_epoch_model"].append(
+                    results[idx]["n_epoch_model"]
                 )
-                output_dict[name]['moments_fail'].append(
-                    results[idx]['moments_fail']
+                output_dict[name]["moments_fail"].append(
+                    results[idx]["moments_fail"]
                 )
-                output_dict[name]['ntry_fit'].append(
-                    results[idx][name]['ntry']
+                output_dict[name]["ntry_fit"].append(results[idx][name]["ntry"])
+                output_dict[name]["g1_psfo_ngmix"].append(
+                    results[idx]["g_PSFo"][0]
                 )
-                output_dict[name]['g1_psfo_ngmix'].append(
-                    results[idx]['g_PSFo'][0]
+                output_dict[name]["g2_psfo_ngmix"].append(
+                    results[idx]["g_PSFo"][1]
                 )
-                output_dict[name]['g2_psfo_ngmix'].append(
-                    results[idx]['g_PSFo'][1]
+                output_dict[name]["g1_err_psfo_ngmix"].append(
+                    results[idx]["g_err_PSFo"][0]
                 )
-                output_dict[name]['g1_err_psfo_ngmix'].append(
-                    results[idx]['g_err_PSFo'][0]
+                output_dict[name]["g2_err_psfo_ngmix"].append(
+                    results[idx]["g_err_PSFo"][1]
                 )
-                output_dict[name]['g2_err_psfo_ngmix'].append(
-                    results[idx]['g_err_PSFo'][1]
+                output_dict[name]["T_psfo_ngmix"].append(results[idx]["T_PSFo"])
+                output_dict[name]["T_err_psfo_ngmix"].append(
+                    results[idx]["T_err_PSFo"]
                 )
-                output_dict[name]['T_psfo_ngmix'].append(
-                    results[idx]['T_PSFo']
+                output_dict[name]["g1"].append(results[idx][name]["g"][0])
+                output_dict[name]["g1_err"].append(
+                    results[idx][name]["pars_err"][2]
                 )
-                output_dict[name]['T_err_psfo_ngmix'].append(
-                    results[idx]['T_err_PSFo']
+                output_dict[name]["g2"].append(results[idx][name]["g"][1])
+                output_dict[name]["g2_err"].append(
+                    results[idx][name]["pars_err"][3]
                 )
-                output_dict[name]['g1'].append(results[idx][name]['g'][0])
-                output_dict[name]['g1_err'].append(
-                    results[idx][name]['pars_err'][2]
+                output_dict[name]["T"].append(results[idx][name]["T"])
+                output_dict[name]["T_err"].append(results[idx][name]["T_err"])
+                output_dict[name]["Tpsf"].append(results[idx][name]["Tpsf"])
+                output_dict[name]["g1_psf"].append(
+                    results[idx][name]["gpsf"][0]
                 )
-                output_dict[name]['g2'].append(results[idx][name]['g'][1])
-                output_dict[name]['g2_err'].append(
-                    results[idx][name]['pars_err'][3]
+                output_dict[name]["g2_psf"].append(
+                    results[idx][name]["gpsf"][1]
                 )
-                output_dict[name]['T'].append(results[idx][name]['T'])
-                output_dict[name]['T_err'].append(results[idx][name]['T_err'])
-                output_dict[name]['Tpsf'].append(results[idx][name]['Tpsf'])
-                output_dict[name]['g1_psf'].append(
-                    results[idx][name]['gpsf'][0]
+                output_dict[name]["flux"].append(results[idx][name]["flux"])
+                output_dict[name]["flux_err"].append(
+                    results[idx][name]["flux_err"]
                 )
-                output_dict[name]['g2_psf'].append(
-                    results[idx][name]['gpsf'][1]
-                )
-                output_dict[name]['flux'].append(results[idx][name]['flux'])
-                output_dict[name]['flux_err'].append(
-                    results[idx][name]['flux_err']
-                )
-                output_dict[name]['mag'].append(mag)
-                output_dict[name]['mag_err'].append(mag_err)
-
-                if 's2n' in results[idx][name]:
-                    output_dict[name]['s2n'].append(results[idx][name]['s2n'])
-                elif 's2n_r' in results[idx][name]:
-                    output_dict[name]['s2n'].append(
-                        results[idx][name]['s2n_r']
-                    )
+                output_dict[name]["mag"].append(mag)
+                output_dict[name]["mag_err"].append(mag_err)
+
+                if "s2n" in results[idx][name]:
+                    output_dict[name]["s2n"].append(results[idx][name]["s2n"])
+                elif "s2n_r" in results[idx][name]:
+                    output_dict[name]["s2n"].append(results[idx][name]["s2n_r"])
                 else:
-                    raise KeyError('No SNR key (s2n, s2n_r) found in results')
+                    raise KeyError("No SNR key (s2n, s2n_r) found in results")
 
-                output_dict[name]['flags'].append(results[idx][name]['flags'])
-                output_dict[name]['mcal_flags'].append(
-                    results[idx]['mcal_flags']
+                output_dict[name]["flags"].append(results[idx][name]["flags"])
+                output_dict[name]["mcal_flags"].append(
+                    results[idx]["mcal_flags"]
                 )
 
         return output_dict
@@ -314,13 +306,10 @@ def save_results(self, output_dict):
             Dictionary containing the results
 
         """
-        output_name = (
-            f'{self._output_dir}/ngmix{self._file_number_string}.fits'
-        )
+        output_name = f"{self._output_dir}/ngmix{self._file_number_string}.fits"
 
         f = file_io.FITSCatalogue(
-            output_name,
-            open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
+            output_name, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
         )
 
         for key in output_dict.keys():
@@ -342,10 +331,10 @@ def process(self):
             SEx_catalogue=True,
         )
         tile_cat.open()
-        obj_id = np.copy(tile_cat.get_data()['NUMBER'])
-        tile_vign = np.copy(tile_cat.get_data()['VIGNET'])
-        tile_ra = np.copy(tile_cat.get_data()['XWIN_WORLD'])
-        tile_dec = np.copy(tile_cat.get_data()['YWIN_WORLD'])
+        obj_id = np.copy(tile_cat.get_data()["NUMBER"])
+        tile_vign = np.copy(tile_cat.get_data()["VIGNET"])
+        tile_ra = np.copy(tile_cat.get_data()["XWIN_WORLD"])
+        tile_dec = np.copy(tile_cat.get_data()["YWIN_WORLD"])
         tile_cat.close()
 
         f_wcs_file = SqliteDict(self._f_wcs_path)
@@ -381,64 +370,63 @@ def process(self):
             weight_vign = []
             flag_vign = []
             jacob_list = []
-            if (
-                (psf_vign_cat[str(id_tmp)] == 'empty')
-                or (gal_vign_cat[str(id_tmp)] == 'empty')
+            if (psf_vign_cat[str(id_tmp)] == "empty") or (
+                gal_vign_cat[str(id_tmp)] == "empty"
             ):
                 continue
             psf_expccd_name = list(psf_vign_cat[str(id_tmp)].keys())
             for expccd_name_tmp in psf_expccd_name:
-                exp_name, ccd_n = re.split('-', expccd_name_tmp)
+                exp_name, ccd_n = re.split("-", expccd_name_tmp)
 
-                gal_vign_tmp = (
-                    gal_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET']
-                )
+                gal_vign_tmp = gal_vign_cat[str(id_tmp)][expccd_name_tmp][
+                    "VIGNET"
+                ]
                 if len(np.where(gal_vign_tmp.ravel() == 0)[0]) != 0:
                     continue
 
-                bkg_vign_tmp = (
-                    bkg_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET']
-                )
+                bkg_vign_tmp = bkg_vign_cat[str(id_tmp)][expccd_name_tmp][
+                    "VIGNET"
+                ]
                 gal_vign_sub_bkg = gal_vign_tmp - bkg_vign_tmp
 
-                tile_vign_tmp = (
-                    Ngmix.MegaCamFlip(np.copy(tile_vign[i_tile]), int(ccd_n))
+                tile_vign_tmp = Ngmix.MegaCamFlip(
+                    np.copy(tile_vign[i_tile]), int(ccd_n)
                 )
 
-                flag_vign_tmp = (
-                    flag_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET']
-                )
+                flag_vign_tmp = flag_vign_cat[str(id_tmp)][expccd_name_tmp][
+                    "VIGNET"
+                ]
                 flag_vign_tmp[np.where(tile_vign_tmp == -1e30)] = 2**10
                 v_flag_tmp = flag_vign_tmp.ravel()
                 if len(np.where(v_flag_tmp != 0)[0]) / (51 * 51) > 1 / 3.0:
                     continue
 
-                weight_vign_tmp = (
-                    weight_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET']
-                )
+                weight_vign_tmp = weight_vign_cat[str(id_tmp)][expccd_name_tmp][
+                    "VIGNET"
+                ]
 
                 jacob_tmp = get_jacob(
-                    f_wcs_file[exp_name][int(ccd_n)]['WCS'],
+                    f_wcs_file[exp_name][int(ccd_n)]["WCS"],
                     tile_ra[i_tile],
-                    tile_dec[i_tile]
+                    tile_dec[i_tile],
                 )
 
                 header_tmp = fits.Header.fromstring(
-                    f_wcs_file[exp_name][int(ccd_n)]['header']
+                    f_wcs_file[exp_name][int(ccd_n)]["header"]
                 )
-                Fscale = header_tmp['FSCALE']
+                Fscale = header_tmp["FSCALE"]
 
                 gal_vign_scaled = gal_vign_sub_bkg * Fscale
-                weight_vign_scaled = weight_vign_tmp * 1 / Fscale ** 2
+                weight_vign_scaled = weight_vign_tmp * 1 / Fscale**2
 
                 gal_vign.append(gal_vign_scaled)
                 psf_vign.append(
-                    psf_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET']
+                    psf_vign_cat[str(id_tmp)][expccd_name_tmp]["VIGNET"]
                 )
                 sigma_psf.append(
-                    psf_vign_cat[
-                        str(id_tmp)
-                    ][expccd_name_tmp]['SHAPES']['SIGMA_PSF_HSM']
+                    psf_vign_cat[str(id_tmp)][expccd_name_tmp]["SHAPES"][
+                        "SIGMA_PSF_HSM"
+                    ]
                 )
                 weight_vign.append(weight_vign_scaled)
                 flag_vign.append(flag_vign_tmp)
@@ -455,21 +443,21 @@ def process(self):
                     flag_vign,
                     jacob_list,
                     prior,
-                    self._pixel_scale
+                    self._pixel_scale,
                 )
             except Exception as ee:
                 self._w_log.info(
-                    f'ngmix failed for object ID={id_tmp}.\nMessage: {ee}'
+                    f"ngmix failed for object ID={id_tmp}.\nMessage: {ee}"
                 )
                 continue
 
-            res['obj_id'] = id_tmp
-            res['n_epoch_model'] = len(gal_vign)
+            res["obj_id"] = id_tmp
+            res["n_epoch_model"] = len(gal_vign)
             final_res.append(res)
 
         self._w_log.info(
-            f'ngmix loop over objects finished, processed {count} '
-            + f'objects, id first/last={id_first}/{id_last}'
+            f"ngmix loop over objects finished, processed {count} "
+            + f"objects, id first/last={id_first}/{id_last}"
         )
 
         f_wcs_file.close()
@@ -489,11 +477,11 @@ def process(self):
 def get_guess(
     img,
     pixel_scale,
-    guess_flux_unit='img',
-    guess_size_type='T',
-    guess_size_unit='sky',
+    guess_flux_unit="img",
+    guess_size_type="T",
+    guess_size_unit="sky",
     guess_centroid=True,
-    guess_centroid_unit='sky'
+    guess_centroid_unit="sky",
 ):
     r"""Get Guess.
 
@@ -543,61 +531,56 @@ def get_guess(
 
     error_msg = hsm_shape.error_message
 
-    if error_msg != '':
+    if error_msg != "":
         raise galsim.hsm.GalSimHSMError(
-            f'Error in adaptive moments :\n{error_msg}'
+            f"Error in adaptive moments :\n{error_msg}"
         )
 
-    if guess_flux_unit == 'img':
+    if guess_flux_unit == "img":
         guess_flux = hsm_shape.moments_amp
-    elif guess_flux_unit == 'sky':
-        guess_flux = hsm_shape.moments_amp / pixel_scale ** 2
+    elif guess_flux_unit == "sky":
+        guess_flux = hsm_shape.moments_amp / pixel_scale**2
     else:
         raise ValueError(
-            f'invalid guess_flux_unit \'{guess_flux_unit}\','
-            + ' must be one of \'img\', \'sky\''
+            f"invalid guess_flux_unit '{guess_flux_unit}',"
+            + " must be one of 'img', 'sky'"
         )
 
-    if guess_size_unit == 'img':
-        size_unit = 1.
-    elif guess_size_unit == 'sky':
+    if guess_size_unit == "img":
+        size_unit = 1.0
+    elif guess_size_unit == "sky":
         size_unit = pixel_scale
     else:
         raise ValueError(
-            'invalid guess_size_unit \'{guess_size_unit}\','
-            + 'must be one of \'img\', \'sky\''
+            "invalid guess_size_unit '{guess_size_unit}',"
+            + "must be one of 'img', 'sky'"
         )
 
-    if guess_size_type == 'sigma':
+    if guess_size_type == "sigma":
         guess_size = hsm_shape.moments_sigma * size_unit
-    elif guess_size_type == 'T':
+    elif guess_size_type == "T":
         guess_size = 2 * (hsm_shape.moments_sigma * size_unit) ** 2
 
-    if guess_centroid_unit == 'img':
+    if guess_centroid_unit == "img":
         centroid_unit = 1
-    elif guess_centroid_unit == 'sky':
+    elif guess_centroid_unit == "sky":
         centroid_unit = pixel_scale
     else:
         raise ValueError(
-            f'invalid guess_centroid_unit \'{guess_centroid_unit}\','
-            + '  must be one of \'img\', \'sky\''
+            f"invalid guess_centroid_unit '{guess_centroid_unit}',"
+            + "  must be one of 'img', 'sky'"
         )
 
     if guess_centroid:
         guess_centroid = (
-            (hsm_shape.moments_centroid - galsim_img.center) * centroid_unit
-        )
+            hsm_shape.moments_centroid - galsim_img.center
+        ) * centroid_unit
     else:
         guess_centroid = galsim_img.center * centroid_unit
 
-    guess = np.array([
-        guess_centroid.x,
-        guess_centroid.y,
-        0.,
-        0.,
-        guess_size,
-        guess_flux
-    ])
+    guess = np.array(
+        [guess_centroid.x, guess_centroid.y, 0.0, 0.0, guess_size, guess_flux]
+    )
 
     return guess
 
@@ -637,8 +620,8 @@ def make_galsimfit(obs, model, guess0, prior=None, ntry=5):
     fres = {}
     for it in range(ntry):
         guess[0:5] += urand(low=-limit, high=limit)
-        guess[5:] *= (1 + urand(low=-limit, high=limit))
-        fres['flags'] = 1
+        guess[5:] *= 1 + urand(low=-limit, high=limit)
+        fres["flags"] = 1
         try:
             fitter = ngmix.galsimfit.GalsimSimple(
                 obs,
@@ -650,15 +633,15 @@ def make_galsimfit(obs, model, guess0, prior=None, ntry=5):
         except Exception:
             continue
 
-        if fres['flags'] == 0:
+        if fres["flags"] == 0:
             break
 
-    if fres['flags'] != 0:
+    if fres["flags"] != 0:
         raise ngmix.gexceptions.BootGalFailure(
-            'Failed to fit galaxy image with galsimfit'
+            "Failed to fit galaxy image with galsimfit"
         )
 
-    fres['ntry'] = it + 1
+    fres["ntry"] = it + 1
 
     return fres
 
@@ -730,9 +713,7 @@ def get_noise(gal, weight, guess, pixel_scale, thresh=1.2):
     gauss_win = galsim.Gaussian(sigma=np.sqrt(guess[4] / 2), flux=guess[5])
     gauss_win = gauss_win.shear(g1=guess[2], g2=guess[3])
     gauss_win = gauss_win.drawImage(
-        nx=img_shape[0],
-        ny=img_shape[1],
-        scale=pixel_scale
+        nx=img_shape[0], ny=img_shape[1], scale=pixel_scale
     ).array
 
     m_weight = weight[gauss_win < thresh * sig_tmp] != 0
@@ -743,14 +724,7 @@ def get_noise(gal, weight, guess, pixel_scale, thresh=1.2):
 
 
 def do_ngmix_metacal(
-    gals,
-    psfs,
-    psfs_sigma,
-    weights,
-    flags,
-    jacob_list,
-    prior,
-    pixel_scale
+    gals, psfs, psfs_sigma, weights, flags, jacob_list, prior, pixel_scale
 ):
     """Do Ngmix Metacal.
 
@@ -791,10 +765,10 @@ def do_ngmix_metacal(
     gal_obs_list = ObsList()
     T_guess_psf = []
     psf_res_gT = {
-        'g_PSFo': np.array([0., 0.]),
-        'g_err_PSFo': np.array([0., 0.]),
-        'T_PSFo': 0.,
-        'T_err_PSFo': 0.
+        "g_PSFo": np.array([0.0, 0.0]),
+        "g_err_PSFo": np.array([0.0, 0.0]),
+        "T_PSFo": 0.0,
+        "T_err_PSFo": 0.0,
     }
     gal_guess = []
     gal_guess_flag = True
@@ -804,7 +778,7 @@ def do_ngmix_metacal(
         psf_jacob = ngmix.Jacobian(
             row=(psfs[0].shape[0] - 1) / 2,
             col=(psfs[0].shape[1] - 1) / 2,
-            wcs=jacob_list[n_e]
+            wcs=jacob_list[n_e],
         )
 
         psf_obs = Observation(psfs[n_e], jacobian=psf_jacob)
@@ -812,31 +786,29 @@ def do_ngmix_metacal(
         psf_T = psfs_sigma[n_e] * 1.17741 * pixel_scale
 
         weight_map = np.copy(weights[n_e])
-        weight_map[np.where(flags[n_e] != 0)] = 0.
+        weight_map[np.where(flags[n_e] != 0)] = 0.0
         weight_map[weight_map != 0] = 1
 
-        psf_guess = np.array([0., 0., 0., 0., psf_T, 1.])
+        psf_guess = np.array([0.0, 0.0, 0.0, 0.0, psf_T, 1.0])
         try:
-            psf_res = make_galsimfit(psf_obs, 'gauss', psf_guess)
+            psf_res = make_galsimfit(psf_obs, "gauss", psf_guess)
         except Exception:
             continue
 
         # Gal guess
         try:
             gal_guess_tmp = get_guess(
-                gals[n_e],
-                pixel_scale,
-                guess_size_type='sigma'
+                gals[n_e], pixel_scale, guess_size_type="sigma"
             )
         except Exception:
             gal_guess_flag = False
-            gal_guess_tmp = np.array([0., 0., 0., 0., 1, 100])
+            gal_guess_tmp = np.array([0.0, 0.0, 0.0, 0.0, 1, 100])
 
         # Recenter jacobian if necessary
         gal_jacob = ngmix.Jacobian(
             row=(gals[0].shape[0] - 1) / 2 + gal_guess_tmp[0],
             col=(gals[0].shape[1] - 1) / 2 + gal_guess_tmp[1],
-            wcs=jacob_list[n_e]
+            wcs=jacob_list[n_e],
         )
 
         # Noise handling
@@ -854,20 +826,19 @@ def do_ngmix_metacal(
         noise_img_gal = np.random.randn(*gals[n_e].shape) * sig_noise
 
         gal_masked = np.copy(gals[n_e])
-        if (len(np.where(weight_map == 0)[0]) != 0):
+        if len(np.where(weight_map == 0)[0]) != 0:
             gal_masked[weight_map == 0] = noise_img_gal[weight_map == 0]
 
-        weight_map *= 1 / sig_noise ** 2
+        weight_map *= 1 / sig_noise**2
 
         # Original PSF fit
         w_tmp = np.sum(weight_map)
-        psf_res_gT['g_PSFo'] += psf_res['g'] * w_tmp
-        psf_res_gT['g_err_PSFo'] += np.array([
-            psf_res['pars_err'][2],
-            psf_res['pars_err'][3]
-        ]) * w_tmp
-        psf_res_gT['T_PSFo'] += psf_res['T'] * w_tmp
-        psf_res_gT['T_err_PSFo'] += psf_res['T_err'] * w_tmp
+        psf_res_gT["g_PSFo"] += psf_res["g"] * w_tmp
+        psf_res_gT["g_err_PSFo"] += (
+            np.array([psf_res["pars_err"][2], psf_res["pars_err"][3]]) * w_tmp
+        )
+        psf_res_gT["T_PSFo"] += psf_res["T"] * w_tmp
+        psf_res_gT["T_err_PSFo"] += psf_res["T_err"] * w_tmp
         wsum += w_tmp
 
         gal_obs = Observation(
@@ -875,7 +846,7 @@ def do_ngmix_metacal(
             weight=weight_map,
             jacobian=gal_jacob,
             psf=psf_obs,
-            noise=noise_img
+            noise=noise_img,
         )
 
         if gal_guess_flag:
@@ -887,7 +858,7 @@ def do_ngmix_metacal(
         gal_guess_flag = True
 
     if wsum == 0:
-        raise ZeroDivisionError('Sum of weights = 0, division by zero')
+        raise ZeroDivisionError("Sum of weights = 0, division by zero")
 
     # Normalize PSF fit output
     for key in psf_res_gT.keys():
@@ -897,22 +868,22 @@ def do_ngmix_metacal(
     fail_get_guess = False
     if len(gal_guess) == 0:
         fail_get_guess = True
-        gal_pars = [0., 0., 0., 0., 1, 100]
+        gal_pars = [0.0, 0.0, 0.0, 0.0, 1, 100]
     else:
         gal_pars = np.mean(gal_guess, 0)
 
-    psf_model = 'gauss'
-    gal_model = 'gauss'
+    psf_model = "gauss"
+    gal_model = "gauss"
 
     # metacal specific parameters
     metacal_pars = {
-        'types': ['noshear', '1p', '1m', '2p', '2m'],
-        'step': 0.01,
-        'psf': 'gauss',
-        'fixnoise': True,
-        'cheatnoise': False,
-        'symmetrize_psf': False,
-        'use_noise_image': True
+        "types": ["noshear", "1p", "1m", "2p", "2m"],
+        "step": 0.01,
+        "psf": "gauss",
+        "fixnoise": True,
+        "cheatnoise": False,
+        "symmetrize_psf": False,
+        "use_noise_image": True,
     }
 
     Tguess = np.mean(T_guess_psf)
@@ -921,25 +892,22 @@ def do_ngmix_metacal(
     ntry = 2
 
     obs_dict_mcal = ngmix.metacal.get_all_metacal(gal_obs_list, **metacal_pars)
-    res = {'mcal_flags': 0}
+    res = {"mcal_flags": 0}
 
     ntry = 5
 
     for key in sorted(obs_dict_mcal):
 
         fres = make_galsimfit(
-            obs_dict_mcal[key],
-            gal_model,
-            gal_pars,
-            prior=prior
+            obs_dict_mcal[key], gal_model, gal_pars, prior=prior
         )
 
-        res['mcal_flags'] |= fres['flags']
+        res["mcal_flags"] |= fres["flags"]
         tres = {}
 
         for name in fres.keys():
             tres[name] = fres[name]
-        tres['flags'] = fres['flags']
+        tres["flags"] = fres["flags"]
 
         wsum = 0
         Tpsf_sum = 0
@@ -947,29 +915,29 @@ def do_ngmix_metacal(
         npsf = 0
         for obs in obs_dict_mcal[key]:
 
-            if hasattr(obs, 'psf_nopix'):
+            if hasattr(obs, "psf_nopix"):
                 try:
                     psf_res = make_galsimfit(
                         obs.psf_nopix,
                         psf_model,
-                        np.array([0., 0., 0., 0., Tguess, 1.]),
-                        ntry=ntry
+                        np.array([0.0, 0.0, 0.0, 0.0, Tguess, 1.0]),
+                        ntry=ntry,
                     )
                 except Exception:
                     continue
-                g1, g2 = psf_res['g']
-                T = psf_res['T']
+                g1, g2 = psf_res["g"]
+                T = psf_res["T"]
             else:
                 try:
                     psf_res = make_galsimfit(
                         obs.psf,
                         psf_model,
-                        np.array([0., 0., 0., 0., Tguess, 1.]),
+                        np.array([0.0, 0.0, 0.0, 0.0, Tguess, 1.0]),
                     )
                 except Exception:
                     continue
-                g1, g2 = psf_res['g']
-                T = psf_res['T']
+                g1, g2 = psf_res["g"]
+                T = psf_res["T"]
 
             # TODO we sometimes use other weights
             twsum = obs.weight.sum()
@@ -980,8 +948,8 @@ def do_ngmix_metacal(
             Tpsf_sum += T * twsum
             npsf += 1
 
-        tres['gpsf'] = gpsf_sum / wsum
-        tres['Tpsf'] = Tpsf_sum / wsum
+        tres["gpsf"] = gpsf_sum / wsum
+        tres["Tpsf"] = Tpsf_sum / wsum
 
         res[key] = tres
 
@@ -989,6 +957,6 @@ def do_ngmix_metacal(
     metacal_res = res
 
     metacal_res.update(psf_res_gT)
-    metacal_res['moments_fail'] = fail_get_guess
+    metacal_res["moments_fail"] = fail_get_guess
 
     return metacal_res
diff --git a/shapepipe/modules/ngmix_runner.py b/shapepipe/modules/ngmix_runner.py
index 432008793..80d8e2ea7 100644
--- a/shapepipe/modules/ngmix_runner.py
+++ b/shapepipe/modules/ngmix_runner.py
@@ -11,22 +11,22 @@
 
 
 @module_runner(
-    version='0.0.1',
+    version="0.0.1",
     input_module=[
-        'sextractor_runner',
-        'psfex_interp_runner',
-        'vignetmaker_runner'
+        "sextractor_runner",
+        "psfex_interp_runner",
+        "vignetmaker_runner",
     ],
     file_pattern=[
-        'tile_sexcat',
-        'image',
-        'exp_background',
-        'galaxy_psf',
-        'weight',
-        'flag'
+        "tile_sexcat",
+        "image",
+        "exp_background",
+        "galaxy_psf",
+        "weight",
+        "flag",
     ],
-    file_ext=['.fits', '.sqlite', '.sqlite', '.sqlite', '.sqlite', '.sqlite'],
-    depends=['numpy', 'ngmix', 'galsim', 'sqlitedict', 'astropy'],
+    file_ext=[".fits", ".sqlite", ".sqlite", ".sqlite", ".sqlite", ".sqlite"],
+    depends=["numpy", "ngmix", "galsim", "sqlitedict", "astropy"],
 )
 def ngmix_runner(
     input_file_list,
@@ -40,22 +40,22 @@ def ngmix_runner(
     # Read config file entries
 
     # Photometric zero point
-    zero_point = config.getfloat(module_config_sec, 'MAG_ZP')
+    zero_point = config.getfloat(module_config_sec, "MAG_ZP")
 
     # Pixel scale
-    pixel_scale = config.getfloat(module_config_sec, 'PIXEL_SCALE')
+    pixel_scale = config.getfloat(module_config_sec, "PIXEL_SCALE")
 
     # Path to merged single-exposure single-HDU headers
-    f_wcs_path = config.getexpanded(module_config_sec, 'LOG_WCS')
+    f_wcs_path = config.getexpanded(module_config_sec, "LOG_WCS")
 
     # First and last galaxy ID to process
-    id_obj_min = config.getint(module_config_sec, 'ID_OBJ_MIN')
-    id_obj_max = config.getint(module_config_sec, 'ID_OBJ_MAX')
+    id_obj_min = config.getint(module_config_sec, "ID_OBJ_MIN")
+    id_obj_max = config.getint(module_config_sec, "ID_OBJ_MAX")
 
     # Initialise class instance
     ngmix_inst = Ngmix(
         input_file_list,
-        run_dirs['output'],
+        run_dirs["output"],
         file_number_string,
         zero_point,
         pixel_scale,
diff --git a/shapepipe/modules/pastecat_package/__init__.py b/shapepipe/modules/pastecat_package/__init__.py
index 62838d8e4..b5bcfdcc0 100644
--- a/shapepipe/modules/pastecat_package/__init__.py
+++ b/shapepipe/modules/pastecat_package/__init__.py
@@ -32,4 +32,4 @@
 
 """
 
-__all__ = ['pastecat']
+__all__ = ["pastecat"]
diff --git a/shapepipe/modules/pastecat_package/pastecat.py b/shapepipe/modules/pastecat_package/pastecat.py
index c1a4b07c6..35941018a 100644
--- a/shapepipe/modules/pastecat_package/pastecat.py
+++ b/shapepipe/modules/pastecat_package/pastecat.py
@@ -49,7 +49,7 @@ def __init__(
         w_log,
         ext_name=None,
         check_col_name=None,
-        hdu_no=None
+        hdu_no=None,
     ):
 
         self._input_file_list = input_file_list
@@ -71,12 +71,12 @@ def process(self):
         # Create output catalogue
         pasted_cat = file_io.FITSCatalogue(
             self._output_path,
-            open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
+            open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
         )
 
         for idx, input_file in enumerate(self._input_file_list):
 
-            self._w_log.info(f'Pasting catalogue \'{input_file}\'')
+            self._w_log.info(f"Pasting catalogue '{input_file}'")
 
             # Read input data
             cat = file_io.FITSCatalogue(input_file)
@@ -90,18 +90,18 @@ def process(self):
                 if idx > 0:
                     if self._check_col_name not in col_names:
                         raise KeyError(
-                            f'CHECK_COL_NAME key \'{self._check_col_name}\''
-                            + 'not found in input catalogue'
+                            f"CHECK_COL_NAME key '{self._check_col_name}'"
+                            + "not found in input catalogue"
                         )
                     if not (
                         data[self._check_col_name]
                         == data_prev[self._check_col_name]
                     ).all():
                         raise Exception(
-                            f'Column check using key'
-                            + '\'{self._check_col_name}\''
-                            + 'failed for input catalogues '
-                            + f'#{idx - 1} and #{idx}'
+                            f"Column check using key"
+                            + "'{self._check_col_name}'"
+                            + "failed for input catalogues "
+                            + f"#{idx - 1} and #{idx}"
                         )
                 data_prev = data
 
diff --git a/shapepipe/modules/pastecat_runner.py b/shapepipe/modules/pastecat_runner.py
index 247a44f46..4f659bffa 100644
--- a/shapepipe/modules/pastecat_runner.py
+++ b/shapepipe/modules/pastecat_runner.py
@@ -11,12 +11,12 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module='sextractor_runner',
-    file_pattern='tile_sexcat',
-    file_ext='.fits',
-    depends=['numpy', 'astropy'],
-    run_method='parallel',
+    version="1.1",
+    input_module="sextractor_runner",
+    file_pattern="tile_sexcat",
+    file_ext=".fits",
+    depends=["numpy", "astropy"],
+    run_method="parallel",
 )
 def paste_cat_runner(
     input_file_list,
@@ -28,48 +28,44 @@ def paste_cat_runner(
 ):
     """Define The Paste Catalogue Runner."""
     # Get config options
-    if config.has_option(module_config_sec, 'CHECK_COL_NAME'):
-        check_col_name = config.get(module_config_sec, 'CHECK_COL_NAME')
+    if config.has_option(module_config_sec, "CHECK_COL_NAME"):
+        check_col_name = config.get(module_config_sec, "CHECK_COL_NAME")
     else:
         check_col_name = None
 
-    if config.has_option(module_config_sec, 'HDU'):
-        tmp = config.getlist(module_config_sec, 'HDU')
+    if config.has_option(module_config_sec, "HDU"):
+        tmp = config.getlist(module_config_sec, "HDU")
         hdu_no = [int(idx) for idx in tmp]
         if len(hdu_no) != len(input_file_list):
             raise IndexError(
-                'Different lengths for input file list '
-                + f'({len(input_file_list)}) and HDU ({len(hdu_no)}).'
+                "Different lengths for input file list "
+                + f"({len(input_file_list)}) and HDU ({len(hdu_no)})."
             )
     else:
         hdu_no = None
 
-    if config.has_option(module_config_sec, 'PREFIX'):
-        prefix = config.get(
-            module_config_sec,
-            'PREFIX'
-        )
+    if config.has_option(module_config_sec, "PREFIX"):
+        prefix = config.get(module_config_sec, "PREFIX")
     else:
-        prefix = 'cat_pasted'
+        prefix = "cat_pasted"
 
-    if config.has_option(module_config_sec, 'EXT_NAME'):
-        ext_name_list = config.getlist(module_config_sec, 'EXT_NAME')
+    if config.has_option(module_config_sec, "EXT_NAME"):
+        ext_name_list = config.getlist(module_config_sec, "EXT_NAME")
         if len(ext_name_list) != len(input_file_list):
             raise ValueError(
-                f'Input file list length ({len(input_file_list)}) '
-                + f'and EXT_NAME list ({len(ext_name_list)})'
-                + 'need to be equal.'
+                f"Input file list length ({len(input_file_list)}) "
+                + f"and EXT_NAME list ({len(ext_name_list)})"
+                + "need to be equal."
             )
     else:
         ext_name_list = None
 
     # Set file extension
-    file_ext = 'fits'
+    file_ext = "fits"
 
     # Set output path
     output_path = (
-        f'{run_dirs["output"]}/{prefix}'
-        + f'{file_number_string}.{file_ext}'
+        f'{run_dirs["output"]}/{prefix}' + f"{file_number_string}.{file_ext}"
     )
 
     # Create rand cat class instance
@@ -79,7 +75,7 @@ def paste_cat_runner(
         w_log,
         ext_name=ext_name_list,
         check_col_name=check_col_name,
-        hdu_no=hdu_no
+        hdu_no=hdu_no,
     )
 
     # Run processing
diff --git a/shapepipe/modules/psfex_interp_package/__init__.py b/shapepipe/modules/psfex_interp_package/__init__.py
index afda4d2e2..1c3b51ca4 100644
--- a/shapepipe/modules/psfex_interp_package/__init__.py
+++ b/shapepipe/modules/psfex_interp_package/__init__.py
@@ -43,4 +43,4 @@
 
 """
 
-__all__ = ['psfex_interp']
+__all__ = ["psfex_interp"]
diff --git a/shapepipe/modules/psfex_interp_package/psfex_interp.py b/shapepipe/modules/psfex_interp_package/psfex_interp.py
index 1a3a0e50d..dc18a0339 100644
--- a/shapepipe/modules/psfex_interp_package/psfex_interp.py
+++ b/shapepipe/modules/psfex_interp_package/psfex_interp.py
@@ -24,10 +24,9 @@
     import_fail = False
 
 
-NOT_ENOUGH_STARS = 'Fail_stars'
-BAD_CHI2 = 'Fail_chi2'
-FILE_NOT_FOUND = 'File_not_found'
-
+NOT_ENOUGH_STARS = "Fail_stars"
+BAD_CHI2 = "Fail_chi2"
+FILE_NOT_FOUND = "File_not_found"
 
 
 class PSFExInterpolator(object):
@@ -76,22 +75,21 @@ def __init__(
 
         # Path to PSFEx output file
         self._dotpsf_path = dotpsf_path
-        if (
-            not isinstance(dotpsf_path, type(None))
-            and not os.path.isfile(dotpsf_path)
+        if not isinstance(dotpsf_path, type(None)) and not os.path.isfile(
+            dotpsf_path
         ):
-            raise ValueError(f'Cound not find file {dotpsf_path}.')
+            raise ValueError(f"Cound not find file {dotpsf_path}.")
 
         # Path to catalogue containing galaxy positions
         if os.path.isfile(galcat_path):
             self._galcat_path = galcat_path
         else:
-            raise ValueError(f'Cound not find file {galcat_path}.')
+            raise ValueError(f"Cound not find file {galcat_path}.")
 
         # Path to output file to be written
-        self._output_path = output_path + '/galaxy_psf'
+        self._output_path = output_path + "/galaxy_psf"
         # Path to output file to be written for validation
-        self._output_path_validation = output_path + '/validation_psf'
+        self._output_path_validation = output_path + "/validation_psf"
         # if required, compute and save shapes
         self._compute_shape = get_shapes
         # Number of stars under which we don't interpolate the PSF
@@ -107,8 +105,8 @@ def __init__(
         if pos_params:
             if not len(pos_params) == 2:
                 raise ValueError(
-                    f'{len(pos_params)} position parameters were passed on; '
-                    + 'there should be exactly two.'
+                    f"{len(pos_params)} position parameters were passed on; "
+                    + "there should be exactly two."
                 )
             self._pos_params = pos_params
         else:
@@ -135,21 +133,18 @@ def process(self):
             and self.interp_PSFs == NOT_ENOUGH_STARS
         ):
             self._w_log.info(
-                'Not enough stars to interpolate the psf in the file '
-                + f'{self._dotpsf_path}.'
+                "Not enough stars to interpolate the psf in the file "
+                + f"{self._dotpsf_path}."
             )
-        elif (
-            isinstance(self.interp_PSFs, str)
-            and self.interp_PSFs == BAD_CHI2
-        ):
+        elif isinstance(self.interp_PSFs, str) and self.interp_PSFs == BAD_CHI2:
             self._w_log.info(
-                f'Bad chi2 for the psf model in the file {self._dotpsf_path}.'
+                f"Bad chi2 for the psf model in the file {self._dotpsf_path}."
             )
         elif (
             isinstance(self.interp_PSFs, str)
             and self.interp_PSFs == FILE_NOT_FOUND
         ):
-            self._w_log.info(f'Psf model file {self._dotpsf_path} not found.')
+            self._w_log.info(f"Psf model file {self._dotpsf_path} not found.")
         else:
             if self._compute_shape:
                 self._get_psfshapes()
@@ -165,8 +160,8 @@ def _get_position_parameters(self):
         dotpsf = file_io.FITSCatalogue(self._dotpsf_path)
         dotpsf.open()
         self._pos_params = [
-            dotpsf.get_header()['POLNAME1'],
-            dotpsf.get_header()['POLNAME2']
+            dotpsf.get_header()["POLNAME1"],
+            dotpsf.get_header()["POLNAME2"],
         ]
         dotpsf.close()
 
@@ -183,29 +178,31 @@ def _get_galaxy_positions(self):
         galcat.open()
 
         try:
-            self.gal_pos = np.array([
-                [x, y] for x, y in zip(
-                    galcat.get_data()[self._pos_params[0]],
-                    galcat.get_data()[self._pos_params[1]]
-                )
-            ])
+            self.gal_pos = np.array(
+                [
+                    [x, y]
+                    for x, y in zip(
+                        galcat.get_data()[self._pos_params[0]],
+                        galcat.get_data()[self._pos_params[1]],
+                    )
+                ]
+            )
             self._w_log.info(
-                f'Read {self.gal_pos.shape[0]} positions from galaxy catalog'
+                f"Read {self.gal_pos.shape[0]} positions from galaxy catalog"
             )
 
         except KeyError as detail:
             # extract erroneous position parameter from original exception
             err_pos_param = detail.args[0][4:-15]
             pos_param_err = (
-                f'Required position parameter {err_pos_param}'
-                + 'was not found in galaxy catalog. Leave '
-                + 'pos_params (or EXTRA_CODE_OPTION) blank to '
-                + 'read them from .psf file.'
+                f"Required position parameter {err_pos_param}"
+                + "was not found in galaxy catalog. Leave "
+                + "pos_params (or EXTRA_CODE_OPTION) blank to "
+                + "read them from .psf file."
             )
             raise KeyError(pos_param_err)
         galcat.close()
 
-
     def interpsfex(self, dotpsfpath, pos):
         """Interpolate PSFEx.
 
@@ -223,7 +220,7 @@ def interpsfex(self, dotpsfpath, pos):
         numpy.ndarray
             Array of PSFs, each row is the PSF image at the corresponding position
             requested
-    
+
         """
         if not os.path.exists(dotpsfpath):
             return FILE_NOT_FOUND
@@ -241,49 +238,62 @@ def interpsfex(self, dotpsfpath, pos):
         thresh_star = self._star_thresh
         thresh_chi2 = self._chi2_thresh
 
-        if PSF_model.header['ACCEPTED'] < thresh_star:
+        if PSF_model.header["ACCEPTED"] < thresh_star:
             return NOT_ENOUGH_STARS
-        if PSF_model.header['CHI2'] > thresh_chi2:
+        if PSF_model.header["CHI2"] > thresh_chi2:
             return BAD_CHI2
 
         PSF_basis = np.array(PSF_model.data)[0][0]
         try:
-            deg = PSF_model.header['POLDEG1']
+            deg = PSF_model.header["POLDEG1"]
         except KeyError:
             # constant PSF model
             return PSF_basis[0, :, :]
 
         # scale coordinates
         x_interp, x_scale = (
-            PSF_model.header['POLZERO1'],
-            PSF_model.header['POLSCAL1']
+            PSF_model.header["POLZERO1"],
+            PSF_model.header["POLSCAL1"],
         )
         y_interp, y_scale = (
-            PSF_model.header['POLZERO2'],
-            PSF_model.header['POLSCAL2']
-
+            PSF_model.header["POLZERO2"],
+            PSF_model.header["POLSCAL2"],
         )
-        xs, ys = (pos[:, 0] - x_interp) / x_scale, (pos[:, 1] - y_interp) / y_scale
+        xs, ys = (pos[:, 0] - x_interp) / x_scale, (
+            pos[:, 1] - y_interp
+        ) / y_scale
 
         # compute polynomial coefficients
-        coeffs = np.array([[x ** idx for idx in range(deg + 1)] for x in xs])
-        cross_coeffs = np.array([
-            np.concatenate([
-                [(x ** idx_j) * (y ** idx_i) for idx_j in range(deg - idx_i + 1)]
-                for idx_i in range(1, deg + 1)
-            ])
-            for x, y in zip(xs, ys)
-        ])
+        coeffs = np.array([[x**idx for idx in range(deg + 1)] for x in xs])
+        cross_coeffs = np.array(
+            [
+                np.concatenate(
+                    [
+                        [
+                            (x**idx_j) * (y**idx_i)
+                            for idx_j in range(deg - idx_i + 1)
+                        ]
+                        for idx_i in range(1, deg + 1)
+                    ]
+                )
+                for x, y in zip(xs, ys)
+            ]
+        )
         coeffs = np.hstack((coeffs, cross_coeffs))
 
         # compute interpolated PSF
-        PSFs = np.array([
-            np.sum(
-                [coeff * atom for coeff, atom in zip(coeffs_posi, PSF_basis)],
-                axis=0,
-            )
-            for coeffs_posi in coeffs
-        ])
+        PSFs = np.array(
+            [
+                np.sum(
+                    [
+                        coeff * atom
+                        for coeff, atom in zip(coeffs_posi, PSF_basis)
+                    ],
+                    axis=0,
+                )
+                for coeffs_posi in coeffs
+            ]
+        )
 
         return PSFs
 
@@ -306,22 +316,24 @@ def _get_psfshapes(self):
 
         """
         if import_fail:
-            raise ImportError('Galsim is required to get shapes information')
+            raise ImportError("Galsim is required to get shapes information")
 
         psf_moms = [
             hsm.FindAdaptiveMom(Image(psf), strict=False)
             for psf in self.interp_PSFs
         ]
 
-        self.psf_shapes = np.array([
+        self.psf_shapes = np.array(
             [
-                moms.observed_shape.g1,
-                moms.observed_shape.g2,
-                moms.moments_sigma,
-                int(bool(moms.error_message))
+                [
+                    moms.observed_shape.g1,
+                    moms.observed_shape.g2,
+                    moms.moments_sigma,
+                    int(bool(moms.error_message)),
+                ]
+                for moms in psf_moms
             ]
-            for moms in psf_moms
-        ])
+        )
 
     def _write_output(self):
         """Write Output.
@@ -330,21 +342,21 @@ def _write_output(self):
 
         """
         output = file_io.FITSCatalogue(
-            self._output_path + self._img_number + '.fits',
+            self._output_path + self._img_number + ".fits",
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
             SEx_catalogue=True,
         )
 
         if self._compute_shape:
             data = {
-                'VIGNET': self.interp_PSFs,
-                'E1_PSF_HSM': self.psf_shapes[:, 0],
-                'E2_PSF_HSM': self.psf_shapes[:, 1],
-                'SIGMA_PSF_HSM': self.psf_shapes[:, 2],
-                'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int)
+                "VIGNET": self.interp_PSFs,
+                "E1_PSF_HSM": self.psf_shapes[:, 0],
+                "E2_PSF_HSM": self.psf_shapes[:, 1],
+                "SIGMA_PSF_HSM": self.psf_shapes[:, 2],
+                "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int),
             }
         else:
-            data = {'VIGNET': self.interp_PSFs}
+            data = {"VIGNET": self.interp_PSFs}
         output.save_as_fits(data, sex_cat_path=self._galcat_path)
 
     def process_validation(self, psfex_cat_path):
@@ -359,7 +371,7 @@ def process_validation(self, psfex_cat_path):
 
         """
         if not os.path.isfile(psfex_cat_path):
-            raise ValueError(f'Cound not find file {psfex_cat_path}.')
+            raise ValueError(f"Cound not find file {psfex_cat_path}.")
 
         if self.gal_pos is None:
             self._get_galaxy_positions()
@@ -372,21 +384,18 @@ def process_validation(self, psfex_cat_path):
             and self.interp_PSFs == NOT_ENOUGH_STARS
         ):
             self._w_log.info(
-                'Not enough stars to interpolate the psf in the file '
-                + f'{self._dotpsf_path}.'
+                "Not enough stars to interpolate the psf in the file "
+                + f"{self._dotpsf_path}."
             )
-        elif (
-            isinstance(self.interp_PSFs, str)
-            and self.interp_PSFs == BAD_CHI2
-        ):
+        elif isinstance(self.interp_PSFs, str) and self.interp_PSFs == BAD_CHI2:
             self._w_log.info(
-                f'Bad chi2 for the psf model in the file {self._dotpsf_path}.'
+                f"Bad chi2 for the psf model in the file {self._dotpsf_path}."
             )
         elif (
             isinstance(self.interp_PSFs, str)
             and self.interp_PSFs == FILE_NOT_FOUND
         ):
-            self._w_log.info(f'Psf model file {self._dotpsf_path} not found.')
+            self._w_log.info(f"Psf model file {self._dotpsf_path} not found.")
         else:
             star_cat = file_io.FITSCatalogue(
                 self._galcat_path,
@@ -394,14 +403,14 @@ def process_validation(self, psfex_cat_path):
             )
             star_cat.open()
             star_dict = {}
-            star_vign = np.copy(star_cat.get_data()['VIGNET'])
-            star_dict['NUMBER'] = np.copy(star_cat.get_data()['NUMBER'])
-            star_dict['X'] = np.copy(star_cat.get_data()['XWIN_IMAGE'])
-            star_dict['Y'] = np.copy(star_cat.get_data()['YWIN_IMAGE'])
-            star_dict['RA'] = np.copy(star_cat.get_data()['XWIN_WORLD'])
-            star_dict['DEC'] = np.copy(star_cat.get_data()['YWIN_WORLD'])
-            star_dict['MAG'] = np.copy(star_cat.get_data()['MAG_AUTO'])
-            star_dict['SNR'] = np.copy(star_cat.get_data()['SNR_WIN'])
+            star_vign = np.copy(star_cat.get_data()["VIGNET"])
+            star_dict["NUMBER"] = np.copy(star_cat.get_data()["NUMBER"])
+            star_dict["X"] = np.copy(star_cat.get_data()["XWIN_IMAGE"])
+            star_dict["Y"] = np.copy(star_cat.get_data()["YWIN_IMAGE"])
+            star_dict["RA"] = np.copy(star_cat.get_data()["XWIN_WORLD"])
+            star_dict["DEC"] = np.copy(star_cat.get_data()["YWIN_WORLD"])
+            star_dict["MAG"] = np.copy(star_cat.get_data()["MAG_AUTO"])
+            star_dict["SNR"] = np.copy(star_cat.get_data()["SNR_WIN"])
             star_cat.close()
 
             self._get_psfshapes()
@@ -422,7 +431,7 @@ def _get_starshapes(self, star_vign):
 
         """
         if import_fail:
-            raise ImportError('Galsim is required to get shapes information')
+            raise ImportError("Galsim is required to get shapes information")
 
         masks = np.zeros_like(star_vign)
         masks[np.where(star_vign == -1e30)] = 1
@@ -432,15 +441,17 @@ def _get_starshapes(self, star_vign):
             for star, mask in zip(star_vign, masks)
         ]
 
-        self.star_shapes = np.array([
+        self.star_shapes = np.array(
             [
-                moms.observed_shape.g1,
-                moms.observed_shape.g2,
-                moms.moments_sigma,
-                int(bool(moms.error_message))
+                [
+                    moms.observed_shape.g1,
+                    moms.observed_shape.g2,
+                    moms.moments_sigma,
+                    int(bool(moms.error_message)),
+                ]
+                for moms in star_moms
             ]
-            for moms in star_moms
-        ])
+        )
 
     def _get_psfexcatdict(self, psfex_cat_path):
         """Get PSFEx Catalogue Dictionary.
@@ -462,18 +473,16 @@ def _get_psfexcatdict(self, psfex_cat_path):
         psfex_cat.open()
 
         psfex_cat_dict = {}
-        psfex_cat_dict['SOURCE_NUMBER'] = np.copy(
-            psfex_cat.get_data()['SOURCE_NUMBER']
-        )
-        psfex_cat_dict['DELTAX_IMAGE'] = np.copy(
-            psfex_cat.get_data()['DELTAX_IMAGE']
+        psfex_cat_dict["SOURCE_NUMBER"] = np.copy(
+            psfex_cat.get_data()["SOURCE_NUMBER"]
         )
-        psfex_cat_dict['DELTAY_IMAGE'] = np.copy(
-            psfex_cat.get_data()['DELTAY_IMAGE']
+        psfex_cat_dict["DELTAX_IMAGE"] = np.copy(
+            psfex_cat.get_data()["DELTAX_IMAGE"]
         )
-        psfex_cat_dict['CHI2_PSF'] = np.copy(
-            psfex_cat.get_data()['CHI2_PSF']
+        psfex_cat_dict["DELTAY_IMAGE"] = np.copy(
+            psfex_cat.get_data()["DELTAY_IMAGE"]
         )
+        psfex_cat_dict["CHI2_PSF"] = np.copy(psfex_cat.get_data()["CHI2_PSF"])
 
         return psfex_cat_dict
 
@@ -491,29 +500,29 @@ def _write_output_validation(self, star_dict, psfex_cat_dict):
 
         """
         output = file_io.FITSCatalogue(
-            self._output_path_validation + self._img_number + '.fits',
+            self._output_path_validation + self._img_number + ".fits",
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
             SEx_catalogue=True,
         )
 
         data = {
-            'E1_PSF_HSM': self.psf_shapes[:, 0],
-            'E2_PSF_HSM': self.psf_shapes[:, 1],
-            'SIGMA_PSF_HSM': self.psf_shapes[:, 2],
-            'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int),
-            'E1_STAR_HSM': self.star_shapes[:, 0],
-            'E2_STAR_HSM': self.star_shapes[:, 1],
-            'SIGMA_STAR_HSM': self.star_shapes[:, 2],
-            'FLAG_STAR_HSM': self.star_shapes[:, 3].astype(int)
+            "E1_PSF_HSM": self.psf_shapes[:, 0],
+            "E2_PSF_HSM": self.psf_shapes[:, 1],
+            "SIGMA_PSF_HSM": self.psf_shapes[:, 2],
+            "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int),
+            "E1_STAR_HSM": self.star_shapes[:, 0],
+            "E2_STAR_HSM": self.star_shapes[:, 1],
+            "SIGMA_STAR_HSM": self.star_shapes[:, 2],
+            "FLAG_STAR_HSM": self.star_shapes[:, 3].astype(int),
         }
         data = {**data, **star_dict}
 
-        data['ACCEPTED'] = np.ones_like(data['NUMBER'], dtype='int16')
-        star_used = psfex_cat_dict.pop('SOURCE_NUMBER')
+        data["ACCEPTED"] = np.ones_like(data["NUMBER"], dtype="int16")
+        star_used = psfex_cat_dict.pop("SOURCE_NUMBER")
 
-        for idx in range(len(data['NUMBER'])):
+        for idx in range(len(data["NUMBER"])):
             if idx + 1 not in star_used:
-                data['ACCEPTED'][idx] = 0
+                data["ACCEPTED"][idx] = 0
 
         output.save_as_fits(data, sex_cat_path=self._galcat_path)
 
@@ -532,11 +541,8 @@ def process_me(self, dot_psf_dirs, dot_psf_pattern, f_wcs_path):
             Path to the log file containing the WCS for each CCDs
 
         """
-        if not any(
-             os.path.exists(dot_psf_dir)
-             for dot_psf_dir in dot_psf_dirs
-        ):
-            raise ValueError('Cound not find any dot psf directory.')
+        if not any(os.path.exists(dot_psf_dir) for dot_psf_dir in dot_psf_dirs):
+            raise ValueError("Cound not find any dot psf directory.")
 
         self._dot_psf_dirs = dot_psf_dirs
 
@@ -545,7 +551,7 @@ def process_me(self, dot_psf_dirs, dot_psf_pattern, f_wcs_path):
         if os.path.isfile(f_wcs_path):
             self._f_wcs_file = SqliteDict(f_wcs_path)
         else:
-            raise ValueError(f'Cound not find file {f_wcs_path}.')
+            raise ValueError(f"Cound not find file {f_wcs_path}.")
 
         if self.gal_pos is None:
             self._get_galaxy_positions()
@@ -574,27 +580,28 @@ def _interpolate_me(self):
         cat = file_io.FITSCatalogue(self._galcat_path, SEx_catalogue=True)
         cat.open()
 
-        all_id = np.copy(cat.get_data()['NUMBER'])
-        key_ne = 'N_EPOCH'
+        all_id = np.copy(cat.get_data()["NUMBER"])
+        key_ne = "N_EPOCH"
         if key_ne not in cat.get_data().dtype.names:
             raise KeyError(
-                f'Key {key_ne} not found in input galaxy catalogue'
-                + f' {self._galcat_path}, needed for'
-                + ' PSF interpolation to multi-epoch data; run previous module'
-                + ' (SExtractor) in multi-epoch mode'
+                f"Key {key_ne} not found in input galaxy catalogue"
+                + f" {self._galcat_path}, needed for"
+                + " PSF interpolation to multi-epoch data; run previous module"
+                + " (SExtractor) in multi-epoch mode"
             )
         n_epoch = np.copy(cat.get_data()[key_ne])
 
         list_ext_name = cat.get_ext_name()
         hdu_ind = [
-            idx for idx in range(len(list_ext_name))
-            if 'EPOCH' in list_ext_name[idx]
+            idx
+            for idx in range(len(list_ext_name))
+            if "EPOCH" in list_ext_name[idx]
         ]
 
         final_list = []
         for hdu_index in hdu_ind:
-            exp_name = cat.get_data(hdu_index)['EXP_NAME'][0]
-            ccd_list = list(set(cat.get_data(hdu_index)['CCD_N']))
+            exp_name = cat.get_data(hdu_index)["EXP_NAME"][0]
+            ccd_list = list(set(cat.get_data(hdu_index)["CCD_N"]))
             array_psf = None
             array_id = None
             array_shape = None
@@ -605,8 +612,8 @@ def _interpolate_me(self):
                 found = False
                 for dot_psf_dir in self._dot_psf_dirs:
                     dot_psf_path = (
-                        f'{dot_psf_dir}/{self._dot_psf_pattern}-{exp_name}'
-                        + f'-{ccd}.psf'
+                        f"{dot_psf_dir}/{self._dot_psf_pattern}-{exp_name}"
+                        + f"-{ccd}.psf"
                     )
                     if os.path.exists(dot_psf_path):
                         found = True
@@ -618,10 +625,10 @@ def _interpolate_me(self):
                     )
                     continue
 
-                ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0]
+                ind_obj = np.where(cat.get_data(hdu_index)["CCD_N"] == ccd)[0]
                 obj_id = all_id[ind_obj]
                 gal_pos = np.array(
-                    self._f_wcs_file[exp_name][ccd]['WCS'].all_world2pix(
+                    self._f_wcs_file[exp_name][ccd]["WCS"].all_world2pix(
                         self.gal_pos[:, 0][ind_obj],
                         self.gal_pos[:, 1][ind_obj],
                         0,
@@ -638,9 +645,9 @@ def _interpolate_me(self):
                     and self.interp_PSFs == NOT_ENOUGH_STARS
                 ):
                     self._w_log.info(
-                        f'Not enough stars found on ccd {ccd} of '
-                        + f'exposure {exp_name}. Object inside this ccd will '
-                        + 'lose an epoch.'
+                        f"Not enough stars found on ccd {ccd} of "
+                        + f"exposure {exp_name}. Object inside this ccd will "
+                        + "lose an epoch."
                     )
                     continue
                 if (
@@ -648,9 +655,9 @@ def _interpolate_me(self):
                     and self.interp_PSFs == BAD_CHI2
                 ):
                     self._w_log.info(
-                        f'Bad chi2 for the psf model in the ccd {ccd} of the '
-                        + f'exposure {exp_name}. Object inside this ccd will '
-                        + 'lose an epoch.'
+                        f"Bad chi2 for the psf model in the ccd {ccd} of the "
+                        + f"exposure {exp_name}. Object inside this ccd will "
+                        + "lose an epoch."
                     )
                     continue
                 if (
@@ -658,8 +665,8 @@ def _interpolate_me(self):
                     and self.interp_PSFs == FILE_NOT_FOUND
                 ):
                     self._w_log.info(
-                        f'Psf model file {dot_psf_path} not found. '
-                        + 'Object inside this ccd will lose an epoch.'
+                        f"Psf model file {dot_psf_path} not found. "
+                        + "Object inside this ccd will lose an epoch."
                     )
                     continue
 
@@ -680,16 +687,18 @@ def _interpolate_me(self):
                     if array_shape is None:
                         array_shape = np.copy(self.psf_shapes)
                     else:
-                        array_shape = np.concatenate((
-                            array_shape,
-                            np.copy(self.psf_shapes),
-                        ))
+                        array_shape = np.concatenate(
+                            (
+                                array_shape,
+                                np.copy(self.psf_shapes),
+                            )
+                        )
                 else:
                     array_shape = None
 
-                exp_name_tmp = np.array([
-                    exp_name + '-' + str(ccd) for _ in range(len(obj_id))
-                ])
+                exp_name_tmp = np.array(
+                    [exp_name + "-" + str(ccd) for _ in range(len(obj_id))]
+                )
                 if array_exp_name is None:
                     array_exp_name = exp_name_tmp
                 else:
@@ -697,12 +706,9 @@ def _interpolate_me(self):
                         (array_exp_name, exp_name_tmp)
                     )
 
-            final_list.append([
-                array_id,
-                array_psf,
-                array_shape,
-                array_exp_name
-            ])
+            final_list.append(
+                [array_id, array_psf, array_shape, array_exp_name]
+            )
 
         self._f_wcs_file.close()
         cat.close()
@@ -714,34 +720,34 @@ def _interpolate_me(self):
             counter = 0
             for j in range(len(final_list)):
                 where_res = np.where(final_list[j][0] == id_tmp)[0]
-                if (len(where_res) != 0):
+                if len(where_res) != 0:
                     output_dict[id_tmp][final_list[j][3][where_res[0]]] = {}
-                    output_dict[id_tmp][
-                        final_list[j][3][where_res[0]]
-                    ]['VIGNET'] = final_list[j][1][where_res[0]]
+                    output_dict[id_tmp][final_list[j][3][where_res[0]]][
+                        "VIGNET"
+                    ] = final_list[j][1][where_res[0]]
                     if self._compute_shape:
                         shape_dict = {}
-                        shape_dict['E1_PSF_HSM'] = (
-                            final_list[j][2][where_res[0]][0]
-                        )
-                        shape_dict['E2_PSF_HSM'] = (
-                            final_list[j][2][where_res[0]][1]
-                        )
-                        shape_dict['SIGMA_PSF_HSM'] = (
-                            final_list[j][2][where_res[0]][2]
-                        )
-                        shape_dict['FLAG_PSF_HSM'] = (
-                            final_list[j][2][where_res[0]][3]
-                        )
-                        output_dict[id_tmp][
-                            final_list[j][3][where_res[0]]
-                        ]['SHAPES'] = shape_dict
+                        shape_dict["E1_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][0]
+                        shape_dict["E2_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][1]
+                        shape_dict["SIGMA_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][2]
+                        shape_dict["FLAG_PSF_HSM"] = final_list[j][2][
+                            where_res[0]
+                        ][3]
+                        output_dict[id_tmp][final_list[j][3][where_res[0]]][
+                            "SHAPES"
+                        ] = shape_dict
                     counter += 1
             if counter == 0:
-                output_dict[id_tmp] = 'empty'
+                output_dict[id_tmp] = "empty"
                 n_empty += 1
 
-        self._w_log.info(f'{n_empty}/{len(all_id)} PSFs are empty')
+        self._w_log.info(f"{n_empty}/{len(all_id)} PSFs are empty")
 
         return output_dict
 
@@ -757,7 +763,7 @@ def _write_output_me(self, output_dict):
 
         """
         output_file = SqliteDict(
-            self._output_path + self._img_number + '.sqlite'
+            self._output_path + self._img_number + ".sqlite"
         )
         for idx in output_dict.keys():
             output_file[str(idx)] = output_dict[idx]
diff --git a/shapepipe/modules/psfex_interp_runner.py b/shapepipe/modules/psfex_interp_runner.py
index e9c0cca54..55d8d73c1 100644
--- a/shapepipe/modules/psfex_interp_runner.py
+++ b/shapepipe/modules/psfex_interp_runner.py
@@ -13,11 +13,11 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module=['psfex_runner', 'setools_runner'],
-    file_pattern=['star_selection', 'galaxy_selection'],
-    file_ext=['.psf', '.fits'],
-    depends=['numpy', 'astropy', 'galsim', 'sqlitedict'],
+    version="1.1",
+    input_module=["psfex_runner", "setools_runner"],
+    file_pattern=["star_selection", "galaxy_selection"],
+    file_ext=[".psf", ".fits"],
+    depends=["numpy", "astropy", "galsim", "sqlitedict"],
 )
 def psfex_interp_runner(
     input_file_list,
@@ -29,15 +29,15 @@ def psfex_interp_runner(
 ):
     """Define The PSFEx Interpolation Runner."""
     # Fetch interpolation run mode
-    mode = config.get(module_config_sec, 'MODE')
+    mode = config.get(module_config_sec, "MODE")
     # Fetch parameter values
-    pos_params = config.getlist(module_config_sec, 'POSITION_PARAMS')
-    get_shapes = config.getboolean(module_config_sec, 'GET_SHAPES')
-    star_thresh = config.getint(module_config_sec, 'STAR_THRESH')
-    chi2_thresh = config.getint(module_config_sec, 'CHI2_THRESH')
+    pos_params = config.getlist(module_config_sec, "POSITION_PARAMS")
+    get_shapes = config.getboolean(module_config_sec, "GET_SHAPES")
+    star_thresh = config.getint(module_config_sec, "STAR_THRESH")
+    chi2_thresh = config.getint(module_config_sec, "CHI2_THRESH")
 
     # Run in CLASSIC mode
-    if mode == 'CLASSIC':
+    if mode == "CLASSIC":
 
         # Set input paths
         psfcat_path, galcat_path = input_file_list
@@ -46,7 +46,7 @@ def psfex_interp_runner(
         pi_inst = psfex_interp.PSFExInterpolator(
             psfcat_path,
             galcat_path,
-            run_dirs['output'],
+            run_dirs["output"],
             file_number_string,
             w_log,
             pos_params,
@@ -59,28 +59,29 @@ def psfex_interp_runner(
         pi_inst.process()
 
     # Run in MULTI-EPOCH mode
-    elif mode == 'MULTI-EPOCH':
+    elif mode == "MULTI-EPOCH":
 
         # Fetch multi-epoch parameters
         module = config.getexpanded(
             module_config_sec,
-            'ME_DOT_PSF_DIR',
+            "ME_DOT_PSF_DIR",
         )
         module_name = module.split(":")[-1]
         if "last" in module:
-            dot_psf_dirs = [get_last_dir(run_dirs['run_log'], module_name)]
+            dot_psf_dirs = [get_last_dir(run_dirs["run_log"], module_name)]
         elif "all" in module:
             dot_psf_dirs = get_all_dirs(run_dirs["run_log"], module_name)
         else:
             raise ValueError(
                 "Expected qualifier 'last:' or 'all' before module"
-               + f" '{module}' in config entry 'ME_DOT_PSF_DIR'")
+                + f" '{module}' in config entry 'ME_DOT_PSF_DIR'"
+            )
 
         dot_psf_pattern = config.get(
             module_config_sec,
-            'ME_DOT_PSF_PATTERN',
+            "ME_DOT_PSF_PATTERN",
         )
-        f_wcs_path = config.getexpanded(module_config_sec, 'ME_LOG_WCS')
+        f_wcs_path = config.getexpanded(module_config_sec, "ME_LOG_WCS")
 
         # Set input paths
         galcat_path = input_file_list[0]
@@ -89,7 +90,7 @@ def psfex_interp_runner(
         psfex_interp_inst = psfex_interp.PSFExInterpolator(
             None,
             galcat_path,
-            run_dirs['output'],
+            run_dirs["output"],
             file_number_string,
             w_log,
             pos_params,
@@ -102,7 +103,7 @@ def psfex_interp_runner(
         psfex_interp_inst.process_me(dot_psf_dirs, dot_psf_pattern, f_wcs_path)
 
     # Run in VALIDATION mode
-    elif mode == 'VALIDATION':
+    elif mode == "VALIDATION":
 
         # Set input paths
         psfcat_path, galcat_path, psfex_cat_path = input_file_list
@@ -111,7 +112,7 @@ def psfex_interp_runner(
         psfex_interp_inst = psfex_interp.PSFExInterpolator(
             psfcat_path,
             galcat_path,
-            run_dirs['output'],
+            run_dirs["output"],
             file_number_string,
             w_log,
             pos_params,
@@ -125,7 +126,7 @@ def psfex_interp_runner(
 
     else:
         # Raise error for invalid run mode
-        ValueError('MODE has to be in : [CLASSIC, MULTI-EPOCH, VALIDATION]')
+        ValueError("MODE has to be in : [CLASSIC, MULTI-EPOCH, VALIDATION]")
 
     # No return objects
     return None, None
diff --git a/shapepipe/modules/psfex_package/__init__.py b/shapepipe/modules/psfex_package/__init__.py
index 81cdd2e69..63e7590d0 100644
--- a/shapepipe/modules/psfex_package/__init__.py
+++ b/shapepipe/modules/psfex_package/__init__.py
@@ -35,4 +35,4 @@
 
 """
 
-__all__ = ['psfex_script']
+__all__ = ["psfex_script"]
diff --git a/shapepipe/modules/psfex_package/psfex_script.py b/shapepipe/modules/psfex_package/psfex_script.py
index 7e8866426..bde7b4a5d 100644
--- a/shapepipe/modules/psfex_package/psfex_script.py
+++ b/shapepipe/modules/psfex_package/psfex_script.py
@@ -39,7 +39,7 @@ def __init__(
         psfex_config_file,
         output_dir,
         outcatalog_name,
-        check_image_list
+        check_image_list,
     ):
         self.psfex_executable_path = psfex_executable_path
         self.input_file_path = input_file_path
@@ -61,19 +61,16 @@ def generate_command(self):
         """
         # Prepare command line
         command_line = (
-            f'{self.psfex_executable_path} '
-            + f'{self.input_file_path} '
-            + f'-c {self.psfex_config_file} '
-            + f'-PSF_DIR {self.output_dir} '
-            + f'-OUTCAT_NAME {self.outcatalog_name}'
+            f"{self.psfex_executable_path} "
+            + f"{self.input_file_path} "
+            + f"-c {self.psfex_config_file} "
+            + f"-PSF_DIR {self.output_dir} "
+            + f"-OUTCAT_NAME {self.outcatalog_name}"
         )
 
-        if (
-            (len(self.check_image_list) == 1)
-            & (self.check_image_list[0] == '')
-        ):
-            check_type_list = ['NONE']
-            check_name_list = ['none']
+        if (len(self.check_image_list) == 1) & (self.check_image_list[0] == ""):
+            check_type_list = ["NONE"]
+            check_name_list = ["none"]
         else:
             # Get pattern for filenaming from file in list
             input_file_name = os.path.split(input_file_path)[-1]
@@ -85,10 +82,10 @@ def generate_command(self):
             for check_image in self.check_image_list:
                 check_type_list.append(check_image.upper())
                 check_name_list.append(
-                    f'{output_dir}'
-                    + f'/{suffix}'
-                    + f'{check_image.lower()}'
-                    + f'{file_number_string}.fits'
+                    f"{output_dir}"
+                    + f"/{suffix}"
+                    + f"{check_image.lower()}"
+                    + f"{file_number_string}.fits"
                 )
 
         # Add checks to command line
@@ -120,11 +117,11 @@ def parse_errors(stderr, stdout):
             Updated standard output and error
 
         """
-        check_error = re.findall('error', stdout.lower())
-        check_error2 = re.findall('all done', stdout.lower())
+        check_error = re.findall("error", stdout.lower())
+        check_error2 = re.findall("all done", stdout.lower())
 
         if check_error == []:
-            stderr2 = ''
+            stderr2 = ""
         else:
             stderr2 = stdout
 
diff --git a/shapepipe/modules/psfex_runner.py b/shapepipe/modules/psfex_runner.py
index 0398c46c8..d9c515e58 100644
--- a/shapepipe/modules/psfex_runner.py
+++ b/shapepipe/modules/psfex_runner.py
@@ -12,45 +12,41 @@
 
 
 @module_runner(
-    input_module='setools_runner',
-    version='1.0',
-    file_pattern=['star_selection'],
-    file_ext=['.fits'],
-    executes='psfex',
+    input_module="setools_runner",
+    version="1.0",
+    file_pattern=["star_selection"],
+    file_ext=[".fits"],
+    executes="psfex",
 )
 def psfex_runner(
-        input_file_list,
-        run_dirs,
-        file_number_string,
-        config,
-        module_config_sec,
-        w_log,
+    input_file_list,
+    run_dirs,
+    file_number_string,
+    config,
+    module_config_sec,
+    w_log,
 ):
     """Define The PSFEx Runner."""
     # Extract psfex run configurations
-    if config.has_option(module_config_sec, 'EXEC_PATH'):
+    if config.has_option(module_config_sec, "EXEC_PATH"):
         psfex_executable_path = config.getexpanded(
-            module_config_sec,
-            'EXEC_PATH'
+            module_config_sec, "EXEC_PATH"
         )
     else:
-        psfex_executable_path = 'psfex'
-    output_dir = run_dirs['output']
+        psfex_executable_path = "psfex"
+    output_dir = run_dirs["output"]
 
-    outcatalog_name = f'{output_dir}/psfex_cat{file_number_string}.cat'
+    outcatalog_name = f"{output_dir}/psfex_cat{file_number_string}.cat"
 
-    psfex_config_file = config.getexpanded(
-        module_config_sec,
-        'DOT_PSFEX_FILE'
-    )
+    psfex_config_file = config.getexpanded(module_config_sec, "DOT_PSFEX_FILE")
 
     input_file_path = input_file_list[0]
 
     # Check image options
-    if config.has_option(module_config_sec, 'CHECKIMAGE'):
-        check_image_list = config.getlist(module_config_sec, 'CHECKIMAGE')
+    if config.has_option(module_config_sec, "CHECKIMAGE"):
+        check_image_list = config.getlist(module_config_sec, "CHECKIMAGE")
     else:
-        check_image_list = ['']
+        check_image_list = [""]
 
     # Create psfex caller class instance
     psfex_inst = PSFExCaller(
@@ -64,7 +60,7 @@ def psfex_runner(
 
     # Generate psfex command line
     command_line = psfex_inst.generate_command()
-    w_log.info(f'Running command \'{command_line}\'')
+    w_log.info(f"Running command '{command_line}'")
 
     # Execute command line
     stderr, stdout = execute(command_line)
diff --git a/shapepipe/modules/python_example_package/__init__.py b/shapepipe/modules/python_example_package/__init__.py
index ecc47860d..41bce721e 100644
--- a/shapepipe/modules/python_example_package/__init__.py
+++ b/shapepipe/modules/python_example_package/__init__.py
@@ -27,4 +27,4 @@
 
 """
 
-__all__ = ['python_example']
+__all__ = ["python_example"]
diff --git a/shapepipe/modules/python_example_package/python_example.py b/shapepipe/modules/python_example_package/python_example.py
index d9ea2a22c..5bbe9a968 100644
--- a/shapepipe/modules/python_example_package/python_example.py
+++ b/shapepipe/modules/python_example_package/python_example.py
@@ -60,7 +60,7 @@ def _read_file(self, file_name):
 
         """
         with open(file_name) as data_file:
-            content = data_file.read().replace('\n', '')
+            content = data_file.read().replace("\n", "")
 
         return content
 
@@ -81,7 +81,7 @@ def read_files(self, file_name1, file_name2):
         content1 = self._read_file(file_name1)
         content2 = self._read_file(file_name2)
 
-        self.content = f'{content1} and {content2}'
+        self.content = f"{content1} and {content2}"
 
     def write_file(self, file_name, message):
         """Write File.
@@ -98,6 +98,6 @@ def write_file(self, file_name, message):
         """
         new_content = message + str(self.content)
 
-        text_file = open(file_name, 'w')
+        text_file = open(file_name, "w")
         text_file.write(new_content)
         text_file.close()
diff --git a/shapepipe/modules/python_example_runner.py b/shapepipe/modules/python_example_runner.py
index d468c10e0..f5016f08a 100644
--- a/shapepipe/modules/python_example_runner.py
+++ b/shapepipe/modules/python_example_runner.py
@@ -11,25 +11,25 @@
 
 
 @module_runner(
-    version='1.1',
-    file_pattern=['numbers', 'letters'],
-    file_ext='.txt',
+    version="1.1",
+    file_pattern=["numbers", "letters"],
+    file_ext=".txt",
     depends=[
-        'numpy',
-        'astropy',
-        'galsim',
-        'joblib',
-        'mccd',
-        'ngmix',
-        'pandas',
-        'pysap',
-        'scipy',
-        'sf_tools',
-        'sip_tpv',
-        'sqlitedict',
-        'treecorr',
+        "numpy",
+        "astropy",
+        "galsim",
+        "joblib",
+        "mccd",
+        "ngmix",
+        "pandas",
+        "pysap",
+        "scipy",
+        "sf_tools",
+        "sip_tpv",
+        "sqlitedict",
+        "treecorr",
     ],
-    run_method='parallel',
+    run_method="parallel",
 )
 def python_example_runner(
     input_file_list,
@@ -46,7 +46,7 @@ def python_example_runner(
     )
 
     # Retrieve log message from config file
-    message = config.get(module_config_sec, 'MESSAGE')
+    message = config.get(module_config_sec, "MESSAGE")
 
     # Create an instance of the Python example class
     py_ex_inst = python_example.PythonExample(0)
diff --git a/shapepipe/modules/random_cat_package/__init__.py b/shapepipe/modules/random_cat_package/__init__.py
index b3a1cf21e..32c6f64b2 100644
--- a/shapepipe/modules/random_cat_package/__init__.py
+++ b/shapepipe/modules/random_cat_package/__init__.py
@@ -34,4 +34,4 @@
 
 """
 
-__all__ = ['random_cat.py']
+__all__ = ["random_cat.py"]
diff --git a/shapepipe/modules/random_cat_package/random_cat.py b/shapepipe/modules/random_cat_package/random_cat.py
index 3bdb6ba6d..feb69ff90 100644
--- a/shapepipe/modules/random_cat_package/random_cat.py
+++ b/shapepipe/modules/random_cat_package/random_cat.py
@@ -22,7 +22,7 @@
 from shapepipe.utilities import cfis
 
 
-class RandomCat():
+class RandomCat:
     """Random Catalogue.
 
     This class creates a random catalogue given a mask FITS file.
@@ -90,24 +90,24 @@ def save_as_healpix(self, mask, header):
             return
 
         # Tranform config entry from str to int
-        nside = int(self._healpix_options['NSIDE'])
+        nside = int(self._healpix_options["NSIDE"])
 
         mask_1d, footprint = reproject_to_healpix(
             (mask, header),
-            'galactic',
+            "galactic",
             nside=nside,
         )
 
         t = Table()
-        t['flux'] = mask_1d
-        t.meta['ORDERING'] = 'RING'
-        t.meta['COORDSYS'] = 'G'
-        t.meta['NSIDE'] = nside
-        t.meta['INDXSCHM'] = 'IMPLICIT'
+        t["flux"] = mask_1d
+        t.meta["ORDERING"] = "RING"
+        t.meta["COORDSYS"] = "G"
+        t.meta["NSIDE"] = nside
+        t.meta["INDXSCHM"] = "IMPLICIT"
 
         output_path = (
             f'{self._output_dir}/{self._healpix_options["FILE_BASE"]}-'
-            + f'{self._file_number_string}.fits'
+            + f"{self._file_number_string}.fits"
         )
         t.write(output_path)
 
@@ -174,14 +174,14 @@ def process(self):
             # Check that a reasonably large number of pixels is not masked
             if n_unmasked < n_obj:
                 raise ValueError(
-                    f'Number of un-masked pixels {n_unmasked} is smaller '
-                    + f'than number of random objects requested {n_obj}'
+                    f"Number of un-masked pixels {n_unmasked} is smaller "
+                    + f"than number of random objects requested {n_obj}"
                 )
 
         else:
             n_obj = 0
 
-        self._w_log.info(f'Creating {n_obj} random objects')
+        self._w_log.info(f"Creating {n_obj} random objects")
 
         # Draw points until n are in mask
         n_found = 0
@@ -213,35 +213,28 @@ def process(self):
 
         # Tile ID
         output_path = (
-            f'{self._output_dir}/{self._output_file_pattern}-'
-            + f'{self._file_number_string}.fits'
+            f"{self._output_dir}/{self._output_file_pattern}-"
+            + f"{self._file_number_string}.fits"
         )
         file_name = os.path.split(output_path)[1]
         file_base = os.path.splitext(file_name)[0]
-        tile_ID_str = re.split('-', file_base)[1:]
-        tile_id = float('.'.join(tile_ID_str))
+        tile_ID_str = re.split("-", file_base)[1:]
+        tile_id = float(".".join(tile_ID_str))
         tile_id_array = np.ones(n_obj) * tile_id
 
         # Write to output
-        cat_out = [
-            ra_rand,
-            dec_rand,
-            x_rand,
-            y_rand,
-            tile_id_array
-        ]
-        column_names = ['RA', 'DEC', 'x', 'y', 'TILE_ID']
+        cat_out = [ra_rand, dec_rand, x_rand, y_rand, tile_id_array]
+        column_names = ["RA", "DEC", "x", "y", "TILE_ID"]
 
         # TODO: Add units to header
         output = file_io.FITSCatalogue(
-            output_path,
-            open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
+            output_path, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
         )
         output.save_as_fits(cat_out, names=column_names)
 
         # Write area information to log file
-        self._w_log.info(f'Total area = {area_deg2:.4f} deg^2')
-        self._w_log.info(f'Unmasked area = {area_deg2_eff:.4f} deg^2')
+        self._w_log.info(f"Total area = {area_deg2:.4f} deg^2")
+        self._w_log.info(f"Unmasked area = {area_deg2_eff:.4f} deg^2")
         self._w_log.info(
-            f'Ratio masked to total pixels = {n_unmasked / n_pix:.3f}'
+            f"Ratio masked to total pixels = {n_unmasked / n_pix:.3f}"
         )
diff --git a/shapepipe/modules/random_cat_runner.py b/shapepipe/modules/random_cat_runner.py
index 5595a53ad..665792fec 100644
--- a/shapepipe/modules/random_cat_runner.py
+++ b/shapepipe/modules/random_cat_runner.py
@@ -11,11 +11,11 @@
 
 
 @module_runner(
-    version='1.1',
-    file_pattern=['image', 'pipeline_flag'],
-    file_ext=['.fits', 'fits'],
-    depends=['astropy'],
-    numbering_scheme='_0',
+    version="1.1",
+    file_pattern=["image", "pipeline_flag"],
+    file_ext=[".fits", "fits"],
+    depends=["astropy"],
+    numbering_scheme="_0",
 )
 def random_cat_runner(
     input_file_list,
@@ -31,42 +31,39 @@ def random_cat_runner(
     input_mask_name = input_file_list[1]
 
     # Set output file name
-    if config.has_option(module_config_sec, 'OUTPUT_FILE_PATTERN'):
+    if config.has_option(module_config_sec, "OUTPUT_FILE_PATTERN"):
         output_file_pattern = config.get(
-            module_config_sec,
-            'OUTPUT_FILE_PATTERN'
+            module_config_sec, "OUTPUT_FILE_PATTERN"
         )
     else:
-        output_file_pattern = 'random_cat'
+        output_file_pattern = "random_cat"
 
     # Get number of random objects requested on output
-    n_rand = config.getfloat(module_config_sec, 'N_RANDOM')
+    n_rand = config.getfloat(module_config_sec, "N_RANDOM")
 
     # Flag whether n_rand is total (DENSITY=False, default)
     # or per square degree (DENSITY=True)
-    if config.has_option(module_config_sec, 'DENSITY'):
-        density = config.getboolean(module_config_sec, 'DENSITY')
+    if config.has_option(module_config_sec, "DENSITY"):
+        density = config.getboolean(module_config_sec, "DENSITY")
     else:
         density = False
 
     # Get healpix output options
     save_mask_as_healpix = config.getboolean(
-        module_config_sec,
-        'SAVE_MASK_AS_HEALPIX'
+        module_config_sec, "SAVE_MASK_AS_HEALPIX"
     )
     if save_mask_as_healpix:
         healpix_options = {}
-        for option_trunc in ['FILE_BASE', 'NSIDE']:
-            option = f'HEALPIX_OUT_{option_trunc}'
+        for option_trunc in ["FILE_BASE", "NSIDE"]:
+            option = f"HEALPIX_OUT_{option_trunc}"
             healpix_options[option_trunc] = config.get(
-                module_config_sec,
-                option
+                module_config_sec, option
             )
     # Create rand cat class instance
     rand_cat_inst = RandomCat(
         input_image_name,
         input_mask_name,
-        run_dirs['output'],
+        run_dirs["output"],
         file_number_string,
         output_file_pattern,
         n_rand,
diff --git a/shapepipe/modules/serial_example_runner.py b/shapepipe/modules/serial_example_runner.py
index 3baced6ee..61cfc3edf 100644
--- a/shapepipe/modules/serial_example_runner.py
+++ b/shapepipe/modules/serial_example_runner.py
@@ -19,13 +19,13 @@ def __init__(self):
     def _read_file(self, file_name):
         """Read File."""
         with open(file_name) as data_file:
-            content = data_file.read().replace('\n', '')
+            content = data_file.read().replace("\n", "")
 
         return content
 
     def read_files(self, input_file_list):
         """Read Files."""
-        self.content = ''
+        self.content = ""
 
         for file_list in input_file_list:
             for file_name in file_list:
@@ -33,18 +33,18 @@ def read_files(self, input_file_list):
 
     def write_file(self, file_name):
         """Write Files."""
-        text_file = open(file_name, 'w')
+        text_file = open(file_name, "w")
         text_file.write(self.content)
         text_file.close()
 
 
 @module_runner(
-    version='1.1',
-    input_module='python_example_runner',
-    file_pattern=['numbers', 'letters', 'pyex_output'],
-    file_ext=['.txt', '.txt', '.cat'],
-    depends='numpy',
-    run_method='serial',
+    version="1.1",
+    input_module="python_example_runner",
+    file_pattern=["numbers", "letters", "pyex_output"],
+    file_ext=[".txt", ".txt", ".cat"],
+    depends="numpy",
+    run_method="serial",
 )
 def serial_example_runner(
     input_file_list,
diff --git a/shapepipe/modules/setools_package/__init__.py b/shapepipe/modules/setools_package/__init__.py
index 0414a9db7..502df0ae8 100644
--- a/shapepipe/modules/setools_package/__init__.py
+++ b/shapepipe/modules/setools_package/__init__.py
@@ -203,4 +203,4 @@
 
 """
 
-__all__ = ['setools']
+__all__ = ["setools"]
diff --git a/shapepipe/modules/setools_package/setools.py b/shapepipe/modules/setools_package/setools.py
index 3d4d3eb9b..a54ce8515 100644
--- a/shapepipe/modules/setools_package/setools.py
+++ b/shapepipe/modules/setools_package/setools.py
@@ -88,39 +88,39 @@ def process(self, w_log):
         if self._is_file:
             file_number = self._file_number_string
         else:
-            file_number = ''
+            file_number = ""
 
         self.read()
 
         # Processing: Create mask = filter input
         if len(self._mask) != 0:
-            direc = f'{self._output_dir}/mask'
+            direc = f"{self._output_dir}/mask"
             mkdir(direc)
             self._make_mask()
             for key in self.mask.keys():
-                if 'NO_SAVE' in self._mask[key]:
+                if "NO_SAVE" in self._mask[key]:
                     continue
-                file_name = f'{direc}/{key}{file_number}.fits'
+                file_name = f"{direc}/{key}{file_number}.fits"
                 self.save_mask(self.mask[key], file_name)
 
         if len(self._plot) != 0:
-            direc = f'{self._output_dir}/plot'
+            direc = f"{self._output_dir}/plot"
             mkdir(direc)
             self._make_plot()
             for key in self.plot.keys():
-                output_path = f'{direc}/{key}{file_number}'
+                output_path = f"{direc}/{key}{file_number}"
                 SEPlot(self.plot[key], self._data, output_path, self.mask)
 
         if len(self._new_cat) != 0:
-            direc = f'{self._output_dir}/new_cat'
+            direc = f"{self._output_dir}/new_cat"
             mkdir(direc)
             self._make_new_cat()
             for key in self.new_cat.keys():
-                file_name = f'{direc}/{key}{file_number}'
+                file_name = f"{direc}/{key}{file_number}"
                 self.save_new_cat(self.new_cat[key], file_name)
 
         if len(self._rand_split) != 0:
-            direc = f'{self._output_dir}/rand_split'
+            direc = f"{self._output_dir}/rand_split"
             mkdir(direc)
             self._make_rand_split()
 
@@ -134,12 +134,13 @@ def process(self, w_log):
                         empty_found = True
                 if empty_found:
                     w_log.info(
-                        'At least one random-split catalogue is empty, no '
-                        + 'random sub-samples written for sample_type='
-                        + f'{sample_type}')
+                        "At least one random-split catalogue is empty, no "
+                        + "random sub-samples written for sample_type="
+                        + f"{sample_type}"
+                    )
                     continue
 
-                output_dir = f'{direc}/{sample_type}_'
+                output_dir = f"{direc}/{sample_type}_"
                 self.save_rand_split(
                     self.rand_split[sample_type],
                     output_dir,
@@ -147,11 +148,11 @@ def process(self, w_log):
                 )
 
         if len(self._stat) != 0:
-            direc = f'{self._output_dir}/stat'
+            direc = f"{self._output_dir}/stat"
             mkdir(direc)
             self._make_stat()
             for key in self.stat.keys():
-                output_path = f'{direc}/{key}{file_number}.txt'
+                output_path = f"{direc}/{key}{file_number}.txt"
                 self.save_stat(self.stat[key], output_path)
 
     def read(self):
@@ -180,7 +181,7 @@ def read(self):
         while True:
             line_tmp = self._config_file.readline()
 
-            if line_tmp == '':
+            if line_tmp == "":
                 break
 
             line_tmp = self._clean_line(line_tmp)
@@ -192,49 +193,49 @@ def read(self):
             # [SECTION_TYPE:OBJECT_NAME], e.g.
             # [MASK:star_selection]
 
-            if (in_section != 0) & (re.split(r'\[', line_tmp)[0] == ''):
+            if (in_section != 0) & (re.split(r"\[", line_tmp)[0] == ""):
                 in_section = 0
             if not in_section:
-                if (re.split(r'\[', line_tmp)[0] != ''):
-                    raise RuntimeError('No section found')
+                if re.split(r"\[", line_tmp)[0] != "":
+                    raise RuntimeError("No section found")
 
-                sec = re.split(r'\[|\]', line_tmp)[1]
-                if re.split(':', sec)[0] == 'MASK':
+                sec = re.split(r"\[|\]", line_tmp)[1]
+                if re.split(":", sec)[0] == "MASK":
                     in_section = 1
                     try:
-                        mask_name = re.split(':', sec)[1]
+                        mask_name = re.split(":", sec)[1]
                     except Exception:
-                        mask_name = f'mask_{len(self._mask) + 1}'
+                        mask_name = f"mask_{len(self._mask) + 1}"
                     self._mask_key.append(mask_name)
                     self._mask[mask_name] = []
-                elif re.split(':', sec)[0] == 'PLOT':
+                elif re.split(":", sec)[0] == "PLOT":
                     in_section = 2
                     try:
-                        plot_name = re.split(':', sec)[1]
+                        plot_name = re.split(":", sec)[1]
                     except Exception:
-                        plot_name = f'plot_{len(self._plot) + 1}'
+                        plot_name = f"plot_{len(self._plot) + 1}"
                     self._plot[plot_name] = []
-                elif re.split(':', sec)[0] == 'STAT':
+                elif re.split(":", sec)[0] == "STAT":
                     in_section = 3
                     try:
-                        stat_name = re.split(':', sec)[1]
+                        stat_name = re.split(":", sec)[1]
                     except Exception:
-                        stat_name = f'stat_{len(self._stat) + 1}'
+                        stat_name = f"stat_{len(self._stat) + 1}"
                     self._stat[stat_name] = []
-                elif re.split(':', sec)[0] == 'NEW_CAT':
+                elif re.split(":", sec)[0] == "NEW_CAT":
                     in_section = 4
                     try:
-                        new_cat_name = re.split(':', sec)[1]
+                        new_cat_name = re.split(":", sec)[1]
                     except Exception:
-                        new_cat_name = f'new_cat_{len(self._new_cat) + 1}'
+                        new_cat_name = f"new_cat_{len(self._new_cat) + 1}"
                     self._new_cat[new_cat_name] = []
-                elif re.split(':', sec)[0] == 'RAND_SPLIT':
+                elif re.split(":", sec)[0] == "RAND_SPLIT":
                     in_section = 5
                     try:
-                        rand_split_name = re.split(':', sec)[1]
+                        rand_split_name = re.split(":", sec)[1]
                     except Exception:
                         rand_split_name = (
-                            f'rand_split_{len(self._rand_split) + 1}'
+                            f"rand_split_{len(self._rand_split) + 1}"
                         )
                     self._rand_split[rand_split_name] = []
                 else:
@@ -274,23 +275,23 @@ def _clean_line(self, line):
         """
         s = re.split('"', line)
         if len(s) == 3:
-            line_tmp = s[0].replace(' ', '') + s[1] + s[2].replace(' ', '')
+            line_tmp = s[0].replace(" ", "") + s[1] + s[2].replace(" ", "")
         else:
-            line_tmp = line.replace(' ', '')
+            line_tmp = line.replace(" ", "")
 
-        if re.split('#', line_tmp)[0] == '':
+        if re.split("#", line_tmp)[0] == "":
             return None
 
-        line_tmp = line_tmp.replace('\n', '')
-        line_tmp = line_tmp.replace('\t', '')
-        line_tmp = re.split('#', line_tmp)[0]
+        line_tmp = line_tmp.replace("\n", "")
+        line_tmp = line_tmp.replace("\t", "")
+        line_tmp = re.split("#", line_tmp)[0]
 
-        if line_tmp != '':
+        if line_tmp != "":
             return line_tmp
         else:
             return None
 
-    def save_mask(self, mask, output_path, ext_name='LDAC_OBJECTS'):
+    def save_mask(self, mask, output_path, ext_name="LDAC_OBJECTS"):
         """Save Mask.
 
         This function will apply a mask to the data and save them into a new
@@ -315,12 +316,12 @@ def save_mask(self, mask, output_path, ext_name='LDAC_OBJECTS'):
 
         """
         if mask is None:
-            raise ValueError('mask not provided')
+            raise ValueError("mask not provided")
         if len(mask) == 0:
             pass
 
         if output_path is None:
-            raise ValueError('output path not provided')
+            raise ValueError("output path not provided")
 
         mask_file = file_io.FITSCatalogue(
             output_path,
@@ -333,7 +334,7 @@ def save_mask(self, mask, output_path, ext_name='LDAC_OBJECTS'):
             sex_cat_path=self._cat_filepath,
         )
 
-    def save_new_cat(self, new_cat, output_path, ext_name='LDAC_OBJECTS'):
+    def save_new_cat(self, new_cat, output_path, ext_name="LDAC_OBJECTS"):
         """Save New Catalogue.
 
         This function creates a new catalogue with a specific format
@@ -357,19 +358,19 @@ def save_new_cat(self, new_cat, output_path, ext_name='LDAC_OBJECTS'):
 
         """
         try:
-            output_format = new_cat.pop('OUTPUT_FORMAT')
+            output_format = new_cat.pop("OUTPUT_FORMAT")
         except Exception:
-            raise ValueError('OUTPUT_FORMAT not provided')
+            raise ValueError("OUTPUT_FORMAT not provided")
 
-        if output_format == 'fits':
+        if output_format == "fits":
             new_file = file_io.FITSCatalogue(
-                output_path + '.fits',
+                output_path + ".fits",
                 open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
             )
             new_file.save_as_fits(data=new_cat, ext_name=ext_name)
-        elif output_format == 'SEx_cat':
+        elif output_format == "SEx_cat":
             new_file = file_io.FITSCatalogue(
-                output_path + '.fits',
+                output_path + ".fits",
                 open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
                 SEx_catalogue=(self._cat_filepath is not None),
             )
@@ -378,23 +379,23 @@ def save_new_cat(self, new_cat, output_path, ext_name='LDAC_OBJECTS'):
                 ext_name=ext_name,
                 sex_cat_path=self._cat_filepath,
             )
-        elif (output_format == 'txt') | (output_format == 'ascii'):
-            new_file = open(output_path + '.txt', 'w')
-            new_file.write('# HEADER\n')
-            new_file.write('# ')
+        elif (output_format == "txt") | (output_format == "ascii"):
+            new_file = open(output_path + ".txt", "w")
+            new_file.write("# HEADER\n")
+            new_file.write("# ")
             n_max = -1
             for key in new_cat.keys():
                 if len(new_cat[key]) > n_max:
                     n_max = len(new_cat[key])
-                new_file.write(f'{key}\t')
-            new_file.write('\n')
+                new_file.write(f"{key}\t")
+            new_file.write("\n")
             for idx in range(n_max):
                 for key in new_cat.keys():
                     try:
-                        new_file.write(f'{new_cat[key][idx]}\t')
+                        new_file.write(f"{new_cat[key][idx]}\t")
                     except Exception:
-                        new_file.write('\t')
-                new_file.write('\n')
+                        new_file.write("\t")
+                new_file.write("\n")
             new_file.close()
         else:
             raise ValueError("Format should be in ['fits', 'SEx_cat', 'txt']")
@@ -404,7 +405,7 @@ def save_rand_split(
         rand_split,
         output_path,
         file_number,
-        ext_name='LDAC_OBJECTS',
+        ext_name="LDAC_OBJECTS",
     ):
         """Save Random Split Catalogues.
 
@@ -432,18 +433,18 @@ def save_rand_split(
 
         """
         if rand_split is None:
-            raise ValueError('rand_split not provided')
+            raise ValueError("rand_split not provided")
         if output_path is None:
-            raise ValueError('output path not provided')
+            raise ValueError("output path not provided")
         if file_number is None:
-            raise ValueError('file_number path not provided')
+            raise ValueError("file_number path not provided")
 
-        mask = rand_split.pop('mask')
+        mask = rand_split.pop("mask")
         data = self._data[mask]
 
         for idx in rand_split.keys():
             rand_split_file = file_io.FITSCatalogue(
-                f'{output_path}{idx}{file_number}.fits',
+                f"{output_path}{idx}{file_number}.fits",
                 open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
                 SEx_catalogue=(self._cat_filepath is not None),
             )
@@ -474,15 +475,15 @@ def save_stat(self, stat, output_path):
 
         """
         if stat is None:
-            raise ValueError('stat not provided')
+            raise ValueError("stat not provided")
         if output_path is None:
-            raise ValueError('output path not provided')
+            raise ValueError("output path not provided")
 
-        file = open(output_path, 'w')
-        file.write('# Statistics\n')
+        file = open(output_path, "w")
+        file.write("# Statistics\n")
 
         for key in stat.keys():
-            file.write(f'{key} = {str(stat[key])}\n')
+            file.write(f"{key} = {str(stat[key])}\n")
 
         file.close()
 
@@ -507,8 +508,8 @@ def _make_mask(self):
             global_mask = np.ones(self._cat_size, dtype=bool)
             global_ind = np.where(global_mask)[0]
             for idx in self._mask[key]:
-                s = re.split('{|}', idx)
-                if s[0] == '':
+                s = re.split("{|}", idx)
+                if s[0] == "":
                     try:
                         global_mask &= self.mask[s[1]]
                         global_ind = np.where(global_mask)[0]
@@ -518,7 +519,7 @@ def _make_mask(self):
 
             mask_tmp = None
             for idx in self._mask[key]:
-                if idx == 'NO_SAVE':
+                if idx == "NO_SAVE":
                     continue
                 tmp = StrInterpreter(
                     idx,
@@ -556,23 +557,23 @@ def _make_plot(self):
         for key in self._plot.keys():
             self.plot[key] = {}
             for idx in self._plot[key]:
-                s = re.split('=', idx)
+                s = re.split("=", idx)
                 if len(s) != 2:
                     raise ValueError(
-                        'Plot option keyword/value not in correct format '
-                        + f'(key=val): {idx}'
+                        "Plot option keyword/value not in correct format "
+                        + f"(key=val): {idx}"
                     )
-                ss = re.split('_', s[0])
+                ss = re.split("_", s[0])
                 if len(ss) == 1:
-                    self.plot[key][ss[0]] = {'0': s[1]}
+                    self.plot[key][ss[0]] = {"0": s[1]}
                 elif len(ss) == 2:
                     if ss[0] not in self.plot[key].keys():
                         self.plot[key][ss[0]] = {}
                     self.plot[key][ss[0]][ss[1]] = s[1]
                 else:
                     raise ValueError(
-                        'Plot keyword not in correct format (key or key_i)'
-                        + f': {idx}'
+                        "Plot keyword not in correct format (key or key_i)"
+                        + f": {idx}"
                     )
 
     def _make_new_cat(self):
@@ -594,9 +595,9 @@ def _make_new_cat(self):
         for key in self._new_cat.keys():
             self.new_cat[key] = {}
             for idx in self._new_cat[key]:
-                s = re.split('=', j)
+                s = re.split("=", j)
                 if len(s) == 2:
-                    if s[0] == 'OUTPUT_FORMAT':
+                    if s[0] == "OUTPUT_FORMAT":
                         self.new_cat[key][s[0]] = s[1]
                     else:
                         self.new_cat[key][s[0]] = StrInterpreter(
@@ -606,7 +607,7 @@ def _make_new_cat(self):
                             mask_dict=self.mask,
                         ).result
                 else:
-                    raise ValueError(f'Not a valid format : {idx}')
+                    raise ValueError(f"Not a valid format : {idx}")
 
     def _make_rand_split(self):
         """Make Random Split.
@@ -632,25 +633,25 @@ def _make_rand_split(self):
         for key in self._rand_split.keys():
             self.rand_split[key] = {}
             for idx in self._rand_split[key]:
-                s = re.split('=', idx)
+                s = re.split("=", idx)
                 if len(s) != 2:
                     raise ValueError(
-                        f'Not a valid format : {self._rand_split[key][0]}'
+                        f"Not a valid format : {self._rand_split[key][0]}"
                     )
-                if s[0] == 'RATIO':
+                if s[0] == "RATIO":
                     try:
                         ratio = float(s[1])
                     except Exception:
-                        raise ValueError('RATIO is not a number')
+                        raise ValueError("RATIO is not a number")
                     if ratio >= 1:
-                        ratio /= 100.
-                elif s[0] == 'MASK':
-                    ss = re.split(',', s[1])
+                        ratio /= 100.0
+                elif s[0] == "MASK":
+                    ss = re.split(",", s[1])
                     for k in ss:
                         try:
                             mask &= self.mask[k]
                         except Exception:
-                            raise ValueError(f'mask {k} does not exist')
+                            raise ValueError(f"mask {k} does not exist")
 
             cat_size = len(np.where(mask)[0])
             n_keep = int(np.ceil(cat_size * ratio))
@@ -661,9 +662,9 @@ def _make_rand_split(self):
                 mask_ratio.append(mask_left.pop(idx))
             mask_ratio = np.array(mask_ratio)
             mask_left = np.array(mask_left)
-            self.rand_split[key]['mask'] = mask
-            self.rand_split[key][f'ratio_{int(ratio * 100)}'] = mask_ratio
-            self.rand_split[key][f'ratio_{100 - int(ratio * 100)}'] = mask_left
+            self.rand_split[key]["mask"] = mask
+            self.rand_split[key][f"ratio_{int(ratio * 100)}"] = mask_ratio
+            self.rand_split[key][f"ratio_{100 - int(ratio * 100)}"] = mask_left
 
     def _make_stat(self):
         """Make Statistics.
@@ -683,9 +684,9 @@ def _make_stat(self):
         for key in self._stat.keys():
             self.stat[key] = {}
             for idx in self._stat[key]:
-                s = re.split('=', idx)
+                s = re.split("=", idx)
                 if len(s) != 2:
-                    raise ValueError(f'Not a valid format : {idx}')
+                    raise ValueError(f"Not a valid format : {idx}")
                 self.stat[key][s[0]] = StrInterpreter(
                     s[1],
                     self._data,
@@ -732,33 +733,33 @@ class SEPlot(object):
     def __init__(self, plot_dict, catalogue, output_path, mask_dict=None):
 
         if plot_dict is None:
-            raise ValueError('plot_dict not provided')
+            raise ValueError("plot_dict not provided")
         if catalogue is None:
-            raise ValueError('catalogue not provided')
+            raise ValueError("catalogue not provided")
         if output_path is None:
-            raise ValueError('output_path not provided')
+            raise ValueError("output_path not provided")
 
         self._plot = plot_dict
         self._output_path = output_path
         self._cat = catalogue
         self._mask_dict = mask_dict
 
-        if 'TYPE' not in self._plot.keys():
-            raise ValueError('Plot type not specified')
+        if "TYPE" not in self._plot.keys():
+            raise ValueError("Plot type not specified")
 
-        if self._plot['TYPE']['0'] in ['plot', 'PLOT']:
-            self._check_key_for_plot(['X', 'Y'])
+        if self._plot["TYPE"]["0"] in ["plot", "PLOT"]:
+            self._check_key_for_plot(["X", "Y"])
             self._make_plot()
-        elif self._plot['TYPE']['0'] in ['scatter', 'SCATTER']:
-            self._check_key_for_plot(['X', 'Y'])
+        elif self._plot["TYPE"]["0"] in ["scatter", "SCATTER"]:
+            self._check_key_for_plot(["X", "Y"])
             self._make_scatter()
-        elif self._plot['TYPE']['0'] in [
-            'histogram',
-            'hist',
-            'HISTOGRAM',
-            'HIST'
+        elif self._plot["TYPE"]["0"] in [
+            "histogram",
+            "hist",
+            "HISTOGRAM",
+            "HIST",
         ]:
-            self._check_key_for_plot(['Y'])
+            self._check_key_for_plot(["Y"])
             self._make_hist()
         else:
             raise ValueError(f'Type : {self._plot["TYPE"]["0"]} not available')
@@ -782,7 +783,7 @@ def _check_key_for_plot(self, key_list):
         for key in key_list:
             if key not in self._plot.keys():
                 raise ValueError(
-                    f'Key \'{key}\' not provided for plot of type '
+                    f"Key '{key}' not provided for plot of type "
                     + f'\'{self._plot["TYPE"]["0"]}\''
                 )
 
@@ -805,9 +806,9 @@ def _make_plot(self):
         """
         self._fig = plt.figure()
 
-        if 'TITLE' in self._plot.keys():
-            title = self._plot['TITLE']['0']
-            s = re.split('@', title)
+        if "TITLE" in self._plot.keys():
+            title = self._plot["TITLE"]["0"]
+            s = re.split("@", title)
             if len(s) >= 3:
                 title = s[0]
                 ii = 1
@@ -815,23 +816,25 @@ def _make_plot(self):
                     if ii % 2 == 0:
                         title += idx
                     else:
-                        title += str(StrInterpreter(
-                            idx,
-                            self._cat,
-                            make_compare=False,
-                            mask_dict=self._mask_dict,
-                        ).result)
+                        title += str(
+                            StrInterpreter(
+                                idx,
+                                self._cat,
+                                make_compare=False,
+                                mask_dict=self._mask_dict,
+                            ).result
+                        )
                     ii += 1
         else:
-            title = ''
+            title = ""
 
         self._fig.suptitle(title)
 
-        for key in self._plot['Y'].keys():
-            if 'LABEL' in self._plot.keys():
+        for key in self._plot["Y"].keys():
+            if "LABEL" in self._plot.keys():
                 try:
-                    label = self._plot['LABEL'][key]
-                    s = re.split('@', label)
+                    label = self._plot["LABEL"][key]
+                    s = re.split("@", label)
                     if len(s) >= 3:
                         label = s[0]
                         jj = 1
@@ -839,68 +842,70 @@ def _make_plot(self):
                             if jj % 2 == 0:
                                 label += j
                             else:
-                                label += str(StrInterpreter(
-                                    j,
-                                    self._cat,
-                                    make_compare=False,
-                                    mask_dict=self._mask_dict,
-                                ).result)
+                                label += str(
+                                    StrInterpreter(
+                                        j,
+                                        self._cat,
+                                        make_compare=False,
+                                        mask_dict=self._mask_dict,
+                                    ).result
+                                )
                             jj += 1
                 except Exception:
                     label = None
             else:
                 label = None
-            if 'COLOR' in self._plot.keys():
+            if "COLOR" in self._plot.keys():
                 try:
-                    color = self._plot['COLOR'][key]
+                    color = self._plot["COLOR"][key]
                 except Exception:
                     color = None
             else:
                 color = None
-            if 'MARKER' in self._plot.keys():
+            if "MARKER" in self._plot.keys():
                 try:
-                    marker = self._plot['MARKER'][key]
+                    marker = self._plot["MARKER"][key]
                 except Exception:
-                    marker = '+'
+                    marker = "+"
             else:
-                marker = '+'
-            if 'MARKERSIZE' in self._plot.keys():
+                marker = "+"
+            if "MARKERSIZE" in self._plot.keys():
                 try:
-                    markersize = self._plot['MARKERSIZE'][key]
+                    markersize = self._plot["MARKERSIZE"][key]
                 except Exception:
                     markersize = 1
             else:
                 markersize = 1
-            if 'LINE' in self._plot.keys():
+            if "LINE" in self._plot.keys():
                 try:
-                    line = self._plot['LINE'][key]
+                    line = self._plot["LINE"][key]
                 except Exception:
-                    line = ''
+                    line = ""
             else:
-                line = ''
-            if 'ALPHA' in self._plot.keys():
+                line = ""
+            if "ALPHA" in self._plot.keys():
                 try:
-                    alpha = self._plot['ALPHA'][key]
+                    alpha = self._plot["ALPHA"][key]
                 except Exception:
                     alpha = None
             else:
                 alpha = None
 
             try:
-                x = self._plot['X'][key]
+                x = self._plot["X"][key]
             except Exception:
-                if len(self._plot['X']) == 1:
-                    x = self._plot['X'][self._plot['X'].keys()[0]]
+                if len(self._plot["X"]) == 1:
+                    x = self._plot["X"][self._plot["X"].keys()[0]]
                 else:
                     raise ValueError(
-                        'You need to specify X for each Y provided if they '
-                        + 'dont have the same'
+                        "You need to specify X for each Y provided if they "
+                        + "dont have the same"
                     )
 
             plt.plot(
                 StrInterpreter(x, self._cat, mask_dict=self._mask_dict).result,
                 StrInterpreter(
-                    self._plot['Y'][key],
+                    self._plot["Y"][key],
                     self._cat,
                     mask_dict=self._mask_dict,
                 ).result,
@@ -914,33 +919,33 @@ def _make_plot(self):
             )
 
         # Set ploy limits for x and y
-        for (lim, set_lim) in zip(['XLIM', 'YLIM'], [plt.xlim, plt.ylim]):
+        for lim, set_lim in zip(["XLIM", "YLIM"], [plt.xlim, plt.ylim]):
             if lim in self._plot.keys():
                 try:
-                    val = re.split(',', self._plot[lim]['0'])
+                    val = re.split(",", self._plot[lim]["0"])
                 except Exception:
                     raise ValueError(
-                        f'Plot {lim} keyword/value not in correct format '
+                        f"Plot {lim} keyword/value not in correct format "
                         + f'({lim}=lower,upper): {self._plot[lim]["0"]}'
                     )
 
                 set_lim(float(val[0]), float(val[1]))
 
-        if 'LABEL' in self._plot.keys():
+        if "LABEL" in self._plot.keys():
             plt.legend()
 
-        if 'XLABEL' in self._plot.keys():
-            plt.xlabel(self._plot['XLABEL']['0'])
-        if 'YLABEL' in self._plot.keys():
-            plt.ylabel(self._plot['YLABEL']['0'])
+        if "XLABEL" in self._plot.keys():
+            plt.xlabel(self._plot["XLABEL"]["0"])
+        if "YLABEL" in self._plot.keys():
+            plt.ylabel(self._plot["YLABEL"]["0"])
 
-        if 'FORMAT' in self._plot.keys():
-            out_format = self._plot['FORMAT']['0']
+        if "FORMAT" in self._plot.keys():
+            out_format = self._plot["FORMAT"]["0"]
         else:
             out_format = "PNG"
 
         self._fig.savefig(
-            f'{self._output_path}.{out_format.lower()}',
+            f"{self._output_path}.{out_format.lower()}",
             format=out_format,
         )
         plt.close()
@@ -964,9 +969,9 @@ def _make_scatter(self):
         """
         self._fig = plt.figure()
 
-        if 'TITLE' in self._plot.keys():
-            title = self._plot['TITLE']['0']
-            s = re.split('@', title)
+        if "TITLE" in self._plot.keys():
+            title = self._plot["TITLE"]["0"]
+            s = re.split("@", title)
             if len(s) >= 3:
                 title = s[0]
                 counter = 1
@@ -974,23 +979,25 @@ def _make_scatter(self):
                     if counter % 2 == 0:
                         title += idx
                     else:
-                        title += str(StrInterpreter(
-                            idx,
-                            self._cat,
-                            make_compare=False,
-                            mask_dict=self._mask_dict,
-                        ).result)
+                        title += str(
+                            StrInterpreter(
+                                idx,
+                                self._cat,
+                                make_compare=False,
+                                mask_dict=self._mask_dict,
+                            ).result
+                        )
                     counter += 1
         else:
-            title = ''
+            title = ""
 
         self._fig.suptitle(title)
 
-        for key in self._plot['SCATTER'].keys():
-            if 'LABEL' in self._plot.keys():
+        for key in self._plot["SCATTER"].keys():
+            if "LABEL" in self._plot.keys():
                 try:
-                    label = self._plot['LABEL'][key]
-                    s = re.split('@', label)
+                    label = self._plot["LABEL"][key]
+                    s = re.split("@", label)
                     if len(s) >= 3:
                         label = s[0]
                         jj = 1
@@ -998,58 +1005,60 @@ def _make_scatter(self):
                             if jj % 2 == 0:
                                 label += j
                             else:
-                                label += str(StrInterpreter(
-                                    j,
-                                    self._cat,
-                                    make_compare=False,
-                                    mask_dict=self._mask_dict,
-                                ).result)
+                                label += str(
+                                    StrInterpreter(
+                                        j,
+                                        self._cat,
+                                        make_compare=False,
+                                        mask_dict=self._mask_dict,
+                                    ).result
+                                )
                             jj += 1
                 except Exception:
                     label = None
             else:
                 label = None
-            if 'MARKER' in self._plot.keys():
+            if "MARKER" in self._plot.keys():
                 try:
-                    marker = self._plot['MARKER'][key]
+                    marker = self._plot["MARKER"][key]
                 except Exception:
-                    marker = '+'
+                    marker = "+"
             else:
-                marker = '+'
-            if 'ALPHA' in self._plot.keys():
+                marker = "+"
+            if "ALPHA" in self._plot.keys():
                 try:
-                    alpha = self._plot['ALPHA'][key]
+                    alpha = self._plot["ALPHA"][key]
                 except Exception:
                     alpha = None
             else:
                 alpha = None
 
             try:
-                x = self._plot['X'][key]
+                x = self._plot["X"][key]
             except Exception:
-                if len(self._plot['X']) == 1:
-                    x = self._plot['X'][self._plot['X'].keys()[0]]
+                if len(self._plot["X"]) == 1:
+                    x = self._plot["X"][self._plot["X"].keys()[0]]
                 else:
                     raise ValueError(
-                        'You need to specify X for each SCATTER provided if '
-                        + 'they dont have the same'
+                        "You need to specify X for each SCATTER provided if "
+                        + "they dont have the same"
                     )
             try:
-                y = self._plot['Y'][key]
+                y = self._plot["Y"][key]
             except Exception:
-                if len(self._plot['Y']) == 1:
-                    y = self._plot['Y'][self._plot['Y'].keys()[0]]
+                if len(self._plot["Y"]) == 1:
+                    y = self._plot["Y"][self._plot["Y"].keys()[0]]
                 else:
                     raise ValueError(
-                        'You need to specify Y for each SCATTER provided if '
-                        + 'they dont have the same'
+                        "You need to specify Y for each SCATTER provided if "
+                        + "they dont have the same"
                     )
 
             plt.scatter(
                 StrInterpreter(x, self._cat, mask_dict=self._mask_dict).result,
                 StrInterpreter(y, self._cat, mask_dict=self._mask_dict).result,
                 c=StrInterpreter(
-                    self._plot['SCATTER'][key],
+                    self._plot["SCATTER"][key],
                     self._cat,
                     mask_dict=self._mask_dict,
                 ).result,
@@ -1059,22 +1068,22 @@ def _make_scatter(self):
                 figure=self._fig,
             )
 
-        if 'LABEL' in self._plot.keys():
+        if "LABEL" in self._plot.keys():
             plt.legend()
-        if 'XLABEL' in self._plot.keys():
-            plt.xlabel(self._plot['XLABEL']['0'])
-        if 'YLABEL' in self._plot.keys():
-            plt.ylabel(self._plot['YLABEL']['0'])
+        if "XLABEL" in self._plot.keys():
+            plt.xlabel(self._plot["XLABEL"]["0"])
+        if "YLABEL" in self._plot.keys():
+            plt.ylabel(self._plot["YLABEL"]["0"])
 
         plt.colorbar()
 
-        if 'FORMAT' in self._plot.keys():
-            out_format = self._plot['FORMAT']['0']
+        if "FORMAT" in self._plot.keys():
+            out_format = self._plot["FORMAT"]["0"]
         else:
-            out_format = 'PNG'
+            out_format = "PNG"
 
         self._fig.savefig(
-            f'{self._output_path}.{out_format.lower()}',
+            f"{self._output_path}.{out_format.lower()}",
             format=out_format,
         )
         plt.close()
@@ -1091,9 +1100,9 @@ def _make_hist(self):
         """
         self._fig = plt.figure()
 
-        if 'TITLE' in self._plot.keys():
-            title = self._plot['TITLE']['0']
-            s = re.split('@', title)
+        if "TITLE" in self._plot.keys():
+            title = self._plot["TITLE"]["0"]
+            s = re.split("@", title)
             if len(s) >= 3:
                 title = s[0]
                 counter = 1
@@ -1101,35 +1110,37 @@ def _make_hist(self):
                     if counter % 2 == 0:
                         title += idx
                     else:
-                        title += str(StrInterpreter(
-                            idx,
-                            self._cat,
-                            make_compare=False,
-                            mask_dict=self._mask_dict,
-                        ).result)
+                        title += str(
+                            StrInterpreter(
+                                idx,
+                                self._cat,
+                                make_compare=False,
+                                mask_dict=self._mask_dict,
+                            ).result
+                        )
                     counter += 1
         else:
-            title = ''
+            title = ""
 
         self._fig.suptitle(title)
 
-        if 'HTYPE' in self._plot.keys():
-            htype = self._plot['HTYPE']['0']
+        if "HTYPE" in self._plot.keys():
+            htype = self._plot["HTYPE"]["0"]
         else:
-            htype = 'bar'
-        if 'LOG' in self._plot.keys():
-            if self._plot['LOG']['0'] in ['True', 'true', '1']:
+            htype = "bar"
+        if "LOG" in self._plot.keys():
+            if self._plot["LOG"]["0"] in ["True", "true", "1"]:
                 log = True
             else:
                 log = False
         else:
             log = False
 
-        for key in self._plot['Y'].keys():
-            if 'LABEL' in self._plot.keys():
+        for key in self._plot["Y"].keys():
+            if "LABEL" in self._plot.keys():
                 try:
-                    label = self._plot['LABEL'][key]
-                    s = re.split('@', label)
+                    label = self._plot["LABEL"][key]
+                    s = re.split("@", label)
                     if len(s) >= 3:
                         label = s[0]
                         jj = 1
@@ -1137,37 +1148,39 @@ def _make_hist(self):
                             if jj % 2 == 0:
                                 label += j
                             else:
-                                label += str(StrInterpreter(
-                                    j,
-                                    self._cat,
-                                    make_compare=False,
-                                    mask_dict=self._mask_dict,
-                                ).result)
+                                label += str(
+                                    StrInterpreter(
+                                        j,
+                                        self._cat,
+                                        make_compare=False,
+                                        mask_dict=self._mask_dict,
+                                    ).result
+                                )
                             jj += 1
                 except Exception:
                     label = None
             else:
                 label = None
-            if 'COLOR' in self._plot.keys():
+            if "COLOR" in self._plot.keys():
                 try:
-                    color = self._plot['COLOR'][key]
+                    color = self._plot["COLOR"][key]
                 except Exception:
                     color = None
             else:
                 color = None
-            if 'BIN' in self._plot.keys():
+            if "BIN" in self._plot.keys():
                 try:
-                    bins = int(self._plot['BIN'][key])
+                    bins = int(self._plot["BIN"][key])
                 except Exception:
-                    if len(self._plot['BIN']) == 1:
+                    if len(self._plot["BIN"]) == 1:
                         bins = int(
-                            self._plot['BIN'][self._plot['BIN'].keys()[0]]
+                            self._plot["BIN"][self._plot["BIN"].keys()[0]]
                         )
             else:
                 bins = 50
-            if 'ALPHA' in self._plot.keys():
+            if "ALPHA" in self._plot.keys():
                 try:
-                    alpha = float(self._plot['ALPHA'][key])
+                    alpha = float(self._plot["ALPHA"][key])
                 except Exception:
                     alpha = None
             else:
@@ -1175,7 +1188,7 @@ def _make_hist(self):
 
             plt.hist(
                 StrInterpreter(
-                    self._plot['Y'][key],
+                    self._plot["Y"][key],
                     self._cat,
                     mask_dict=self._mask_dict,
                 ).result,
@@ -1187,19 +1200,19 @@ def _make_hist(self):
                 log=log,
             )
 
-        if 'LABEL' in self._plot.keys():
+        if "LABEL" in self._plot.keys():
             plt.legend()
-        if 'XLABEL' in self._plot.keys():
-            plt.xlabel(self._plot['XLABEL']['0'])
-        if 'YLABEL' in self._plot.keys():
-            plt.ylabel(self._plot['YLABEL']['0'])
-        if 'FORMAT' in self._plot.keys():
-            out_format = self._plot['FORMAT']['0']
+        if "XLABEL" in self._plot.keys():
+            plt.xlabel(self._plot["XLABEL"]["0"])
+        if "YLABEL" in self._plot.keys():
+            plt.ylabel(self._plot["YLABEL"]["0"])
+        if "FORMAT" in self._plot.keys():
+            out_format = self._plot["FORMAT"]["0"]
         else:
-            out_format = 'PNG'
+            out_format = "PNG"
 
         self._fig.savefig(
-            f'{self._output_path}.{out_format.lower()}',
+            f"{self._output_path}.{out_format.lower()}",
             format=out_format,
         )
         plt.close()
diff --git a/shapepipe/modules/setools_runner.py b/shapepipe/modules/setools_runner.py
index a076bd08e..f68720de3 100644
--- a/shapepipe/modules/setools_runner.py
+++ b/shapepipe/modules/setools_runner.py
@@ -11,11 +11,11 @@
 
 
 @module_runner(
-    input_module='sextractor_runner',
-    version='1.1',
-    file_pattern=['sexcat'],
-    file_ext=['.fits'],
-    depends=['numpy', 'matplotlib'],
+    input_module="sextractor_runner",
+    version="1.1",
+    file_pattern=["sexcat"],
+    file_ext=[".fits"],
+    depends=["numpy", "matplotlib"],
 )
 def setools_runner(
     input_file_list,
@@ -27,12 +27,12 @@ def setools_runner(
 ):
     """Define The SETools Runner."""
     # Get path to setools configuration file
-    config_file = config.getexpanded(module_config_sec, 'SETOOLS_CONFIG_PATH')
+    config_file = config.getexpanded(module_config_sec, "SETOOLS_CONFIG_PATH")
 
     # Create instance of SETools
     se_inst = SETools(
         input_file_list[0],
-        run_dirs['output'],
+        run_dirs["output"],
         file_number_string,
         config_file,
     )
diff --git a/shapepipe/modules/sextractor_package/__init__.py b/shapepipe/modules/sextractor_package/__init__.py
index 658acf8ef..e3cd01188 100644
--- a/shapepipe/modules/sextractor_package/__init__.py
+++ b/shapepipe/modules/sextractor_package/__init__.py
@@ -67,4 +67,4 @@
 
 """
 
-__all__ = ['sextractor_script']
+__all__ = ["sextractor_script"]
diff --git a/shapepipe/modules/sextractor_package/sextractor_script.py b/shapepipe/modules/sextractor_package/sextractor_script.py
index 3720c00bc..2c0124eed 100644
--- a/shapepipe/modules/sextractor_package/sextractor_script.py
+++ b/shapepipe/modules/sextractor_package/sextractor_script.py
@@ -41,7 +41,7 @@ def get_header_value(image_path, key):
         val = float(val)
     except Exception:
         raise ValueError(
-            f'The key {key} does not return a float value. Got {val}'
+            f"The key {key} does not return a float value. Got {val}"
         )
 
     return val
@@ -77,7 +77,8 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size):
 
     """
     cat = file_io.FITSCatalogue(
-        cat_path, SEx_catalogue=True,
+        cat_path,
+        SEx_catalogue=True,
         open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
     )
     cat.open()
@@ -85,25 +86,25 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size):
     f_wcs = SqliteDict(f_wcs_path)
     key_list = list(f_wcs.keys())
     if len(key_list) == 0:
-        raise IOError(f'Could not read sql file \'{f_wcs_path}\'')
+        raise IOError(f"Could not read sql file '{f_wcs_path}'")
     n_hdu = len(f_wcs[key_list[0]])
 
     history = []
     for idx in cat.get_data(1)[0][0]:
-        if re.split('HISTORY', idx)[0] == '':
+        if re.split("HISTORY", idx)[0] == "":
             history.append(idx)
 
     exp_list = []
-    pattern = r'([0-9]*)p\.(.*)'
+    pattern = r"([0-9]*)p\.(.*)"
     for hist in history:
         m = re.search(pattern, hist)
         exp_list.append(m.group(1))
 
-    obj_id = np.copy(cat.get_data()['NUMBER'])
+    obj_id = np.copy(cat.get_data()["NUMBER"])
 
-    n_epoch = np.zeros(len(obj_id), dtype='int32')
+    n_epoch = np.zeros(len(obj_id), dtype="int32")
     for idx, exp in enumerate(exp_list):
-        pos_tmp = np.ones(len(obj_id), dtype='int32') * -1
+        pos_tmp = np.ones(len(obj_id), dtype="int32") * -1
         for idx_j in range(n_hdu):
             if exp not in f_wcs:
                 raise KeyError(
@@ -111,11 +112,9 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size):
                     + f" found in header file {f_wcs_path}. Make sure this"
                     + " file is complete."
                 )
-            w = f_wcs[exp][idx_j]['WCS']
+            w = f_wcs[exp][idx_j]["WCS"]
             pix_tmp = w.all_world2pix(
-                cat.get_data()[pos_params[0]],
-                cat.get_data()[pos_params[1]],
-                0
+                cat.get_data()[pos_params[0]], cat.get_data()[pos_params[1]], 0
             )
             ind = (
                 (pix_tmp[0] > int(ccd_size[0]))
@@ -132,22 +131,22 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size):
                 for ii in range(len(exp_name))
             ],
             dtype=[
-                ('NUMBER', obj_id.dtype),
-                ('EXP_NAME', exp_name.dtype),
-                ('CCD_N', pos_tmp.dtype)
-            ]
+                ("NUMBER", obj_id.dtype),
+                ("EXP_NAME", exp_name.dtype),
+                ("CCD_N", pos_tmp.dtype),
+            ],
         )
-        cat.save_as_fits(data=a, ext_name=f'EPOCH_{idx}')
+        cat.save_as_fits(data=a, ext_name=f"EPOCH_{idx}")
         cat.open()
 
     f_wcs.close()
 
-    cat.add_col('N_EPOCH', n_epoch)
+    cat.add_col("N_EPOCH", n_epoch)
 
     cat.close()
 
 
-class SExtractorCaller():
+class SExtractorCaller:
     """The SExtractor Caller.
 
     This class constructs the command line to call SExtractor based on the
@@ -193,28 +192,28 @@ class SExtractorCaller():
     """
 
     def __init__(
-            self,
-            path_input_files,
-            path_output_dir,
-            number_string,
-            path_dot_sex,
-            path_dot_param,
-            path_dot_conv,
-            use_weight,
-            use_flag,
-            use_psf,
-            use_detection_image,
-            use_detection_weight,
-            use_zero_point,
-            use_background,
-            zero_point_key=None,
-            background_key=None,
-            check_image=None,
-            output_prefix=None,
+        self,
+        path_input_files,
+        path_output_dir,
+        number_string,
+        path_dot_sex,
+        path_dot_param,
+        path_dot_conv,
+        use_weight,
+        use_flag,
+        use_psf,
+        use_detection_image,
+        use_detection_weight,
+        use_zero_point,
+        use_background,
+        zero_point_key=None,
+        background_key=None,
+        check_image=None,
+        output_prefix=None,
     ):
 
-        self.cmd_line = ''
-        self._cmd_line_extra = ''
+        self.cmd_line = ""
+        self._cmd_line_extra = ""
 
         self._meas_img_path = path_input_files[0]
         self._all_input_path = path_input_files
@@ -227,8 +226,13 @@ def __init__(
         self._path_dot_param = path_dot_param
         self._path_dot_conv = path_dot_conv
 
-        self.set_input_files(use_weight, use_flag, use_psf,
-                             use_detection_image, use_detection_weight)
+        self.set_input_files(
+            use_weight,
+            use_flag,
+            use_psf,
+            use_detection_image,
+            use_detection_weight,
+        )
 
         # Collect optional arguments for SExtractor
         self.get_zero_point(use_zero_point, zero_point_key)
@@ -252,25 +256,25 @@ def get_output_name(self, output_prefix=None):
 
         """
         if isinstance(output_prefix, type(None)):
-            self.prefix = ''
+            self.prefix = ""
         else:
-            if (output_prefix.lower() is not None) & (output_prefix != ''):
-                self.prefix = output_prefix + '_'
+            if (output_prefix.lower() is not None) & (output_prefix != ""):
+                self.prefix = output_prefix + "_"
             else:
-                self.prefix = ''
+                self.prefix = ""
 
-        output_file_name = self.prefix + f'sexcat{self._num_str}.fits'
-        output_file_path = f'{self._path_output_dir}/{output_file_name}'
+        output_file_name = self.prefix + f"sexcat{self._num_str}.fits"
+        output_file_path = f"{self._path_output_dir}/{output_file_name}"
 
         return output_file_path
 
     def set_input_files(
-            self,
-            use_weight,
-            use_flag,
-            use_psf,
-            use_detect_img,
-            use_detect_weight,
+        self,
+        use_weight,
+        use_flag,
+        use_psf,
+        use_detect_img,
+        use_detect_weight,
     ):
         """Set Input Files.
 
@@ -303,15 +307,13 @@ def set_input_files(
 
         if use_flag:
             self._cmd_line_extra += (
-                ' -FLAG_IMAGE '
-                + f'{self._all_input_path[extra]}'
+                " -FLAG_IMAGE " + f"{self._all_input_path[extra]}"
             )
             extra += 1
 
         if use_psf:
             self._cmd_line_extra += (
-                ' -PSF_NAME '
-                + f'{self._all_input_path[extra]}'
+                " -PSF_NAME " + f"{self._all_input_path[extra]}"
             )
             extra += 1
 
@@ -320,13 +322,12 @@ def set_input_files(
         # First, consistency checks
         if use_detect_weight and not use_detect_img:
             raise ValueError(
-                'DETECTION_WEIGHT cannot be True '
-                + 'if DETECTION_IMAGE is False'
+                "DETECTION_WEIGHT cannot be True "
+                + "if DETECTION_IMAGE is False"
             )
         if use_detect_weight and not use_weight:
             raise ValueError(
-                'DETECTION_WEIGHT cannot be True '
-                + 'if WEIGHT_FILE is False'
+                "DETECTION_WEIGHT cannot be True " + "if WEIGHT_FILE is False"
             )
 
         # Check for separate image file for detection and measurement
@@ -347,18 +348,17 @@ def set_input_files(
             else:
                 detect_weight_path = weight_image
             self._cmd_line_extra += (
-                f' -WEIGHT_IMAGE {detect_weight_path}'
-                + f',{weight_image}'
+                f" -WEIGHT_IMAGE {detect_weight_path}" + f",{weight_image}"
             )
         else:
-            self._cmd_line_extra += ' -WEIGHT_TYPE None'
+            self._cmd_line_extra += " -WEIGHT_TYPE None"
 
         if extra != len(self._all_input_path):
             raise ValueError(
-                'Incoherence between input file number and keys '
-                + f'related to extra files: 1 regular + {extra-1} extra '
-                + 'files not compatible with total file list '
-                + f'length of {len(self._all_input_path)}'
+                "Incoherence between input file number and keys "
+                + f"related to extra files: 1 regular + {extra-1} extra "
+                + "files not compatible with total file list "
+                + f"length of {len(self._all_input_path)}"
             )
 
     def get_zero_point(self, use_zp, zp_key=None):
@@ -376,7 +376,7 @@ def get_zero_point(self, use_zp, zp_key=None):
         """
         if use_zp and not isinstance(zp_key, type(None)):
             zp_value = get_header_value(self._meas_img_path, zp_key)
-            self._cmd_line_extra += f' -MAG_ZEROPOINT {zp_value}'
+            self._cmd_line_extra += f" -MAG_ZEROPOINT {zp_value}"
 
     def get_background(self, use_bkg, bkg_key=None):
         """Get Background.
@@ -394,7 +394,7 @@ def get_background(self, use_bkg, bkg_key=None):
         if use_bkg and not isinstance(bkg_key, type(None)):
             bkg_value = get_header_value(self._meas_img_path, bkg_key)
             self._cmd_line_extra += (
-                f' -BACK_TYPE MANUAL -BACK_VALUE {bkg_value}'
+                f" -BACK_TYPE MANUAL -BACK_VALUE {bkg_value}"
             )
 
     def get_check_image(self, check_image):
@@ -408,18 +408,21 @@ def get_check_image(self, check_image):
             List of SExtractor keys corresponding to check images
 
         """
-        if (len(check_image) == 1) & (check_image[0] == ''):
-            check_type = ['NONE']
-            check_name = ['none']
+        if (len(check_image) == 1) & (check_image[0] == ""):
+            check_type = ["NONE"]
+            check_name = ["none"]
         else:
             check_type = []
             check_name = []
             for key in check_image:
                 check_type.append(key.upper())
                 check_name.append(
-                    self._path_output_dir + '/' + self.prefix
+                    self._path_output_dir
+                    + "/"
+                    + self.prefix
                     + key.lower()
-                    + self._num_str + '.fits'
+                    + self._num_str
+                    + ".fits"
                 )
 
         self._cmd_line_extra += (
@@ -445,14 +448,14 @@ def make_command_line(self, exec_path):
         """
         # Base arguments for SExtractor
         command_line_base = (
-            f'{exec_path} {self._detect_img_path},{self._meas_img_path} '
-            + f'-c {self._path_dot_sex} '
-            + f'-PARAMETERS_NAME {self._path_dot_param} '
-            + f'-FILTER_NAME {self._path_dot_conv} '
-            + f'-CATALOG_NAME {self.path_output_file}'
+            f"{exec_path} {self._detect_img_path},{self._meas_img_path} "
+            + f"-c {self._path_dot_sex} "
+            + f"-PARAMETERS_NAME {self._path_dot_param} "
+            + f"-FILTER_NAME {self._path_dot_conv} "
+            + f"-CATALOG_NAME {self.path_output_file}"
         )
 
-        command_line = f'{command_line_base} {self._cmd_line_extra}'
+        command_line = f"{command_line_base} {self._cmd_line_extra}"
 
         return command_line
 
@@ -476,11 +479,11 @@ def parse_errors(stderr, stdout):
             Updated standard output and error
 
         """
-        check_error = re.findall('error', stdout.lower())
-        check_error2 = re.findall('all done', stdout.lower())
+        check_error = re.findall("error", stdout.lower())
+        check_error2 = re.findall("all done", stdout.lower())
 
         if check_error == []:
-            stderr2 = ''
+            stderr2 = ""
         else:
             stderr2 = stdout
 
diff --git a/shapepipe/modules/sextractor_runner.py b/shapepipe/modules/sextractor_runner.py
index e65374983..869523441 100644
--- a/shapepipe/modules/sextractor_runner.py
+++ b/shapepipe/modules/sextractor_runner.py
@@ -14,12 +14,12 @@
 
 
 @module_runner(
-    version='1.0.1',
-    input_module='mask_runner',
-    file_pattern=['image', 'weight', 'flag'],
-    file_ext=['.fits', '.fits', '.fits'],
-    executes=['sex'],
-    depends=['numpy'],
+    version="1.0.1",
+    input_module="mask_runner",
+    file_pattern=["image", "weight", "flag"],
+    file_ext=[".fits", ".fits", ".fits"],
+    executes=["sex"],
+    depends=["numpy"],
 )
 def sextractor_runner(
     input_file_list,
@@ -31,47 +31,47 @@ def sextractor_runner(
 ):
     """Define The SExtractor Runner."""
     # Set the SExtractor executable name
-    if config.has_option(module_config_sec, 'EXEC_PATH'):
-        exec_path = config.getexpanded(module_config_sec, 'EXEC_PATH')
+    if config.has_option(module_config_sec, "EXEC_PATH"):
+        exec_path = config.getexpanded(module_config_sec, "EXEC_PATH")
     else:
-        exec_path = 'sex'
+        exec_path = "sex"
 
     # Get SExtractor config options
-    dot_sex = config.getexpanded(module_config_sec, 'DOT_SEX_FILE')
-    dot_param = config.getexpanded(module_config_sec, 'DOT_PARAM_FILE')
-    dot_conv = config.getexpanded(module_config_sec, 'DOT_CONV_FILE')
-    weight_file = config.getboolean(module_config_sec, 'WEIGHT_IMAGE')
-    flag_file = config.getboolean(module_config_sec, 'FLAG_IMAGE')
-    psf_file = config.getboolean(module_config_sec, 'PSF_FILE')
-    detection_image = config.getboolean(module_config_sec, 'DETECTION_IMAGE')
-    detection_weight = config.getboolean(module_config_sec, 'DETECTION_WEIGHT')
-
-    zp_from_header = config.getboolean(module_config_sec, 'ZP_FROM_HEADER')
+    dot_sex = config.getexpanded(module_config_sec, "DOT_SEX_FILE")
+    dot_param = config.getexpanded(module_config_sec, "DOT_PARAM_FILE")
+    dot_conv = config.getexpanded(module_config_sec, "DOT_CONV_FILE")
+    weight_file = config.getboolean(module_config_sec, "WEIGHT_IMAGE")
+    flag_file = config.getboolean(module_config_sec, "FLAG_IMAGE")
+    psf_file = config.getboolean(module_config_sec, "PSF_FILE")
+    detection_image = config.getboolean(module_config_sec, "DETECTION_IMAGE")
+    detection_weight = config.getboolean(module_config_sec, "DETECTION_WEIGHT")
+
+    zp_from_header = config.getboolean(module_config_sec, "ZP_FROM_HEADER")
     if zp_from_header:
-        zp_key = config.get(module_config_sec, 'ZP_KEY')
+        zp_key = config.get(module_config_sec, "ZP_KEY")
     else:
         zp_key = None
 
-    bkg_from_header = config.getboolean(module_config_sec, 'BKG_FROM_HEADER')
+    bkg_from_header = config.getboolean(module_config_sec, "BKG_FROM_HEADER")
     if bkg_from_header:
-        bkg_key = config.get(module_config_sec, 'BKG_KEY')
+        bkg_key = config.get(module_config_sec, "BKG_KEY")
     else:
         bkg_key = None
 
-    if config.has_option(module_config_sec, 'CHECKIMAGE'):
-        check_image = config.getlist(module_config_sec, 'CHECKIMAGE')
+    if config.has_option(module_config_sec, "CHECKIMAGE"):
+        check_image = config.getlist(module_config_sec, "CHECKIMAGE")
     else:
-        check_image = ['']
+        check_image = [""]
 
-    if config.has_option(module_config_sec, 'PREFIX'):
-        prefix = config.get(module_config_sec, 'PREFIX')
+    if config.has_option(module_config_sec, "PREFIX"):
+        prefix = config.get(module_config_sec, "PREFIX")
     else:
         prefix = None
 
     # Create sextractor caller class instance
     ss_inst = ss.SExtractorCaller(
         input_file_list,
-        run_dirs['output'],
+        run_dirs["output"],
         file_number_string,
         dot_sex,
         dot_param,
@@ -91,7 +91,7 @@ def sextractor_runner(
 
     # Generate sextractor command line
     command_line = ss_inst.make_command_line(exec_path)
-    w_log.info(f'Calling command: {command_line}')
+    w_log.info(f"Calling command: {command_line}")
 
     # Execute command line
     stderr, stdout = execute(command_line)
@@ -100,14 +100,12 @@ def sextractor_runner(
     stdout, stderr = ss_inst.parse_errors(stderr, stdout)
 
     # Run sextractor post processing
-    if config.getboolean(module_config_sec, 'MAKE_POST_PROCESS'):
-        f_wcs_path = config.getexpanded(module_config_sec, 'LOG_WCS')
-        pos_params = config.getlist(module_config_sec, 'WORLD_POSITION')
-        ccd_size = config.getlist(module_config_sec, 'CCD_SIZE')
+    if config.getboolean(module_config_sec, "MAKE_POST_PROCESS"):
+        f_wcs_path = config.getexpanded(module_config_sec, "LOG_WCS")
+        pos_params = config.getlist(module_config_sec, "WORLD_POSITION")
+        ccd_size = config.getlist(module_config_sec, "CCD_SIZE")
         ss.make_post_process(
-            ss_inst.path_output_file,
-            f_wcs_path,
-            pos_params, ccd_size
+            ss_inst.path_output_file, f_wcs_path, pos_params, ccd_size
         )
 
     # Return stdout and stderr
diff --git a/shapepipe/modules/split_exp_package/__init__.py b/shapepipe/modules/split_exp_package/__init__.py
index fb55a7f42..4cfb8a764 100644
--- a/shapepipe/modules/split_exp_package/__init__.py
+++ b/shapepipe/modules/split_exp_package/__init__.py
@@ -39,4 +39,4 @@
 
 """
 
-__all__ = ['split_exp.py']
+__all__ = ["split_exp.py"]
diff --git a/shapepipe/modules/split_exp_package/split_exp.py b/shapepipe/modules/split_exp_package/split_exp.py
index 3af708af7..c4b824389 100644
--- a/shapepipe/modules/split_exp_package/split_exp.py
+++ b/shapepipe/modules/split_exp_package/split_exp.py
@@ -42,7 +42,7 @@ def __init__(
         output_dir,
         file_number_string,
         output_suffix,
-        n_hdu
+        n_hdu,
     ):
 
         self._input_file_list = input_file_list
@@ -58,29 +58,19 @@ def process(self):
 
         """
         for exp_path, output_suffix in zip(
-            self._input_file_list,
-            self._output_suffix
+            self._input_file_list, self._output_suffix
         ):
 
-            transf_int = 'flag' in output_suffix
-            transf_coord = 'image' in output_suffix
-            save_header = 'image' in output_suffix
+            transf_int = "flag" in output_suffix
+            transf_coord = "image" in output_suffix
+            save_header = "image" in output_suffix
 
             self.create_hdus(
-                exp_path,
-                output_suffix,
-                transf_coord,
-                transf_int,
-                save_header
+                exp_path, output_suffix, transf_coord, transf_int, save_header
             )
 
     def create_hdus(
-        self,
-        exp_path,
-        output_suffix,
-        transf_coord,
-        transf_int,
-        save_header
+        self, exp_path, output_suffix, transf_coord, transf_int, save_header
     ):
         """Create HDUs.
 
@@ -100,7 +90,7 @@ def create_hdus(
             Save WCS information if ``True``
 
         """
-        header_file = np.zeros(self._n_hdu, dtype='O')
+        header_file = np.zeros(self._n_hdu, dtype="O")
 
         hdu_list = fits.open(exp_path)
         if len(hdu_list) != self._n_hdu + 1:
@@ -111,12 +101,12 @@ def create_hdus(
 
         for idx in range(1, self._n_hdu + 1):
 
-            #h = fits.getheader(exp_path, idx)
+            # h = fits.getheader(exp_path, idx)
             h = hdu_list[idx].header
             if transf_coord:
                 stp.pv_to_sip(h)
 
-            #d = fits.getdata(exp_path, idx)
+            # d = fits.getdata(exp_path, idx)
             try:
                 d = hdu_list[idx].data
             except TypeError as e:
@@ -131,13 +121,12 @@ def create_hdus(
                 d = d.astype(np.int16)
 
             file_name = (
-                f'{self._output_dir}/{output_suffix}'
-                + f'{self._file_number_string}-{str(idx-1)}.fits'
+                f"{self._output_dir}/{output_suffix}"
+                + f"{self._file_number_string}-{str(idx-1)}.fits"
             )
 
             new_file = file_io.FITSCatalogue(
-                file_name,
-                open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
+                file_name, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
             )
             new_file.save_as_fits(data=d, image=True, image_header=h)
 
@@ -145,13 +134,12 @@ def create_hdus(
                 try:
                     w = WCS(h)
                 except Exception:
-                    print(f'WCS error for file {exp_path}')
+                    print(f"WCS error for file {exp_path}")
                     raise
-                header_file[idx - 1] = {'WCS': w, 'header': h.tostring()}
-
+                header_file[idx - 1] = {"WCS": w, "header": h.tostring()}
 
         if save_header:
             file_name = (
-                f'{self._output_dir}/headers{self._file_number_string}.npy'
+                f"{self._output_dir}/headers{self._file_number_string}.npy"
             )
             np.save(file_name, header_file)
diff --git a/shapepipe/modules/split_exp_runner.py b/shapepipe/modules/split_exp_runner.py
index 5ddae5328..77e6010d0 100644
--- a/shapepipe/modules/split_exp_runner.py
+++ b/shapepipe/modules/split_exp_runner.py
@@ -11,12 +11,12 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module='get_images_runner',
-    file_pattern=['image', 'weight', 'flag'],
-    file_ext=['.fz', '.fz', '.fz'],
-    depends=['numpy', 'astropy', 'sip_tpv'],
-    run_method='parallel',
+    version="1.1",
+    input_module="get_images_runner",
+    file_pattern=["image", "weight", "flag"],
+    file_ext=[".fz", ".fz", ".fz"],
+    depends=["numpy", "astropy", "sip_tpv"],
+    run_method="parallel",
 )
 def split_exp_runner(
     input_file_list,
@@ -28,17 +28,17 @@ def split_exp_runner(
 ):
     """Define The Split Exposures Runner."""
     # Get file suffix
-    output_suffix = config.getlist(module_config_sec, 'OUTPUT_SUFFIX')
+    output_suffix = config.getlist(module_config_sec, "OUTPUT_SUFFIX")
     # Get the number of HDUs
-    n_hdu = config.getint(module_config_sec, 'N_HDU')
+    n_hdu = config.getint(module_config_sec, "N_HDU")
 
     # Create split exposures class instance
     split_inst = SplitExposures(
         input_file_list,
-        run_dirs['output'],
+        run_dirs["output"],
         file_number_string,
         output_suffix,
-        n_hdu
+        n_hdu,
     )
 
     # Process splitting
diff --git a/shapepipe/modules/spread_model_package/__init__.py b/shapepipe/modules/spread_model_package/__init__.py
index 045e19977..336283e78 100644
--- a/shapepipe/modules/spread_model_package/__init__.py
+++ b/shapepipe/modules/spread_model_package/__init__.py
@@ -33,4 +33,4 @@
 
 """
 
-__all__ = ['spread_model']
+__all__ = ["spread_model"]
diff --git a/shapepipe/modules/spread_model_package/spread_model.py b/shapepipe/modules/spread_model_package/spread_model.py
index 98deb4aa5..0ea9c51f9 100644
--- a/shapepipe/modules/spread_model_package/spread_model.py
+++ b/shapepipe/modules/spread_model_package/spread_model.py
@@ -61,7 +61,7 @@ def get_sm(obj_vign, psf_vign, model_vign, weight_vign):
     tnt = np.sum(t_v * noise_v * t_v * w_v)
     pnp = np.sum(psf_v * noise_v * psf_v * w_v)
     tnp = np.sum(t_v * noise_v * psf_v * w_v)
-    err = tnt * pg ** 2 + pnp * tg ** 2 - 2 * tnp * pg * tg
+    err = tnt * pg**2 + pnp * tg**2 - 2 * tnp * pg * tg
 
     # Compute spread model
     if pg > 0:
@@ -102,9 +102,7 @@ def get_model(sigma, flux, img_shape, pixel_scale=0.186):
 
     """
     # Get scale radius
-    scale_radius = (
-        1 / 16 * galaxy.sigma_to_fwhm(sigma, pixel_scale=pixel_scale)
-    )
+    scale_radius = 1 / 16 * galaxy.sigma_to_fwhm(sigma, pixel_scale=pixel_scale)
 
     # Get galaxy model
     gal_obj = galsim.Exponential(scale_radius=scale_radius, flux=flux)
@@ -117,15 +115,11 @@ def get_model(sigma, flux, img_shape, pixel_scale=0.186):
 
     # Draw galaxy and PSF on vignets
     gal_vign = gal_obj.drawImage(
-        nx=img_shape[0],
-        ny=img_shape[1],
-        scale=pixel_scale
+        nx=img_shape[0], ny=img_shape[1], scale=pixel_scale
     ).array
 
     psf_vign = psf_obj.drawImage(
-        nx=img_shape[0],
-        ny=img_shape[1],
-        scale=pixel_scale
+        nx=img_shape[0], ny=img_shape[1], scale=pixel_scale
     ).array
 
     return gal_vign, psf_vign
@@ -167,7 +161,7 @@ def __init__(
         weight_cat_path,
         output_path,
         pixel_scale,
-        output_mode
+        output_mode,
     ):
 
         self._sex_cat_path = sex_cat_path
@@ -186,11 +180,11 @@ def process(self):
         # Get data
         sex_cat = file_io.FITSCatalogue(self._sex_cat_path, SEx_catalogue=True)
         sex_cat.open()
-        obj_id = np.copy(sex_cat.get_data()['NUMBER'])
-        obj_vign = np.copy(sex_cat.get_data()['VIGNET'])
+        obj_id = np.copy(sex_cat.get_data()["NUMBER"])
+        obj_vign = np.copy(sex_cat.get_data()["VIGNET"])
         obj_mag = None
-        if self._output_mode == 'new':
-            obj_mag = np.copy(sex_cat.get_data()['MAG_AUTO'])
+        if self._output_mode == "new":
+            obj_mag = np.copy(sex_cat.get_data()["MAG_AUTO"])
         sex_cat.close()
 
         psf_cat = SqliteDict(self._psf_cat_path)
@@ -200,7 +194,7 @@ def process(self):
             SEx_catalogue=True,
         )
         weight_cat.open()
-        weigh_vign = weight_cat.get_data()['VIGNET']
+        weigh_vign = weight_cat.get_data()["VIGNET"]
         weight_cat.close()
 
         # Get spread model
@@ -210,7 +204,7 @@ def process(self):
         for idx, id_tmp in enumerate(obj_id):
             sigma_list = []
 
-            if psf_cat[str(id_tmp)] == 'empty':
+            if psf_cat[str(id_tmp)] == "empty":
                 spread_model_final.append(-1)
                 spread_model_err_final.append(1)
                 continue
@@ -219,27 +213,22 @@ def process(self):
 
             for expccd_name_tmp in psf_expccd_name:
                 psf_cat_id_ccd = psf_cat[str(id_tmp)][expccd_name_tmp]
-                sigma_list.append(
-                    psf_cat_id_ccd['SHAPES']['SIGMA_PSF_HSM']
-                )
+                sigma_list.append(psf_cat_id_ccd["SHAPES"]["SIGMA_PSF_HSM"])
 
             obj_sigma_tmp = np.mean(sigma_list)
             if obj_sigma_tmp > 0:
                 obj_vign_tmp = obj_vign[idx]
-                obj_flux_tmp = 1.
+                obj_flux_tmp = 1.0
                 obj_weight_tmp = weigh_vign[idx]
                 obj_model_tmp, obj_psf_tmp = get_model(
                     obj_sigma_tmp,
                     obj_flux_tmp,
                     obj_vign_tmp.shape,
-                    self._pixel_scale
+                    self._pixel_scale,
                 )
 
                 obj_sm, obj_sm_err = get_sm(
-                    obj_vign_tmp,
-                    obj_psf_tmp,
-                    obj_model_tmp,
-                    obj_weight_tmp
+                    obj_vign_tmp, obj_psf_tmp, obj_model_tmp, obj_weight_tmp
                 )
             else:
                 # size < 0, something is not right with this object
@@ -248,19 +237,16 @@ def process(self):
             spread_model_final.append(obj_sm)
             spread_model_err_final.append(obj_sm_err)
 
-        spread_model_final = np.array(spread_model_final, dtype='float64')
+        spread_model_final = np.array(spread_model_final, dtype="float64")
         spread_model_err_final = np.array(
             spread_model_err_final,
-            dtype='float64',
+            dtype="float64",
         )
 
         psf_cat.close()
 
         self.save_results(
-            spread_model_final,
-            spread_model_err_final,
-            obj_mag,
-            obj_id
+            spread_model_final, spread_model_err_final, obj_mag, obj_id
         )
 
     def save_results(self, sm, sm_err, mag, number):
@@ -285,23 +271,22 @@ def save_results(self, sm, sm_err, mag, number):
             For incorrect output mode
 
         """
-        if self._output_mode == 'new':
+        if self._output_mode == "new":
             new_cat = file_io.FITSCatalogue(
                 self._output_path,
                 SEx_catalogue=True,
-                open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
+                open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
             )
             dict_data = {
-                'NUMBER': number,
-                'MAG': mag,
-                'SPREAD_MODEL': sm,
-                'SPREADERR_MODEL': sm_err
+                "NUMBER": number,
+                "MAG": mag,
+                "SPREAD_MODEL": sm,
+                "SPREADERR_MODEL": sm_err,
             }
             new_cat.save_as_fits(
-                data=dict_data,
-                sex_cat_path=self._sex_cat_path
+                data=dict_data, sex_cat_path=self._sex_cat_path
             )
-        elif self._output_mode == 'add':
+        elif self._output_mode == "add":
             ori_cat = file_io.FITSCatalogue(
                 self._sex_cat_path,
                 SEx_catalogue=True,
@@ -310,17 +295,14 @@ def save_results(self, sm, sm_err, mag, number):
             new_cat = file_io.FITSCatalogue(
                 self._output_path,
                 SEx_catalogue=True,
-                open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
+                open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
             )
             ori_cat.add_col(
-                'SPREAD_MODEL',
-                sm,
-                new_cat=True,
-                new_cat_inst=new_cat
+                "SPREAD_MODEL", sm, new_cat=True, new_cat_inst=new_cat
             )
             ori_cat.close()
             new_cat.open()
-            new_cat.add_col('SPREADERR_MODEL', sm_err)
+            new_cat.add_col("SPREADERR_MODEL", sm_err)
             new_cat.close()
         else:
-            raise ValueError('Mode must be in [new, add].')
+            raise ValueError("Mode must be in [new, add].")
diff --git a/shapepipe/modules/spread_model_runner.py b/shapepipe/modules/spread_model_runner.py
index 59e1319be..16c9a2d3b 100644
--- a/shapepipe/modules/spread_model_runner.py
+++ b/shapepipe/modules/spread_model_runner.py
@@ -11,16 +11,16 @@
 
 
 @module_runner(
-    version='1.1',
+    version="1.1",
     input_module=[
-        'sextractor_runner',
-        'psfex_interp_runner',
-        'vignetmaker_runner'
+        "sextractor_runner",
+        "psfex_interp_runner",
+        "vignetmaker_runner",
     ],
-    file_pattern=['sexcat', 'galaxy_psf', 'weight_vign'],
-    file_ext=['.fits', '.sqlite', '.fits'],
-    depends=['numpy', 'galsim'],
-    run_method='parallel',
+    file_pattern=["sexcat", "galaxy_psf", "weight_vign"],
+    file_ext=[".fits", ".sqlite", ".fits"],
+    depends=["numpy", "galsim"],
+    run_method="parallel",
 )
 def spread_model_runner(
     input_file_list,
@@ -35,21 +35,21 @@ def spread_model_runner(
     sex_cat_path, psf_cat_path, weight_cat_path = input_file_list
 
     # Get file prefix (optional)
-    if config.has_option(module_config_sec, 'PREFIX'):
-        prefix = config.get(module_config_sec, 'PREFIX')
-        if (prefix.lower() != 'none') & (prefix != ''):
-            prefix = prefix + '_'
+    if config.has_option(module_config_sec, "PREFIX"):
+        prefix = config.get(module_config_sec, "PREFIX")
+        if (prefix.lower() != "none") & (prefix != ""):
+            prefix = prefix + "_"
         else:
-            prefix = ''
+            prefix = ""
     else:
-        prefix = ''
+        prefix = ""
 
     # Get pixel scale and output mode
-    pixel_scale = config.getfloat(module_config_sec, 'PIXEL_SCALE')
-    output_mode = config.get(module_config_sec, 'OUTPUT_MODE')
+    pixel_scale = config.getfloat(module_config_sec, "PIXEL_SCALE")
+    output_mode = config.get(module_config_sec, "OUTPUT_MODE")
 
     # Set output file path
-    file_name = f'{prefix}sexcat_sm{file_number_string}.fits'
+    file_name = f"{prefix}sexcat_sm{file_number_string}.fits"
     output_path = f'{run_dirs["output"]}/{file_name}'
 
     # Create spread model class instance
diff --git a/shapepipe/modules/uncompress_fits_package/__init__.py b/shapepipe/modules/uncompress_fits_package/__init__.py
index 2630e1ab4..5f5cd26bc 100644
--- a/shapepipe/modules/uncompress_fits_package/__init__.py
+++ b/shapepipe/modules/uncompress_fits_package/__init__.py
@@ -29,4 +29,4 @@
 
 """
 
-__all__ = ['uncompress_fits']
+__all__ = ["uncompress_fits"]
diff --git a/shapepipe/modules/uncompress_fits_package/uncompress_fits.py b/shapepipe/modules/uncompress_fits_package/uncompress_fits.py
index f8eca921d..55f3d4d75 100644
--- a/shapepipe/modules/uncompress_fits_package/uncompress_fits.py
+++ b/shapepipe/modules/uncompress_fits_package/uncompress_fits.py
@@ -35,7 +35,7 @@ def __init__(
         output_pattern_list,
         output_dir,
         file_number_string,
-        data_hdu
+        data_hdu,
     ):
 
         self._input_file_list = input_file_list
@@ -61,7 +61,7 @@ def process(self):
             hdu = fits.PrimaryHDU(data, header)
             hdul = fits.HDUList([hdu])
             hdul.writeto(
-                f'{self._output_dir}/'
-                + f'{self._output_pattern_list[idx]}'
-                + f'{self._file_number_string}.fits'
+                f"{self._output_dir}/"
+                + f"{self._output_pattern_list[idx]}"
+                + f"{self._file_number_string}.fits"
             )
diff --git a/shapepipe/modules/uncompress_fits_runner.py b/shapepipe/modules/uncompress_fits_runner.py
index 3ff070233..39ee4186e 100644
--- a/shapepipe/modules/uncompress_fits_runner.py
+++ b/shapepipe/modules/uncompress_fits_runner.py
@@ -11,10 +11,10 @@
 
 
 @module_runner(
-    version='1.1',
-    file_pattern=['image'],
-    file_ext=['.fits'],
-    numbering_scheme='_0',
+    version="1.1",
+    file_pattern=["image"],
+    file_ext=[".fits"],
+    numbering_scheme="_0",
 )
 def uncompress_fits_runner(
     input_file_list,
@@ -26,27 +26,27 @@ def uncompress_fits_runner(
 ):
     """Define The Uncompress Fits Runner."""
     # Get HDU number of input image data
-    if config.has_option(module_config_sec, 'HDU_DATA'):
-        data_hdu = config.getint(module_config_sec, 'HDU_DATA')
+    if config.has_option(module_config_sec, "HDU_DATA"):
+        data_hdu = config.getint(module_config_sec, "HDU_DATA")
     else:
         data_hdu = 0
 
     # Get output patterns
-    output_pattern_list = config.getlist(module_config_sec, 'OUTPUT_PATTERN')
+    output_pattern_list = config.getlist(module_config_sec, "OUTPUT_PATTERN")
 
     # Check consistency of input and output list lengths
     if len(input_file_list) != len(output_pattern_list):
         raise ValueError(
-            f'Lists INPUT_PATH ({len(input_file_list)})'
-            + f' and OUTPUT_PATTERN ({len(output_pattern_list)})'
-            + 'need to be of equal length.'
+            f"Lists INPUT_PATH ({len(input_file_list)})"
+            + f" and OUTPUT_PATTERN ({len(output_pattern_list)})"
+            + "need to be of equal length."
         )
 
     # Create instance of uncompress
     uncompress_inst = uncompress_fits.Uncompress(
         input_file_list,
         output_pattern_list,
-        run_dirs['output'],
+        run_dirs["output"],
         file_number_string,
         data_hdu,
     )
diff --git a/shapepipe/modules/vignetmaker_package/__init__.py b/shapepipe/modules/vignetmaker_package/__init__.py
index a61e83c27..b24f8397e 100644
--- a/shapepipe/modules/vignetmaker_package/__init__.py
+++ b/shapepipe/modules/vignetmaker_package/__init__.py
@@ -47,4 +47,4 @@
 
 """
 
-__all__ = ['vignetmaker']
+__all__ = ["vignetmaker"]
diff --git a/shapepipe/modules/vignetmaker_package/vignetmaker.py b/shapepipe/modules/vignetmaker_package/vignetmaker.py
index a7e2b2857..fdae9e717 100644
--- a/shapepipe/modules/vignetmaker_package/vignetmaker.py
+++ b/shapepipe/modules/vignetmaker_package/vignetmaker.py
@@ -72,14 +72,14 @@ def process(self, image_path_list, rad, prefix):
         for _prefix, img in zip(prefix, image_path_list):
             image_path = img
 
-            if self._pos_type == 'PIX':
+            if self._pos_type == "PIX":
                 pos = self._pos
-            elif self._pos_type == 'SPHE':
+            elif self._pos_type == "SPHE":
                 pos = convert_pos(image_path)
             else:
                 raise ValueError(
-                    'Coordinates type must be in : PIX (pixel), '
-                    + 'SPHE (spherical).'
+                    "Coordinates type must be in : PIX (pixel), "
+                    + "SPHE (spherical)."
                 )
 
             vign = self._get_stamp(image_path, pos - 1, rad)
@@ -205,19 +205,18 @@ def _get_stamp_me(self, image_dirs, image_pattern):
         cat = file_io.FITSCatalogue(self._galcat_path, SEx_catalogue=True)
         cat.open()
 
-        all_id = np.copy(cat.get_data()['NUMBER'])
-        n_epoch = np.copy(cat.get_data()['N_EPOCH'])
+        all_id = np.copy(cat.get_data()["NUMBER"])
+        n_epoch = np.copy(cat.get_data()["N_EPOCH"])
 
         list_ext_name = cat.get_ext_name()
         hdu_ind = [
-            i for i in range(len(list_ext_name))
-            if 'EPOCH' in list_ext_name[i]
+            i for i in range(len(list_ext_name)) if "EPOCH" in list_ext_name[i]
         ]
 
         final_list = []
         for hdu_index in hdu_ind:
-            exp_name = cat.get_data(hdu_index)['EXP_NAME'][0]
-            ccd_list = list(set(cat.get_data(hdu_index)['CCD_N']))
+            exp_name = cat.get_data(hdu_index)["EXP_NAME"][0]
+            ccd_list = list(set(cat.get_data(hdu_index)["CCD_N"]))
             array_vign = None
             array_id = None
             array_exp_name = None
@@ -240,15 +239,17 @@ def _get_stamp_me(self, image_dirs, image_pattern):
                         f"Could not find image {image_name}"
                     )
 
-                ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0]
+                ind_obj = np.where(cat.get_data(hdu_index)["CCD_N"] == ccd)[0]
                 obj_id = all_id[ind_obj]
 
-                wcs_file = self._f_wcs_file[exp_name][ccd]['WCS']
-                pos = np.array(wcs_file.all_world2pix(
-                    self._pos[:, 1][ind_obj],
-                    self._pos[:, 0][ind_obj],
-                    1,
-                )).T
+                wcs_file = self._f_wcs_file[exp_name][ccd]["WCS"]
+                pos = np.array(
+                    wcs_file.all_world2pix(
+                        self._pos[:, 1][ind_obj],
+                        self._pos[:, 0][ind_obj],
+                        1,
+                    )
+                ).T
                 pos[:, [0, 1]] = pos[:, [1, 0]]
 
                 tmp_vign = self._get_stamp(img_path, pos - 1, self._rad)
@@ -256,9 +257,7 @@ def _get_stamp_me(self, image_dirs, image_pattern):
                 if array_vign is None:
                     array_vign = np.copy(tmp_vign)
                 else:
-                    array_vign = np.concatenate(
-                        (array_vign, np.copy(tmp_vign))
-                    )
+                    array_vign = np.concatenate((array_vign, np.copy(tmp_vign)))
 
                 if array_id is None:
                     array_id = np.copy(obj_id)
@@ -266,7 +265,7 @@ def _get_stamp_me(self, image_dirs, image_pattern):
                     array_id = np.concatenate((array_id, np.copy(obj_id)))
 
                 exp_name_tmp = np.array(
-                    [exp_name + '-' + str(ccd) for i in range(len(obj_id))]
+                    [exp_name + "-" + str(ccd) for i in range(len(obj_id))]
                 )
                 if array_exp_name is None:
                     array_exp_name = exp_name_tmp
@@ -289,16 +288,16 @@ def _get_stamp_me(self, image_dirs, image_pattern):
 
                 where_res = np.where(final_list[j][0] == id_tmp)[0]
 
-                if (len(where_res) != 0):
+                if len(where_res) != 0:
                     index = final_list[j][2][where_res[0]]
                     output_dict[id_tmp][index] = {}
-                    output_dict[id_tmp][index]['VIGNET'] = (
-                        final_list[j][1][where_res[0]]
-                    )
+                    output_dict[id_tmp][index]["VIGNET"] = final_list[j][1][
+                        where_res[0]
+                    ]
                     counter += 1
 
             if counter == 0:
-                output_dict[id_tmp] = 'empty'
+                output_dict[id_tmp] = "empty"
 
         return output_dict
 
@@ -353,8 +352,8 @@ def _save_vignet_me(self, output_dict, prefix):
             Prefix to use for the output file name
 
         """
-        output_name = f'{self._output_dir}/{prefix}_vignet{self._image_num}'
-        output_file = SqliteDict(output_name + '.sqlite')
+        output_name = f"{self._output_dir}/{prefix}_vignet{self._image_num}"
+        output_file = SqliteDict(output_name + ".sqlite")
 
         for _index in output_dict.keys():
             output_file[str(_index)] = output_dict[_index]
@@ -382,7 +381,7 @@ def get_original_vignet(galcat_path):
     file = file_io.FITSCatalogue(galcat_path, SEx_catalogue=True)
     file.open()
 
-    vignet = file.get_data()['VIGNET']
+    vignet = file.get_data()["VIGNET"]
 
     file.close()
 
@@ -433,7 +432,7 @@ def save_vignet(vignet, sexcat_path, output_dir, prefix, image_num):
         Image numbering
 
     """
-    output_name = f'{output_dir}/{prefix}_vignet{image_num}.fits'
+    output_name = f"{output_dir}/{prefix}_vignet{image_num}.fits"
 
     file = file_io.FITSCatalogue(
         output_name,
@@ -441,4 +440,4 @@ def save_vignet(vignet, sexcat_path, output_dir, prefix, image_num):
         open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite,
     )
 
-    file.save_as_fits(vignet, names=['VIGNET'], sex_cat_path=sexcat_path)
+    file.save_as_fits(vignet, names=["VIGNET"], sex_cat_path=sexcat_path)
diff --git a/shapepipe/modules/vignetmaker_runner.py b/shapepipe/modules/vignetmaker_runner.py
index 9a83f1cd6..55a0eda24 100644
--- a/shapepipe/modules/vignetmaker_runner.py
+++ b/shapepipe/modules/vignetmaker_runner.py
@@ -13,11 +13,11 @@
 
 
 @module_runner(
-    version='1.1',
-    input_module='sextractor_runner',
-    file_pattern=['galaxy_selection', 'image'],
-    file_ext=['.fits', '.fits'],
-    depends=['numpy', 'astropy', 'sf_tools', 'sqlitedict'],
+    version="1.1",
+    input_module="sextractor_runner",
+    file_pattern=["galaxy_selection", "image"],
+    file_ext=[".fits", ".fits"],
+    depends=["numpy", "astropy", "sf_tools", "sqlitedict"],
 )
 def vignetmaker_runner(
     input_file_list,
@@ -33,83 +33,84 @@ def vignetmaker_runner(
 
     # Check if masking should be performed
     # With masking
-    if config.getboolean(module_config_sec, 'MASKING'):
+    if config.getboolean(module_config_sec, "MASKING"):
         # Fetch the mask value
-        mask_value = config.getfloat(module_config_sec, 'MASK_VALUE')
+        mask_value = config.getfloat(module_config_sec, "MASK_VALUE")
         # Make a mask
         vignet = vm.make_mask(galcat_path=galcat_path, mask_value=mask_value)
         # Save the vignet
         vm.save_vignet(
             vignet=vignet,
             sexcat_path=galcat_path,
-            output_dir=run_dirs['output'],
-            prefix='cat',
+            output_dir=run_dirs["output"],
+            prefix="cat",
             image_num=file_number_string,
         )
 
     # Without masking
     else:
         # Fetch stamp size
-        stamp_size = config.getint(module_config_sec, 'STAMP_SIZE') - 1
+        stamp_size = config.getint(module_config_sec, "STAMP_SIZE") - 1
         # Check stamp size
         if stamp_size % 2 != 0:
-            raise ValueError('The STAMP_SIZE must be odd')
+            raise ValueError("The STAMP_SIZE must be odd")
         # Set radius
         radius = int(stamp_size / 2)
 
         # Fetch position type and values
-        pos_type = config.get(module_config_sec, 'COORD')
-        pos_params = config.getlist(module_config_sec, 'POSITION_PARAMS')
+        pos_type = config.get(module_config_sec, "COORD")
+        pos_params = config.getlist(module_config_sec, "POSITION_PARAMS")
         # Fetch vignet run mode
-        mode = config.get(module_config_sec, 'MODE')
+        mode = config.get(module_config_sec, "MODE")
 
         # Create instance of VignetMaker
         vm_inst = vm.VignetMaker(
             galcat_path=galcat_path,
             pos_type=pos_type,
             pos_params=pos_params,
-            output_dir=run_dirs['output'],
+            output_dir=run_dirs["output"],
             image_num=file_number_string,
         )
 
         # Run in CLASSIC mode
-        if mode == 'CLASSIC':
+        if mode == "CLASSIC":
             # Fetch prefix
-            prefix = config.getlist(module_config_sec, 'PREFIX')
+            prefix = config.getlist(module_config_sec, "PREFIX")
             # Check prefix
             if len(prefix) != len(input_file_list[1:]):
                 raise ValueError(
-                    f'The number of prefixes ({len(prefix)}) has to be '
-                    + 'equal to the number of input file types '
-                    + f'({len(input_file_list[1:])}).'
+                    f"The number of prefixes ({len(prefix)}) has to be "
+                    + "equal to the number of input file types "
+                    + f"({len(input_file_list[1:])})."
                 )
 
             # Process inputs
             vm_inst.process(input_file_list[1:], radius, prefix)
 
         # Run in MULTI-EPOCH mode
-        elif mode == 'MULTI-EPOCH':
+        elif mode == "MULTI-EPOCH":
             # Fetch image directory and patterns
-            modules = config.getlist(module_config_sec, 'ME_IMAGE_DIR')
+            modules = config.getlist(module_config_sec, "ME_IMAGE_DIR")
             image_dirs = []
             for module in modules:
                 module_name = module.split(":")[-1]
                 if "last" in module:
-                    dirs = [get_last_dir(run_dirs['run_log'], module_name)]
+                    dirs = [get_last_dir(run_dirs["run_log"], module_name)]
                 elif "all" in module:
-                    dirs = get_all_dirs(run_dirs['run_log'], module_name)
+                    dirs = get_all_dirs(run_dirs["run_log"], module_name)
                 else:
                     raise ValueError(
                         "Expected qualifier 'last:' or 'all' before module"
-                        + f" '{module}' in config entry 'ME_IMAGE_DIR'")
+                        + f" '{module}' in config entry 'ME_IMAGE_DIR'"
+                    )
                 image_dirs.append(dirs)
 
             image_pattern = config.getlist(
                 module_config_sec,
-                'ME_IMAGE_PATTERN',
+                "ME_IMAGE_PATTERN",
             )
             # Fetch WCS log path
-            f_wcs_path = config.getexpanded(module_config_sec, 'ME_LOG_WCS')
+            f_wcs_path = config.getexpanded(module_config_sec, "ME_LOG_WCS")
 
             # Process inputs
             vm_inst.process_me(image_dirs, image_pattern, f_wcs_path, radius)
@@ -117,7 +118,7 @@ def vignetmaker_runner(
         # Invalid mode
         else:
             # Raise error for invalid run mode
-            raise ValueError(f'Invalid MODE=\'{mode}\'')
+            raise ValueError(f"Invalid MODE='{mode}'")
 
     # No return objects
     return None, None
diff --git a/shapepipe/pipeline/__init__.py b/shapepipe/pipeline/__init__.py
index 588c375a5..3966563f6 100644
--- a/shapepipe/pipeline/__init__.py
+++ b/shapepipe/pipeline/__init__.py
@@ -7,17 +7,17 @@
 """
 
 __all__ = [
-    'args',
-    'config',
-    'dependency_handler',
-    'execute',
-    'file_handler',
-    'file_io',
-    'job_handler',
-    'mpi_run',
-    'run_log',
-    'shared',
-    'str_handler',
-    'timeout',
-    'worker_handler',
+    "args",
+    "config",
+    "dependency_handler",
+    "execute",
+    "file_handler",
+    "file_io",
+    "job_handler",
+    "mpi_run",
+    "run_log",
+    "shared",
+    "str_handler",
+    "timeout",
+    "worker_handler",
 ]
diff --git a/shapepipe/pipeline/args.py b/shapepipe/pipeline/args.py
index 818f54163..70cb8c38b 100644
--- a/shapepipe/pipeline/args.py
+++ b/shapepipe/pipeline/args.py
@@ -42,16 +42,24 @@ def print_message(message):
         Custom action class object
 
     """
+
     class customAction(ap.Action):
 
-        def __init__(self, option_strings, version=None, dest=ap.SUPPRESS,
-                     default=ap.SUPPRESS, help=help):
+        def __init__(
+            self,
+            option_strings,
+            version=None,
+            dest=ap.SUPPRESS,
+            default=ap.SUPPRESS,
+            help=help,
+        ):
             super(customAction, self).__init__(
                 option_strings=option_strings,
                 dest=dest,
                 default=default,
                 nargs=0,
-                help=help)
+                help=help,
+            )
 
         def __call__(self, parser, args, values, option_string=None):
             print(message)
@@ -71,10 +79,10 @@ def module_str():
         Formatted string of module names
 
     """
-    string = ''
+    string = ""
 
     for module in __module_list__:
-        string += f' - {module}\n'
+        string += f" - {module}\n"
 
     return string
 
@@ -92,46 +100,44 @@ def create_arg_parser():
     """
     # Create parser
     parser = ap.ArgumentParser(
-        add_help=False, description=shapepipe_logo(),
+        add_help=False,
+        description=shapepipe_logo(),
         formatter_class=cutomFormatter,
     )
-    optional = parser.add_argument_group('Optional Arguments')
+    optional = parser.add_argument_group("Optional Arguments")
 
     # Add arguments
     optional.add_argument(
-        '-h',
-        '--help',
-        action='help',
-        help='show this help message and exit',
+        "-h",
+        "--help",
+        action="help",
+        help="show this help message and exit",
     )
 
     optional.add_argument(
-        '-v',
-        '--version',
-        action='version',
-        version=f'%(prog)s v{__version__}'
+        "-v", "--version", action="version", version=f"%(prog)s v{__version__}"
     )
 
     optional.add_argument(
-        '-l',
-        '--list_modules',
+        "-l",
+        "--list_modules",
         action=print_message(
-            f'ShapePipe modules currently available:\n{module_str()}'
+            f"ShapePipe modules currently available:\n{module_str()}"
         ),
-        help='list modules currently available and exit',
+        help="list modules currently available and exit",
     )
 
     optional.add_argument(
-        '-c',
-        '--config',
-        default='config.ini',
-        help='configuration file name',
+        "-c",
+        "--config",
+        default="config.ini",
+        help="configuration file name",
     )
 
     optional.add_argument(
-        '-e',
-        '--exclusive',
-        help='exclusive input file number string',
+        "-e",
+        "--exclusive",
+        help="exclusive input file number string",
     )
     # Return parser
     return parser.parse_args()
diff --git a/shapepipe/pipeline/config.py b/shapepipe/pipeline/config.py
index 3db2a7b98..f43bf7345 100644
--- a/shapepipe/pipeline/config.py
+++ b/shapepipe/pipeline/config.py
@@ -37,7 +37,7 @@ def getexpanded(self, section, option):
         """
         return self._get(section, os.path.expandvars, option)
 
-    def getlist(self, section, option, delimiter=','):
+    def getlist(self, section, option, delimiter=","):
         """Get List.
 
         This method retrieves a list of strings separated by a given
@@ -100,7 +100,7 @@ def file_name(self):
     def file_name(self, value):
 
         if not os.path.exists(value):
-            raise IOError(f'Configuration file {value} does not exist.')
+            raise IOError(f"Configuration file {value} does not exist.")
 
         self._file_name = value
 
@@ -110,14 +110,14 @@ def _set_defaults(self):
         Set default configuration options.
 
         """
-        if not self.config.has_option('DEFAULT', 'RUN_NAME'):
-            self.config.set('DEFAULT', 'RUN_NAME', 'shapepipe_run')
+        if not self.config.has_option("DEFAULT", "RUN_NAME"):
+            self.config.set("DEFAULT", "RUN_NAME", "shapepipe_run")
 
-        if not self.config.has_option('DEFAULT', 'RUN_DATETIME'):
-            self.config.set('DEFAULT', 'RUN_DATETIME', 'True')
+        if not self.config.has_option("DEFAULT", "RUN_DATETIME"):
+            self.config.set("DEFAULT", "RUN_DATETIME", "True")
 
-        if not self.config.has_option('DEFAULT', 'VERBOSE'):
-            self.config.set('DEFAULT', 'VERBOSE', 'True')
+        if not self.config.has_option("DEFAULT", "VERBOSE"):
+            self.config.set("DEFAULT", "VERBOSE", "True")
 
     def _set_execution_options(self):
         """Set Execution Options.
@@ -132,11 +132,11 @@ def _set_execution_options(self):
             For non-existent module runner
 
         """
-        if not self.config.has_option('EXECUTION', 'MODULE'):
-            raise RuntimeError('No module(s) specified')
+        if not self.config.has_option("EXECUTION", "MODULE"):
+            raise RuntimeError("No module(s) specified")
 
-        if not self.config.has_option('EXECUTION', 'MODE'):
-            self.config.set('EXECUTION', 'MODE', 'smp')
+        if not self.config.has_option("EXECUTION", "MODE"):
+            self.config.set("EXECUTION", "MODE", "smp")
 
     def _set_file_options(self):
         """Set File Options.
@@ -155,26 +155,26 @@ def _set_file_options(self):
             For non-existent output directory
 
         """
-        if not self.config.has_option('FILE', 'LOG_NAME'):
-            self.config.set('FILE', 'LOG_NAME', 'shapepipe')
+        if not self.config.has_option("FILE", "LOG_NAME"):
+            self.config.set("FILE", "LOG_NAME", "shapepipe")
 
-        if not self.config.has_option('FILE', 'RUN_LOG_NAME'):
-            self.config.set('FILE', 'RUN_LOG_NAME', 'shapepipe_runs')
+        if not self.config.has_option("FILE", "RUN_LOG_NAME"):
+            self.config.set("FILE", "RUN_LOG_NAME", "shapepipe_runs")
 
-        if not self.config.has_option('FILE', 'INPUT_DIR'):
-            raise RuntimeError('Not input directory specified')
+        if not self.config.has_option("FILE", "INPUT_DIR"):
+            raise RuntimeError("Not input directory specified")
 
-        if not self.config.has_option('FILE', 'OUTPUT_DIR'):
-            raise RuntimeError('Not output directory specified')
+        if not self.config.has_option("FILE", "OUTPUT_DIR"):
+            raise RuntimeError("Not output directory specified")
 
-        elif not os.path.isdir(self.config.getexpanded('FILE', 'OUTPUT_DIR')):
+        elif not os.path.isdir(self.config.getexpanded("FILE", "OUTPUT_DIR")):
             raise OSError(
                 f'Directory {self.config.getexpanded("FILE", "OUTPUT_DIR")} '
-                + 'not found.'
+                + "not found."
             )
 
-        if not self.config.has_option('FILE', 'CORRECT_FILE_PATTERN'):
-            self.config.set('FILE', 'CORRECT_FILE_PATTERN', 'True')
+        if not self.config.has_option("FILE", "CORRECT_FILE_PATTERN"):
+            self.config.set("FILE", "CORRECT_FILE_PATTERN", "True")
 
     def _set_worker_options(self):
         """Set Worker Options.
@@ -182,11 +182,11 @@ def _set_worker_options(self):
         This module checks the worker options in the configuration file.
 
         """
-        if not self.config.has_section('WORKER'):
-            self.config.add_section('WORKER')
+        if not self.config.has_section("WORKER"):
+            self.config.add_section("WORKER")
 
-        if not self.config.has_option('WORKER', 'PROCESS_PRINT_LIMIT'):
-            self.config.set('WORKER', 'PROCESS_PRINT_LIMIT', '200')
+        if not self.config.has_option("WORKER", "PROCESS_PRINT_LIMIT"):
+            self.config.set("WORKER", "PROCESS_PRINT_LIMIT", "200")
 
     def get_parser(self):
         """Get Parser.
diff --git a/shapepipe/pipeline/dependency_handler.py b/shapepipe/pipeline/dependency_handler.py
index 33b98f6f4..f4779e5ed 100644
--- a/shapepipe/pipeline/dependency_handler.py
+++ b/shapepipe/pipeline/dependency_handler.py
@@ -31,10 +31,10 @@ def __init__(self, dependencies=[], executables=[]):
 
         self.depend = dependencies
         self.execute = executables
-        self._greq = '>='
-        self._equal = '=='
-        self._great = '>'
-        self._less = '<'
+        self._greq = ">="
+        self._equal = "=="
+        self._great = ">"
+        self._less = "<"
         self.dependency_list = []
         self.executable_list = list(set(self.execute))
 
@@ -51,10 +51,10 @@ def depend(self):
     def depend(self, value):
 
         if not isinstance(value, list):
-            raise TypeError('Input must be list type.')
+            raise TypeError("Input must be list type.")
 
         if not all(isinstance(x, str) for x in value):
-            raise ValueError('List elements must be strings.')
+            raise ValueError("List elements must be strings.")
 
         self._depend = value
 
@@ -67,10 +67,10 @@ def execute(self):
     def execute(self, value):
 
         if not isinstance(value, list):
-            raise TypeError('Input must be list type.')
+            raise TypeError("Input must be list type.")
 
         if not all(isinstance(x, str) for x in value):
-            raise ValueError('List elements must be strings.')
+            raise ValueError("List elements must be strings.")
 
         self._execute = value
 
@@ -160,8 +160,7 @@ def _get_indices(array, value):
 
         """
         return [
-            index for index, element in enumerate(array)
-            if element == value
+            index for index, element in enumerate(array) if element == value
         ]
 
     @classmethod
@@ -210,7 +209,7 @@ def _check_executable(exe_name):
 
         """
         if not isinstance(exe_name, str):
-            raise TypeError('Executable name must be a string.')
+            raise TypeError("Executable name must be a string.")
 
         def is_exe(fpath):
             return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
@@ -218,18 +217,20 @@ def is_exe(fpath):
         fpath, fname = os.path.split(exe_name)
 
         if not fpath:
-            res = any([
-                is_exe(os.path.join(path, exe_name))
-                for path in os.environ['PATH'].split(os.pathsep)
-            ])
+            res = any(
+                [
+                    is_exe(os.path.join(path, exe_name))
+                    for path in os.environ["PATH"].split(os.pathsep)
+                ]
+            )
 
         else:
             res = is_exe(exe_name)
 
         if not res:
             raise IOError(
-                f'{exe_name} does not appear to be a valid executable on '
-                + 'this system.'
+                f"{exe_name} does not appear to be a valid executable on "
+                + "this system."
             )
 
     def _split_string(self, string):
@@ -249,19 +250,19 @@ def _split_string(self, string):
 
         """
         if self._greq in string:
-            val = re.split(f'({self._greq})', string)
+            val = re.split(f"({self._greq})", string)
 
         elif self._equal in string:
-            val = re.split(f'({self._equal})', string)
+            val = re.split(f"({self._equal})", string)
 
         elif self._great in string:
-            val = re.split(f'({self._great})', string)
+            val = re.split(f"({self._great})", string)
 
         elif self._less in string:
             raise ValueError('"<" not permitted in package version string.')
 
         else:
-            val = [string, '', '']
+            val = [string, "", ""]
 
         return val
 
@@ -271,10 +272,12 @@ def _split_strings(self):
         This method splits the input dependency modules strings.
 
         """
-        self._depend_arr = list(map(
-            list,
-            zip(*[self._split_string(string) for string in self.depend])
-        ))
+        self._depend_arr = list(
+            map(
+                list,
+                zip(*[self._split_string(string) for string in self.depend]),
+            )
+        )
         self._dependency_set = set(self._depend_arr[0])
 
     def _unique_dependencies(self):
@@ -290,18 +293,18 @@ def _unique_dependencies(self):
             if any(self._equal in element for element in subset):
                 subset = self._slice_col_val(subset, 1, self._equal)
 
-            if any([ver != '' for ver in subset[2]]):
-                subset = (self._slice_col_val(
+            if any([ver != "" for ver in subset[2]]):
+                subset = self._slice_col_val(
                     subset,
                     2,
-                    str(max(
-                        [self._convert_to_float(ver) for ver in subset[2]]
-                    ))
-                ))
+                    str(
+                        max([self._convert_to_float(ver) for ver in subset[2]])
+                    ),
+                )
 
             subset = [element[0] for element in self._slice_2d(subset, [0])]
 
-            self.dependency_list.append(''.join(subset))
+            self.dependency_list.append("".join(subset))
 
     def check_dependencies(self):
         """Check Dependencies.
@@ -322,23 +325,23 @@ def check_dependencies(self):
                 package = importlib.import_module(dependency)
             except Exception:
                 raise ImportError(
-                    f'Could not import pipeline dependency {dependency}'
+                    f"Could not import pipeline dependency {dependency}"
                 )
 
-            if hasattr(package, '__version__'):
+            if hasattr(package, "__version__"):
                 version = package.__version__
             else:
-                version = 'N/A'
+                version = "N/A"
 
-            if hasattr(package, '__path__'):
+            if hasattr(package, "__path__"):
                 path = package.__path__[0]
-            elif hasattr(package, '__file__'):
+            elif hasattr(package, "__file__"):
                 path = package.__file__
             else:
-                path = 'N/A'
+                path = "N/A"
 
             dependency_status_list.append(
-                f' - {package.__name__} {version} {path}'
+                f" - {package.__name__} {version} {path}"
             )
 
         return dependency_status_list
@@ -361,7 +364,7 @@ def check_executables(self):
             self._check_executable(executable)
 
             exe_path, err = subprocess.Popen(
-                f'which {executable}',
+                f"which {executable}",
                 shell=True,
                 stdout=subprocess.PIPE,
                 stderr=subprocess.PIPE,
diff --git a/shapepipe/pipeline/execute.py b/shapepipe/pipeline/execute.py
index d9c63bcb1..0a69fae7f 100644
--- a/shapepipe/pipeline/execute.py
+++ b/shapepipe/pipeline/execute.py
@@ -32,7 +32,7 @@ def execute(command_line):
 
     """
     if not isinstance(command_line, str):
-        raise TypeError('Command line must be a string.')
+        raise TypeError("Command line must be a string.")
 
     command = command_line.split()
     check_executable(command[0])
@@ -40,7 +40,7 @@ def execute(command_line):
     process = sp.Popen(command, stdout=sp.PIPE, stderr=sp.PIPE)
     stdout, stderr = process.communicate()
 
-    return stdout.decode('utf-8'), stderr.decode('utf-8')
+    return stdout.decode("utf-8"), stderr.decode("utf-8")
 
 
 def check_executable(exe_name):
@@ -62,7 +62,7 @@ def check_executable(exe_name):
 
     """
     if not isinstance(exe_name, str):
-        raise TypeError('Executable name must be a string.')
+        raise TypeError("Executable name must be a string.")
 
     def is_exe(fpath):
         return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
@@ -70,16 +70,18 @@ def is_exe(fpath):
     fpath, fname = os.path.split(exe_name)
 
     if not fpath:
-        res = any([
-            is_exe(os.path.join(path, exe_name))
-            for path in os.environ['PATH'].split(os.pathsep)
-        ])
+        res = any(
+            [
+                is_exe(os.path.join(path, exe_name))
+                for path in os.environ["PATH"].split(os.pathsep)
+            ]
+        )
 
     else:
         res = is_exe(exe_name)
 
     if not res:
         raise OSError(
-            f'{exe_name} does not appear to be a valid executable on this '
-            + 'system.'
+            f"{exe_name} does not appear to be a valid executable on this "
+            + "system."
         )
diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py
index 03c9c76ab..a37b3ba13 100644
--- a/shapepipe/pipeline/file_handler.py
+++ b/shapepipe/pipeline/file_handler.py
@@ -44,43 +44,43 @@ def __init__(self, run_name, modules, config, exclusive=None, verbose=True):
         self._run_name = run_name
 
         self._module_list = modules
-        if self._module_list[-1] == '':
-            raise ValueError('Invalid module list, check for a trailing comma')
+        if self._module_list[-1] == "":
+            raise ValueError("Invalid module list, check for a trailing comma")
 
         self._config = config
         self._exclusive = exclusive
         self._verbose = verbose
 
         self.module_runners = get_module_runners(self._module_list)
-        self._input_list = config.getlist('FILE', 'INPUT_DIR')
-        self._output_dir = config.getexpanded('FILE', 'OUTPUT_DIR')
-        self._log_name = config.get('FILE', 'LOG_NAME')
+        self._input_list = config.getlist("FILE", "INPUT_DIR")
+        self._output_dir = config.getexpanded("FILE", "OUTPUT_DIR")
+        self._log_name = config.get("FILE", "LOG_NAME")
         self._correct_pattern = config.getboolean(
-            'FILE',
-            'CORRECT_FILE_PATTERN',
+            "FILE",
+            "CORRECT_FILE_PATTERN",
         )
         self._run_log_file = self.setpath(
             self._output_dir,
-            config.get('FILE', 'RUN_LOG_NAME'),
-            '.txt',
+            config.get("FILE", "RUN_LOG_NAME"),
+            ".txt",
         )
         self._module_dict = {}
 
-        if config.has_option('FILE', 'FILE_PATTERN'):
-            self._file_pattern = config.getlist('FILE', 'FILE_PATTERN')
-        if config.has_option('FILE', 'FILE_EXT'):
-            self._file_ext = config.getlist('FILE', 'FILE_EXT')
-        if config.has_option('FILE', 'NUMBERING_SCHEME'):
-            self._numbering_scheme = config.get('FILE', 'NUMBERING_SCHEME')
+        if config.has_option("FILE", "FILE_PATTERN"):
+            self._file_pattern = config.getlist("FILE", "FILE_PATTERN")
+        if config.has_option("FILE", "FILE_EXT"):
+            self._file_ext = config.getlist("FILE", "FILE_EXT")
+        if config.has_option("FILE", "NUMBERING_SCHEME"):
+            self._numbering_scheme = config.get("FILE", "NUMBERING_SCHEME")
         else:
-            self._numbering_scheme = r'RE:\_\d+'
-        if config.has_option('FILE', 'NUMBER_LIST'):
-            if os.path.isfile(config.get('FILE', 'NUMBER_LIST')):
-                self._number_list = (
-                    self.read_number_list(config.get('FILE', 'NUMBER_LIST'))
+            self._numbering_scheme = r"RE:\_\d+"
+        if config.has_option("FILE", "NUMBER_LIST"):
+            if os.path.isfile(config.get("FILE", "NUMBER_LIST")):
+                self._number_list = self.read_number_list(
+                    config.get("FILE", "NUMBER_LIST")
                 )
             else:
-                self._number_list = config.getlist('FILE', 'NUMBER_LIST')
+                self._number_list = config.getlist("FILE", "NUMBER_LIST")
         else:
             self._number_list = None
 
@@ -141,7 +141,7 @@ def read_number_list(file_name):
         with open(file_name) as data_file:
             number_list = data_file.readlines()
 
-        return [value.rstrip('\n') for value in number_list]
+        return [value.rstrip("\n") for value in number_list]
 
     @classmethod
     def check_dir(cls, dir_name, check_exists=False):
@@ -161,7 +161,7 @@ def check_dir(cls, dir_name, check_exists=False):
 
         """
         if check_exists and os.path.isdir(dir_name):
-            raise OSError(f'Directory {dir_name} already exists.')
+            raise OSError(f"Directory {dir_name} already exists.")
 
         return cls.strip_slash(dir_name)
 
@@ -195,7 +195,7 @@ def mkdir(cls, dir_name):
         mkdir(dir_name)
 
     @staticmethod
-    def setpath(path, name, ext=''):
+    def setpath(path, name, ext=""):
         """Set Path Name.
 
         This method appends the file/directory name to the input path.
@@ -215,7 +215,7 @@ def setpath(path, name, ext=''):
             Formated path
 
         """
-        return f'{path}/{name}{ext}'
+        return f"{path}/{name}{ext}"
 
     @staticmethod
     def strip_slash(path):
@@ -234,7 +234,7 @@ def strip_slash(path):
             Updated path
 
         """
-        return path.rstrip('/')
+        return path.rstrip("/")
 
     @classmethod
     def strip_slash_list(cls, path_list):
@@ -292,8 +292,8 @@ def _get_module_run_name(dir):
             Module run name, module name, search string
 
         """
-        string, module_run = dir.split(':')
-        module = module_run.split('/')[0]
+        string, module_run = dir.split(":")
+        module = module_run.split("/")[0]
 
         return module_run.lower(), module.lower(), string
 
@@ -321,30 +321,32 @@ def _check_input_dir_list(self, dir_list):
             if os.path.isdir(dir):
                 input_dir.append(dir)
 
-            elif 'last' in dir.lower():
+            elif "last" in dir.lower():
                 module_run, module, _ = self._get_module_run_name(dir)
                 runs = get_list(self._run_log_file)
                 last_module = get_last(runs, module)
                 input_dir.append(
                     self.setpath(
                         self.setpath(last_module, module_run),
-                        'output',
+                        "output",
                     )
                 )
 
-            elif 'all' in dir.lower():
+            elif "all" in dir.lower():
                 module_run, module, _ = self._get_module_run_name(dir)
                 runs = get_list(self._run_log_file)
                 all_runs = get_all(runs, module)
-                input_dir.extend([
-                    self.setpath(
-                        self.setpath(run.split(' ')[0], module_run),
-                        'output'
-                    )
-                    for run in all_runs
-                ])
+                input_dir.extend(
+                    [
+                        self.setpath(
+                            self.setpath(run.split(" ")[0], module_run),
+                            "output",
+                        )
+                        for run in all_runs
+                    ]
+                )
 
-            elif ':' in dir.lower():
+            elif ":" in dir.lower():
                 module_run, _, string = self._get_module_run_name(dir)
                 input_dir.append(
                     self.setpath(
@@ -352,15 +354,15 @@ def _check_input_dir_list(self, dir_list):
                             self._run_log.get_run(string),
                             module_run,
                         ),
-                        'output',
+                        "output",
                     )
                 )
 
             else:
                 raise ValueError(
-                    f'Invalid INPUT_DIR ({dir}). Make sure the paths '
-                    + 'provided are valid directories or use the '
-                    + 'allowed special keys.'
+                    f"Invalid INPUT_DIR ({dir}). Make sure the paths "
+                    + "provided are valid directories or use the "
+                    + "allowed special keys."
                 )
 
         return input_dir
@@ -380,8 +382,8 @@ def create_global_run_dirs(self):
 
         """
         self.run_dir = self.setpath(self._output_dir, self._run_name)
-        self._log_dir = self.setpath(self.run_dir, 'logs')
-        self._tmp_dir = self.setpath(self.run_dir, 'tmp')
+        self._log_dir = self.setpath(self.run_dir, "logs")
+        self._tmp_dir = self.setpath(self.run_dir, "tmp")
         self.log_name = self.setpath(self._log_dir, self._log_name)
         self._run_log = RunLog(
             self._run_log_file,
@@ -406,7 +408,7 @@ def _copy_config_to_log(self):
 
         copyfile(
             self._config.file_name,
-            f'{self._log_dir}/{config_file_name}',
+            f"{self._log_dir}/{config_file_name}",
         )
 
     def get_module_current_run(self, module):
@@ -425,7 +427,7 @@ def get_module_current_run(self, module):
             Module run count
 
         """
-        return str(self._module_dict[module]['run_count'])
+        return str(self._module_dict[module]["run_count"])
 
     def get_module_run_prop(self, module, property):
         """Get Module Run Property.
@@ -450,9 +452,9 @@ def get_module_run_prop(self, module, property):
             For invalid module dictionary key
 
         """
-        run_name = self._module_dict[module]['latest']
+        run_name = self._module_dict[module]["latest"]
 
-        if property == 'run_name':
+        if property == "run_name":
             value = run_name
         elif property in self._module_dict[module].keys():
             value = self._module_dict[module][property]
@@ -460,7 +462,7 @@ def get_module_run_prop(self, module, property):
             value = self._module_dict[module][run_name][property]
         else:
             raise ValueError(
-                f'Property {property} not found for module {module}.'
+                f"Property {property} not found for module {module}."
             )
 
         return value
@@ -481,7 +483,7 @@ def get_module_config_sec(self, module):
             Configuration file section name
 
         """
-        return self._module_dict[module]['latest'].upper()
+        return self._module_dict[module]["latest"].upper()
 
     def get_add_module_property(self, run_name, property):
         """Get Additional Module Properties.
@@ -501,14 +503,14 @@ def get_add_module_property(self, run_name, property):
             Additional module property values
 
         """
-        if (self._config.has_option(
+        if self._config.has_option(
             run_name.upper(),
-            f'ADD_{property.upper()}',
-        )):
+            f"ADD_{property.upper()}",
+        ):
 
             return self._config.getlist(
                 run_name.upper(),
-                f'ADD_{property.upper()}',
+                f"ADD_{property.upper()}",
             )
 
     def _set_module_property(self, module, run_name, property, get_type):
@@ -544,22 +546,22 @@ def _set_module_property(self, module, run_name, property, get_type):
         """
         # 1) Check for parameter value in module section of config file
         if self._config.has_option(run_name.upper(), property.upper()):
-            if get_type == 'str':
+            if get_type == "str":
                 prop_val = self._config.get(
                     run_name.upper(),
                     property.upper(),
                 )
-            elif get_type == 'list':
+            elif get_type == "list":
                 prop_val = self._config.getlist(
                     run_name.upper(),
                     property.upper(),
                 )
             else:
-                raise ValueError(f'{get_type} is not a valid get type')
+                raise ValueError(f"{get_type} is not a valid get type")
 
         # 2) Check for default parameter values in file handler
-        elif hasattr(self, f'_{property}'):
-            prop_val = getattr(self, f'_{property}')
+        elif hasattr(self, f"_{property}"):
+            prop_val = getattr(self, f"_{property}")
 
         # 3) Check for default parameter values in module runner
         elif hasattr(self.module_runners[module], property):
@@ -567,13 +569,12 @@ def _set_module_property(self, module, run_name, property, get_type):
 
         else:
             raise ValueError(
-                f'No value for {property} in {module} could be found.'
+                f"No value for {property} in {module} could be found."
             )
 
         # Look for additional module properties for list objects
-        if (
-            isinstance(prop_val, list)
-            and self.get_add_module_property(run_name, property)
+        if isinstance(prop_val, list) and self.get_add_module_property(
+            run_name, property
         ):
             prop_val += self.get_add_module_property(run_name, property)
 
@@ -591,37 +592,35 @@ def _set_module_properties(self, module, run_name):
 
         """
         module_props = {
-            'numbering_scheme': 'str',
-            'run_method': 'str',
-            'input_module': 'list',
-            'file_pattern': 'list',
-            'file_ext': 'list',
-            'depends': 'list',
-            'executes': 'list'
+            "numbering_scheme": "str",
+            "run_method": "str",
+            "input_module": "list",
+            "file_pattern": "list",
+            "file_ext": "list",
+            "depends": "list",
+            "executes": "list",
         }
 
         for property, get_type in module_props.items():
             self._set_module_property(module, run_name, property, get_type)
 
         # Make sure the number of patterns and extensions match
-        if (
-            (len(self._module_dict[module][run_name]['file_ext']) == 1)
-            and (len(self._module_dict[module][run_name]['file_pattern']) > 1)
+        if (len(self._module_dict[module][run_name]["file_ext"]) == 1) and (
+            len(self._module_dict[module][run_name]["file_pattern"]) > 1
         ):
-            self._module_dict[module][run_name]['file_ext'] = [
-                self._module_dict[module][run_name]['file_ext'][0]
-                for i in self._module_dict[module][run_name]['file_pattern']
+            self._module_dict[module][run_name]["file_ext"] = [
+                self._module_dict[module][run_name]["file_ext"][0]
+                for i in self._module_dict[module][run_name]["file_pattern"]
             ]
 
-        if (
-            len(self._module_dict[module][run_name]['file_ext'])
-            != len(self._module_dict[module][run_name]['file_pattern'])
+        if len(self._module_dict[module][run_name]["file_ext"]) != len(
+            self._module_dict[module][run_name]["file_pattern"]
         ):
-            n_fext = len(self._module_dict[module][run_name]['file_ext'])
-            n_fpat = len(self._module_dict[module][run_name]['file_pattern'])
+            n_fext = len(self._module_dict[module][run_name]["file_ext"])
+            n_fpat = len(self._module_dict[module][run_name]["file_pattern"])
             raise ValueError(
-                f'The number of file_ext values ({n_fext}) does not match the '
-                + f'number of file_pattern values ({n_fpat}).'
+                f"The number of file_ext values ({n_fext}) does not match the "
+                + f"number of file_pattern values ({n_fpat})."
             )
 
     def _create_module_run_dirs(self, module, run_name):
@@ -635,34 +634,30 @@ def _create_module_run_dirs(self, module, run_name):
             Module name
 
         """
-        self._module_dict[module][run_name]['run_dir'] = (
-            self.setpath(self._run_dir, run_name)
+        self._module_dict[module][run_name]["run_dir"] = self.setpath(
+            self._run_dir, run_name
         )
-        self._module_dict[module][run_name]['log_dir'] = (
-            self.setpath(
-                self._module_dict[module][run_name]['run_dir'],
-                'logs',
-            )
+        self._module_dict[module][run_name]["log_dir"] = self.setpath(
+            self._module_dict[module][run_name]["run_dir"],
+            "logs",
         )
-        self._module_dict[module][run_name]['output_dir'] = (
-            self.setpath(
-                self._module_dict[module][run_name]['run_dir'],
-                'output',
-            )
+        self._module_dict[module][run_name]["output_dir"] = self.setpath(
+            self._module_dict[module][run_name]["run_dir"],
+            "output",
         )
 
-        self.mkdir(self._module_dict[module][run_name]['run_dir'])
-        self.mkdir(self._module_dict[module][run_name]['log_dir'])
-        self.mkdir(self._module_dict[module][run_name]['output_dir'])
+        self.mkdir(self._module_dict[module][run_name]["run_dir"])
+        self.mkdir(self._module_dict[module][run_name]["log_dir"])
+        self.mkdir(self._module_dict[module][run_name]["output_dir"])
 
         # Set current output directory to module output directory
-        self.output_dir = self._module_dict[module][run_name]['output_dir']
+        self.output_dir = self._module_dict[module][run_name]["output_dir"]
         self.module_run_dirs = {
-            'run': self.run_dir,
-            'log': self._log_dir,
-            'tmp': self._tmp_dir,
-            'output': self.output_dir,
-            'run_log': self._run_log_file
+            "run": self.run_dir,
+            "log": self._log_dir,
+            "tmp": self._tmp_dir,
+            "output": self.output_dir,
+            "run_log": self._run_log_file,
         }
 
     def _set_module_input_dir(self, module, run_name):
@@ -693,88 +688,82 @@ def _set_module_input_dir(self, module, run_name):
         # run in the pipeline
         if (
             isinstance(
-                self._module_dict[module][run_name]['input_module'],
+                self._module_dict[module][run_name]["input_module"],
                 type(None),
             )
             or len(self._module_dict) == 1
         ):
             # If so, use the input directory/ies set in the [FILE] section
             input_dir = self._input_dir
-            dir_set_by = '[FILE]'
+            dir_set_by = "[FILE]"
 
         # Check if input directory/ies has/have been set in the module config
         # section
-        if self._config.has_option(run_name.upper(), 'INPUT_DIR'):
+        if self._config.has_option(run_name.upper(), "INPUT_DIR"):
             # If so set this/these as the input directory/ies, note that this
             # overrides the value set in the [FILE] section
             input_dir = self._check_input_dir_list(
-                self._config.getlist(run_name.upper(), 'INPUT_DIR')
+                self._config.getlist(run_name.upper(), "INPUT_DIR")
             )
-            dir_set_by = f'[{run_name.upper()}]'
+            dir_set_by = f"[{run_name.upper()}]"
 
         # Check if input directory/ies has/have has not been set and if input
         # modules have been defined for the current module
-        if (
-            not input_dir
-            and isinstance(
-                self._module_dict[module][run_name]['input_module'],
-                list
-            )
+        if not input_dir and isinstance(
+            self._module_dict[module][run_name]["input_module"], list
         ):
-            dir_set_by = f'{module}.py'
+            dir_set_by = f"{module}.py"
             # If so, loop through all the input modules defined for the current
             # module
-            for input_module in (
-                self._module_dict[module][run_name]['input_module']
-            ):
+            for input_module in self._module_dict[module][run_name][
+                "input_module"
+            ]:
                 # Get the input module name and run
-                input_module, in_mod_run = (
-                    shared.split_module_run(input_module)
-                )
+                input_module, in_mod_run = shared.split_module_run(input_module)
                 # Check if the input module was part of the current pipeline
                 if input_module in self._module_dict:
                     # If so, check if the input module was a single run
                     if in_mod_run == input_module:
                         # If so, Set the input module run to the latest run
-                        in_mod_run = self._module_dict[input_module]['latest']
+                        in_mod_run = self._module_dict[input_module]["latest"]
                     # Add the output directory of the input module to
                     # the list of input directories for the current module
                     input_dir.append(
                         self._module_dict[input_module][in_mod_run][
-                            'output_dir'
+                            "output_dir"
                         ]
                     )
                 else:
                     # If not, add the last run of the input module to the
                     # list of input directories
-                    input_dir.append(f'{input_module}:last')
+                    input_dir.append(f"{input_module}:last")
 
         # Check if input directory/ies has/have been added in the module config
         # section
-        if self.get_add_module_property(run_name, 'input_dir'):
+        if self.get_add_module_property(run_name, "input_dir"):
             # If so add this/these to the input directory/ies
-            input_dir += self.get_add_module_property(run_name, 'input_dir')
-            if not dir_set_by == f'[{module}]':
-                dir_set_by = f'{dir_set_by} and [{run_name.upper()}]'
+            input_dir += self.get_add_module_property(run_name, "input_dir")
+            if not dir_set_by == f"[{module}]":
+                dir_set_by = f"{dir_set_by} and [{run_name.upper()}]"
 
         # Check if no input directory has been set
         if not input_dir:
             # If so, raise an error
             raise RuntimeError(
-                'Could not find appropriate input directory '
-                + f'for module {run_name}.'
+                "Could not find appropriate input directory "
+                + f"for module {run_name}."
             )
 
         # Add the input directories for the current module to the module
         # dictionary
-        self._module_dict[module][run_name]['input_dir'] = (
-            self.check_dirs(input_dir)
+        self._module_dict[module][run_name]["input_dir"] = self.check_dirs(
+            input_dir
         )
-        self._module_dict[module][run_name]['dir_set_by'] = dir_set_by
+        self._module_dict[module][run_name]["dir_set_by"] = dir_set_by
 
         # Log the input directories and how they were set
-        module_input_dir = f' -- Input directories: {input_dir}'
-        module_dir_set_by = f' -- Inputs set by: {dir_set_by}'
+        module_input_dir = f" -- Input directories: {input_dir}"
+        module_dir_set_by = f" -- Inputs set by: {dir_set_by}"
 
         self.log.info(module_input_dir)
         self.log.info(module_dir_set_by)
@@ -806,18 +795,18 @@ def _generate_re_pattern(match_pattern):
 
         """
         if not isinstance(match_pattern, str):
-            TypeError('Match pattern must be a string.')
+            TypeError("Match pattern must be a string.")
 
         chars = [char for char in match_pattern if not char.isalnum()]
-        split_pattern = '|'.join(chars).replace('.', r'\.')
-        chars = [f'\\{char}' for char in chars] + ['']
+        split_pattern = "|".join(chars).replace(".", r"\.")
+        chars = [f"\\{char}" for char in chars] + [""]
         num_length = [
-            f'\\d{{{len(digits)}}}'
+            f"\\d{{{len(digits)}}}"
             for digits in re.split(split_pattern, match_pattern)
         ]
-        re_pattern = r''.join(
+        re_pattern = r"".join(
             [a for b in zip(num_length, chars) for a in b]
-        ).replace('{1}', '+')
+        ).replace("{1}", "+")
 
         return re.compile(re_pattern)
 
@@ -841,8 +830,9 @@ def _strip_dir_from_file(file_name, dir_list):
 
         """
         return [
-            file_name.replace(_dir + '/', '')
-            for _dir in dir_list if _dir in file_name
+            file_name.replace(_dir + "/", "")
+            for _dir in dir_list
+            if _dir in file_name
         ][0]
 
     @classmethod
@@ -869,13 +859,13 @@ def _get_re(cls, num_scheme):
         """
         # Raise an error if num_scheme is None,
         # but not if num_scheme==''
-        if not num_scheme and num_scheme != '':
+        if not num_scheme and num_scheme != "":
 
-            raise ValueError('No numbering scheme adapted')
+            raise ValueError("No numbering scheme adapted")
 
-        elif num_scheme.startswith('RE:'):
+        elif num_scheme.startswith("RE:"):
 
-            re_pattern = num_scheme.replace('RE:', '')
+            re_pattern = num_scheme.replace("RE:", "")
 
         else:
 
@@ -884,12 +874,7 @@ def _get_re(cls, num_scheme):
         return re_pattern
 
     def _save_num_patterns(
-        self,
-        dir_list,
-        re_pattern,
-        pattern,
-        ext,
-        output_file
+        self, dir_list, re_pattern, pattern, ext, output_file
     ):
         """Save Number Patterns.
 
@@ -928,11 +913,11 @@ def _save_num_patterns(
         if not true_file_list:
             raise RuntimeError(
                 f'No files found matching "{pattern}" and "{ext}" in the '
-                + f'directories {dir_list}.'
+                + f"directories {dir_list}."
             )
 
         # Correct the extension if necessary
-        new_ext = '.' + ext if not ext.startswith('.') else ext
+        new_ext = "." + ext if not ext.startswith(".") else ext
 
         if self._verbose and new_ext != ext:
             print(f'Updating file extension from "{ext}" to "{new_ext}".')
@@ -960,7 +945,7 @@ def _save_num_patterns(
                 new_pattern = striped
 
                 for substring in (new_ext, file_name):
-                    new_pattern = new_pattern.replace(substring, '')
+                    new_pattern = new_pattern.replace(substring, "")
 
                 if new_pattern != pattern:
                     print(
@@ -979,13 +964,13 @@ def _save_num_patterns(
             )
 
         elem = shared.check_duplicate(final_file_list)
-        if elem != '':
+        if elem != "":
             raise RuntimeError(
-                'Input file list contains at least one duplicate element, '
-                + f'\'{elem}\' that matches '
-                + 'file pattern and numbering scheme, leading to identical '
-                + 'input files.  Make sure that the correct input '
-                + 'directory is used.'
+                "Input file list contains at least one duplicate element, "
+                + f"'{elem}' that matches "
+                + "file pattern and numbering scheme, leading to identical "
+                + "input files.  Make sure that the correct input "
+                + "directory is used."
             )
 
         # Save file list
@@ -1009,14 +994,13 @@ def _save_match_patterns(output_file, mmap_list):
             List of memory maps
 
         """
-        num_pattern_list = [np.load(mmap, mmap_mode='r') for mmap in mmap_list]
+        num_pattern_list = [np.load(mmap, mmap_mode="r") for mmap in mmap_list]
 
         np.save(
             output_file,
             reduce(
-                partial(np.intersect1d, assume_unique=True),
-                num_pattern_list
-            )
+                partial(np.intersect1d, assume_unique=True), num_pattern_list
+            ),
         )
 
         del num_pattern_list
@@ -1045,7 +1029,7 @@ def _get_file_name(path, pattern, number, ext):
             File name
 
         """
-        return f'{path}/{pattern}{number}{ext}'
+        return f"{path}/{pattern}{number}{ext}"
 
     @staticmethod
     def _remove_mmaps(mmap_list):
@@ -1099,7 +1083,7 @@ def _format_process_list(
         pattern_list, ext_list, path_list = list(zip(*patterns))
 
         if isinstance(self._number_list, type(None)):
-            number_list = np.load(memory_map, mmap_mode='r')
+            number_list = np.load(memory_map, mmap_mode="r")
         else:
             number_list = self._number_list
 
@@ -1118,21 +1102,25 @@ def _format_process_list(
                 id_to_test = f"-{self._exclusive.replace('.', '-')}"
                 if number == id_to_test:
                     if self._verbose:
-                        print(f"-- Using exclusive number {self._exclusive} ({id_to_test})")
+                        print(
+                            f"-- Using exclusive number {self._exclusive} ({id_to_test})"
+                        )
                 else:
                     if self._verbose:
-                        #print(f"Skipping {number}, not equal to {self._exclusive} ({id_to_test})")
+                        # print(f"Skipping {number}, not equal to {self._exclusive} ({id_to_test})")
                         pass
                     continue
 
-            if run_method == 'serial':
+            if run_method == "serial":
                 process_items = []
             else:
                 process_items = [number]
-            process_items.extend([
-                self._get_file_name(path, fp, number, ext)
-                for path, fp, ext in zip(path_list, pattern_list, ext_list)
-            ])
+            process_items.extend(
+                [
+                    self._get_file_name(path, fp, number, ext)
+                    for path, fp, ext in zip(path_list, pattern_list, ext_list)
+                ]
+            )
             process_list.append(process_items)
 
         if len(process_list) == 0:
@@ -1169,24 +1157,19 @@ def _save_process_list(
 
         """
         np_mmap_list = [
-            self.setpath(self._tmp_dir, f'nums_{pattern}_{ext}.npy')
+            self.setpath(self._tmp_dir, f"nums_{pattern}_{ext}.npy")
             for pattern, ext in zip(pattern_list, ext_list)
         ]
-        match_mmap = self.setpath(self._tmp_dir, 'matching_num_patterns.npy')
-        self.process_mmap = self.setpath(self._tmp_dir, 'process_list.npy')
+        match_mmap = self.setpath(self._tmp_dir, "matching_num_patterns.npy")
+        self.process_mmap = self.setpath(self._tmp_dir, "process_list.npy")
 
         re_pattern = self._get_re(num_scheme)
 
         temp = [
-            self._save_num_patterns(
-                dir_list,
-                re_pattern,
-                pattern,
-                ext,
-                np_mmap
+            self._save_num_patterns(dir_list, re_pattern, pattern, ext, np_mmap)
+            for pattern, ext, np_mmap in zip(
+                pattern_list, ext_list, np_mmap_list
             )
-            for pattern, ext, np_mmap in
-            zip(pattern_list, ext_list, np_mmap_list)
         ]
 
         self._save_match_patterns(match_mmap, np_mmap_list)
@@ -1202,7 +1185,7 @@ def _save_process_list(
         np.save(self.process_mmap, np.array(process_list))
         del process_list
 
-        self.process_list = np.load(self.process_mmap, mmap_mode='r')
+        self.process_list = np.load(self.process_mmap, mmap_mode="r")
 
         self.missed = []
 
@@ -1227,11 +1210,11 @@ def _get_module_input_files(self, module, run_name):
             Module name
 
         """
-        dir_list = self._module_dict[module][run_name]['input_dir']
-        pattern_list = self._module_dict[module][run_name]['file_pattern']
-        ext_list = self._module_dict[module][run_name]['file_ext']
-        num_scheme = self._module_dict[module][run_name]['numbering_scheme']
-        run_method = self._module_dict[module][run_name]['run_method']
+        dir_list = self._module_dict[module][run_name]["input_dir"]
+        pattern_list = self._module_dict[module][run_name]["file_pattern"]
+        ext_list = self._module_dict[module][run_name]["file_ext"]
+        num_scheme = self._module_dict[module][run_name]["numbering_scheme"]
+        run_method = self._module_dict[module][run_name]["run_method"]
 
         self._save_process_list(
             dir_list,
@@ -1255,19 +1238,19 @@ def set_up_module(self, module):
         multi_call = self._module_list.count(module) > 1
 
         if module in self._module_dict.keys():
-            self._module_dict[module]['run_count'] += 1
+            self._module_dict[module]["run_count"] += 1
         else:
             self._module_dict[module] = {}
-            self._module_dict[module]['run_count'] = 1
+            self._module_dict[module]["run_count"] = 1
 
         if multi_call:
-            call_num = self._module_dict[module]['run_count']
-            run_name = f'{module}_run_{call_num}'
+            call_num = self._module_dict[module]["run_count"]
+            run_name = f"{module}_run_{call_num}"
         else:
             run_name = module
 
         # Log run count
-        module_prop_text = ' - Module properties'
+        module_prop_text = " - Module properties"
         module_run_num = f' -- Run: {self._module_dict[module]["run_count"]}'
 
         self.log.info(module_prop_text)
@@ -1277,7 +1260,7 @@ def set_up_module(self, module):
             print(module_prop_text)
             print(module_run_num)
 
-        self._module_dict[module]['latest'] = run_name
+        self._module_dict[module]["latest"] = run_name
         self._module_dict[module][run_name] = {}
 
         self._set_module_properties(module, run_name)
@@ -1303,7 +1286,7 @@ def get_worker_log_name(self, module, file_number_string):
             Worker log file name
 
         """
-        run_name = self._module_dict[module]['latest']
-        log_dir = self._module_dict[module][run_name]['log_dir']
+        run_name = self._module_dict[module]["latest"]
+        log_dir = self._module_dict[module][run_name]["log_dir"]
 
-        return f'{log_dir}/process{file_number_string}'
+        return f"{log_dir}/process{file_number_string}"
diff --git a/shapepipe/pipeline/file_io.py b/shapepipe/pipeline/file_io.py
index 2aa87959f..ffe8bed82 100644
--- a/shapepipe/pipeline/file_io.py
+++ b/shapepipe/pipeline/file_io.py
@@ -87,7 +87,7 @@ def get_nb_rows(self):
             Number of rows
 
         """
-        raise BaseCatalogue.FeatureNotImplemented('get_nb_rows()')
+        raise BaseCatalogue.FeatureNotImplemented("get_nb_rows()")
 
     def get_nb_cols(self):
         """Get Number of Columns.
@@ -111,7 +111,7 @@ def get_col_names(self):
         list
             list of column names
         """
-        raise BaseCatalogue.FeatureNotImplemented('get_col_names()')
+        raise BaseCatalogue.FeatureNotImplemented("get_col_names()")
 
     def get_col_formats(self):
         """Get Column Formats.
@@ -119,7 +119,7 @@ def get_col_formats(self):
         Get the list of column formats in the order of columns
 
         """
-        raise BaseCatalogue.FeatureNotImplemented('get_col_names()')
+        raise BaseCatalogue.FeatureNotImplemented("get_col_names()")
 
     def add_col(
         self,
@@ -144,7 +144,7 @@ def add_col(
             Column data as a numpy array
 
         """
-        raise BaseCatalogue.FeatureNotImplemented('add_col()')
+        raise BaseCatalogue.FeatureNotImplemented("add_col()")
 
     def _file_exists(self, filepath):
         """File Exists.
@@ -174,9 +174,9 @@ class InputFormat:
     class OpenMode:
         """Supported input catalogue open modes."""
 
-        ReadOnly = 'readonly'
-        ReadWrite = 'update'
-        Append = 'append'
+        ReadOnly = "readonly"
+        ReadWrite = "update"
+        Append = "append"
 
     class Column(object):
         """Column.
@@ -194,7 +194,7 @@ def name(self):
 
             Get the name of the column
             """
-            raise BaseCatalogue.FeatureNotImplemented('column.name')
+            raise BaseCatalogue.FeatureNotImplemented("column.name")
 
         @property
         def format(self):
@@ -203,7 +203,7 @@ def format(self):
             Get the format of the column
 
             """
-            raise BaseCatalogue.FeatureNotImplemented('column.format')
+            raise BaseCatalogue.FeatureNotImplemented("column.format")
 
         @property
         def data(self):
@@ -212,7 +212,7 @@ def data(self):
             Get the data associated with the column
 
             """
-            raise BaseCatalogue.FeatureNotImplemented('column.data')
+            raise BaseCatalogue.FeatureNotImplemented("column.data")
 
         def get_nb_rows(self):
             """Get Number of Rows.
@@ -220,7 +220,7 @@ def get_nb_rows(self):
             Retrieve the number of rows of the column.
 
             """
-            raise BaseCatalogue.FeatureNotImplemented('get_nb_rows()')
+            raise BaseCatalogue.FeatureNotImplemented("get_nb_rows()")
 
         def get_info(self):
             """Get Information.
@@ -228,7 +228,7 @@ def get_info(self):
             Retrieve information about the column.
 
             """
-            raise BaseCatalogue.FeatureNotImplemented('get_info()')
+            raise BaseCatalogue.FeatureNotImplemented("get_info()")
 
         def get_type(self):
             """Get Type.
@@ -236,7 +236,7 @@ def get_type(self):
             Get the data type of the column
 
             """
-            raise BaseCatalogue.FeatureNotImplemented('get_type()')
+            raise BaseCatalogue.FeatureNotImplemented("get_type()")
 
     class FeatureNotImplemented(NotImplementedError):
         """Feature Not Implemented.
@@ -253,8 +253,8 @@ def __init__(self, msg):
 
         def __str__(self):
             return (
-                f'File IO *** ERROR ***: Feature: {self._msg} is not '
-                + 'implemented in this class'
+                f"File IO *** ERROR ***: Feature: {self._msg} is not "
+                + "implemented in this class"
             )
 
     class catalogueNotOpen(Exception):
@@ -274,8 +274,8 @@ def __init__(self, filepath):
 
         def __str__(self):
             return (
-                f'File IO *** ERROR ***: catalogue: {self._filepath} '
-                + 'is not open'
+                f"File IO *** ERROR ***: catalogue: {self._filepath} "
+                + "is not open"
             )
 
     class DataNotFound(Exception):
@@ -298,8 +298,8 @@ def __init__(self, filepath, hdu):
 
         def __str__(self):
             return (
-                f'File IO *** ERROR ***: File \'{self._filepath}\', '
-                + f'hdu={self._hdu}: data not found'
+                f"File IO *** ERROR ***: File '{self._filepath}', "
+                + f"hdu={self._hdu}: data not found"
             )
 
     class catalogueFileNotFound(Exception):
@@ -319,7 +319,7 @@ def __init__(self, filepath):
 
         def __str__(self):
             """Set string representation of the exception object."""
-            return f'File IO *** ERROR ***: file {self._filepath} no found'
+            return f"File IO *** ERROR ***: file {self._filepath} no found"
 
     class ColumnNotFound(Exception):
         """Column Not Found.
@@ -338,7 +338,7 @@ def __init__(self, col_name):
 
         def __str__(self):
             """Set string representation of the exception object."""
-            return f'File IO *** ERROR ***: column {self._col_name} no found'
+            return f"File IO *** ERROR ***: column {self._col_name} no found"
 
     class catalogueNotCreated(Exception):
         """Catalogue Not Created.
@@ -357,8 +357,8 @@ def __init__(self, filepath):
 
         def __str__(self):
             return (
-                f'File IO *** ERROR ***: catalogue: {self._filepath} could '
-                + 'not be created'
+                f"File IO *** ERROR ***: catalogue: {self._filepath} could "
+                + "not be created"
             )
 
     class OpenModeNotSupported(Exception):
@@ -381,8 +381,8 @@ def __init__(self, filepath, open_mode):
 
         def __str__(self):
             return (
-                f'File IO *** ERROR ***: catalogue: {self._filepath} '
-                + 'Open Mode {self._open_mode} not supported'
+                f"File IO *** ERROR ***: catalogue: {self._filepath} "
+                + "Open Mode {self._open_mode} not supported"
             )
 
     class OpenModeConflict(Exception):
@@ -405,8 +405,8 @@ def __init__(self, open_mode, open_mode_needed):
 
         def __str__(self):
             return (
-                'File IO *** ERROR ***: catalogue has to be open as : '
-                + f'{self._open_mode_needed} , Mode used : {self._open_mode}'
+                "File IO *** ERROR ***: catalogue has to be open as : "
+                + f"{self._open_mode_needed} , Mode used : {self._open_mode}"
             )
 
 
@@ -464,9 +464,9 @@ def __init__(
 
     def __str__(self):
         if self._cat_data is not None:
-            info = f'{self.get_info()}'
+            info = f"{self.get_info()}"
         else:
-            info = 'No information'
+            info = "No information"
         return info
 
     @property
@@ -560,8 +560,8 @@ def create(self, ext_name=None, s_hdu=True, sex_cat_path=None):
                     raise BaseCatalogue.catalogueFileNotFound(sex_cat_path)
             else:
                 raise ValueError(
-                    'sex_cat_path needs to be provided to create a '
-                    + 'SEXtractor catalogue'
+                    "sex_cat_path needs to be provided to create a "
+                    + "SEXtractor catalogue"
                 )
         elif s_hdu:
             secondary_hdu = fits.BinTableHDU(
@@ -642,9 +642,9 @@ def apply_mask(
         if fits_file._cat_data is None:
             raise BaseCatalogue.catalogueNotOpen(fits_file.fullpath)
         if mask is None:
-            raise ValueError('Mask not provided')
+            raise ValueError("Mask not provided")
         if type(mask) is not np.ndarray:
-            raise TypeError('Mask need to be a numpy.ndarray')
+            raise TypeError("Mask need to be a numpy.ndarray")
         if hdu_no is None:
             hdu_no = fits_file.hdu_no
 
@@ -667,7 +667,7 @@ def apply_mask(
                 )
             )
         else:
-            raise TypeError('Mask type must be of type int or bool')
+            raise TypeError("Mask type must be of type int or bool")
 
     def save_as_fits(
         self,
@@ -721,7 +721,7 @@ def save_as_fits(
             )
 
         if data is None:
-            raise ValueError('Data not provided')
+            raise ValueError("Data not provided")
 
         if not image:
             if type(data) is dict:
@@ -761,7 +761,7 @@ def save_as_fits(
                         names = data.dtype.names
                         it = names
                     else:
-                        raise ValueError('Names not provided')
+                        raise ValueError("Names not provided")
                 else:
                     it = range(len(names))
                 self._save_to_fits(
@@ -775,7 +775,7 @@ def save_as_fits(
 
             elif type(data) is list:
                 if names is None:
-                    raise ValueError('Names not provided')
+                    raise ValueError("Names not provided")
                 it = range(len(names))
                 data = np.asarray(data)
                 self._save_to_fits(
@@ -789,7 +789,7 @@ def save_as_fits(
 
             elif type(data) is Table:
                 if names is None:
-                    raise ValueError('Names not provided')
+                    raise ValueError("Names not provided")
                 it = names
                 self._save_to_fits(
                     data,
@@ -808,7 +808,7 @@ def save_as_fits(
                     overwrite=overwrite,
                 )
             else:
-                raise TypeError('Data need to be a numpy.ndarray')
+                raise TypeError("Data need to be a numpy.ndarray")
 
     def create_from_numpy(
         self,
@@ -851,7 +851,7 @@ def create_from_numpy(
         fits_header = None
         if header is not None:
             fits_header = fits.Header()
-            for (k, v) in header.items():
+            for k, v in header.items():
                 fits_header[k] = v
 
         primary_hdu = fits.PrimaryHDU()
@@ -1181,16 +1181,16 @@ def get_header_value(self, request, hdu_no=None):
 
         """
         if request is None:
-            raise ValueError('request not provided')
+            raise ValueError("request not provided")
         if type(request) is not str:
-            raise TypeError('request has to be a string')
+            raise TypeError("request has to be a string")
 
         if hdu_no is None:
             hdu_no = self._hdu_no
 
         header = self.get_header(hdu_no=hdu_no)
         if header is None:
-            raise ValueError(f'Empty header in the hdu : {hdu_no}')
+            raise ValueError(f"Empty header in the hdu : {hdu_no}")
 
         return interpreter(string=request, catalogue=header).result
 
@@ -1225,7 +1225,7 @@ def add_header_card(self, key, value=None, comment=None, hdu_no=None):
 
         card = []
         if key is None:
-            raise ValueError('key not provided')
+            raise ValueError("key not provided")
         else:
             card.append(key)
 
@@ -1233,7 +1233,7 @@ def add_header_card(self, key, value=None, comment=None, hdu_no=None):
             card.append(value)
         else:
             if comment is not None:
-                card.append('')
+                card.append("")
 
         if comment is not None:
             card.append(comment)
@@ -1308,12 +1308,12 @@ def get_col_comments(self, hdu_no=None):
             if hdu_no is None:
                 hdu_no = self.hdu_no
             hdr_col_types = [
-                tt for tt in self._cat_data[hdu_no].header.keys()
-                if 'TTYPE' in tt
+                tt
+                for tt in self._cat_data[hdu_no].header.keys()
+                if "TTYPE" in tt
             ]
             return [
-                self._cat_data[hdu_no].header.comments[c]
-                for c in hdr_col_types
+                self._cat_data[hdu_no].header.comments[c] for c in hdr_col_types
             ]
         else:
             raise BaseCatalogue.catalogueNotOpen(self.fullpath)
@@ -1387,7 +1387,7 @@ def add_col(
             )
 
         if type(col_data) != np.ndarray:
-            TypeError('col_data must be a numpy.ndarray')
+            TypeError("col_data must be a numpy.ndarray")
 
         if hdu_no is None:
             hdu_no = self.hdu_no
@@ -1413,31 +1413,43 @@ def add_col(
         if len(data_shape) != 0:
             for k in data_shape:
                 mem_size *= k
-            data_format = f'{mem_size}{data_type}'
-            new_col = fits.ColDefs([fits.Column(
-                name=col_name,
-                format=data_format,
-                array=col_data,
-                dim=dim,
-            )])
+            data_format = f"{mem_size}{data_type}"
+            new_col = fits.ColDefs(
+                [
+                    fits.Column(
+                        name=col_name,
+                        format=data_format,
+                        array=col_data,
+                        dim=dim,
+                    )
+                ]
+            )
             col_list += new_col
-        elif data_type == 'A':
+        elif data_type == "A":
             mem_size *= len(max(col_data, key=len))
-            data_format = f'{mem_size}{data_type}'
-            new_col = fits.ColDefs([fits.Column(
-                name=col_name,
-                format=data_format,
-                array=col_data,
-                dim=str((mem_size,)),
-            )])
+            data_format = f"{mem_size}{data_type}"
+            new_col = fits.ColDefs(
+                [
+                    fits.Column(
+                        name=col_name,
+                        format=data_format,
+                        array=col_data,
+                        dim=str((mem_size,)),
+                    )
+                ]
+            )
             col_list += new_col
         else:
-            data_format = f'{mem_size}{data_type}'
-            new_col = fits.ColDefs([fits.Column(
-                name=col_name,
-                format=data_format,
-                array=col_data,
-            )])
+            data_format = f"{mem_size}{data_type}"
+            new_col = fits.ColDefs(
+                [
+                    fits.Column(
+                        name=col_name,
+                        format=data_format,
+                        array=col_data,
+                    )
+                ]
+            )
             col_list += new_col
 
         new_fits.append(fits.BinTableHDU.from_columns(col_list, name=ext_name))
@@ -1466,7 +1478,7 @@ def remove_col(self, col_index):
             Index of the column to delete
 
         """
-        raise BaseCatalogue.FeatureNotImplemented('remove_col()')
+        raise BaseCatalogue.FeatureNotImplemented("remove_col()")
 
     def remove_named_col(self, col_name):
         """Remove Named Column.
@@ -1511,11 +1523,15 @@ def _append_col(self, column, hdu_no=None):
             orig_table = fits.open(self.fullpath)[hdu_no].data
             orig_cols = orig_table.columns
 
-            new_col = fits.ColDefs([fits.Column(
-                name=column.name,
-                format=column.format,
-                array=np.zeros(len(orig_table)),
-            )])
+            new_col = fits.ColDefs(
+                [
+                    fits.Column(
+                        name=column.name,
+                        format=column.format,
+                        array=np.zeros(len(orig_table)),
+                    )
+                ]
+            )
             col_list = orig_cols + new_col
             hdu = fits.BinTableHDU.from_columns(col_list)
             hdu.data[column.name] = column.data
@@ -1541,21 +1557,21 @@ def _get_fits_col_type(self, col_data):
 
         """
         if col_data is None or len(col_data) == 0:
-            col_type = 'D'
+            col_type = "D"
         elif type(col_data[0]) in [np.int16]:
-            col_type = 'I'
+            col_type = "I"
         elif type(col_data[0]) in [np.int32]:
-            col_type = 'J'
+            col_type = "J"
         elif type(col_data[0]) in [int, np.int64]:
-            col_type = 'K'
+            col_type = "K"
         elif type(col_data[0]) in [float, np.float16, np.float32, np.float64]:
-            col_type = 'D'
+            col_type = "D"
         elif type(col_data[0]) is bool:
-            col_type = 'L'
+            col_type = "L"
         elif type(col_data[0]) in [str, np.str_, np.str0]:
-            col_type = 'A'
+            col_type = "A"
         else:
-            col_type = 'D'
+            col_type = "D"
 
         return col_type
 
@@ -1575,27 +1591,27 @@ def _get_python_col_type(self, col_type):
             Column Python data type
 
         """
-        if col_type in ['B', 'I', 'J', 'K']:
-            pcol_type = '%d'
-        elif col_type in ['D', 'E']:
-            pcol_type = '%f'
-        elif col_type in ['A', 'C', 'M']:
-            pcol_type = '%s'
-        elif col_type == 'L':
-            pcol_type = '%s'
+        if col_type in ["B", "I", "J", "K"]:
+            pcol_type = "%d"
+        elif col_type in ["D", "E"]:
+            pcol_type = "%f"
+        elif col_type in ["A", "C", "M"]:
+            pcol_type = "%s"
+        elif col_type == "L":
+            pcol_type = "%s"
         else:
-            pcol_type = '%f'
+            pcol_type = "%f"
 
         return pcol_type
 
     def _save_to_fits(
-            self,
-            data,
-            names,
-            it,
-            ext_name=None,
-            sex_cat_path=None,
-            overwrite=False,
+        self,
+        data,
+        names,
+        it,
+        ext_name=None,
+        sex_cat_path=None,
+        overwrite=False,
     ):
         """Save to FITS.
 
@@ -1618,24 +1634,24 @@ def _save_to_fits(
 
         """
         if data is None:
-            raise ValueError('Data not provided')
+            raise ValueError("Data not provided")
 
         if self._file_exists(self.fullpath) and not overwrite:
             if self._cat_data is None:
                 self.open()
             if ext_name is None:
-                ext_name = 'new'
+                ext_name = "new"
         else:
             if self._SEx_catalogue:
                 self.create(s_hdu=False, sex_cat_path=sex_cat_path)
                 self.open()
                 if ext_name is None:
-                    ext_name = 'LDAC_OBJECTS'
+                    ext_name = "LDAC_OBJECTS"
             else:
                 self.create(s_hdu=False)
                 self.open()
                 if ext_name is None:
-                    ext_name = 'new'
+                    ext_name = "new"
 
         if len(names) == 1:
             data = np.array([data])
@@ -1649,29 +1665,35 @@ def _save_to_fits(
             if len(data_shape) != 0:
                 for shape in data_shape:
                     mem_size *= shape
-                data_format = f'{mem_size}{data_type}'
-                col_list.append(fits.Column(
-                    name=name,
-                    format=data_format,
-                    array=data[idx],
-                    dim=dim,
-                ))
-            elif data_type == 'A':
+                data_format = f"{mem_size}{data_type}"
+                col_list.append(
+                    fits.Column(
+                        name=name,
+                        format=data_format,
+                        array=data[idx],
+                        dim=dim,
+                    )
+                )
+            elif data_type == "A":
                 mem_size *= len(max(data[idx], key=len))
-                data_format = f'{mem_size}{data_type}'
-                col_list.append(fits.Column(
-                    name=name,
-                    format=data_format,
-                    array=data[idx],
-                    dim=str((mem_size,)),
-                ))
+                data_format = f"{mem_size}{data_type}"
+                col_list.append(
+                    fits.Column(
+                        name=name,
+                        format=data_format,
+                        array=data[idx],
+                        dim=str((mem_size,)),
+                    )
+                )
             else:
-                data_format = f'{mem_size}{data_type}'
-                col_list.append(fits.Column(
-                    name=name,
-                    format=data_format,
-                    array=data[idx],
-                ))
+                data_format = f"{mem_size}{data_type}"
+                col_list.append(
+                    fits.Column(
+                        name=name,
+                        format=data_format,
+                        array=data[idx],
+                    )
+                )
 
         self._cat_data.append(
             fits.BinTableHDU.from_columns(col_list, name=ext_name)
@@ -1703,13 +1725,13 @@ def _save_from_recarray(
 
         """
         if data is None:
-            raise ValueError('Data not provided')
+            raise ValueError("Data not provided")
 
         if self._file_exists(self.fullpath) and not overwrite:
             if self._cat_data is None:
                 self.open()
             if ext_name is None:
-                ext_name = 'new'
+                ext_name = "new"
             self._cat_data.append(fits.BinTableHDU(data, name=ext_name))
             self.close()
         else:
@@ -1717,14 +1739,14 @@ def _save_from_recarray(
                 self.create(s_hdu=False, sex_cat_path=sex_cat_path)
                 self.open()
                 if ext_name is None:
-                    ext_name = 'LDAC_OBJECTS'
+                    ext_name = "LDAC_OBJECTS"
                 self._cat_data.append(fits.BinTableHDU(data, name=ext_name))
                 self.close()
             else:
                 self.create(s_hdu=False)
                 self.open()
                 if ext_name is None:
-                    ext_name = 'new'
+                    ext_name = "new"
                 self._cat_data.append(fits.BinTableHDU(data, name=ext_name))
                 self.close()
 
@@ -1743,13 +1765,13 @@ def _save_image(self, data=None, header=None, overwrite=False):
             Option to overwrite an existing catalogue
 
         """
-        if (data is not None):
+        if data is not None:
             fits.PrimaryHDU(data, header).writeto(
                 self.fullpath,
                 overwrite=overwrite,
             )
         else:
-            raise ValueError('Data or names not provided')
+            raise ValueError("Data or names not provided")
 
     class Column(BaseCatalogue.Column):
         """Column.
@@ -1775,7 +1797,7 @@ def __init__(self, name, format=None, comment=None, data=None):
             self._name = name
 
             if format is None:
-                format = 'D'
+                format = "D"
             self._format = format
 
             if comment is None:
@@ -1791,7 +1813,7 @@ def __init__(self, name, format=None, comment=None, data=None):
                     self._data = data
 
         def __str__(self):
-            info = f'{self._cat_col}'
+            info = f"{self._cat_col}"
             return info
 
         @property
@@ -1874,7 +1896,7 @@ def get_unit_from_fits_header(header, key):
     idx = 1
     idx_found = -1
     while True:
-        ttype_idx = f'TTYPE{idx}'
+        ttype_idx = f"TTYPE{idx}"
         if ttype_idx not in header:
             # Reached beyond last column
             break
@@ -1886,14 +1908,13 @@ def get_unit_from_fits_header(header, key):
         idx += 1
 
     if idx_found == -1:
-        raise IndexError(f'Column \'{key}\' not found in FITS header')
+        raise IndexError(f"Column '{key}' not found in FITS header")
 
     # Extract coordinate unit string from header
-    tcunit_idx = f'TCUNI{idx}'
+    tcunit_idx = f"TCUNI{idx}"
     if tcunit_idx not in header:
         raise IndexError(
-            f'No coordinate unit found for column \'{key}\''
-            ' in FITS header'
+            f"No coordinate unit found for column '{key}'" " in FITS header"
         )
     unit_str = header[tcunit_idx]
 
diff --git a/shapepipe/pipeline/job_handler.py b/shapepipe/pipeline/job_handler.py
index bc80f35da..9a6e01f1f 100644
--- a/shapepipe/pipeline/job_handler.py
+++ b/shapepipe/pipeline/job_handler.py
@@ -55,8 +55,8 @@ def __init__(
         filehd,
         config,
         log,
-        job_type='parallel',
-        parallel_mode='smp',
+        job_type="parallel",
+        parallel_mode="smp",
         batch_size=None,
         backend=None,
         timeout=None,
@@ -109,7 +109,7 @@ def config(self, value):
 
         if not isinstance(value, ConfigParser):
             raise TypeError(
-                'config must be an instane of configparser.ConfigParser'
+                "config must be an instane of configparser.ConfigParser"
             )
 
         self._config = value
@@ -132,7 +132,7 @@ def log(self):
     def log(self, value):
 
         if not isinstance(value, Logger):
-            raise TypeError('log must be an instance of logging.Logger.')
+            raise TypeError("log must be an instance of logging.Logger.")
 
         self._log = value
 
@@ -153,8 +153,8 @@ def job_type(self):
     @job_type.setter
     def job_type(self, value):
 
-        if value not in ('serial', 'parallel'):
-            raise TypeError(f'{value} is not a valid job type.')
+        if value not in ("serial", "parallel"):
+            raise TypeError(f"{value} is not a valid job type.")
 
         self._job_type = value
 
@@ -175,8 +175,8 @@ def parallel_mode(self):
     @parallel_mode.setter
     def parallel_mode(self, value):
 
-        if value not in ('smp', 'mpi'):
-            raise TypeError(f'{value} is not a valid parallel mode.')
+        if value not in ("smp", "mpi"):
+            raise TypeError(f"{value} is not a valid parallel mode.")
 
         self._parallel_mode = value
 
@@ -197,20 +197,19 @@ def batch_size(self):
     @batch_size.setter
     def batch_size(self, value):
 
-        if (
-            isinstance(value, type(None))
-            and self.config.has_option('JOB', 'SMP_BATCH_SIZE')
+        if isinstance(value, type(None)) and self.config.has_option(
+            "JOB", "SMP_BATCH_SIZE"
         ):
-            value = self.config.getint('JOB', 'SMP_BATCH_SIZE')
+            value = self.config.getint("JOB", "SMP_BATCH_SIZE")
 
         elif isinstance(value, type(None)):
             value = 1
 
         if not isinstance(value, int) or (value < 1):
-            raise ValueError('Batch size must be an integer >= 1.')
+            raise ValueError("Batch size must be an integer >= 1.")
 
         if value > cpu_count():
-            warn('Batch size exeeds the number of available CPUs.')
+            warn("Batch size exeeds the number of available CPUs.")
 
         self._batch_size = value
 
@@ -231,16 +230,15 @@ def backend(self):
     @backend.setter
     def backend(self, value):
 
-        if (
-            isinstance(value, type(None))
-            and self.config.has_option('JOB', 'SMP_BACKEND')
+        if isinstance(value, type(None)) and self.config.has_option(
+            "JOB", "SMP_BACKEND"
         ):
-            value = self.config.get('JOB', 'SMP_BACKEND').lower()
+            value = self.config.get("JOB", "SMP_BACKEND").lower()
         elif isinstance(value, type(None)):
-            value = 'loky'
+            value = "loky"
 
-        if value not in ('loky', 'multiprocessing', 'threading'):
-            raise ValueError(f'{value} is not a valid joblib backend.')
+        if value not in ("loky", "multiprocessing", "threading"):
+            raise ValueError(f"{value} is not a valid joblib backend.")
 
         self._backend = value
 
@@ -263,15 +261,14 @@ def timeout(self):
     @timeout.setter
     def timeout(self, value):
 
-        if (
-            isinstance(value, type(None))
-            and self.config.has_option('JOB', 'TIMEOUT')
+        if isinstance(value, type(None)) and self.config.has_option(
+            "JOB", "TIMEOUT"
         ):
-            value = self.config.get('JOB', 'TIMEOUT')
-            value = self.hms2sec(value) if ':' in value else int(value)
+            value = self.config.get("JOB", "TIMEOUT")
+            value = self.hms2sec(value) if ":" in value else int(value)
 
         if not isinstance(value, (type(None), int)):
-            raise TypeError('Timeout must be None or an integer.')
+            raise TypeError("Timeout must be None or an integer.")
 
         self._timeout = value
 
@@ -283,12 +280,12 @@ def finish_up(self):
         """
         self._check_for_errors()
         self._check_missed_processes()
-        self.log.info('All processes complete')
-        self.log.info('')
+        self.log.info("All processes complete")
+        self.log.info("")
 
         if self._verbose:
-            print('All processes complete')
-            print('')
+            print("All processes complete")
+            print("")
 
         collect()
 
@@ -300,7 +297,7 @@ def submit_jobs(self):
         Submit jobs in serial or parallel.
 
         """
-        if self.job_type == 'serial':
+        if self.job_type == "serial":
             self.submit_serial_job()
         else:
             self._distribute_smp_jobs()
@@ -328,7 +325,7 @@ def hms2sec(time_str):
         Time strings should take the form 'HH:MM:SS'.
 
         """
-        h, m, s = time_str.split(':')
+        h, m, s = time_str.split(":")
 
         return int(h) * 3600 + int(m) * 60 + int(s)
 
@@ -338,15 +335,15 @@ def _log_job_parameters(self):
         This method logs the job handler instance parameters.
 
         """
-        text = 'Starting job handler with:'
-        module_info = f' - Module: {self._module}'
-        job_prop_text = ' - Job Properties:'
-        job_type = f' -- Job Type: {self.job_type}'
-        batch_info = f' -- Batch size: {self.batch_size}'
-        time_info = f' -- Timeout Limit: {self.timeout}s'
+        text = "Starting job handler with:"
+        module_info = f" - Module: {self._module}"
+        job_prop_text = " - Job Properties:"
+        job_type = f" -- Job Type: {self.job_type}"
+        batch_info = f" -- Batch size: {self.batch_size}"
+        time_info = f" -- Timeout Limit: {self.timeout}s"
 
         show_batch_into = (
-            self.job_type == 'parallel' and self.parallel_mode == 'smp'
+            self.job_type == "parallel" and self.parallel_mode == "smp"
         )
 
         self.log.info(text)
@@ -372,7 +369,7 @@ def _log_num_processes(self):
         This method logs the number of processes detected for a given module.
 
         """
-        proc_info = f' -- Total number of processes: {self._n_procs}'
+        proc_info = f" -- Total number of processes: {self._n_procs}"
 
         self.log.info(proc_info)
 
@@ -385,20 +382,18 @@ def _distribute_smp_jobs(self):
         This method distributes the jobs to the workers using SMP.
 
         """
-        result = (
-            Parallel(n_jobs=self.batch_size, backend=self.backend)(
-                delayed(WorkerHandler(verbose=self._verbose).worker)(
-                    process[1:],
-                    process[0],
-                    self.filehd.get_worker_log_name(self._module, process[0]),
-                    self.filehd.module_run_dirs,
-                    self.config,
-                    self.filehd.get_module_config_sec(self._module),
-                    self.timeout,
-                    self._module_runner
-                )
-                for process in self.filehd.process_list
+        result = Parallel(n_jobs=self.batch_size, backend=self.backend)(
+            delayed(WorkerHandler(verbose=self._verbose).worker)(
+                process[1:],
+                process[0],
+                self.filehd.get_worker_log_name(self._module, process[0]),
+                self.filehd.module_run_dirs,
+                self.config,
+                self.filehd.get_module_config_sec(self._module),
+                self.timeout,
+                self._module_runner,
             )
+            for process in self.filehd.process_list
         )
 
         self.worker_dicts = result
@@ -414,9 +409,10 @@ def submit_serial_job(self):
 
         result = wh.worker(
             process,
-            '',
-            self.filehd.get_worker_log_name(self._module, '_serial'),
-            self.filehd.module_run_dirs, self.config,
+            "",
+            self.filehd.get_worker_log_name(self._module, "_serial"),
+            self.filehd.module_run_dirs,
+            self.config,
             self.filehd.get_module_config_sec(self._module),
             self.timeout,
             self._module_runner,
@@ -442,7 +438,7 @@ def _check_exception_status(self):
 
         """
         for worker_dict in self.worker_dicts:
-            if worker_dict['exception']:
+            if worker_dict["exception"]:
                 self.log.info(
                     f'ERROR: {worker_dict["exception"]} recorded '
                     + f'in: {worker_dict["log"]}'
@@ -457,7 +453,7 @@ def _check_stderr_status(self):
 
         """
         for worker_dict in self.worker_dicts:
-            if worker_dict['stderr']:
+            if worker_dict["stderr"]:
                 self.log.info(
                     f'ERROR: stderr recorded in: {worker_dict["log"]}'
                 )
@@ -470,18 +466,16 @@ def _check_missed_processes(self):
         submitted.
 
         """
-        missed_txt = (
-            ' - The following processes were not submitted to workers:'
-        )
+        missed_txt = " - The following processes were not submitted to workers:"
 
         if self.filehd.missed:
 
             self.log.info(missed_txt)
-            self.log.info(f' - {self.filehd.missed}')
+            self.log.info(f" - {self.filehd.missed}")
 
             if self._verbose:
                 print(missed_txt)
-                print(f' - {self.filehd.missed}')
+                print(f" - {self.filehd.missed}")
 
     def clean_up(self):
         """Finish.
diff --git a/shapepipe/pipeline/mpi_run.py b/shapepipe/pipeline/mpi_run.py
index c92d943c8..4aa547a78 100644
--- a/shapepipe/pipeline/mpi_run.py
+++ b/shapepipe/pipeline/mpi_run.py
@@ -51,14 +51,16 @@ def submit_mpi_jobs(
         w_log_name = worker_log(module_runner.__name__, process[0])
 
         wh = WorkerHandler(verbose=verbose)
-        result.append(wh.worker(
-            process[1:],
-            process[0],
-            w_log_name,
-            run_dirs,
-            config,
-            timeout,
-            module_runner
-        ))
+        result.append(
+            wh.worker(
+                process[1:],
+                process[0],
+                w_log_name,
+                run_dirs,
+                config,
+                timeout,
+                module_runner,
+            )
+        )
 
     return result
diff --git a/shapepipe/pipeline/run_log.py b/shapepipe/pipeline/run_log.py
index c182eeac7..110378539 100644
--- a/shapepipe/pipeline/run_log.py
+++ b/shapepipe/pipeline/run_log.py
@@ -30,7 +30,7 @@ class RunLog(object):
     def __init__(self, run_log_file, module_list, current_run):
 
         self.run_log_file = run_log_file
-        self._module_list = ','.join(module_list)
+        self._module_list = ",".join(module_list)
         self.current_run = current_run
         self._write()
         self._runs = get_list(run_log_file)
@@ -41,8 +41,8 @@ def _write(self):
         Write current run to the run log.
 
         """
-        with open(self.run_log_file, 'a') as run_log:
-            run_log.write(f'{self.current_run} {self._module_list}\n')
+        with open(self.run_log_file, "a") as run_log:
+            run_log.write(f"{self.current_run} {self._module_list}\n")
 
     def get_run(self, search_string):
         """Get Run.
@@ -71,16 +71,16 @@ def get_run(self, search_string):
 
         if len(runs) < 1:
             raise RuntimeError(
-                f'No runs found matching search string \'{search_string}\'.'
+                f"No runs found matching search string '{search_string}'."
             )
 
         elif len(runs) > 1:
             raise RuntimeError(
-                'More than one run found matching search string '
-                + f'\'{search_string}\''
+                "More than one run found matching search string "
+                + f"'{search_string}'"
             )
 
-        return runs[0].split(' ')[0]
+        return runs[0].split(" ")[0]
 
 
 def get_list(run_log_file):
@@ -99,7 +99,7 @@ def get_list(run_log_file):
         Run log file entries
 
     """
-    with open(run_log_file, 'r') as run_log:
+    with open(run_log_file, "r") as run_log:
         lines = run_log.readlines()
 
     runs = [line.rstrip() for line in lines]
@@ -132,14 +132,9 @@ def get_all(runs, module):
     """
     module_base, _ = split_module_run(module)
 
-    all_runs = [
-        run for run in runs
-        if module_base in run.split()[1].split(',')
-    ]
+    all_runs = [run for run in runs if module_base in run.split()[1].split(",")]
     if len(all_runs) == 0:
-        raise RuntimeError(
-            f'No previous run of module \'{module_base}\' found'
-        )
+        raise RuntimeError(f"No previous run of module '{module_base}' found")
 
     all_runs = all_runs[::-1]
 
@@ -167,7 +162,7 @@ def get_last(runs, module):
     all_runs = get_all(runs, module)
     last_run = all_runs[0]
 
-    return last_run.split(' ')[0]
+    return last_run.split(" ")[0]
 
 
 def get_all_dirs(run_log_file, module):
@@ -195,7 +190,7 @@ def get_all_dirs(run_log_file, module):
     for run in all_runs:
         dir_name = run.split(" ")[0]
         all_dirs.append(f"{dir_name}/{module}/output")
- 
+
     return all_dirs
 
 
@@ -221,6 +216,3 @@ def get_last_dir(run_log_file, module):
     last_dir = all_dirs[0]
 
     return last_dir
-
-
-
diff --git a/shapepipe/pipeline/shared.py b/shapepipe/pipeline/shared.py
index 75873251b..24984b34b 100644
--- a/shapepipe/pipeline/shared.py
+++ b/shapepipe/pipeline/shared.py
@@ -33,10 +33,10 @@ def check_duplicate(input_list):
         else:
             input_set.add(elem)
 
-    return ''
+    return ""
 
 
-def find_files(path, pattern='*', ext='*'):
+def find_files(path, pattern="*", ext="*"):
     """Find Files.
 
     This method recursively retrieves file names from a given path that
@@ -66,8 +66,8 @@ def find_files(path, pattern='*', ext='*'):
         For invalid extension format
 
     """
-    dot = '.'
-    star = '*'
+    dot = "."
+    star = "*"
 
     if pattern != star and star in pattern:
         raise ValueError('Do not include "*" in pattern.')
@@ -81,7 +81,7 @@ def find_files(path, pattern='*', ext='*'):
     if ext != star and not ext.startswith(dot):
         ext = dot + ext
 
-    search_string = f'{path}/**/*{pattern}*{ext}'
+    search_string = f"{path}/**/*{pattern}*{ext}"
 
     return glob(search_string, recursive=True)
 
@@ -109,10 +109,10 @@ def split_module_run(module_str):
     """
     if not isinstance(module_str, str):
         raise TypeError(
-            f'Input module_str must be a string not {type(module_str)}.'
+            f"Input module_str must be a string not {type(module_str)}."
         )
 
-    run_split = '_run_'
+    run_split = "_run_"
     module_run = module_str
 
     if run_split in module_str:
diff --git a/shapepipe/pipeline/str_handler.py b/shapepipe/pipeline/str_handler.py
index f64da49f0..e443e31f6 100644
--- a/shapepipe/pipeline/str_handler.py
+++ b/shapepipe/pipeline/str_handler.py
@@ -39,7 +39,7 @@ class StrInterpreter(object):
     def __init__(self, string, catalogue, make_compare=False, mask_dict=None):
 
         if type(string) is not str:
-            raise ValueError('string has to be str type')
+            raise ValueError("string has to be str type")
         else:
             self._string = string
 
@@ -52,7 +52,7 @@ def __init__(self, string, catalogue, make_compare=False, mask_dict=None):
             else:
                 self._cat = catalogue
         else:
-            raise ValueError('catalogue not provided')
+            raise ValueError("catalogue not provided")
 
         self._make_compare = make_compare
 
@@ -61,12 +61,12 @@ def __init__(self, string, catalogue, make_compare=False, mask_dict=None):
 
         self._init_stat_function()
         self._comp_dict = {
-            '<': operator.lt,
-            '>': operator.gt,
-            '<=': operator.le,
-            '>=': operator.ge,
-            '==': operator.eq,
-            '!=': operator.ne,
+            "<": operator.lt,
+            ">": operator.gt,
+            "<=": operator.le,
+            ">=": operator.ge,
+            "==": operator.eq,
+            "!=": operator.ne,
         }
 
         self.result = self.interpret(self._string, self._make_compare)
@@ -107,7 +107,7 @@ def interpret(
             result = self._compare(string)
         else:
             if make_operate:
-                string_split = re.split(r'\*|\/|\-|\+\s*(?![^()]*\))', string)
+                string_split = re.split(r"\*|\/|\-|\+\s*(?![^()]*\))", string)
                 result = self._operate(string, string_split)
             else:
                 if make_func:
@@ -128,14 +128,14 @@ def _compare(self, string):
             strind containing the comparison.
 
         """
-        comp = '<|>|<=|>=|==|!='
+        comp = "<|>|<=|>=|==|!="
 
         if len(re.split(comp, string)) != 2:
             raise Exception(
-                'Only one comparison in [<, >, <=, >=, ==, !=] per line'
+                "Only one comparison in [<, >, <=, >=, ==, !=] per line"
             )
 
-        for operator in ['<=', '>=', '<', '>', '==', '!=']:
+        for operator in ["<=", ">=", "<", ">", "==", "!="]:
             terms = re.split(operator, string)
             if len(terms) == 2:
                 self._make_compare = False
@@ -158,7 +158,7 @@ def _apply_func(self, string):
             result of the function
 
         """
-        str_split = re.split(r'\(|\)', string)
+        str_split = re.split(r"\(|\)", string)
 
         if len(str_split) == 1:
             return self.interpret(
@@ -168,7 +168,7 @@ def _apply_func(self, string):
                 make_operate=False,
             )
         elif len(str_split) == 3:
-            str_split_2 = re.split(',', str_split[1])
+            str_split_2 = re.split(",", str_split[1])
             if len(str_split_2) > 1:
                 param = [
                     self.interpret(
@@ -176,7 +176,8 @@ def _apply_func(self, string):
                         self._make_compare,
                         make_func=False,
                         make_operate=True,
-                    ) for char in str_split_2
+                    )
+                    for char in str_split_2
                 ]
 
                 # Evaluate statistical function, raise error if failure
@@ -190,19 +191,21 @@ def _apply_func(self, string):
             else:
                 if str_split[0] not in self._stat_func:
                     raise KeyError(
-                        f'Invalid function \'{str_split[0]}\' in expression '
-                        + f'\'{string}\''
+                        f"Invalid function '{str_split[0]}' in expression "
+                        + f"'{string}'"
+                    )
+                return self._stat_func[str_split[0]](
+                    self.interpret(
+                        str_split[1],
+                        self._make_compare,
+                        make_func=False,
+                        make_operate=True,
                     )
-                return self._stat_func[str_split[0]](self.interpret(
-                    str_split[1],
-                    self._make_compare,
-                    make_func=False,
-                    make_operate=True,
-                ))
+                )
         else:
             raise Exception(
-                'Only one function can be applied. Problem with the '
-                + f'term: {string}'
+                "Only one function can be applied. Problem with the "
+                + f"term: {string}"
             )
 
     def _init_stat_function(self):
@@ -212,21 +215,21 @@ def _init_stat_function(self):
 
         """
         self._stat_func = {}
-        self._stat_func['mean'] = np.mean
-        self._stat_func['median'] = np.median
-        self._stat_func['mode'] = self._mode
-        self._stat_func['sqrt'] = np.sqrt
-        self._stat_func['pow'] = pow
-        self._stat_func['log'] = np.log
-        self._stat_func['log10'] = np.log10
-        self._stat_func['exp'] = np.exp
-        self._stat_func['std'] = np.std
-        self._stat_func['var'] = np.var
-        self._stat_func['sigma_mad'] = self._sigma_mad
-        self._stat_func['len'] = len
-        self._stat_func['min'] = min
-        self._stat_func['max'] = max
-        self._stat_func['homogen'] = self._test_homogeneity
+        self._stat_func["mean"] = np.mean
+        self._stat_func["median"] = np.median
+        self._stat_func["mode"] = self._mode
+        self._stat_func["sqrt"] = np.sqrt
+        self._stat_func["pow"] = pow
+        self._stat_func["log"] = np.log
+        self._stat_func["log10"] = np.log10
+        self._stat_func["exp"] = np.exp
+        self._stat_func["std"] = np.std
+        self._stat_func["var"] = np.var
+        self._stat_func["sigma_mad"] = self._sigma_mad
+        self._stat_func["len"] = len
+        self._stat_func["min"] = min
+        self._stat_func["max"] = max
+        self._stat_func["homogen"] = self._test_homogeneity
 
     def _mean(self, input):
         """Get Mean.
@@ -303,7 +306,7 @@ def _mode(self, input, eps=0.001, iter_max=1000):
             iteration += 1
 
         if iteration == iter_max:
-            raise ValueError('Mode computation failed')
+            raise ValueError("Mode computation failed")
         else:
             mode = (b_min + b_max) / 2.0
             return mode
@@ -361,18 +364,18 @@ def _test_homogeneity(self, *args):
             n_cells = args[2]
         else:
             raise ValueError(
-                'Inputs should be param_1, param_2 [optional], n_cells'
+                "Inputs should be param_1, param_2 [optional], n_cells"
             )
 
         if n_param == 2:
             if len(param[0]) != len(param[1]):
                 raise ValueError(
-                    'Both param_1 and param_2 must have the same '
-                    + f'length : {len(param[0])}, {len(param[1])}'
+                    "Both param_1 and param_2 must have the same "
+                    + f"length : {len(param[0])}, {len(param[1])}"
                 )
 
         if np.sqrt(n_cells) % 1 != 0:
-            raise ValueError('N_cells must be a square number')
+            raise ValueError("N_cells must be a square number")
 
         n_tot = len(param[0])
         homo_ratio = float(n_tot) / float(n_cells)
@@ -380,37 +383,52 @@ def _test_homogeneity(self, *args):
         param_min = []
         param_max = []
         for idx in param:
-            step = (
-                (np.max(idx) - np.min(idx))
-                / pow(n_cells, 1.0 / float(n_param))
+            step = (np.max(idx) - np.min(idx)) / pow(
+                n_cells, 1.0 / float(n_param)
             )
             param_min.append(
                 [val for val in np.arange(np.min(idx), np.max(idx), step)]
             )
             param_max.append(
                 [
-                    val for val in
-                    np.arange(np.min(idx) + step, np.max(idx) + step, step)
+                    val
+                    for val in np.arange(
+                        np.min(idx) + step, np.max(idx) + step, step
+                    )
                 ]
             )
 
         if n_param == 1:
-            n_obj = np.asarray([
-                float(len(np.where(
-                    (param[0] >= param_min[0][idx])
-                    & (param[0] <= param_max[0][idx])
-                )[0])) for idx in range(int(n_cells))
-            ])
+            n_obj = np.asarray(
+                [
+                    float(
+                        len(
+                            np.where(
+                                (param[0] >= param_min[0][idx])
+                                & (param[0] <= param_max[0][idx])
+                            )[0]
+                        )
+                    )
+                    for idx in range(int(n_cells))
+                ]
+            )
         elif n_param == 2:
             it = itertools.product(range(int(np.sqrt(n_cells))), repeat=2)
-            n_obj = np.asarray([
-                float(len(np.where(
-                    (param[0] >= param_min[0][idx_i])
-                    & (param[0] <= param_max[0][idx_i])
-                    & (param[1] >= param_min[1][idx_j])
-                    & (param[1] <= param_max[1][idx_j])
-                )[0])) for idx_i, idx_j in it
-            ])
+            n_obj = np.asarray(
+                [
+                    float(
+                        len(
+                            np.where(
+                                (param[0] >= param_min[0][idx_i])
+                                & (param[0] <= param_max[0][idx_i])
+                                & (param[1] >= param_min[1][idx_j])
+                                & (param[1] <= param_max[1][idx_j])
+                            )[0]
+                        )
+                    )
+                    for idx_i, idx_j in it
+                ]
+            )
 
         actual_std = np.std(n_obj / homo_ratio)
 
@@ -442,47 +460,47 @@ def _operate(self, string, string_split):
         It's used as a recursive function
 
         """
-        op = r'\*|\/|\-|\+\s*(?![^()]*\))'
+        op = r"\*|\/|\-|\+\s*(?![^()]*\))"
         if string is None:
-            raise ValueError('Parameter not specified')
+            raise ValueError("Parameter not specified")
         if string_split is None:
-            raise ValueError('Parameters splited not specified')
+            raise ValueError("Parameters splited not specified")
 
         if len(re.split(op, string)) == 1:
             return self.interpret(string, make_operate=False)
 
         tmp = self._string_op_func(
-            re.split(r'\+\s*(?![^()]*\))', string),
+            re.split(r"\+\s*(?![^()]*\))", string),
             string_split,
             operator.add,
             0,
         )
-        if not np.isscalar(tmp) or tmp != 'pass':
+        if not np.isscalar(tmp) or tmp != "pass":
             return tmp
         else:
             tmp = self._string_op_func(
-                re.split(r'\-\s*(?![^()]*\))', string),
+                re.split(r"\-\s*(?![^()]*\))", string),
                 string_split,
                 operator.sub,
-                'init',
+                "init",
             )
-            if not np.isscalar(tmp) or tmp != 'pass':
+            if not np.isscalar(tmp) or tmp != "pass":
                 return tmp
             else:
                 tmp = self._string_op_func(
-                    re.split(r'\*\s*(?![^()]*\))', string),
+                    re.split(r"\*\s*(?![^()]*\))", string),
                     string_split,
                     operator.mul,
                     1,
                 )
-                if not np.isscalar(tmp) or tmp != 'pass':
+                if not np.isscalar(tmp) or tmp != "pass":
                     return tmp
                 else:
                     return self._string_op_func(
-                        re.split(r'\/\s*(?![^()]*\))', string),
+                        re.split(r"\/\s*(?![^()]*\))", string),
                         string_split,
                         operator.truediv,
-                        'init',
+                        "init",
                     )
 
     def _string_op_func(self, string_op, string_split, op, tmp):
@@ -512,7 +530,7 @@ def _string_op_func(self, string_op, string_split, op, tmp):
         """
         if len(string_op) > 2:
             for operator in string_op:
-                if tmp == 'init':
+                if tmp == "init":
                     tmp = self._operate(operator, string_split)
                 else:
                     tmp = op(tmp, self._operate(operator, string_split))
@@ -528,7 +546,7 @@ def _string_op_func(self, string_op, string_split, op, tmp):
                 second = self._operate(string_op[1], string_split)
             return op(first, second)
         else:
-            return 'pass'
+            return "pass"
 
     def _get_value(self, string):
         """Get Value.
@@ -558,28 +576,26 @@ def _get_value(self, string):
             string_value = float(string)
             return string_value
         except Exception:
-            str_split = re.split(r'\{|\}', string)
+            str_split = re.split(r"\{|\}", string)
             if len(str_split) == 1:
                 try:
                     return self._cat[string]
                 except Exception:
                     raise ValueError(
-                        'String has to be a float or a catalogue parameter. '
-                        + f'{string} not found'
+                        "String has to be a float or a catalogue parameter. "
+                        + f"{string} not found"
                     )
             if len(str_split) == 3:
                 if str_split[1] in self._mask.keys():
                     try:
-                        return (
-                            self._cat[str_split[0]][self._mask[str_split[1]]]
-                        )
+                        return self._cat[str_split[0]][self._mask[str_split[1]]]
                     except Exception:
                         raise ValueError(
-                            'String has to be a catalogue parameter. '
-                            + f'{str_split[0]} not found'
+                            "String has to be a catalogue parameter. "
+                            + f"{str_split[0]} not found"
                         )
                 else:
                     raise ValueError(
-                        f'Mask has to be provided. {str_split[1]} not '
-                        + 'found in mask'
+                        f"Mask has to be provided. {str_split[1]} not "
+                        + "found in mask"
                     )
diff --git a/shapepipe/pipeline/timeout.py b/shapepipe/pipeline/timeout.py
index a27726b30..f37e1876e 100644
--- a/shapepipe/pipeline/timeout.py
+++ b/shapepipe/pipeline/timeout.py
@@ -28,9 +28,10 @@ def with_timeout(timeout, log_file):
         For process exceeding timeout limit
 
     """
+
     def handler(signum, frame):
         raise TimeoutError(
-            f'The process time exceeded {timeout}s in {log_file}'
+            f"The process time exceeded {timeout}s in {log_file}"
         )
 
     def decorator(decorated):
diff --git a/shapepipe/pipeline/worker_handler.py b/shapepipe/pipeline/worker_handler.py
index c8fb7cb2d..bdd8b037e 100644
--- a/shapepipe/pipeline/worker_handler.py
+++ b/shapepipe/pipeline/worker_handler.py
@@ -39,7 +39,7 @@ def worker(
         config,
         module_config_sec,
         timeout,
-        module_runner
+        module_runner,
     ):
         """Worker.
 
@@ -73,8 +73,7 @@ def worker(
         self._config = config
         self._module_config_sec = module_config_sec
         self._module_runner = module_runner
-        self._prepare_worker(process, job_name, timeout,
-                             module_runner.__name__)
+        self._prepare_worker(process, job_name, timeout, module_runner.__name__)
         self._create_worker_log()
         self._run_worker()
         close_log(self.w_log, verbose=False)
@@ -98,7 +97,7 @@ def _set_job_name(num):
             Job name
 
         """
-        return f'process{num}'
+        return f"process{num}"
 
     def _prepare_worker(self, process, job_name, timeout, module):
         """Prepare Worker.
@@ -117,18 +116,18 @@ def _prepare_worker(self, process, job_name, timeout, module):
             Module runner name
 
         """
-        self.worker_dict['pid'] = getpid()
-        self.worker_dict['threads'] = active_count()
-        self.worker_dict['node'] = platform.node()
-        self.worker_dict['system'] = platform.system()
-        self.worker_dict['machine'] = platform.machine()
-        self.worker_dict['exception'] = False
-        self.worker_dict['stderr'] = False
-        self.worker_dict['process'] = list(process)
-        self.worker_dict['file_number_string'] = job_name
-        self.worker_dict['job_name'] = self._set_job_name(job_name)
-        self.worker_dict['timeout'] = timeout
-        self.worker_dict['module'] = module
+        self.worker_dict["pid"] = getpid()
+        self.worker_dict["threads"] = active_count()
+        self.worker_dict["node"] = platform.node()
+        self.worker_dict["system"] = platform.system()
+        self.worker_dict["machine"] = platform.machine()
+        self.worker_dict["exception"] = False
+        self.worker_dict["stderr"] = False
+        self.worker_dict["process"] = list(process)
+        self.worker_dict["file_number_string"] = job_name
+        self.worker_dict["job_name"] = self._set_job_name(job_name)
+        self.worker_dict["timeout"] = timeout
+        self.worker_dict["module"] = module
 
     def _create_worker_log(self):
         """Create Worker Log.
@@ -137,18 +136,17 @@ def _create_worker_log(self):
         worker parameters.
 
         """
-        process_size = len(str(self.worker_dict['process']))
+        process_size = len(str(self.worker_dict["process"]))
 
         if self._verbose:
 
-            job_name = self.worker_dict['job_name']
-            pid = self.worker_dict['pid']
+            job_name = self.worker_dict["job_name"]
+            pid = self.worker_dict["pid"]
 
-            print(f' - {job_name} PID: {pid} ', end='')
+            print(f" - {job_name} PID: {pid} ", end="")
 
-            if (
-                process_size
-                < self._config.getint('WORKER', 'PROCESS_PRINT_LIMIT')
+            if process_size < self._config.getint(
+                "WORKER", "PROCESS_PRINT_LIMIT"
             ):
                 print(
                     f'processing {self.worker_dict["file_number_string"]} '
@@ -158,8 +156,8 @@ def _create_worker_log(self):
                 print()
 
         self.w_log = set_up_log(self._w_log_name, verbose=False)
-        self.worker_dict['log'] = self.w_log.name
-        self.w_log.info('Worker process running with:')
+        self.worker_dict["log"] = self.w_log.name
+        self.w_log.info("Worker process running with:")
         self.w_log.info(f' - Job Name: {self.worker_dict["job_name"]}')
         self.w_log.info(f' - PID: {self.worker_dict["pid"]}')
         self.w_log.info(f' - Threads: {self.worker_dict["threads"]}')
@@ -177,13 +175,13 @@ def _run_worker(self):
 
         """
         try:
-            with_timeout(self.worker_dict['timeout'], self.w_log.name)(
+            with_timeout(self.worker_dict["timeout"], self.w_log.name)(
                 self._worker_execution
             )()
 
         except Exception as err:
             catch_error(err, self.w_log)
-            self.worker_dict['exception'] = type(err).__name__
+            self.worker_dict["exception"] = type(err).__name__
 
     def _worker_execution(self):
         """Worker Execution.
@@ -205,12 +203,10 @@ def _run_module(self):
             For non-existent module runner
 
         """
-        self.w_log.info(
-            f' - Running module: {self.worker_dict["module"]}'
-        )
+        self.w_log.info(f' - Running module: {self.worker_dict["module"]}')
 
-        file_number_string = self.worker_dict['file_number_string']
-        input_file_list = self.worker_dict['process']
+        file_number_string = self.worker_dict["file_number_string"]
+        input_file_list = self.worker_dict["process"]
 
         self._stdout, self._stderr = self._module_runner(
             input_file_list,
@@ -228,11 +224,11 @@ def _log_stdout(self):
 
         """
         self.w_log.info(
-            f'Process produced the following output: {self._stdout}'
+            f"Process produced the following output: {self._stdout}"
         )
 
         if self._stderr:
             self.w_log.info(
-                f'Process produced the following error(s): {self._stderr}'
+                f"Process produced the following error(s): {self._stderr}"
             )
-            self.worker_dict['stderr'] = True
+            self.worker_dict["stderr"] = True
diff --git a/shapepipe/run.py b/shapepipe/run.py
index 80bebbda5..5e095ba16 100644
--- a/shapepipe/run.py
+++ b/shapepipe/run.py
@@ -29,7 +29,7 @@
     import_mpi = True
 
 
-class ShapePipe():
+class ShapePipe:
     """ShapePipe.
 
     ShapePipe runner class.
@@ -49,10 +49,10 @@ def set_up(self):
         self._args = create_arg_parser()
         self.config = create_config_parser(self._args.config)
         self._set_run_name()
-        self.modules = self.config.getlist('EXECUTION', 'MODULE')
-        self.mode = self.config.get('EXECUTION', 'MODE').lower()
-        self.exclusive=self._args.exclusive
-        self.verbose = self.config.getboolean('DEFAULT', 'VERBOSE')
+        self.modules = self.config.getlist("EXECUTION", "MODULE")
+        self.mode = self.config.get("EXECUTION", "MODE").lower()
+        self.exclusive = self._args.exclusive
+        self.verbose = self.config.getboolean("DEFAULT", "VERBOSE")
         self.filehd = FileHandler(
             self._run_name,
             self.modules,
@@ -69,10 +69,10 @@ def _set_run_name(self):
         Set the name of the current pipeline run.
 
         """
-        self._run_name = self.config.get('DEFAULT', 'RUN_NAME')
+        self._run_name = self.config.get("DEFAULT", "RUN_NAME")
 
-        if self.config.getboolean('DEFAULT', 'RUN_DATETIME'):
-            self._run_name += datetime.now().strftime('_%Y-%m-%d_%H-%M-%S')
+        if self.config.getboolean("DEFAULT", "RUN_DATETIME"):
+            self._run_name += datetime.now().strftime("_%Y-%m-%d_%H-%M-%S")
 
     def _create_pipeline_log(self):
         """Create Pipeline Log.
@@ -82,16 +82,16 @@ def _create_pipeline_log(self):
         """
         self.log = set_up_log(self.filehd.log_name, verbose=False)
 
-        start_text = f'Starting ShapePipe Run: {self._run_name}'
+        start_text = f"Starting ShapePipe Run: {self._run_name}"
 
         self.log.info(shapepipe_logo())
         self.log.info(start_text)
-        self.log.info('')
+        self.log.info("")
 
         if self.verbose:
             print(shapepipe_logo(colour=True))
             print(start_text)
-            print('')
+            print("")
 
         # Temporary fix to give file handler access to the log. This should
         # be improved at some point.
@@ -109,13 +109,13 @@ def close_pipeline_log(self):
 
         """
         if self.error_count == 1:
-            plur = ' was'
+            plur = " was"
         else:
-            plur = 's were'
+            plur = "s were"
         final_error_count = (
-            f'A total of {self.error_count} error{plur} recorded.'
+            f"A total of {self.error_count} error{plur} recorded."
         )
-        end_text = 'Finishing ShapePipe Run'
+        end_text = "Finishing ShapePipe Run"
 
         self.log.info(final_error_count)
         self.log.info(end_text)
@@ -174,15 +174,15 @@ def _check_dependencies(self):
         Check that all pipeline dependencies have been installed.
 
         """
-        module_dep = self._get_module_depends('depends') + __installs__
-        module_exe = self._get_module_depends('executes')
+        module_dep = self._get_module_depends("depends") + __installs__
+        module_exe = self._get_module_depends("executes")
 
-        module_dep += ['mpi4py'] if import_mpi else module_dep
+        module_dep += ["mpi4py"] if import_mpi else module_dep
 
         dh = DependencyHandler(module_dep, module_exe)
 
-        dep_text = 'Checking Python Dependencies:'
-        exe_text = 'Checking System Executables:'
+        dep_text = "Checking Python Dependencies:"
+        exe_text = "Checking System Executables:"
 
         self.log.info(dep_text)
         if self.verbose:
@@ -195,9 +195,9 @@ def _check_dependencies(self):
             if self.verbose:
                 print(dep)
 
-        self.log.info('')
+        self.log.info("")
         if self.verbose:
-            print('')
+            print("")
 
         self.log.info(exe_text)
         if self.verbose:
@@ -210,9 +210,9 @@ def _check_dependencies(self):
             if self.verbose:
                 print(exe)
 
-        self.log.info('')
+        self.log.info("")
         if self.verbose:
-            print('')
+            print("")
 
     def _check_module_versions(self):
         """Check Module Version.
@@ -220,7 +220,7 @@ def _check_module_versions(self):
         Check versions of the modules.
 
         """
-        ver_text = 'Checking Module Versions:'
+        ver_text = "Checking Module Versions:"
 
         self.log.info(ver_text)
         if self.verbose:
@@ -229,16 +229,16 @@ def _check_module_versions(self):
         for module in set(self.modules):
 
             module_txt = (
-                f' - {module} {self.filehd.module_runners[module].version}'
+                f" - {module} {self.filehd.module_runners[module].version}"
             )
 
             self.log.info(module_txt)
             if self.verbose:
                 print(module_txt)
 
-        self.log.info('')
+        self.log.info("")
         if self.verbose:
-            print('')
+            print("")
 
     def _check_system_setup(self):
         """Check System Set Up.
@@ -246,17 +246,17 @@ def _check_system_setup(self):
         Check the set up of the machine on which the pipeline is running.
 
         """
-        setup_text = 'Checking System Set Up:'
-        cpu_info = f' - Number of available CPUs: {cpu_count()}'
+        setup_text = "Checking System Set Up:"
+        cpu_info = f" - Number of available CPUs: {cpu_count()}"
 
         self.log.info(setup_text)
         self.log.info(cpu_info)
-        self.log.info('')
+        self.log.info("")
 
         if self.verbose:
             print(setup_text)
             print(cpu_info)
-            print('')
+            print("")
 
     def _get_module_run_methods(self):
         """Get Module Run Method.
@@ -268,9 +268,9 @@ def _get_module_run_methods(self):
 
         for module in self.modules:
 
-            self.run_method[module] = (
-                self.filehd.module_runners[module].run_method
-            )
+            self.run_method[module] = self.filehd.module_runners[
+                module
+            ].run_method
 
     def _prep_run(self):
         """Prepare Run.
@@ -302,13 +302,13 @@ def record_mode(self):
         Log mode in which ShapePipe is running.
 
         """
-        mode_text = f'Running ShapePipe using {self.mode}'
+        mode_text = f"Running ShapePipe using {self.mode}"
 
         self.log.info(mode_text)
-        self.log.info('')
+        self.log.info("")
         if self.verbose:
             print(mode_text)
-            print('')
+            print("")
 
 
 def run_smp(pipe):
@@ -390,7 +390,7 @@ def run_mpi(pipe, comm):
                 config=config,
                 log=pipe.log,
                 job_type=pipe.run_method[module],
-                parallel_mode='mpi',
+                parallel_mode="mpi",
                 exclusive=pipe.exclusive,
                 verbose=verbose,
             )
@@ -399,7 +399,7 @@ def run_mpi(pipe, comm):
             job_type = jh.job_type
 
             # Handle serial jobs
-            if job_type == 'serial':
+            if job_type == "serial":
                 jh.submit_jobs()
 
             # Handle parallel jobs
@@ -416,13 +416,14 @@ def run_mpi(pipe, comm):
                 jobs = split_mpi_jobs(process_list, comm.size)
                 del process_list
         else:
-            job_type = module_runner = worker_log = timeout = \
-                jobs = run_dirs = None
+            job_type = module_runner = worker_log = timeout = jobs = (
+                run_dirs
+            ) = None
 
         # Broadcast job type to all nodes
         job_type = comm.bcast(job_type, root=0)
 
-        if job_type == 'parallel':
+        if job_type == "parallel":
 
             # Broadcast objects to all nodes
             run_dirs = comm.bcast(run_dirs, root=0)
@@ -441,7 +442,7 @@ def run_mpi(pipe, comm):
                     run_dirs,
                     module_runner,
                     worker_log,
-                    verbose
+                    verbose,
                 ),
                 root=0,
             )
@@ -490,13 +491,13 @@ def run(*args):
             pipe = None
             mode = None
 
-        mode = comm.bcast(mode, root=0) if import_mpi else 'smp'
+        mode = comm.bcast(mode, root=0) if import_mpi else "smp"
 
         if master:
             pipe.mode = mode
             pipe.record_mode()
 
-        if mode == 'mpi':
+        if mode == "mpi":
             run_mpi(pipe, comm)
         else:
             run_smp(pipe)
diff --git a/shapepipe/tests/test_get_images.py b/shapepipe/tests/test_get_images.py
index ca492e9b6..860f37f97 100644
--- a/shapepipe/tests/test_get_images.py
+++ b/shapepipe/tests/test_get_images.py
@@ -19,8 +19,8 @@ class GetImagesTestCase(TestCase):
 
     def setUp(self):
 
-        self.number_tile = '123.456'
-        self.number_exp = '2490092p'
+        self.number_tile = "123.456"
+        self.number_exp = "2490092p"
         self.number_int = 123456
 
     def tearDown(self):
@@ -32,13 +32,11 @@ def tearDown(self):
     def test_in2out_pattern(self):
 
         npt.assert_string_equal(
-            get_images.in2out_pattern(self.number_tile),
-            '123-456'
+            get_images.in2out_pattern(self.number_tile), "123-456"
         )
 
         npt.assert_string_equal(
-            get_images.in2out_pattern(self.number_exp),
-            '2490092'
+            get_images.in2out_pattern(self.number_exp), "2490092"
         )
 
         npt.assert_raises(
diff --git a/shapepipe/tests/test_pipeline.py b/shapepipe/tests/test_pipeline.py
index 24b9ce8ca..2a59a6c74 100644
--- a/shapepipe/tests/test_pipeline.py
+++ b/shapepipe/tests/test_pipeline.py
@@ -18,8 +18,8 @@ class ExecuteTestCase(TestCase):
 
     def setUp(self):
 
-        self.command_line = 'echo 1'
-        self.output_tuple = ('1\n', '')
+        self.command_line = "echo 1"
+        self.output_tuple = ("1\n", "")
 
     def tearDown(self):
 
@@ -34,5 +34,5 @@ def test_execute(self):
     def test_check_executable(self):
 
         npt.assert_raises(TypeError, execute.check_executable, 1)
-        npt.assert_raises(OSError, execute.check_executable, '')
-        self.assertIsNone(execute.check_executable('/bin/ls'))
+        npt.assert_raises(OSError, execute.check_executable, "")
+        self.assertIsNone(execute.check_executable("/bin/ls"))
diff --git a/shapepipe/tests/test_utilities.py b/shapepipe/tests/test_utilities.py
index d5c02233a..83d624108 100644
--- a/shapepipe/tests/test_utilities.py
+++ b/shapepipe/tests/test_utilities.py
@@ -45,22 +45,22 @@ def test_sigma_to_fwhm(self):
         npt.assert_almost_equal(
             galaxy.sigma_to_fwhm(self.sigma_float),
             self.sigma_float_exp,
-            err_msg='sigma_to_fwhm gave invalid result for float input',
+            err_msg="sigma_to_fwhm gave invalid result for float input",
         )
 
         npt.assert_almost_equal(
             galaxy.sigma_to_fwhm(self.sigma_float, self.pixel_scale),
             self.sigma_float_ps_exp,
             err_msg=(
-                'sigma_to_fwhm gave invalid result for float input with '
-                + 'non-default pixel scale'
+                "sigma_to_fwhm gave invalid result for float input with "
+                + "non-default pixel scale"
             ),
         )
 
         npt.assert_allclose(
             galaxy.sigma_to_fwhm(self.sigma_array),
             self.sigma_array_exp,
-            err_msg='sigma_to_fwhm gave invalid result for array input',
+            err_msg="sigma_to_fwhm gave invalid result for array input",
         )
 
         npt.assert_raises(TypeError, galaxy.sigma_to_fwhm, self.sigma_int)
diff --git a/shapepipe/utilities/__init__.py b/shapepipe/utilities/__init__.py
index 63b425136..15e59739c 100644
--- a/shapepipe/utilities/__init__.py
+++ b/shapepipe/utilities/__init__.py
@@ -7,4 +7,4 @@
 
 """
 
-__all__ = ['file_system', 'cfis', 'galaxy']
+__all__ = ["file_system", "cfis", "galaxy"]
diff --git a/shapepipe/utilities/cfis.py b/shapepipe/utilities/cfis.py
index c8cdcb7a5..0d94b3be3 100644
--- a/shapepipe/utilities/cfis.py
+++ b/shapepipe/utilities/cfis.py
@@ -18,17 +18,17 @@
 
 from shapepipe.utilities.file_system import mkdir
 
-unitdef = 'degree'
+unitdef = "degree"
 
 # Maybe define class for these constants?
 size = {}
-size['tile'] = 0.5
-size['weight'] = 0.5
-size['exposure'] = 1.0
+size["tile"] = 0.5
+size["weight"] = 0.5
+size["exposure"] = 1.0
 
 # Cut criteria for exposures
 exp_time_min = 95
-flag_valid = 'V'
+flag_valid = "V"
 
 
 class param:
@@ -60,7 +60,7 @@ class CfisError(Exception):
     pass
 
 
-class image():
+class image:
     """Image Class.
 
     Class to store and create image information.
@@ -80,7 +80,7 @@ class image():
 
     """
 
-    def __init__(self, name, ra, dec, exp_time=-1, valid='Unknown'):
+    def __init__(self, name, ra, dec, exp_time=-1, valid="Unknown"):
         self.name = name
         self.ra = ra
         self.dec = dec
@@ -89,7 +89,7 @@ def __init__(self, name, ra, dec, exp_time=-1, valid='Unknown'):
         else:
             self.exp_time = exp_time
         if valid is None:
-            self.valid = 'Unknown'
+            self.valid = "Unknown"
         else:
             self.valid = valid
 
@@ -119,7 +119,7 @@ def cut(self, no_cuts=False):
             return True
 
         # Cut if validation flag is not valid (and not unknown)
-        if self.valid != flag_valid and self.valid != 'Unknown':
+        if self.valid != flag_valid and self.valid != "Unknown":
             return True
 
         return False
@@ -140,18 +140,14 @@ def get_ID(self):
             if name does not match to ID pattern
 
         """
-        m = re.search(r'(\d{3}).{1}(\d{3})', self.name)
+        m = re.search(r"(\d{3}).{1}(\d{3})", self.name)
         if m is None:
-            raise ValueError(f'No ID match in file name {name}')
+            raise ValueError(f"No ID match in file name {name}")
         else:
-            return f'{m[1]}.{m[2]}'
+            return f"{m[1]}.{m[2]}"
 
     def print(
-        self,
-        file=sys.stdout,
-        base_name=False,
-        name_only=True,
-        ID_only=False
+        self, file=sys.stdout, base_name=False, name_only=True, ID_only=False
     ):
         """Print.
 
@@ -180,21 +176,21 @@ def print(
             name = self.name
 
         if ID_only:
-            m = re.search(r'\d{3}.\d{3}', name)
+            m = re.search(r"\d{3}.\d{3}", name)
             if m is None:
-                raise ValueError(f'No ID match in file name {name}')
+                raise ValueError(f"No ID match in file name {name}")
             else:
                 name = m[0]
-        print(name, end='', file=file)
+        print(name, end="", file=file)
 
         if not name_only:
             if self.ra is not None:
                 ra_unit = getattr(self.ra, unitdef)
-                print(f' {ra_unit:10.2f}', end='', file=file)
+                print(f" {ra_unit:10.2f}", end="", file=file)
             if self.dec is not None:
                 dec_unit = getattr(self.dec, unitdef)
-                print(f' {dec_unit:10.2f}', end='', file=file)
-            print(f' {self.exp_time:5d} {self.valid:8s}', end='', file=file)
+                print(f" {dec_unit:10.2f}", end="", file=file)
+            print(f" {self.exp_time:5d} {self.valid:8s}", end="", file=file)
         print(file=file)
 
     def print_header(self, file=sys.stdout):
@@ -209,8 +205,8 @@ def print_header(self, file=sys.stdout):
 
         """
         print(
-            f'#Name ra[{unitdef}] dec[{unitdef}] exp_time[s] validation',
-            file=file
+            f"#Name ra[{unitdef}] dec[{unitdef}] exp_time[s] validation",
+            file=file,
         )
 
 
@@ -237,30 +233,30 @@ def log_command(argv, name=None, close_no_return=True):
 
     """
     if name is None:
-        name = 'log_' + os.path.basename(argv[0])
+        name = "log_" + os.path.basename(argv[0])
 
-    if name == 'sys.stdout':
+    if name == "sys.stdout":
         f = sys.stdout
-    elif name == 'sys.stderr':
+    elif name == "sys.stderr":
         f = sys.stderr
     else:
-        f = open(name, 'w')
+        f = open(name, "w")
 
     for a in argv:
 
         # Quote argument if special characters
-        if ']' in a or ']' in a:
-            a = f'\"{a}\"'
+        if "]" in a or "]" in a:
+            a = f'"{a}"'
 
-        print(a, end='', file=f)
-        print(' ', end='', file=f)
+        print(a, end="", file=f)
+        print(" ", end="", file=f)
 
-    print('', file=f)
+    print("", file=f)
 
     if not close_no_return:
         return f
 
-    if name != 'sys.stdout' and name != 'sys.stderr':
+    if name != "sys.stdout" and name != "sys.stderr":
         f.close()
 
 
@@ -301,30 +297,30 @@ def my_string_split(string, num=-1, verbose=False, stop=False, sep=None):
         return None
 
     if sep is None:
-        has_space = string.find(' ')
-        has_underscore = string.find('_')
-        has_dot = string.find('.')
+        has_space = string.find(" ")
+        has_underscore = string.find("_")
+        has_dot = string.find(".")
 
         if has_space != -1:
-            my_sep = ' '
+            my_sep = " "
         elif has_underscore != -1:
-            my_sep = '_'
+            my_sep = "_"
         elif has_dot != -1:
-            my_sep = '.'
+            my_sep = "."
         else:
             # no separator found, does string consist of only one element?
             if num == -1 or num == 1:
                 my_sep = None
             else:
                 raise Valueerror(
-                    'No separator (\' \', \'_\', or \'.\') found in string'
-                    + f' \'{string}\', cannot split'
+                    "No separator (' ', '_', or '.') found in string"
+                    + f" '{string}', cannot split"
                 )
     else:
         if not string.find(sep):
             raise ValueError(
-                f'No separator \'{sep}\' found in string \'{string}\', '
-                + 'cannot split'
+                f"No separator '{sep}' found in string '{string}', "
+                + "cannot split"
             )
         my_sep = sep
 
@@ -332,7 +328,7 @@ def my_string_split(string, num=-1, verbose=False, stop=False, sep=None):
 
     if num != -1 and num != len(res) and stop:
         raise CfisError(
-            f'String \'{len(res)}\' has length {num}, required is {num}'
+            f"String '{len(res)}' has length {num}, required is {num}"
         )
 
     return res
@@ -364,46 +360,46 @@ def get_file_pattern(pattern, band, image_type, want_re=True, ext=True):
         output pattern
 
     """
-    if pattern == '':
+    if pattern == "":
         if image_type in (
-            'exposure',
-            'exposure_flag',
-            'exposure_flag.fz',
-            'exposure_weight',
-            'exposure_weight.fz'
+            "exposure",
+            "exposure_flag",
+            "exposure_flag.fz",
+            "exposure_weight",
+            "exposure_weight.fz",
         ):
-            pattern_base = r'\d{7}p'
+            pattern_base = r"\d{7}p"
         else:
-            pattern_base = rf'CFIS.*\.{band}'
+            pattern_base = rf"CFIS.*\.{band}"
     else:
         pattern_base = pattern
 
     if ext:
-        if image_type == 'exposure':
-            pattern_out = rf'{pattern_base}\.fits\.fz'
-        elif image_type == 'exposure_flag':
-            pattern_out = rf'{pattern_base}\.flag\.fits'
-        elif image_type == 'exposure_flag.fz':
-            pattern_out = rf'{pattern_base}\.flag\.fits\.fz'
-        elif image_type == 'exposure_weight':
-            pattern_out = rf'{pattern_base}\.weight\.fits'
-        elif image_type == 'exposure_weight.fz':
-            pattern_out = rf'{pattern_base}\.weight\.fits\.fz'
-        elif image_type == 'tile':
-            pattern_out = rf'{pattern_base}\.fits'
-        elif image_type == 'cat':
-            pattern_out = rf'{pattern_base}\.cat'
-        elif image_type == 'weight':
-            pattern_out = rf'{pattern_base}\.weight\.fits'
-        elif image_type == 'weight.fz':
-            pattern_out = rf'{pattern_base}\.weight\.fits\.fz'
+        if image_type == "exposure":
+            pattern_out = rf"{pattern_base}\.fits\.fz"
+        elif image_type == "exposure_flag":
+            pattern_out = rf"{pattern_base}\.flag\.fits"
+        elif image_type == "exposure_flag.fz":
+            pattern_out = rf"{pattern_base}\.flag\.fits\.fz"
+        elif image_type == "exposure_weight":
+            pattern_out = rf"{pattern_base}\.weight\.fits"
+        elif image_type == "exposure_weight.fz":
+            pattern_out = rf"{pattern_base}\.weight\.fits\.fz"
+        elif image_type == "tile":
+            pattern_out = rf"{pattern_base}\.fits"
+        elif image_type == "cat":
+            pattern_out = rf"{pattern_base}\.cat"
+        elif image_type == "weight":
+            pattern_out = rf"{pattern_base}\.weight\.fits"
+        elif image_type == "weight.fz":
+            pattern_out = rf"{pattern_base}\.weight\.fits\.fz"
         else:
-            raise CfisError(f'Invalid type \'{image_type}\'')
+            raise CfisError(f"Invalid type '{image_type}'")
     else:
         pattern_out = pattern_base
 
     if not want_re:
-        pattern_out = pattern_out.replace('\\', '')
+        pattern_out = pattern_out.replace("\\", "")
 
     return pattern_out
 
@@ -443,13 +439,13 @@ def get_tile_number_from_coord(ra, dec, return_type=str):
         xi = 0
 
     if return_type == str:
-        nix = f'{xi:03d}'
-        niy = f'{yi:03d}'
+        nix = f"{xi:03d}"
+        niy = f"{yi:03d}"
     elif return_type == int:
         nix = xi
         niy = yi
     else:
-        raise CfisError(f'Invalid return type {return_type}')
+        raise CfisError(f"Invalid return type {return_type}")
 
     return nix, niy
 
@@ -482,14 +478,14 @@ def get_tile_coord_from_nixy(nix, niy):
         yi = int(niy)
 
     d = yi / 2 - 90
-    dec = coords.Angle(d, unit='deg')
+    dec = coords.Angle(d, unit="deg")
     r = xi / 2 / np.cos(dec.radian)
-    ra = coords.Angle(r, unit='deg')
+    ra = coords.Angle(r, unit="deg")
 
     return ra, dec
 
 
-def get_tile_name(nix, niy, band, image_type='tile', input_format='full'):
+def get_tile_name(nix, niy, band, image_type="tile", input_format="full"):
     """Get Tile Name.
 
     Return tile name for given tile numbers.
@@ -519,29 +515,29 @@ def get_tile_name(nix, niy, band, image_type='tile', input_format='full'):
 
     """
     if type(nix) is int and type(niy) is int:
-        if input_format == 'ID_only':
-            tile_base = f'{nix:03d}.{niy:03d}'
+        if input_format == "ID_only":
+            tile_base = f"{nix:03d}.{niy:03d}"
         else:
-            tile_base = f'CFIS.{nix:03d}.{niy:03d}.{band}'
+            tile_base = f"CFIS.{nix:03d}.{niy:03d}.{band}"
     elif type(nix) is str and type(niy) is str:
-        if input_format == 'ID_only':
-            tile_base = f'{nix}.{niy}'
+        if input_format == "ID_only":
+            tile_base = f"{nix}.{niy}"
         else:
-            tile_base = f'CFIS.{nix}.{niy}.{band}'
+            tile_base = f"CFIS.{nix}.{niy}.{band}"
     else:
-        raise CfisError(f'Invalid type for input tile numbers {nix}, {niy}')
+        raise CfisError(f"Invalid type for input tile numbers {nix}, {niy}")
 
-    if input_format == 'ID_only':
+    if input_format == "ID_only":
         tile_name = tile_base
     else:
-        if image_type == 'tile':
-            tile_name = f'{tile_base}.fits'
-        elif image_type == 'weight':
-            tile_name = f'{tile_base}.weight.fits'
-        elif image_type == 'weight.fz':
-            tile_name = f'{tile_base}.weight.fits.fz'
+        if image_type == "tile":
+            tile_name = f"{tile_base}.fits"
+        elif image_type == "weight":
+            tile_name = f"{tile_base}.weight.fits"
+        elif image_type == "weight.fz":
+            tile_name = f"{tile_base}.weight.fits.fz"
         else:
-            raise CfisError(f'Invalid image type {image_type}')
+            raise CfisError(f"Invalid image type {image_type}")
 
     return tile_name
 
@@ -567,10 +563,10 @@ def get_tile_number(tile_name):
         tile number for x and tile number for y
 
     """
-    m = re.search(r'(\d{3})[\.-](\d{3})', tile_name)
+    m = re.search(r"(\d{3})[\.-](\d{3})", tile_name)
     if m is None or len(m.groups()) != 2:
         raise CfisError(
-            f'Image name \'{tile_name}\' does not match tile name syntax'
+            f"Image name '{tile_name}' does not match tile name syntax"
         )
 
     nix = m.groups()[0]
@@ -629,12 +625,12 @@ def get_log_file(path, verbose=False):
 
     """
     if not os.path.isfile(path):
-        raise CfisError(f'Log file \'{path}\' not found')
+        raise CfisError(f"Log file '{path}' not found")
 
-    f_log = open(path, 'r')
+    f_log = open(path, "r")
     log = f_log.readlines()
     if verbose:
-        print(f'Reading log file, {len(log)} lines found')
+        print(f"Reading log file, {len(log)} lines found")
     f_log.close()
 
     return log
@@ -663,7 +659,7 @@ def check_ra(ra):
     """
     print(ra.deg)
     if ra.deg < 0 or ra.deg > 360:
-        raise CfisError('Invalid ra, valid range is 0 < ra < 360 deg')
+        raise CfisError("Invalid ra, valid range is 0 < ra < 360 deg")
         return 1
 
     return 0
@@ -691,7 +687,7 @@ def check_dec(dec):
 
     """
     if dec.deg < -90 or dec.deg > 90:
-        raise CfisError('Invalid dec, valid range is -90 < dec < 90 deg')
+        raise CfisError("Invalid dec, valid range is -90 < dec < 90 deg")
         return 1
 
     return 0
@@ -744,10 +740,7 @@ def get_Angle_arr(str_coord, num=-1, wrap=True, verbose=False):
 
     """
     angles_mixed = my_string_split(
-        str_coord,
-        num=num,
-        verbose=verbose,
-        stop=True
+        str_coord, num=num, verbose=verbose, stop=True
     )
     n = len(angles_mixed)
     n = int(n / 2)
@@ -784,12 +777,13 @@ def read_list(fname, col=None):
 
     """
     if col is None:
-        f = open(fname, 'rU', encoding='latin1')
+        f = open(fname, "rU", encoding="latin1")
         file_list = [x.strip() for x in f.readlines()]
         f.close()
     else:
         import pandas as pd
-        dat = pd.read_csv(fname, sep=r'\s+', dtype='string', header=None)
+
+        dat = pd.read_csv(fname, sep=r"\s+", dtype="string", header=None)
         if col not in dat:
             col = int(col)
         file_list = dat[col]
@@ -827,17 +821,17 @@ def create_image_list(fname, ra, dec, exp_time=[], valid=[]):
     nr = len(ra)
     nd = len(dec)
     if nf == 0:
-        raise CfisError('No entries in file name list')
+        raise CfisError("No entries in file name list")
     if (nf != nr or nf != nd) and nr != 0 and nd != 0:
         raise CfisError(
-            f'Lists fname, ra, dec have not same length ({nf}, {nr}, {nd})'
+            f"Lists fname, ra, dec have not same length ({nf}, {nr}, {nd})"
         )
 
     images = []
     for i in range(nf):
         if nr > 0 and nd > 0:
-            r = Angle(f'{ra[i]} {unitdef}')
-            d = Angle(f'{dec[i]} {unitdef}')
+            r = Angle(f"{ra[i]} {unitdef}")
+            d = Angle(f"{dec[i]} {unitdef}")
         else:
             r = None
             d = None
@@ -856,12 +850,7 @@ def create_image_list(fname, ra, dec, exp_time=[], valid=[]):
 
 
 def get_image_list(
-    inp,
-    band,
-    image_type,
-    col=None,
-    input_format='full',
-    verbose=False
+    inp, band, image_type, col=None, input_format="full", verbose=False
 ):
     """Get Image List.
 
@@ -897,29 +886,29 @@ def get_image_list(
     if os.path.isdir(inp):
         if col is not None:
             raise CfisError(
-                'Column name (-c option) only valid if input is file'
+                "Column name (-c option) only valid if input is file"
             )
 
         # Read file names from directory listing
-        inp_type = 'dir'
-        file_list = glob.glob(f'{os.path.abspath(inp)}/*')
+        inp_type = "dir"
+        file_list = glob.glob(f"{os.path.abspath(inp)}/*")
 
     elif os.path.isfile(inp):
-        if image_type in ('tile', 'weight', 'weight.fz'):
+        if image_type in ("tile", "weight", "weight.fz"):
             # File names in single-column ascii file
-            inp_type = 'file'
+            inp_type = "file"
             file_list = read_list(inp, col=col)
-        elif image_type == 'exposure':
+        elif image_type == "exposure":
             # File names and coordinates in ascii file
-            inp_type = 'file'
+            inp_type = "file"
             dat = ascii.read(inp)
 
             if len(dat.keys()) == 3:
                 # File is exposure + coord list
                 # (obtained from get_coord_CFIS_pointings.py)
-                file_list = dat['Pointing']
-                ra_list = dat['R.A.[degree]']
-                dec_list = dat['Declination[degree]']
+                file_list = dat["Pointing"]
+                ra_list = dat["R.A.[degree]"]
+                dec_list = dat["Declination[degree]"]
             elif len(dat.keys()) == 12:
                 # File is log file, e.g. from
                 # http://www.cfht.hawaii.edu/Science/CFIS-DATA
@@ -927,41 +916,35 @@ def get_image_list(
                 # Default file separator is '|'
                 for d in dat:
                     file_list.append(f'd{d["col1"]}p.fits.fz')
-                    ra = re.split(r'\s*', d['col4'])[0]
-                    dec = re.split(r'\s*', d['col4'])[1]
-                    ang = coords.Angle('{ra} hours')
+                    ra = re.split(r"\s*", d["col4"])[0]
+                    dec = re.split(r"\s*", d["col4"])[1]
+                    ang = coords.Angle("{ra} hours")
                     ra_list.append(ang.degree)
                     dec_list.append(dec)
-                    exp_time = int(d['col5'])
+                    exp_time = int(d["col5"])
                     exp_time_list.append(exp_time)
-                    valid = re.split(r'\s*', d['col11'])[2]
+                    valid = re.split(r"\s*", d["col11"])[2]
                     valid_list.append(valid)
             else:
                 raise CfisError(
-                    f'Wrong file format, #columns={len(dat.keys())},'
-                    + f' has to be 3 or 12'
+                    f"Wrong file format, #columns={len(dat.keys())},"
+                    + f" has to be 3 or 12"
                 )
         else:
-            raise CfisError(f'Image type \'{image_type}\' not supported')
+            raise CfisError(f"Image type '{image_type}' not supported")
 
     # Create list of objects, coordinate lists can be empty
     image_list = create_image_list(
-        file_list,
-        ra_list,
-        dec_list,
-        exp_time=exp_time_list,
-        valid=valid_list
+        file_list, ra_list, dec_list, exp_time=exp_time_list, valid=valid_list
     )
 
     # Filter file list to match CFIS image pattern
     img_list = []
-    if input_format == 'ID_only':
-        pattern = get_file_pattern(r'\d{3}.\d{3}', band, image_type, ext=False)
+    if input_format == "ID_only":
+        pattern = get_file_pattern(r"\d{3}.\d{3}", band, image_type, ext=False)
     else:
         pattern = get_file_pattern(
-            rf'CFIS.\d{{3}}.\d{{3}}\.{band}',
-            band,
-            image_type
+            rf"CFIS.\d{{3}}.\d{{3}}\.{band}", band, image_type
         )
 
     for img in image_list:
@@ -979,9 +962,7 @@ def get_image_list(
             img_list.append(img)
 
     if verbose and len(img_list) > 0:
-        print(
-            f'{len(img_list)} image files found in input {inp_type} \'{inp}\''
-        )
+        print(f"{len(img_list)} image files found in input {inp_type} '{inp}'")
 
     return img_list
 
@@ -1013,8 +994,8 @@ def find_image_at_coord(
     band,
     image_type,
     no_cuts=False,
-    input_format='full',
-    verbose=False
+    input_format="full",
+    verbose=False,
 ):
     """Find Image At Coordinates.
 
@@ -1055,16 +1036,12 @@ def find_image_at_coord(
     ra, dec = get_Angle(coord)
 
     if verbose:
-        print(f'Looking for image at coordinates {ra}, {dec}')
+        print(f"Looking for image at coordinates {ra}, {dec}")
 
-    if image_type in ('tile', 'weight', 'weight.fz'):
+    if image_type in ("tile", "weight", "weight.fz"):
         nix, niy = get_tile_number_from_coord(ra, dec, return_type=int)
         tile_name = get_tile_name(
-            nix,
-            niy,
-            band,
-            image_type,
-            input_format=input_format
+            nix, niy, band, image_type, input_format=input_format
         )
 
         img_found = []
@@ -1074,9 +1051,9 @@ def find_image_at_coord(
                 ra_c, dec_c = get_tile_coord_from_nixy(nix, niy)
                 if img.ra is not None or img.dec is not None:
                     raise CfisError(
-                        'Coordinates in image are already '
-                        + f'set to {img.ra}, {img.rec}, '
-                        + f'cannot update to {ra_c}, {ra_dec}'
+                        "Coordinates in image are already "
+                        + f"set to {img.ra}, {img.rec}, "
+                        + f"cannot update to {ra_c}, {ra_dec}"
                     )
                 img.ra = ra_c
                 img.dec = dec_c
@@ -1086,12 +1063,12 @@ def find_image_at_coord(
             pass
         else:
             if verbose:
-                print(f'Tile with numbers ({nix}, {niy}) not found')
+                print(f"Tile with numbers ({nix}, {niy}) not found")
 
         if len(img_found) > 1:
-            raise CfisError(f'More than one tile ({img_found}) found')
+            raise CfisError(f"More than one tile ({img_found}) found")
 
-    elif image_type == 'exposure':
+    elif image_type == "exposure":
         sc_input = coords.SkyCoord(ra, dec)
 
         img_found = []
@@ -1112,21 +1089,16 @@ def find_image_at_coord(
             pass
         else:
             if verbose:
-                print('No exposure image found')
+                print("No exposure image found")
 
     else:
-        raise CfisError('Only implemented for image_type=tile')
+        raise CfisError("Only implemented for image_type=tile")
 
     return img_found
 
 
 def find_images_in_area(
-    images,
-    angles,
-    band,
-    image_type,
-    no_cuts=False,
-    verbose=False
+    images, angles, band, image_type, no_cuts=False, verbose=False
 ):
     """Fine Images In Area.
 
@@ -1164,22 +1136,22 @@ def find_images_in_area(
     if angles[1].ra > threesixty:
         ra_bounds = [
             [angles[0].ra, threesixty],
-            [coords.Angle(0, unitdef), angles[1].ra - threesixty]
+            [coords.Angle(0, unitdef), angles[1].ra - threesixty],
         ]
     else:
         ra_bounds = [[angles[0].ra, angles[1].ra]]
 
     if verbose:
         print(
-            'Looking for all images within rectangle, '
-            + f'dec=({angles[0].dec}, {angles[1].dec}), ',
-            end=''
+            "Looking for all images within rectangle, "
+            + f"dec=({angles[0].dec}, {angles[1].dec}), ",
+            end="",
         )
         for ra_min_max in ra_bounds:
-            print(f'ra=[({ra_min_max[0]}, {ra_min_max[1]}) ', end='')
+            print(f"ra=[({ra_min_max[0]}, {ra_min_max[1]}) ", end="")
         print()
 
-    if image_type in ('tile', 'weight', 'weight.fz'):
+    if image_type in ("tile", "weight", "weight.fz"):
         for img in images:
             nix, niy = get_tile_number(img.name)
             ra, dec = get_tile_coord_from_nixy(nix, niy)
@@ -1188,7 +1160,7 @@ def find_images_in_area(
                 within = False
 
                 # Check whether image is in any of the ra bound pairs
-                for (ra_min, ra_max) in ra_bounds:
+                for ra_min, ra_max in ra_bounds:
                     if ra.is_within_bounds(ra_min, ra_max):
                         within = True
                         break
@@ -1199,13 +1171,13 @@ def find_images_in_area(
 
                     found.append(img)
 
-    elif image_type == 'exposure':
+    elif image_type == "exposure":
         for img in images:
             if img.dec.is_within_bounds(angles[0].dec, angles[1].dec):
                 within = False
 
                 # Check whether image is in any of the ra bound pairs
-                for (ra_min, ra_max) in ra_bounds:
+                for ra_min, ra_max in ra_bounds:
                     if ra.is_within_bounds(ra_min, ra_max):
                         within = True
                         break
@@ -1214,10 +1186,10 @@ def find_images_in_area(
                         found.append(img)
 
     else:
-        raise CfisError(f'Image type \'{image_type}\' not implemented yet')
+        raise CfisError(f"Image type '{image_type}' not implemented yet")
 
     if verbose:
-        print(f'{len(found)} images found in area')
+        print(f"{len(found)} images found in area")
 
     return found
 
@@ -1235,9 +1207,9 @@ def plot_init():
     ax.yaxis.label.set_size(fs)
     ax.xaxis.label.set_size(fs)
 
-    plt.tick_params(axis='both', which='major', labelsize=fs)
+    plt.tick_params(axis="both", which="major", labelsize=fs)
 
-    plt.rcParams.update({'figure.autolayout': True})
+    plt.rcParams.update({"figure.autolayout": True})
 
     return ax
 
@@ -1255,7 +1227,7 @@ def plot_area(
     ax=None,
     lw=None,
     save=True,
-    dxy=0
+    dxy=0,
 ):
     """Plot Area.
 
@@ -1292,15 +1264,15 @@ def plot_area(
 
     """
     if outbase is None:
-        outname = 'plot.pdf'
+        outname = "plot.pdf"
     else:
-        outname = f'{outbase}.pdf'
+        outname = f"{outbase}.pdf"
 
     if not lw:
         my_lw = 0.1
     else:
         my_lw = lw
-    color = {'tile': 'b', 'exposure': 'g', 'weight': 'r'}
+    color = {"tile": "b", "exposure": "g", "weight": "r"}
 
     if not ax:
         ax = plot_init()
@@ -1322,16 +1294,16 @@ def plot_area(
         dy = abs(angles[0].dec - angles[1].dec)
         dx = getattr(dx, unitdef)
         dy = getattr(dy, unitdef)
-        radius = (
-            max(dx, dy) / 2 + (size['exposure'] + size['tile']) * np.sqrt(2)
+        radius = max(dx, dy) / 2 + (size["exposure"] + size["tile"]) * np.sqrt(
+            2
         )
         circle = plt.Circle(
             (ra_c.deg, dec_c.deg),
             radius,
-            color='r',
+            color="r",
             fill=False,
         )
-        plt.plot(ra_c, dec_c, 'or', mfc='none', ms=3)
+        plt.plot(ra_c, dec_c, "or", mfc="none", ms=3)
         ax.add_artist(circle)
     else:
         radius = 0
@@ -1349,24 +1321,24 @@ def plot_area(
             plt.text(
                 x,
                 y,
-                f'{nix}.{niy}',
+                f"{nix}.{niy}",
                 fontsize=3,
-                horizontalalignment='center',
-                verticalalignment='center'
+                horizontalalignment="center",
+                verticalalignment="center",
             )
 
         # Image boundary
         dx = size[image_type] / 2 / cos_dec_c
         dy = size[image_type] / 2
         cx, cy = square_from_centre(x, y, dx, dy, dxy=dxy)
-        ax.plot(cx, cy, '-', color=c, linewidth=my_lw)
+        ax.plot(cx, cy, "-", color=c, linewidth=my_lw)
 
     if show_area_border:
         cx, cy = square_from_corners(angles[0], angles[1])
-        ax.plot(cx, cy, 'r-.', linewidth=my_lw)
+        ax.plot(cx, cy, "r-.", linewidth=my_lw)
 
-    plt.xlabel('R.A. [degree]')
-    plt.ylabel('Declination [degree]')
+    plt.xlabel("R.A. [degree]")
+    plt.ylabel("Declination [degree]")
     if outbase is not None:
         plt.title(outbase)
 
@@ -1385,7 +1357,7 @@ def plot_area(
     plt.ylim(ym - lim / 2 - border, ym + lim / 2 + border)
 
     if save:
-        print(f'Saving plot to {outname}')
+        print(f"Saving plot to {outname}")
         plt.savefig(outname)
 
     if interactive:
diff --git a/shapepipe/utilities/file_system.py b/shapepipe/utilities/file_system.py
index 52f5fd906..603800ee7 100644
--- a/shapepipe/utilities/file_system.py
+++ b/shapepipe/utilities/file_system.py
@@ -37,7 +37,7 @@ def check_dir(dir_name):
     """
     if not isinstance(dir_name, str):
         raise TypeError(
-            f'Directory name must be of type string, not {type(dir_name)}'
+            f"Directory name must be of type string, not {type(dir_name)}"
         )
 
     return os.path.isdir(dir_name)
@@ -71,5 +71,5 @@ def mkdir(dir_name, check_created=True, exist_ok=True):
 
     if check_created and not check_dir(dir_name):
         raise FileSystemError(
-            f'Directory \"{dir_name}\" not found after mkdir command.'
+            f'Directory "{dir_name}" not found after mkdir command.'
         )
diff --git a/shapepipe/utilities/galaxy.py b/shapepipe/utilities/galaxy.py
index eb05c4bc2..40948a8f1 100644
--- a/shapepipe/utilities/galaxy.py
+++ b/shapepipe/utilities/galaxy.py
@@ -61,32 +61,32 @@ def sigma_to_fwhm(sigma, pixel_scale=1.0):
     """
     if not isinstance(sigma, (np.ndarray, float)):
         raise TypeError(
-            f'Sigma must be of type numpy array or float, not {type(sigma)}.'
+            f"Sigma must be of type numpy array or float, not {type(sigma)}."
         )
     elif isinstance(sigma, np.ndarray) and sigma.dtype != np.float64:
         raise TypeError(
-            f'Sigma array values must be of type float, not {sigma.dtype}.'
+            f"Sigma array values must be of type float, not {sigma.dtype}."
         )
 
     if not isinstance(pixel_scale, float):
         raise TypeError(
-            f'The pixel scale must of type float, not {type(pixel_scale)}.'
+            f"The pixel scale must of type float, not {type(pixel_scale)}."
         )
 
     if isinstance(sigma, np.ndarray) and np.any(sigma <= 0.0):
         raise ValueError(
-            f'Found {sigma[sigma <=0].size} invalid standard deviation array '
-            + 'values, all elements must to be greater than 0.0.'
+            f"Found {sigma[sigma <=0].size} invalid standard deviation array "
+            + "values, all elements must to be greater than 0.0."
         )
     elif isinstance(sigma, float) and sigma <= 0.0:
         raise ValueError(
-            f'Invalid standard deviation {sigma}, needs to be greater than '
-            + '0.0.'
+            f"Invalid standard deviation {sigma}, needs to be greater than "
+            + "0.0."
         )
 
     if pixel_scale <= 0.0:
         raise ValueError(
-            f'Invalid pixel scale {pixel_scale}, needs to be greater than 0.0.'
+            f"Invalid pixel scale {pixel_scale}, needs to be greater than 0.0."
         )
 
     cst = 2.35482004503
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 8977a5d66..f19a11a31 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -70,7 +70,6 @@ def get_IDs_from_file(path):
     return numbers
 
 
-
 def get_all_exposures(exp_number_file_list, verbose=False):
     """Get All Exposures.
 
@@ -187,7 +186,7 @@ def check_special(module, paths_in_dir, names_in_dir):
                             print(f"b stars = {value}, not special")
                         break
 
-        #print(inds_special)
+        # print(inds_special)
         for idx in inds_special:
             paths_in_dir.pop(idx)
             names_in_dir.pop(idx)
@@ -217,7 +216,7 @@ class job_data(object):
     pattern: list, optional
         if not None, file pattern to match; defafult is `None`
     path_main: str, optional
-        main (left-most) part of output directory, default is "."       
+        main (left-most) part of output directory, default is "."
     path_left: str, optional
         left (first) part of output directory, default is "./output"
     output_subdirs: str, optional
@@ -232,6 +231,7 @@ class job_data(object):
         verbose output if True; default is False
 
     """
+
     def __init__(
         self,
         bit,
@@ -256,10 +256,8 @@ def __init__(
         self._path_main = path_main
         self._path_left = path_left
         self._output_subdirs = output_subdirs or [""]
-        self._path_right = set_as_list(
-            path_right, len(modules), default="."
-        )
-        self._output_path_missing_IDs=output_path_missing_IDs
+        self._path_right = set_as_list(path_right, len(modules), default=".")
+        self._output_path_missing_IDs = output_path_missing_IDs
         self._verbose = verbose
 
     def print_intro(self):
@@ -277,9 +275,9 @@ def print_stats_header(self):
         Print overall header information for stats output.
 
         """
-        #logging.info(
-            #"module                          expected     found   miss_expl"
-            #+ " missing uniq_miss  fr_found"
+        # logging.info(
+        # "module                          expected     found   miss_expl"
+        # + " missing uniq_miss  fr_found"
         logging.info(
             "module                          expected     found"
             + "   missing uniq_miss  fr_found"
@@ -333,9 +331,9 @@ def print_stats(
     def is_ID_in_str(self, ID, path):
         if ID in path:
             return True
-        #if re.sub("\.", "-", ID) in path:
-            #return True
-        #return False
+        # if re.sub("\.", "-", ID) in path:
+        # return True
+        # return False
 
     @classmethod
     def is_not_in_any(self, ID, list_str):
@@ -353,7 +351,7 @@ def replace_dash_dot_if_tile(self, numbers):
 
         pattern = re.compile(r"(\d{3})-(\d{3})")
         results = [pattern.sub(r"\1.\2", number) for number in numbers]
-    
+
         return results
 
     @classmethod
@@ -411,21 +409,17 @@ def output_missing(
         n_mult = self._n_mult[idx]
 
         list_expected = get_par_runtime(par_runtime, key_expected, kind="list")
-        
+
         # Count image IDs in names that were found earlier
 
         ## Extract image IDs from names
         IDs = []
         if module != "split_exp_runner":
-            pattern = re.compile(
-                r"(?:\d{3}-\d{3}|\d{7}-\d+|\d{7})"
-            )
+            pattern = re.compile(r"(?:\d{3}-\d{3}|\d{7}-\d+|\d{7})")
         else:
             # split_exp_runner: input is exp, output is shdu (images) and exp
             # (header); ignore hdu number
-            pattern = re.compile(
-                r"(?:\d{3}-\d{3}|\d{7})"
-            )
+            pattern = re.compile(r"(?:\d{3}-\d{3}|\d{7})")
         for name, path in zip(names_in_dir, paths_in_dir):
             match = pattern.search(name)
             if match:
@@ -497,7 +491,7 @@ def get_module_output_dir(self, full_path, module):
         """
         directory = f"{full_path}/{module}/output"
 
-        # Some modules have special requirements 
+        # Some modules have special requirements
         if module == "setools_runner":
             directory = f"{directory}/rand_split"
 
@@ -509,13 +503,11 @@ def get_matches_final(self, directory, idx):
         # os.path.whether exists is twice faster than try/except
 
         if os.path.exists(directory):
-            pattern =  f"{self._pattern[idx]}*"
+            pattern = f"{self._pattern[idx]}*"
             for entry2 in os.scandir(directory):
                 if (
                     entry2.is_file()
-                    and (
-                        fnmatch.fnmatch(entry2.name, pattern)
-                    )
+                    and (fnmatch.fnmatch(entry2.name, pattern))
                     and entry2.stat().st_size > 0
                 ):
                     # Append matching files
@@ -566,9 +558,7 @@ def get_names_in_dir(self, iterable, module, idx):
                     )
 
                     # Get module output directory
-                    directory = self.get_module_output_dir(
-                        full_path, module
-                    )
+                    directory = self.get_module_output_dir(full_path, module)
                     if self._verbose:
                         print(f"**** Output dir = {directory}")
 
@@ -686,7 +676,7 @@ def check_numbers(self, par_runtime=None, indices=None):
         logging.info("")
 
         # Write missing IDs for entire job to file
-        #if n_missing_job > 0:
+        # if n_missing_job > 0:
         self.output_missing_job()
 
 
@@ -719,7 +709,7 @@ def print_par_runtime(par_runtime, verbose=True):
             if not key.startswith("list"):
                 logging.info(f"{key:30s} {value:6d}")
             else:
-                #logging.info(f"{key:30s} {len(value):6d} entries")
+                # logging.info(f"{key:30s} {len(value):6d} entries")
                 pass
         logging.info("===========")
         logging.info("")

From a64ff7fcc6114d1e88e631635e45646b39347298 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 25 Jun 2024 08:37:21 +0000
Subject: [PATCH 179/207] small modifs to make thing smoother

---
 docs/source/pipeline_canfar.md   |  19 +-
 example/cfis/config_exp_SpMh.ini |   2 +-
 install_shapepipe                | 655 -------------------------------
 scripts/sh/curl_canfar_local.sh  |   4 +-
 4 files changed, 12 insertions(+), 668 deletions(-)
 delete mode 100755 install_shapepipe

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 6f4f4f3e0..9b169c55f 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -1,6 +1,5 @@
 patch="P7"
 psf="psfex"
-N_SMP=16
 
 # Terminal title
 echo -ne "\033]0;$patch\007"
@@ -50,12 +49,12 @@ while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; m
 job_sp_canfar.bash -p $psf `cat tile_numbers.txt` -j 1 -r symlink
 
 # Uncompress weights,  split exposures into single HDUs
-job_sp_canfar.bash -p $psf -n $N_SMP -j 2
+job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 2
 
 # Mask tiles
 
 ## Run repeatedly if necessary
-job_sp_canfar.bash -p $psf -n $N_SMP -j 4
+job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 4
 
 ## Combine all runs
 combine_runs.bash -c flag_tile
@@ -63,14 +62,14 @@ combine_runs.bash -c flag_tile
 # Mask exposures
 
 ## Run repeatedly if necessary
-job_sp_canfar.bash -p $psf -n $N_SMP -j 8
+job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 8
 
 # Combine all runs
 combine_runs.bash -c flag_exp
 
 
 # Tile detection
-curl_canfar_local.sh -j 16 -f tile_numbers.txt -p $psf -N $N_SMP
+curl_canfar_local.sh -j 16 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS
 
 
 # Exposure detection
@@ -78,19 +77,19 @@ curl_canfar_local.sh -j 16 -f tile_numbers.txt -p $psf -N $N_SMP
 ~/shapepipe/scripts/python/summary_run.py
 
 cp summary/missing_job_32_sextractor.txt all.txt
-curl_canfar_local.sh -j 32 -f all.txt -p $psf -N $N_SMP
+curl_canfar_local.sh -j 32 -f all.txt -p $psf -N $OMP_NUM_THREADS
 
 # Tile preparation
-curl_canfar_local.sh -j 64 -f tile_numbers.txt -p $psf -N $N_SMP
+curl_canfar_local.sh -j 64 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS
 
 # Tile shape measurement
 curl_canfar_local.sh -j 128 -f tile_numbers.txt -p $psf -N 8
 
 # Merge subcatalogues
-curl_canfar_local.sh -j 256 -f tile_numbers.txt -p $psf -N $N_SMP
+curl_canfar_local.sh -j 256 -f tile_numbers.txt -p $psf -N 8
 
 # Create final cat
-curl_canfar_local.sh -j 512 -f tile_numbers.txt -p $psf -N $N_SMP
+curl_canfar_local.sh -j 512 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS
 # Run in parallel
 cat mc.txt | xargs -I {} -P 16 bash -c 'init_run_exclusive_canfar.sh -p psfex -j 512 -e {} --n_smp 1'
 
@@ -128,7 +127,7 @@ SESSION=https://ws-uv.canfar.net/skaha/v0/session
 for ID in `cat session_IDs.txt`; do echo $ID; curl -X DELETE -E $SSL $SESSION/$ID; done
 
 ## Run in terminal in parallel (-e needs to be last arg)
-cat all.txt | xargs -P 16 -n 1  init_run_exclusive_canfar.sh -j 64 -p psfex -f summary/missing_job_64_all.txt -n -e
+cat all.txt | xargs -P 16 -n 1  init_run_exclusive_canfar.sh -j 64 -p psfex -n -e
 
 ## Get missing jobs that are not currently running
 stats_jobs_canfar.sh
diff --git a/example/cfis/config_exp_SpMh.ini b/example/cfis/config_exp_SpMh.ini
index add375bfd..b05b8f0c2 100644
--- a/example/cfis/config_exp_SpMh.ini
+++ b/example/cfis/config_exp_SpMh.ini
@@ -12,7 +12,7 @@ VERBOSE = True
 RUN_NAME = run_sp_exp_SpMh
 
 # Add date and time to RUN_NAME, optional, default: True
-; RUN_DATETIME = False
+RUN_DATETIME = False
 
 
 ## ShapePipe execution options
diff --git a/install_shapepipe b/install_shapepipe
deleted file mode 100755
index e6ac4ad20..000000000
--- a/install_shapepipe
+++ /dev/null
@@ -1,655 +0,0 @@
-#!/usr/bin/env bash
-export LC_ALL=en_US.UTF-8
-export LC_CTYPE=en_US.utf8
-
-##############################################################################
-# Install ShapePipe Executables
-#
-# This script can only be run after the ShapePipe environment has been
-# installed.
-#
-##############################################################################
-
-version="1.6"
-last_update="08/03/22"
-
-##############################################################################
-# EXTERNAL PACKAGES AND SCRIPTS
-##############################################################################
-
-# External packages
-
-# Conda package versions
-fftw_ver="3.3.10"
-libpng_ver="1.6.37"
-mpi4py_ver="3.1.3"
-openblas_ver="0.3.18"
-
-# WeightWatcher Package
-ww_url="http://snapshot.debian.org/archive/debian/20171211T160522Z/pool/main/w/weightwatcher/weightwatcher_1.12.orig.tar.gz"
-ww_tar="weightwatcher_1.12.orig.tar.gz"
-ww_dir="weightwatcher-1.12"
-ww_bin="ww"
-ww_version=TRUE
-
-# CDSclient Package (need Findgsc2.2)
-cdsclient_url="http://cdsarc.u-strasbg.fr/ftp/pub/sw/cdsclient.tar.gz"
-cdscleint_tar="cdsclient.tar.gz"
-cdsclient_dir="cdsclient-3.84"
-cdsclient_bin="findgsc2.2"
-cdsclient_version=FALSE
-
-# mpi4py Package
-mpi_url="https://github.com/mpi4py/mpi4py/archive/${mpi4py_ver}.tar.gz"
-mpi_tar="${mpi4py_ver}.tar.gz"
-mpi_dir="mpi4py-${mpi4py_ver}"
-mpi_bin="mpiexec"
-mpi_version=TRUE
-
-# Allowed script extensions
-script_ext=(
-  .py
-  .sh
-  .bash
-)
-
-# Divider line
-line="########################################################################"
-
-# Text colours
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-CYAN='\033[0;36m'
-YELLOW='\033[1;33m'
-NC='\033[0m'
-
-# Set variable defaults
-PIPE_DIR=$PWD
-BUILD_DIR=$PIPE_DIR/build
-ENV_NAME='shapepipe'
-BUILD_ENV=TRUE
-DEVELOP=FALSE
-VOS=FALSE
-INSTALL_WW=TRUE
-INSTALL_CDSCLIENT=TRUE
-ATLAS_SEARCH=FALSE
-use_atlas=FALSE
-USE_MPI=TRUE
-ERROR=FALSE
-
-##############################################################################
-# SCRIPT FUNCTIONS
-##############################################################################
-
-# Function to download, and unzip and untar a package
-download_package() {
-  cd $BUILD_DIR
-  wget --no-check-certificate $1
-  tar -xzf $2
-  rm $2
-}
-
-# Function to build a standard package
-build_standard() {
-  cd $BUILD_DIR/$1
-  ./configure --prefix=$CONDA_PREFIX --quiet
-  make --quiet
-  make install
-}
-
-# Function to build mpi4pi using preinstalled MPI libraries
-build_mpi(){
-  cd $BUILD_DIR/$1
-  python setup.py build --mpicc=$MPI_ROOT
-  python setup.py install
-  ln -s $MPI_ROOT/bin/$mpi_bin $CONDA_PREFIX/bin/$mpi_bin
-}
-
-# Check the conda executable is available
-check_conda() {
-  if ! type -t "conda" > /dev/null
-  then
-    echo -ne "${RED}ERROR: Conda command not found, make sure it is installed before proceding.${NC}\n"
-    exit 1
-  fi
-  # Set Conda variables
-  CONDA_VERSION=$(conda -V | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )
-  CONDA_VERSION_MAJOR=$(cut -d'.' -f1 <<<$CONDA_VERSION)
-  CONDA_VERSION_MINOR=$(cut -d'.' -f2 <<<$CONDA_VERSION)
-  CONDA_VERSION_PATCH=$(cut -d'.' -f3 <<<$CONDA_VERSION)
-  CONDA_SH=/opt/conda/etc/profile.d/conda.sh
-  # Check Conda major version
-  if [ "$CONDA_VERSION_MAJOR" -lt 4 ]
-  then
-    echo -ne "${RED}ERROR: Found Conda version $CONDA_VERSION but require 4.0.0 or greater.${NC}\n"
-    exit 1
-  fi
-  # Check Conda minor version
-  if [ "$CONDA_VERSION_MINOR" -gt 4 ]
-  then
-    if [ -f "$CONDA_PREFIX_1$CONDA_SH" ]
-    then
-      source "$CONDA_PREFIX_1$CONDA_SH"
-    elif [ -f "$CONDA_PREFIX$CONDA_SH" ]
-    then
-      source "$CONDA_PREFIX$CONDA_SH"
-    else
-      echo -ne "${RED}ERROR: Could not find $CONDA_SH in \$CONDA_PREFIX.${NC}\n"
-      echo -ne "${RED}Activate the base/root Conda environment and try again.${NC}\n"
-      exit 1
-    fi
-    CONDA_ACTIVATE="conda activate"
-    CONDA_DEACTIVATE="conda deactivate"
-  else
-    CONDA_ACTIVATE="source activate"
-    CONDA_DEACTIVATE="source deactivate"
-  fi
-}
-
-# Check if a binary executable is already installed in the conda environment
-check_binary() {
-  if ! type -t "$CONDA_PREFIX/bin/$1" > /dev/null
-  then
-    return 0
-  else
-    echo "Executable '$1' is already installed, skipping."
-    echo ""
-    return 1
-  fi
-}
-
-# Check if a binary executable is already installed in the conda environment
-check_binary2() {
-  if type -t "$CONDA_PREFIX/bin/$1" > /dev/null
-  then
-    echo -ne "$2: ${GREEN}INSTALLED${NC}\n"
-    if [ "$3" == TRUE ]
-    then
-      "$CONDA_PREFIX/bin/$1" --version | head -n 2
-    fi
-  else
-    if [ "$4" == TRUE ]
-    then
-      echo -ne "$2: ${RED}INSTALLATION FAILED${NC}\n"
-      ERROR=TRUE
-    else
-      echo -ne "$2: ${YELLOW}NOT INSTALLED${NC}\n"
-    fi
-  fi
-
-  echo ""
-}
-
-# Check if a python site-package is installed correctly in the conda environment
-check_site_pkg() {
-  if compgen -G "$CONDA_PREFIX/lib/python3.*/site-packages/$1*" > /dev/null
-  then
-    echo -ne "   - $1:\t \xe2\x9c\x85\n"
-  else
-    echo -ne "   - $1:\t \xe2\x9d\x8c\n"
-  fi
-}
-
-# Function to report progress
-report_progress() {
-  echo ''
-  echo $line
-  echo -e "${CYAN}Installing $1${NC}"
-  echo $line
-  echo ''
-}
-
-# Function to start the script
-start() {
-  echo ''
-  echo $line
-  echo 'ShapePipe Installation Script'
-  echo ''
-  echo 'Author: Samuel Farrens'
-  echo 'Version:' $version
-  echo 'Last Update:' $last_update
-  echo $line
-  echo ''
-}
-
-# Function to report package versions
-packages() {
-  check_binary2 $ww_bin "WeightWatcher" $ww_version $INSTALL_WW
-  check_binary2 $cdsclient_bin "CDSclient" $cdsclient_version $INSTALL_CDSCLIENT
-  check_binary2 $mpi_bin "MPI" $mpi_version $USE_MPI $MPI_ROOT
-  check_binary2 "shapepipe_run" "ShapePipe_Run" TRUE TRUE
-}
-
-site-packages() {
-  check_site_pkg "shapepipe"
-  check_site_pkg "astropy"
-  check_site_pkg "galsim"
-  check_site_pkg "joblib"
-  check_site_pkg "mccd"
-  check_site_pkg "ngmix"
-  check_site_pkg "numpy"
-  check_site_pkg "pandas"
-  check_site_pkg "pysap"
-  check_site_pkg "scipy"
-  check_site_pkg "sf_tools"
-  check_site_pkg "sip_tpv"
-  check_site_pkg "sqlitedict"
-  check_site_pkg "treecorr"
-}
-
-# Function to return exit code
-exit_code() {
-  if [ "$ERROR" == TRUE ]
-  then
-    echo "ShapePipe installation failed as some packages were not properly installed."
-    exit 1
-  else
-    exit 0
-  fi
-}
-
-# Function to report package versions
-package_report() {
-  if [ "$CONDA_DEFAULT_ENV" != "$ENV_NAME" ]
-  then
-    activate_shapepipe
-  fi
-  INSTALL_WW=FALSE
-  INSTALL_CDSCLIENT=FALSE
-  USE_MPI=FALSE
-  start
-  echo 'Package Report'
-  echo ''
-  packages
-  python -m piplist
-  echo ''
-  exit_code
-}
-
-# Function to end the script
-finish() {
-  echo $line
-  echo ''
-  echo $line
-  echo 'Installation Complete!'
-  echo ''
-  packages
-  echo 'Python Package Check List:'
-  echo ''
-  site-packages
-  echo ''
-  echo $line
-  echo ''
-  exit_code
-}
-
-check_status () {
-  if [ "$2" == FALSE ]
-  then
-    echo -ne "$1 ${YELLOW}$2${NC}"
-  elif [ "$2" == TRUE ]
-  then
-    echo -ne "$1 ${GREEN}$2${NC}"
-  else
-    echo -ne "$1 ${CYAN}$2${NC}"
-  fi
-  echo -ne " ${CYAN}$3${NC}\n"
-}
-
-# Function to show the installation setup
-setup() {
-  check_status 'Operating System:' $SYSOS
-  check_status 'Conda Version:' $CONDA_VERSION
-  check_status 'Build Conda Environment:' $BUILD_ENV $ENV_NAME
-  check_status 'Install WeightWatcher:' $INSTALL_WW
-  check_status 'Install CDSclient:' $INSTALL_CDSCLIENT
-  check_status 'Use MPI:' $USE_MPI $MPI_ROOT
-  check_status 'ShapePipe Directory:' $PIPE_DIR
-  check_status 'Build Directory:' $BUILD_DIR
-  echo ''
-}
-
-# Function to show the astromatic setup
-astromatic_setup() {
-  echo 'FFTW Library Path:' $FFTW_LIB
-  echo 'FFTW Include Path:' $FFTW_INC
-  if [ "$use_atlas" == TRUE ]
-  then
-    echo 'ATLAS Library Path:' $ATLAS_LIB
-    echo 'ATLAS Include Path:' $ATLAS_INC
-  else
-    echo 'OpenBLAS Library Path:' $BLAS_LIB
-    echo 'OpenBLAS Include Path:' $BLAS_INC
-  fi
-  echo ''
-}
-
-# Function to uninstall ShapePipe and dependencies
-uninstall() {
-  read -p "Uninstall $ENV_NAME environment [y/N]: " response
-  response=${response:-n}
-  if [ $response == "y" ]
-  then
-    rm -r build dist *.egg-info .eggs
-    deactivate_shapepipe
-    conda remove -n $ENV_NAME --all -y
-    echo "Finished uninstalling $ENV_NAME"
-  fi
-}
-
-# Function to activate ShapePipe environment
-activate_shapepipe() {
-  # Run activation command
-  echo -ne "Running ${CYAN}$CONDA_ACTIVATE $ENV_NAME${NC}\n"
-  eval "$CONDA_ACTIVATE $ENV_NAME"
-  # Check if the activation was successful
-  if [ "$?" -eq 0 ]
-  then
-    echo -ne "Successfully activated ShapePipe environment ${CYAN}$CONDA_PREFIX${NC}\n"
-    export LD_RUN_PATH=$CONDA_PREFIX/lib
-  else
-    echo -ne "${RED}ERROR: Could not activate ShapePipe environment.${NC}\n"
-    exit 1
-  fi
-}
-
-# Function to deactivate ShapePipe environment
-deactivate_shapepipe() {
-  # Run deactivation command
-  eval $CONDA_DEACTIVATE
-}
-
-# Build symbolic links for scripts
-build_symlinks() {
-  for ext in ${script_ext[@]}; do
-    for script in $CONDA_PREFIX/bin/*$ext; do
-      link_name=`basename $script $ext`
-      ln -s $script $CONDA_PREFIX/bin/$link_name
-    done
-  done
-}
-
-##############################################################################
-# SCRIPT OPTIONS
-##############################################################################
-
-help="$(basename "$0") [OPTIONS]\n\n
-Options:\n
-\t-h,--help\t show this help message and exit\n
-\t-v,--version\t print script version and exit\n
-\t-p,--packages\t print status of installed packages\n
-\t--uninstall\t uninstall ShapePipe\n
-\t--pipe-dir\t set the path to the ShapePipe base directory (default is \$PWD)\n
-\t--build-dir\t set the path to the ShapePipe build (default is \$PWD/build)\n
-\t--env-name\t set the name of the conda environment (default is shapepipe)\n
-\t--develop\t option to install additional development packages\n
-\t--vos\t\t option to install virtual observatory software\n
-\t--no-env\t do not build Conda environment\n
-\t--no-ww\t\t do not build WeightWatcher\n
-\t--no-cds\t do not build CDSclient\n
-\t--no-exe\t do not build any system executables\n\n
-
-Executable Build Options:\n
-\t--fftw-lib\t path to FFTW library directory\n
-\t--fftw-inc\t path to FFTW include directory\n
-\t--blas-lib\t path to OpenBLAS library directory\n
-\t--blas-inc\t path to OpenBLAS include directory\n
-\t--atlas-lib\t path to ATLAS library directory\n
-\t--atlas-inc\t path to ATLAS include directory\n
-\t--atlas-search\t search system path for ATLAS directories\n\n
-
-MPI Build Options:\n
-\t--no-mpi\t do not use MPI\n
-\t--mpi-root\t path to MPI installation\n\n
-
-"
-
-# Parse command line options
-for i in "$@"
-do
-case $i in
-    -h|--help)
-    start
-    echo -ne $help
-    shift
-    exit
-    ;;
-    -v|--version)
-    echo $(basename "$0") $version
-    shift
-    exit
-    ;;
-    -p|--packages)
-    package_report
-    shift
-    exit
-    ;;
-    --uninstall)
-    uninstall
-    shift
-    exit
-    ;;
-    --pipe-dir=*)
-    PIPE_DIR="${i#*=}"
-    shift
-    ;;
-    --build-dir=*)
-    BUILD_DIR="${i#*=}"
-    shift
-    ;;
-    --env-name=*)
-    ENV_NAME="${i#*=}"
-    shift
-    ;;
-    --develop)
-    DEVELOP=TRUE
-    shift
-    ;;
-    --vos)
-    VOS=TRUE
-    shift
-    ;;
-    --no-env)
-    BUILD_ENV=FALSE
-    shift
-    ;;
-    --no-ww)
-    INSTALL_WW=FALSE
-    shift
-    ;;
-    --no-cds)
-    INSTALL_CDSCLIENT=FALSE
-    shift
-    ;;
-    --fftw-lib=*)
-    FFTW_LIB="${i#*=}"
-    shift
-    ;;
-    --fftw-inc=*)
-    FFTW_INC="${i#*=}"
-    shift
-    ;;
-    --blas-lib=*)
-    BLAS_LIB="${i#*=}"
-    shift
-    ;;
-    --blas-inc=*)
-    BLAS_INC="${i#*=}"
-    shift
-    ;;
-    --atlas-lib=*)
-    ATLAS_LIB="${i#*=}"
-    shift
-    ;;
-    --atlas-inc=*)
-    ATLAS_INC="${i#*=}"
-    shift
-    ;;
-    --atlas-search)
-    ATLAS_SEARCH=TRUE
-    shift
-    ;;
-    --no-mpi)
-    USE_MPI=FALSE
-    shift
-    ;;
-    --mpi-root=*)
-    MPI_ROOT="${i#*=}"
-    shift
-    ;;
-    --no-exe)
-    INSTALL_WW=FALSE
-    INSTALL_CDSCLIENT=FALSE
-    shift
-    ;;
-    *)
-    echo "Invalid option, see help!"
-    exit 1
-    ;;
-esac
-done
-
-##############################################################################
-# CREATE CONDA ENVIRONMENT
-##############################################################################
-
-# Start script
-start
-
-# Check if conda is installed
-check_conda
-
-# Find the operating system
-case "$OSTYPE" in
-  darwin*)
-  SYSOS="macOS"
-  ;;
-  linux*)
-  SYSOS="LINUX"
-  ;;
-  *)
-  echo "unknown: $OSTYPE"
-  exit 1
-  ;;
-esac
-
-if [ ! -z "$ATLAS_LIB" ] || [ "$ATLAS_SEARCH" == TRUE ]
-then
-  use_atlas=TRUE
-fi
-
-# Create build directory if it does not already exist
-if [ ! -d "$BUILD_DIR" ]
-then
-  mkdir $BUILD_DIR
-fi
-
-# Print script set-up
-setup
-
-# Build conda environment
-if [ "$BUILD_ENV" == TRUE ]
-then
-  report_progress 'ShapePipe Environment'
-  conda env create -f environment.yml -n $ENV_NAME
-fi
-
-# Activate conda environment
-activate_shapepipe
-
-if [ -z "$FFTW_LIB" ]; then FFTW_LIB=$CONDA_PREFIX/lib; fi
-if [ -z "$FFTW_INC" ]; then FFTW_INC=$CONDA_PREFIX/include; fi
-if [ -z "$BLAS_LIB" ]; then BLAS_LIB=$CONDA_PREFIX/lib; fi
-if [ -z "$BLAS_INC" ]; then BLAS_INC=$CONDA_PREFIX/include; fi
-
-##############################################################################
-# INSTALL DEVELOPER PACKAGES
-##############################################################################
-
-# Install development packages
-if [ "$DEVELOP" == TRUE ]
-then
-  report_progress 'Developer Packages'
-  python -m pip install -r develop.txt
-  python -m pip install -r docs/requirements.txt
-fi
-
-##############################################################################
-# INSTALL THE VOS LIBRARY
-##############################################################################
-
-# Install the vos library
-if [ "$VOS" == TRUE ]
-then
-  report_progress 'vos'
-  python -m pip install vos
-fi
-
-##############################################################################
-# INSTALL MACOS REQUIRMENTS
-##############################################################################
-
-# Set up macOS environment
-if [ "$SYSOS" == "macOS" ]
-then
-  report_progress 'macOS Requirements'
-  conda install -n $ENV_NAME wget -y
-  export C_INCLUDE_PATH=$CONDA_PREFIX/include
-  export CFLAGS="-Wl,-rpath,$CONDA_PREFIX/lib"
-  export CPPFLAGS="-Wno-everything"
-else
-  export CPPFLAGS="-w"
-fi
-
-##############################################################################
-# INSTALL MPI REQUIRMENTS
-##############################################################################
-
-# Install mpi4py
-if [ "$USE_MPI" == TRUE ]
-then
-  report_progress 'MPI'
-  if [ -z "$MPI_ROOT" ]
-  then
-    conda install -n $ENV_NAME -c conda-forge "mpi4py==${mpi4py_ver}" -y
-  else
-    download_package $mpi_url $mpi_tar
-    build_mpi $mpi_dir
-  fi
-fi
-
-##############################################################################
-# BUILD EXTERNAL EXECUTABLES
-##############################################################################
-
-# Build WeightWatcher
-if [ "$INSTALL_WW" == TRUE ] && check_binary $ww_bin
-then
-  report_progress 'WeightWatcher'
-  download_package $ww_url $ww_tar
-  build_standard $ww_dir
-fi
-
-# Build CDSclient
-if [ "$INSTALL_CDSCLIENT" == TRUE ] && check_binary $cdsclient_bin
-then
-  report_progress 'CDSclient'
-  download_package $cdsclient_url $cdscleint_tar
-  build_standard $cdsclient_dir
-fi
-
-##############################################################################
-# INSTALL SHAPEPIPE LIBRARY
-##############################################################################
-
-# Install ShapePipe package
-report_progress 'ShapePipe'
-cd $PIPE_DIR
-python -m pip install .
-
-# Create symbolic links to scripts
-build_symlinks
-
-finish
-
-##############################################################################
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 12e46cd35..963ed19b9 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -155,8 +155,8 @@ function submit_batch() {
 
 }
 
-batch=20
-sleep=150
+batch=50
+sleep=75
 
 ((n_thresh=batch_max-batch))
 

From 124decc5857d71ec599121019aad336b55c742a8 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Wed, 26 Jun 2024 12:54:14 +0000
Subject: [PATCH 180/207] canfar scripts: -m 1 creates local exp headers indep
 of job

---
 scripts/sh/curl_canfar_local.sh         |  9 ++++++++-
 scripts/sh/init_run_exclusive_canfar.sh | 11 ++++++-----
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 963ed19b9..7b4d2e17d 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -19,6 +19,7 @@ version="1.1"
 cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 batch_max=200
 dry_run=0
+mh_local=0
 
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
@@ -31,6 +32,8 @@ usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
     \tfile containing IDs\n
    -p, --psf MODEL\n
     \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
+   -m, --mh_local MH\n
+    \tmerged header file local (MH=0) or global (MH=1); default is $mh_local\n
    -N, --N_SMP N_SMOp\n
     \tnumber of jobs (SMP mode only), default=$N_SMP\n
    -V, --version\n
@@ -64,6 +67,10 @@ while [ $# -gt 0 ]; do
       job="$2"
       shift
       ;;
+    -m|--mh_local)
+      mh_local="$2"
+      shift
+      ;;
     -e|--exclusive)
       ID="$2"
       shift
@@ -123,7 +130,7 @@ dir=`pwd`
 
 # Return argument for local script to be called via curl
 function set_arg() {
-  my_arg="-j $job -p $psf -e $ID -N $N_SMP $arg_dry_run -d $dir"
+  my_arg="-j $job -p $psf -e $ID -N $N_SMP $arg_dry_run -d $dir -m $mh_local"
   echo $my_arg
 }
 
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 75583e5ce..f61e8aeab 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -27,7 +27,7 @@ usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
    -p, --psf MODEL\n
     \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n
    -m, --mh_local MH\n
-   \tmerged header file local (MH=0) or global (MH=1); default is $MH\n
+   \tmerged header file local (MH=0) or global (MH=1); default is $mh_local\n
    -N, --N_SMP N_SMOp\n
     \tnumber of jobs (SMP mode only), default from original config files\n
    -d, --directory\n
@@ -97,7 +97,7 @@ if [ "$psf" != "psfex" ] && [ "$psf" != "mccd" ]; then
 fi
 
 if [ "$mh_local" != "0" ] && [ "$mh_local" != "1" ]; then
-  echo "MH (option -m) needs to be 0 or 1"
+  echo "mh_local (option -m) needs to be 0 or 1"
   exit 5
 fi
 
@@ -233,8 +233,9 @@ command "ln -sf $dir/output/run_sp_Ma_exp" $dry_run
 command "ln -sf $dir/output/run_sp_exp_SpMh" $dry_run
 
 
-(( do_job = $job & 16 ))
-if [ "$mh_local" == "1" ] && [ $do_job != 0 ]; then
+#(( do_job = $job & 16 ))
+#&& [ $do_job != 0 ]; then
+if [ "$mh_local" == "1" ]; then
 
   # Remove previous Sx runs
   command "rm -rf $dir/output/run_tile_Sx_*" $dry_run
@@ -277,7 +278,7 @@ if [ "$mh_local" == "1" ] && [ $do_job != 0 ]; then
   cd output
 
   # Remove previous Sextractor run
-  command "rm -rf run_sp_tile_Sx_*" $dry_run
+  #command "rm -rf run_sp_tile_Sx_*" $dry_run
 fi
 
 # Update links to exposure run directories, which were created in job 32

From 2ae3d359d4281d9e6b07a93ed2f3cf5b97ed6a28 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Wed, 26 Jun 2024 12:55:42 +0000
Subject: [PATCH 181/207] summary check special working

---
 scripts/python/summary_params_pre_v2.py |   6 +-
 shapepipe/utilities/summary.py          | 165 ++++++++++++++----------
 2 files changed, 99 insertions(+), 72 deletions(-)

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index d640c8ab1..06cd285fc 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -111,20 +111,24 @@ def set_jobs_v2_pre_v2(patch, verbose):
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
+            "run_sp_exp_SxSePsf",
             #"run_sp_exp_Pi"
         ],
         [
             "sextractor_runner",
             "setools_runner",
+            "setools_runner",
             "psfex_runner",
             # "psfex_interp_runner"],
         ],
         "shdus",
-        n_mult=[2, 2, 2],  # 1],
+        n_mult=[2, 2, 1, 2],  # 1],
         path_main=path_main,
         path_left="exp_runs",
         output_subdirs="shdus",
         path_right="output",
+        path_output=["output", "output/rand_split", "output/stat", "output"],
+        special=[False, False, True, False],
         verbose=verbose,
     )
 
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 8977a5d66..7c59f6d6e 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -158,41 +158,26 @@ def set_as_list(item=None, n=None, default=1):
     return result
 
 
-def check_special(module, paths_in_dir, names_in_dir):
-
-    if module == "setools_runner":
-        inds_special = []
-        for idx in range(len(paths_in_dir)):
-            base_path = paths_in_dir[idx].replace(names_in_dir[idx], "")
-
-            stats_dir = f"{base_path}/../stat"
-            stats_files = os.listdir(stats_dir)
-            if len(stats_files) != 1:
-                raise ValueError(
-                    f"Expected exactly one stats file in {stats_dir}, not"
-                    + f" {len(stats_files)}"
-                )
+def check_special_one(module, path):
 
-            stats_path = os.path.join(stats_dir, stats_files[0])
-            with open(stats_path) as f_in:
-                lines = f_in.readlines()
-                for line in lines:
-                    entry = line.rstrip()
-                    m = re.search(line, "Nb stars = (\S*)")
-                    if m:
-                        value = int(m[2])
-                        if value == 0:
-                            inds_special.append(idx)
-                        else:
-                            print(f"b stars = {value}, not special")
-                        break
+    with open(path) as f_in:
+        lines = f_in.readlines()
+        for line in lines:
+            entry = line.rstrip()
 
-        #print(inds_special)
-        for idx in inds_special:
-            paths_in_dir.pop(idx)
-            names_in_dir.pop(idx)
+            if module == "setools_runner":
+                m = re.search("Nb stars = (\S*)", line)
+                if m:
+                    value = int(m[1])
+                    if value < 2:
+                        msg = f"Not enough stars for random split: #stars = {value}"
+                        return msg
+                    else:
+                        pass
+                    break
 
-        return paths_in_dir, names_in_dir, len(inds_special)
+    return None
+ 
 
 
 class job_data(object):
@@ -225,9 +210,14 @@ class job_data(object):
     path_right: str, optional
         right (last) part of output subdir suffix if not `None`;
         default is `None`
+    path_output: str, optional
+        module output path, default is "output"
     output_path_missing_IDs: list, optional
         output path of missing ID, if `None` (default) will be
         given by job bit and module.
+    special: bool, optional
+        if True check output file content for special messages;
+        default is False
     verbose: bool, optional
         verbose output if True; default is False
 
@@ -244,7 +234,9 @@ def __init__(
         path_left="output",
         output_subdirs=None,
         path_right=None,
+        path_output="output",
         output_path_missing_IDs=None,
+        special=False,
         verbose=False,
     ):
         self._bit = bit
@@ -257,9 +249,21 @@ def __init__(
         self._path_left = path_left
         self._output_subdirs = output_subdirs or [""]
         self._path_right = set_as_list(
-            path_right, len(modules), default="."
+            path_right,
+            len(modules),
+            default=".",
+        )
+        self._path_output = set_as_list(
+            path_output,
+            len(modules),
+            default="output",
         )
         self._output_path_missing_IDs=output_path_missing_IDs
+        self._special = set_as_list(
+            special,
+            len(modules),
+            default=False,
+        )
         self._verbose = verbose
 
     def print_intro(self):
@@ -277,16 +281,15 @@ def print_stats_header(self):
         Print overall header information for stats output.
 
         """
-        #logging.info(
-            #"module                          expected     found   miss_expl"
-            #+ " missing uniq_miss  fr_found"
         logging.info(
-            "module                          expected     found"
-            + "   missing uniq_miss  fr_found"
+            "module                          expected     found   miss_expl"
+            + " missing uniq_miss  fr_found"
+        #logging.info(
+            #"module                          expected     found"
+            #+ "   missing uniq_miss  fr_found"
         )
         logging.info("=" * 100)
 
-    @classmethod
     def print_stats(
         self,
         module,
@@ -294,7 +297,7 @@ def print_stats(
         n_found,
         n_missing_explained,
         n_missing,
-        n_mult,
+        idx,
     ):
         """Print Stats.
 
@@ -312,8 +315,8 @@ def print_stats(
             number of missing but explained files
         n_missing: int
             number of missing files
-        n_mult: int
-            multipicity
+        idx: int
+            module index
 
         """
         if n_expected > 0:
@@ -321,10 +324,15 @@ def print_stats(
         else:
             fraction_found = 1
 
-        n_missing_per_mult = n_missing / n_mult
+        n_missing_per_mult = n_missing / self._n_mult[idx]
+
+        module_str = module
+        if self._special[idx]:
+            module_str = f"{module_str} (special)"
 
         logging.info(
-            f"{module:30s} {n_expected:9d} {n_found:9d}"
+            f"{module_str:30s} {n_expected:9d} {n_found:9d}"
+            + f" {n_missing_explained:9d}"
             + f" {n_missing:9d}"
             + f" {n_missing_per_mult:9.1f} {fraction_found:9.1%}"
         )
@@ -333,9 +341,6 @@ def print_stats(
     def is_ID_in_str(self, ID, path):
         if ID in path:
             return True
-        #if re.sub("\.", "-", ID) in path:
-            #return True
-        #return False
 
     @classmethod
     def is_not_in_any(self, ID, list_str):
@@ -394,6 +399,28 @@ def write_IDs_to_file(self, output_path, IDs):
             # Remove preivous obsolete ID file
             os.unlink(output_path)
 
+    def check_special(self, module, idx):
+
+        messages = []
+        if self._special[idx]:
+            for name, path in zip(self._names_in_dir[idx], self._paths_in_dir[idx]):
+
+                msg = check_special_one(module, path)
+                if msg:
+                    messages.append(f"{name} {msg}")
+    
+
+            if messages:
+                output_path = (
+                    f"{self._path_main}/summary/special_job_{self._bit}"
+                    + f"_{module}.txt"
+                )
+                with open(output_path, "w") as f_out:
+                    for msg in messages:
+                        print(msg, file=f_out)
+
+        return len(messages)
+
     def output_missing(
         self,
         module,
@@ -414,8 +441,7 @@ def output_missing(
         
         # Count image IDs in names that were found earlier
 
-        ## Extract image IDs from names
-        IDs = []
+        # Get file name pattern
         if module != "split_exp_runner":
             pattern = re.compile(
                 r"(?:\d{3}-\d{3}|\d{7}-\d+|\d{7})"
@@ -426,13 +452,19 @@ def output_missing(
             pattern = re.compile(
                 r"(?:\d{3}-\d{3}|\d{7})"
             )
+
+        ## Extract image IDs from names
+        IDs = []
         for name, path in zip(names_in_dir, paths_in_dir):
+
             match = pattern.search(name)
             if match:
-                IDs.append(match.group())
+                ID = match.group()
+                IDs.append(ID)
             else:
                 raise ValueError(f"No ID found in {name}")
 
+
         ## Count occurences
         ID_counts = Counter(IDs)
 
@@ -489,17 +521,13 @@ def get_last_full_path(self, base_and_subdir, matches):
         return full_path
 
     @classmethod
-    def get_module_output_dir(self, full_path, module):
+    def get_module_output_dir(self, full_path, module, path_output):
         """Get Module Output Dir.
 
         Return output directory name for given module.
 
         """
-        directory = f"{full_path}/{module}/output"
-
-        # Some modules have special requirements 
-        if module == "setools_runner":
-            directory = f"{directory}/rand_split"
+        directory = f"{full_path}/{module}/{path_output}"
 
         return directory
 
@@ -562,12 +590,15 @@ def get_names_in_dir(self, iterable, module, idx):
                             print(match.name)
 
                     full_path = self.get_last_full_path(
-                        base_and_subdir, matches
+                        base_and_subdir,
+                        matches,
                     )
 
                     # Get module output directory
                     directory = self.get_module_output_dir(
-                        full_path, module
+                        full_path,
+                        module,
+                        self._path_output[idx],
                     )
                     if self._verbose:
                         print(f"**** Output dir = {directory}")
@@ -649,18 +680,10 @@ def check_numbers(self, par_runtime=None, indices=None):
             n_expected = n_expected_base * self._n_mult[idx]
             n_missing = n_expected - n_found
 
-            n_missing_explained = 0
-            if n_missing > 0:
-                # TODO: make check_special class function, deal with
-                # paths, names in dir
-                if False and module == "setools_runner":
-                    (
-                        self._paths_in_dir[idx],
-                        self._names_in_dir[idx],
-                        n_missing_explained,
-                    ) = check_special(module, paths_in_dir, names_in_dir)
-
-                n_missing = n_missing - n_missing_explained
+            n_missing_explained = self.check_special(
+                module,
+                idx,
+            )
 
             # Print statistics
             self.print_stats(
@@ -669,7 +692,7 @@ def check_numbers(self, par_runtime=None, indices=None):
                 n_found,
                 n_missing_explained,
                 n_missing,
-                self._n_mult[idx],
+                idx,
             )
 
             # Write missing IDs for module to file

From 9f4e7fb80939eb86cbcdb6a23e9c621be4b96e07 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Wed, 26 Jun 2024 12:56:07 +0000
Subject: [PATCH 182/207] ngmix: added last check that all 8 HDUs are present

---
 shapepipe/modules/ngmix_package/ngmix.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/shapepipe/modules/ngmix_package/ngmix.py b/shapepipe/modules/ngmix_package/ngmix.py
index 7cb614a42..572b67174 100644
--- a/shapepipe/modules/ngmix_package/ngmix.py
+++ b/shapepipe/modules/ngmix_package/ngmix.py
@@ -323,6 +323,12 @@ def save_results(self, output_dict):
             open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite
         )
 
+        n_hdu = len(output_dict.keys())
+        if n_hdu != 8:
+            raise IndexError(
+                f"FITS output file data has {n_hdu} HDUs,"
+                + "expected are 8"
+            )
         for key in output_dict.keys():
             f.save_as_fits(output_dict[key], ext_name=key.upper())
 

From fe69e4dc043eac27d1748383892e638940d8cc97 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Wed, 26 Jun 2024 12:58:50 +0000
Subject: [PATCH 183/207] debug messages removed

---
 auxdir/CFIS/tiles_202106/tiles_P7.txt | 1 -
 scripts/sh/job_sp_canfar.bash         | 1 -
 2 files changed, 2 deletions(-)

diff --git a/auxdir/CFIS/tiles_202106/tiles_P7.txt b/auxdir/CFIS/tiles_202106/tiles_P7.txt
index cd8b6b5af..535084a2e 100644
--- a/auxdir/CFIS/tiles_202106/tiles_P7.txt
+++ b/auxdir/CFIS/tiles_202106/tiles_P7.txt
@@ -1,4 +1,3 @@
-000.000
 052.332
 053.331
 053.332
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 7c7b50681..88ceae36c 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -164,7 +164,6 @@ export VCP="vcp --certfile=$CERTFILE"
 
 # Print string, executes command, and prints return value.
 function command () {
-   echo "MKDEBUG job_sp_canfar command ($1)"
    cmd=$1
    str=$2
 

From 1c75779c72e10bea3e8f5aba02a595e1da00c2c5 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 1 Jul 2024 12:03:47 +0000
Subject: [PATCH 184/207] Added GaAP photometry to SEx param file

---
 example/cfis/default.param | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/example/cfis/default.param b/example/cfis/default.param
index 6521a94d5..09ad8405e 100644
--- a/example/cfis/default.param
+++ b/example/cfis/default.param
@@ -51,7 +51,7 @@ MU_MAX                   #Peak surface brightness above background
 FLAGS                    #Extraction flags                            
 FLAGS_WIN                #Flags for WINdowed parameters                
 
-#!!! REQUIRE FLAG_IMAGE !!!
+# The following flag requires a flag image
 IMAFLAGS_ISO             #FLAG-image flags OR'ed over the iso. profile  !!! REQUIRE FLAG_IMAGE !!!            
 
 FWHM_IMAGE               #FWHM assuming a gaussian core                             [pixel]
@@ -61,9 +61,8 @@ ELLIPTICITY              #1 - B_IMAGE/A_IMAGE
 
 VIGNET(51,51)            #Pixel data around detection                               [count]
 
-#VECTOR_ASSOC             #ASSOCiated parameter vector                              
-#NUMBER_ASSOC             #Number of ASSOCiated IDs                                 
+# For GaaP photometry
+A_WORLD
+B_WORLD
+THETA_J2000
 
-#SPREAD_MODEL
-#SPREADERR_MODEL
-#FWHMPSF_IMAGE

From 26c1b781ac6ff664d52bbb062b90f46cd6bd9ac0 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 1 Jul 2024 12:04:11 +0000
Subject: [PATCH 185/207] summary specials

---
 scripts/python/summary_params_pre_v2.py | 14 +++++++++++---
 shapepipe/utilities/summary.py          | 12 +++++++++---
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 3da55cb1d..5e1fe5a53 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -110,23 +110,31 @@ def set_jobs_v2_pre_v2(patch, verbose):
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
             "run_sp_exp_SxSePsf",
+            "run_sp_exp_SxSePsf",
             #"run_sp_exp_Pi"
         ],
         [
             "sextractor_runner",
             "setools_runner",
             "setools_runner",
+            "setools_runner",
             "psfex_runner",
             # "psfex_interp_runner"],
         ],
         "shdus",
-        n_mult=[2, 2, 1, 2],  # 1],
+        n_mult=[2, 2, 1, 1, 2],
         path_main=path_main,
         path_left="exp_runs",
         output_subdirs="shdus",
         path_right="output",
-        path_output=["output", "output/rand_split", "output/stat", "output"],
-        special=[False, False, True, False],
+        path_output=[
+            "output",
+            "output/rand_split",
+            "output/stat",
+            "logs",
+            "output",
+        ],
+        special=[False, False, True, True, False],
         verbose=verbose,
     )
 
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 6907e67dd..140edf0d9 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -169,11 +169,17 @@ def check_special_one(module, path):
                 if m:
                     value = int(m[1])
                     if value < 2:
-                        msg = f"Not enough stars for random split: #stars = {value}"
+                        msg = (
+                            f"Not enough stars for random split:"
+                            + f"  #stars = {value}"
+                        )
                         return msg
-                    else:
-                        pass
                     break
+                m = re.search("Mode computation failed", line)
+                if m:
+                    msg = "Mode computation of stellar locus failed"
+                    return msg
+
 
     return None
  

From c0e5435475a4728ee1d0eb0268d3c7d8ea06ce79 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 1 Jul 2024 12:04:29 +0000
Subject: [PATCH 186/207] print msg if empty vignets

---
 shapepipe/modules/ngmix_package/ngmix.py | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/shapepipe/modules/ngmix_package/ngmix.py b/shapepipe/modules/ngmix_package/ngmix.py
index 16f134f7b..5eae02a01 100644
--- a/shapepipe/modules/ngmix_package/ngmix.py
+++ b/shapepipe/modules/ngmix_package/ngmix.py
@@ -313,10 +313,10 @@ def save_results(self, output_dict):
         )
 
         n_hdu = len(output_dict.keys())
-        if n_hdu != 8:
+        if n_hdu != 5:
             raise IndexError(
                 f"FITS output file data has {n_hdu} HDUs,"
-                + "expected are 8"
+                + " expected are 5"
             )
         for key in output_dict.keys():
             f.save_as_fits(output_dict[key], ext_name=key.upper())
@@ -368,18 +368,21 @@ def process(self):
                 id_first = id_tmp
             id_last = id_tmp
 
-            count = count + 1
-
             gal_vign = []
             psf_vign = []
             sigma_psf = []
             weight_vign = []
             flag_vign = []
             jacob_list = []
-            if (psf_vign_cat[str(id_tmp)] == "empty") or (
-                gal_vign_cat[str(id_tmp)] == "empty"
-            ):
+            if psf_vign_cat[str(id_tmp)] == "empty":
+                self._w_log.info(f"Skipping object {id_tmp}: empty PSF vignet")
+                continue
+            if gal_vign_cat[str(id_tmp)] == "empty":
+                self._w_log.info(
+                    f"Skipping object {id_tmp}: empty galaxy vignet"
+                )
                 continue
+
             psf_expccd_name = list(psf_vign_cat[str(id_tmp)].keys())
             for expccd_name_tmp in psf_expccd_name:
                 exp_name, ccd_n = re.split("-", expccd_name_tmp)
@@ -457,12 +460,14 @@ def process(self):
                 )
                 continue
 
+            count = count + 1
+
             res["obj_id"] = id_tmp
             res["n_epoch_model"] = len(gal_vign)
             final_res.append(res)
 
         self._w_log.info(
-            f"ngmix loop over objects finished, processed {count} "
+            f"ngmix loop over objects finished, measured {count} "
             + f"objects, id first/last={id_first}/{id_last}"
         )
 

From a7203a3dfd93ca3d2673a08594941c44a1afd24e Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 1 Jul 2024 12:04:47 +0000
Subject: [PATCH 187/207] doc

---
 docs/source/pipeline_canfar.md          | 4 +++-
 scripts/sh/init_run_exclusive_canfar.sh | 6 ++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index f0786501f..23a76692b 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -40,10 +40,12 @@ shapepipe_run -c cfis/config_GitFe_symlink.ini
 
 shapepipe_run -c cfis/config_Gie_vos.ini
 mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp
-rm -rf  output/run_sp_Gie_*
+rm -rf output/run_sp_Gie_*
 update_run_log_file.py
 # repeat the above; or:
 while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp;  ls -l data_exp/ | wc; rm -rf output/run_sp_Git_*; update_run_log_file.py; done
+# Make sure that after all images are downloaded there is no Gie run. This would
+# mess up later modules since last:get_image_runner could point to this run.
 
 ### Create links (and re-run Fe, not necessary)
 job_sp_canfar.bash -p $psf `cat tile_numbers.txt` -j 1 -r symlink
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index f61e8aeab..8664f4e64 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -281,6 +281,12 @@ if [ "$mh_local" == "1" ]; then
   #command "rm -rf run_sp_tile_Sx_*" $dry_run
 fi
 
+(( do_job = $job & 16 ))
+if [[ $do_job != 0 ]]; then
+  # Remove previous Sx runs
+  command "rm -rf $dir/output/run_tile_Sx_*" $dry_run
+fi
+
 # Update links to exposure run directories, which were created in job 32
 (( do_job = $job & 64 ))
 if [[ $do_job != 0 ]]; then

From 7f842a31f0cf86a2229614675915f75fba3e9da7 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 1 Jul 2024 15:12:11 +0200
Subject: [PATCH 188/207] cleaning up and adding doc strings to vignet maker

---
 shapepipe/modules/vignetmaker_runner.py | 33 ++++++++++++++++---------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/shapepipe/modules/vignetmaker_runner.py b/shapepipe/modules/vignetmaker_runner.py
index 9a83f1cd6..ad7349b38 100644
--- a/shapepipe/modules/vignetmaker_runner.py
+++ b/shapepipe/modules/vignetmaker_runner.py
@@ -31,14 +31,16 @@ def vignetmaker_runner(
     # Get path to galaxy catalogue
     galcat_path = input_file_list[0]
 
-    # Check if masking should be performed
-    # With masking
+    # Check whether mask is to be created
     if config.getboolean(module_config_sec, 'MASKING'):
-        # Fetch the mask value
+
+        # Get the mask value
         mask_value = config.getfloat(module_config_sec, 'MASK_VALUE')
-        # Make a mask
+
+        # Create a mask postage stamp
         vignet = vm.make_mask(galcat_path=galcat_path, mask_value=mask_value)
-        # Save the vignet
+
+        # Save the mask postage stamp vignet
         vm.save_vignet(
             vignet=vignet,
             sexcat_path=galcat_path,
@@ -47,20 +49,29 @@ def vignetmaker_runner(
             image_num=file_number_string,
         )
 
-    # Without masking
     else:
-        # Fetch stamp size
+
+        # Get stamp size
         stamp_size = config.getint(module_config_sec, 'STAMP_SIZE') - 1
-        # Check stamp size
+
+        # Make sure stamp size is odd number
         if stamp_size % 2 != 0:
-            raise ValueError('The STAMP_SIZE must be odd')
+            raise ValueError(
+                f"Found even value {stamp_size} for postage stame size (STAMP"
+                + f"_SIZE entry in config file), must be odd"
+            )
+
         # Set radius
         radius = int(stamp_size / 2)
 
-        # Fetch position type and values
+        # Get position type (allowed are "PIX" and "SPHE")
         pos_type = config.get(module_config_sec, 'COORD')
+
+        # Get position column names for x and y / ra and dec
         pos_params = config.getlist(module_config_sec, 'POSITION_PARAMS')
-        # Fetch vignet run mode
+
+        # Get vignet run mode; allowed are "CLASSIC", "MULTI-EPOCH", and
+        # "VALIDATION"
         mode = config.get(module_config_sec, 'MODE')
 
         # Create instance of VignetMaker

From 1c8b4cd29dbb8e35685b3cafe4530d396c2538de Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 12 Jul 2024 14:31:04 +0000
Subject: [PATCH 189/207] cleaned up curl script

---
 scripts/sh/curl_canfar_local.sh | 79 ++++++++++++++++++++++++---------
 1 file changed, 59 insertions(+), 20 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 7b4d2e17d..85d55c1e2 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -16,10 +16,13 @@ ID=-1
 file_IDs=-1
 N_SMP=1
 version="1.1"
-cmd_remote="shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
+cmd_remote="$HOME/shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 batch_max=200
 dry_run=0
 mh_local=0
+debug_out=-1
+
+pat="- "
 
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
@@ -42,6 +45,8 @@ usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS]
     \tremote command to run on canfar, default='$cmd_remote'\n
    -b, --batch_max\n
     \tmaximum batch size = number of jobs run simultaneously, default=$batch_max\n
+   --debug_out PATH\n
+    \tdebug output file PATH, default not used\n
    -n, --dry_run LEVEL\n
     \tdry run, from LEVEL=2 (no processing) to 0 (full run)\n
 "
@@ -87,6 +92,10 @@ while [ $# -gt 0 ]; do
       batch_max="$2"
       shift
       ;;
+    --debug_out)
+      debug_out="$2"
+      shift
+      ;;
     -n|--dry_run)
       dry_run="$2"
       shift
@@ -116,6 +125,17 @@ if [ "$dry_run" != 0 ] && [ "$dry_run" != 1 ] && [ "$dry_run" != 2 ]; then
   exit 5
 fi
 
+if [ "$debug_out" != "-1" ]; then
+  echo "${pat}Starting $(basename "$0")" >> $debug_out
+  echo $pat`date`$ >> $debug_out
+fi
+
+. /opt/conda/etc/profile.d/conda.sh
+conda activate shapepipe
+if [ "$debug_out"  != "-1" ]; then
+    echo "${pat}conda prefix = ${CONDA_PREFIX}" >> $debug_out
+fi
+
 # command line arguments for remote script:
 # collect into string
 
@@ -130,20 +150,40 @@ dir=`pwd`
 
 # Return argument for local script to be called via curl
 function set_arg() {
-  my_arg="-j $job -p $psf -e $ID -N $N_SMP $arg_dry_run -d $dir -m $mh_local"
+  my_arg="-j $job -p $psf -e $ID -N $N_SMP $arg_dry_run -d $dir -m $mh_local --debug_out $debug_out"
   echo $my_arg
 }
 
 
-# MKDEBUG TODO
 function call_curl() {
-  my_arg=$1
+  my_name=$1
+  dry_run=$2
+
+  my_arg=$(set_arg)
+
+  if [ "$dry_run" == "0" ]; then
+  
+    my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${my_name}" -d "cmd=$cmd_remote" --data-urlencode "args=${my_arg[@]}"`
+    # &> /dev/null`
+  fi
 
+
+  cmd=("curl" "-E" "$SSL" "$SESSION?$RESOURCES" "-d" "image=$IMAGE:$version" "-d" "name=${my_name}" "-d" "cmd=$cmd_remote" "--data-urlencode" "args=\"${my_arg}\"")
+
+  if [ "$debug_out" != "=1" ]; then
+    echo "${pat}call_curl $my_name $my_arg" >> $debug_out
+    echo "Running ${cmd[@]} (dry_run=$dry_run)" >> $debug_out
+  fi
+  echo "${cmd[@]} (dry_run=$dry_run)"
+
+
+  # Running $cmd does not work due to unknown problems with passing of args
+
+  update_session_logs
 }
 
 # Add session and image IDs to log files
 function update_session_logs() {
-  #echo "MKDEBUG $my_session $ID"
   echo $my_session >> session_IDs.txt
   echo "$my_session $ID" >> session_image_IDs.txt
 
@@ -153,11 +193,11 @@ function submit_batch() {
   path=$1
 
   for ID in `cat $path`; do
-    my_arg=$(set_arg)
     IDt=`echo $ID | tr "." "-"`
-    MY_NAME="SP-${patch}-J${job}-${IDt}"
-    my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$my_arg" &> /dev/null`
-    update_session_logs
+    my_name="SP-${patch}-J${job}-${IDt}"
+
+    call_curl $my_name $dry_run
+
   done
 
 }
@@ -179,18 +219,16 @@ if [ "$dry_run" == 2 ]; then
     # Submit file (dry run = 2)
     for ID in `cat $file_IDs`; do
       IDt=`echo $ID | tr "." "-"`
-      MY_NAME="SP-${patch}-J${job}-${IDt}"
-      arg=$(set_arg)
-      echo curl -E $SSL \"$SESSION?$RESOURCES\" -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+      my_name="SP-${patch}-J${job}-${IDt}"
+      call_curl $my_name $dry_run
     done
 
   else
 
     # Submit image (dry run = 2)
-    arg=$(set_arg)
     IDt=`echo $ID | tr "." "-"`
-    MY_NAME="SP-${patch}-J${job}-${IDt}"
-    echo curl -E $SSL "$SESSION?$RESOURCES" -d \"image=$IMAGE:$version\" -d \"name=${MY_NAME}\" -d \"cmd=$cmd_remote\" --data-urlencode \"args=$arg\"
+    my_name="SP-${patch}-J${job}-${IDt}"
+    call_curl $my_name $dry_run
 
   fi
 
@@ -241,13 +279,14 @@ else
   else
 
     # Submit image
-    arg=$(set_arg)
     IDt=`echo $ID | tr "." "-"`
-    MY_NAME="SP-${patch}-J${job}-${IDt}"
-    my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg" &> /dev/null`
-    echo curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${MY_NAME}" -d "cmd=$cmd_remote" --data-urlencode "args=$arg"
-    update_session_logs
+    my_name="SP-${patch}-J${job}-${IDt}"
+    call_curl $my_name $dry_run
 
   fi
 
 fi
+
+if [ "$debug_out" != "-1" ]; then
+  echo "${pat}End $(basename "$0")" >> $debug_out
+fi

From 3210b88af99c702232a13bfad5b0c6878201615b Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 12 Jul 2024 14:32:17 +0000
Subject: [PATCH 190/207] canfar scripts adopted to new env; added debug

---
 scripts/sh/init_run_exclusive_canfar.sh | 77 ++++++++++++++++++-------
 scripts/sh/job_sp_canfar.bash           | 48 ++++++++++++++-
 2 files changed, 103 insertions(+), 22 deletions(-)

diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 8664f4e64..9f8e0d2a9 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -8,14 +8,16 @@ job=-1
 ID=-1
 N_SMP=1
 dry_run=0
-nsh_jobs=8
 dir=`pwd`
+debug_out=-1
 
 # mh_local is 0 (1) if merge_header_runner is run on all exposures,
 # which is standard so far (run on exposures of given tile only; new)
 mh_local=0
 VERBOSE=1
 
+pat="-- "
+
 
 ## Help string
 usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
@@ -34,6 +36,8 @@ usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS]
     \trun directory, default is pwd ($dir)\n
    -n, --dry_run\n
     \tdry run, no actuall processing\n
+   --debug_out PATH\n
+   \tdebug output file PATH, default not used\n
 "
 
 ## Help if no arguments                                                         
@@ -76,6 +80,10 @@ while [ $# -gt 0 ]; do
     -n|--dry_run)
       dry_run=1
       ;;
+    --debug_out)
+      debug_out="$2"
+      shift
+      ;;
   esac                                                                          
   shift                                                                         
 done
@@ -116,12 +124,21 @@ function command () {
    #GREEN=''
    #NC=''
 
+   msg="running '$cmd' (dry run=$dry_run)"
    if [ $VERBOSE == 1 ]; then
-        echo "running '$cmd' (dry run=$dry_run)"
+        echo $msg
    fi
+   if [ "$debug_out" != "-1" ]; then
+        echo ${pat}$msg >> $debug_out
+   fi
+
    if [ "$dry_run" == "0" ]; then
         $cmd
         res=$?
+    
+        if [ "$debug_out" != "-1" ]; then
+          echo "${pat}exit code = $res" >> $debug_out
+        fi
 
         if [ $VERBOSE == 1 ]; then
             if [ $res == 0 ]; then
@@ -139,7 +156,12 @@ function command () {
    fi
 }
 
-echo "start init_run_exclusive_canfar"
+msg="Starting $(basename "$0")"
+echo $msg
+if [ "$debug_out" != "-1" ]; then
+  echo $pat$msg >> $debug_out
+  echo ${pat}`date` >> $debug_out
+fi
 
 # Set kind
 job_to_test=16
@@ -185,9 +207,18 @@ if [ "$dry_run" == 1 ]; then
   echo "in dry run mode"
 fi
 
-. /opt/conda/etc/profile.d/conda.sh
-
-conda activate shapepipe
+#. /opt/conda/etc/profile.d/conda.sh
+# the following line will look for /opt/...
+#conda activate shapepipe
+#conda activate $HOME/.conda/envs/shapepipe
+#CONDA_PREFIX=$HOME/.conda/envs/shapepipe
+CONDA_PREFIX=/arc/home/kilbinger/.conda/envs/shapepipe
+PATH=$PATH:$CONDA_PREFIX/bin
+if [ "$debug_out"  != "-1" ]; then
+    echo "${pat}conda prefix = ${CONDA_PREFIX}" >> $debug_out
+    echo "${pat}HOME = ${HOME}" >> $debug_out
+    echo "${pat}path = ${PATH}" >> $debug_out
+fi
 
 cd $dir
 echo $pwd
@@ -232,13 +263,10 @@ command "ln -sf $dir/output/run_sp_Ma_exp" $dry_run
 # exp Sp
 command "ln -sf $dir/output/run_sp_exp_SpMh" $dry_run
 
-
-#(( do_job = $job & 16 ))
-#&& [ $do_job != 0 ]; then
 if [ "$mh_local" == "1" ]; then
 
   # Remove previous Sx runs
-  command "rm -rf $dir/output/run_tile_Sx_*" $dry_run
+  command "rm -rf run_sp_tile_Sx_*" $dry_run
 
   if [ "$ID" == "-1" ]; then
     echo "ID needs to be given (option -e) for mh_local and job&16"
@@ -277,14 +305,12 @@ if [ "$mh_local" == "1" ]; then
   command "shapepipe_run -c cfis/config_exp_Mh.ini" $dry_run
   cd output
 
-  # Remove previous Sextractor run
-  #command "rm -rf run_sp_tile_Sx_*" $dry_run
 fi
 
 (( do_job = $job & 16 ))
 if [[ $do_job != 0 ]]; then
   # Remove previous Sx runs
-  command "rm -rf $dir/output/run_tile_Sx_*" $dry_run
+  command "rm -rf run_sp_tile_Sx_*" $dry_run
 fi
 
 # Update links to exposure run directories, which were created in job 32
@@ -295,11 +321,11 @@ if [[ $do_job != 0 ]]; then
     command "link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs" $dry_run
     cd ${kind}_runs/$ID/output
 
-    # Remove duplicate job-32 runs (tile detection)
-    n_32=`ls -rt1d run_sp_tile_Sx_* | wc -l`
-    if [ "$n_32" != "1" ]; then
-      n_remove="$(($n_32-1))"
-      echo "removing $n_remove duplicate old job-32 runs"
+    # Remove duplicate job-16 runs (tile detection)
+    n_16=`ls -rt1d run_sp_tile_Sx_* | wc -l`
+    if [ "$n_16" != "1" ]; then
+      n_remove="$(($n_16-1))"
+      echo "removing $n_remove duplicate old job-16 runs"
       command "rm -rf `ls -rt1d run_sp_tile_Sx_* | head -$n_remove`" $dry_run
     fi
 
@@ -308,6 +334,13 @@ if [[ $do_job != 0 ]]; then
   fi
 fi
 
+(( do_job = $job & 256 ))
+if [[ $do_job != 0 ]]; then
+  # Remove previous runs of this job
+  rm -rf run_sp_tile_??ViSmVi_20??_*
+
+fi
+
 (( do_job = $job & 256 ))
 if [[ $do_job != 0 ]]; then
 
@@ -339,8 +372,12 @@ echo $CONDA_PREFIX
 # To avoid (new?) qt error with setools (-j 32)
 export DISPLAY=:1.0
 
-command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP" $dry_run
+command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP --nsh_jobs $N_SMP --debug_out $debug_out" $dry_run
 
 cd $dir
 
-echo "end init run tile canfar"
+msg="End $(basename "$0")"
+echo $msg
+if [ "$debug_out" != "-1" ]; then
+  echo $pat$msg >> $debug_out-
+fi
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index 88ceae36c..c5e9663ad 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/bash
 
 # Name: job_sp_canfar.bash
 # Description: General script to process one or more tiles
@@ -21,6 +21,9 @@ exclusive=''
 results='cosmostat/kilbinger/results_v2'
 n_smp=-1
 nsh_jobs=8
+debug_out=-1
+
+pat="--- "
 
 ## Help string
 usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID]
@@ -54,6 +57,8 @@ usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID]
    --nsh_jobs NJOB\n
    \tnumber of objects per parallel shape module call, \n
    \tdefault: optimal number is computed\n
+   --debug_out PATH\n
+   \tdebug output file PATH, default not used\n
    TILE_ID_i\n
    \ttile ID(s), e.g. 283.247 214.242\n
 "
@@ -107,6 +112,10 @@ while [ $# -gt 0 ]; do
       nsh_jobs="$2"
       shift
       ;;
+    --debug_out)
+      debug_out="$2"
+      shift
+      ;;
   esac
   shift
 done
@@ -127,6 +136,14 @@ if [ "$retrieve" != "vos" ] && [ "$retrieve" != "symlink" ]; then
   exit 5
 fi
 
+if [ "$debug_out" != "-1" ]; then
+  echo $pat`date` >> $debug_out
+  echo "${pat}Starting $(basename "$0")" >> $debug_out
+fi
+
+CONDA_PREFIX=/arc/home/kilbinger/.conda/envs/shapepipe
+PATH=$PATH:$CONDA_PREFIX/bin
+
 # For tar archives. TODO: Should be unique to each job
 export ID="test"
 
@@ -164,7 +181,7 @@ export VCP="vcp --certfile=$CERTFILE"
 
 # Print string, executes command, and prints return value.
 function command () {
-   cmd=$1
+  cmd=$1
    str=$2
 
    RED='\033[0;31m'
@@ -176,19 +193,40 @@ function command () {
    #NC=''
 
 
+   if [ "$debug_out" != "-1" ]; then
+      echo "${pat}pwd = `pwd`" >> $debug_out
+      echo "${pat}SP_RUN = $SP_RUN" >> $debug_out
+      echo "${pat}SP_CONFIG = $SP_CONFIG" >> $ddebug_out
+    fi
+
    if [ $# == 2 ]; then
       if [ $VERBOSE == 1 ]; then
            echo "$str: running '$cmd'"
       fi
+      if [ "$debug_out" != "-1" ]; then
+          echo "${pat}Running $cmd" >> $debug_out
+      fi
+
       $cmd
+      
    else
       if [ $VERBOSE == 1 ]; then
          echo "$str: running '$cmd $4 \"$5 $6\"'"
       fi
+      if [ "$debug_out" != "-1" ]; then
+          echo "${pat}Running $cmd $4 \"$5 $6\"" >> $debug_out
+      fi
+
       $cmd $4 "$5 $6"
+
    fi	
+
    res=$?
 
+   if [ "$debug_out" != "-1" ]; then
+       echo "${pat}exit code = $res" >> $debug_out
+   fi
+
    if [ $VERBOSE == 1 ]; then
       if [ $res == 0 ]; then
          echo -e "${GREEN}success, return value = $res${NC}"
@@ -226,6 +264,7 @@ function command_cfg_shapepipe() {
     fi
 
     config_upd=$(set_config_n_smp $config_name $_n_smp)
+    #local cmd="/arc/home/kilbinger/.conda/envs/shapepipe/bin/shapepipe_run -c $config_upd $exclusive_flag"
     local cmd="shapepipe_run -c $config_upd $exclusive_flag"
     command_sp "$cmd" "$str"
 }
@@ -303,6 +342,7 @@ mkdir -p $SP_CONFIG_MOD
 
 # Processing
 
+
 ### Retrieve config files
 if [[ $config_dir == *"vos:"* ]]; then
   command_sp "$VCP $config_dir ." "Retrieve shapepipe config files"
@@ -522,3 +562,7 @@ if [[ $do_job != 0 ]]; then
     $exclusive
 
 fi
+
+if [ "$debug_out" != "-1" ]; then
+  echo "${pat}End $(basename "$0")" >> $debug_out
+fi

From ae97110b4d96161144640a194d3efc9a9a3516d3 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 12 Jul 2024 14:32:48 +0000
Subject: [PATCH 191/207] shapepipe_run script adopted to new canfar env

---
 scripts/python/shapepipe_run.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/python/shapepipe_run.py b/scripts/python/shapepipe_run.py
index 18d7de774..a60f1eaed 100755
--- a/scripts/python/shapepipe_run.py
+++ b/scripts/python/shapepipe_run.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python
+#!/arc/home/kilbinger/.conda/envs/shapepipe/bin/python
 
 """SHAPEPIPE RUN SCRIPT
 

From ebb40b1ea611ce7d721db7db067b338c35030938 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Fri, 12 Jul 2024 14:33:21 +0000
Subject: [PATCH 192/207] setools matplotlib Agg to avoid display error

---
 shapepipe/modules/setools_package/setools.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/shapepipe/modules/setools_package/setools.py b/shapepipe/modules/setools_package/setools.py
index a54ce8515..c430b52b1 100644
--- a/shapepipe/modules/setools_package/setools.py
+++ b/shapepipe/modules/setools_package/setools.py
@@ -12,6 +12,9 @@
 import re
 import string
 
+import matplotlib
+matplotlib.use('Agg')
+
 import matplotlib.pylab as plt
 import numpy as np
 

From ca026efd54b625a3f170e7e6aec1bdca225a6e53 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Thu, 29 Aug 2024 10:11:51 +0000
Subject: [PATCH 193/207] ngmix: catching missing keys in postage stamp sqlite
 database files

---
 shapepipe/modules/ngmix_package/ngmix.py | 35 ++++++++++++++++++------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/shapepipe/modules/ngmix_package/ngmix.py b/shapepipe/modules/ngmix_package/ngmix.py
index 16f134f7b..a5cb28b54 100644
--- a/shapepipe/modules/ngmix_package/ngmix.py
+++ b/shapepipe/modules/ngmix_package/ngmix.py
@@ -321,6 +321,16 @@ def save_results(self, output_dict):
         for key in output_dict.keys():
             f.save_as_fits(output_dict[key], ext_name=key.upper())
 
+
+    @classmethod
+    def check_key(self, expccd_name_tmp, vign_cat[str_id_tmp], path):
+        if expccd_name_tmp not in vign_cat[str_id_tmp]:
+            raise KeyError(
+                "Key '{expccd_name_tmp}' (exposure CCD ID from PSF postage stamp list)" +
+                + " not found in postage stamp database" +
+                + f" file '{self._vignet_path}'"
+            )
+
     def process(self):
         """Process.
 
@@ -367,6 +377,7 @@ def process(self):
             if id_first == -1:
                 id_first = id_tmp
             id_last = id_tmp
+            str_id_tmp = str(id_tmp)
 
             count = count + 1
 
@@ -376,21 +387,27 @@ def process(self):
             weight_vign = []
             flag_vign = []
             jacob_list = []
-            if (psf_vign_cat[str(id_tmp)] == "empty") or (
-                gal_vign_cat[str(id_tmp)] == "empty"
+            if (psf_vign_cat[str_id_tmp] == "empty") or (
+                gal_vign_cat[str_id_tmp] == "empty"
             ):
                 continue
-            psf_expccd_name = list(psf_vign_cat[str(id_tmp)].keys())
+            psf_expccd_name = list(psf_vign_cat[str_id_tmp].keys())
             for expccd_name_tmp in psf_expccd_name:
+
+                check_key(expccd_name_tmp, gal_vign_cat[str_id_tmp], self._gal_vignet_path)
+                check_key(expccd_name_tmp, bkg_vign_cat[str_id_tmp], self._bkg_vignet_path)
+                check_key(expccd_name_tmp, flag_vign_cat[str_id_tmp], self._flag_vignet_path)
+                check_key(expccd_name_tmp, weight_vign_cat[str_id_tmp], self._weight_vignet_path)
+
                 exp_name, ccd_n = re.split("-", expccd_name_tmp)
 
-                gal_vign_tmp = gal_vign_cat[str(id_tmp)][expccd_name_tmp][
+                gal_vign_tmp = gal_vign_cat[str_id_tmp][expccd_name_tmp][
                     "VIGNET"
                 ]
                 if len(np.where(gal_vign_tmp.ravel() == 0)[0]) != 0:
                     continue
 
-                bkg_vign_tmp = bkg_vign_cat[str(id_tmp)][expccd_name_tmp][
+                bkg_vign_tmp = bkg_vign_cat[str_id_tmp][expccd_name_tmp][
                     "VIGNET"
                 ]
                 gal_vign_sub_bkg = gal_vign_tmp - bkg_vign_tmp
@@ -399,7 +416,7 @@ def process(self):
                     np.copy(tile_vign[i_tile]), int(ccd_n)
                 )
 
-                flag_vign_tmp = flag_vign_cat[str(id_tmp)][expccd_name_tmp][
+                flag_vign_tmp = flag_vign_cat[str_id_tmp][expccd_name_tmp][
                     "VIGNET"
                 ]
                 flag_vign_tmp[np.where(tile_vign_tmp == -1e30)] = 2**10
@@ -407,7 +424,7 @@ def process(self):
                 if len(np.where(v_flag_tmp != 0)[0]) / (51 * 51) > 1 / 3.0:
                     continue
 
-                weight_vign_tmp = weight_vign_cat[str(id_tmp)][expccd_name_tmp][
+                weight_vign_tmp = weight_vign_cat[str_id_tmp][expccd_name_tmp][
                     "VIGNET"
                 ]
 
@@ -427,10 +444,10 @@ def process(self):
 
                 gal_vign.append(gal_vign_scaled)
                 psf_vign.append(
-                    psf_vign_cat[str(id_tmp)][expccd_name_tmp]["VIGNET"]
+                    psf_vign_cat[str_id_tmp][expccd_name_tmp]["VIGNET"]
                 )
                 sigma_psf.append(
-                    psf_vign_cat[str(id_tmp)][expccd_name_tmp]["SHAPES"][
+                    psf_vign_cat[str_id_tmp][expccd_name_tmp]["SHAPES"][
                         "SIGMA_PSF_HSM"
                     ]
                 )

From 126be96ac9b191b91a9bcfde1ad780bdf69d2714 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Thu, 29 Aug 2024 10:15:08 +0000
Subject: [PATCH 194/207] combin runs script: added tile_detection

---
 docs/source/pipeline_canfar.md          |  6 +-
 example/cfis/config_exp_Sp.ini          |  6 +-
 scripts/python/summary_params_pre_v2.py |  5 +-
 scripts/sh/combine_runs.bash            |  9 ++-
 scripts/sh/curl_canfar_local.sh         |  5 +-
 scripts/sh/job_sp_canfar.bash           |  2 +-
 scripts/sh/stats_jobs_canfar.sh         |  6 +-
 shapepipe/utilities/summary.py          | 99 +++++++++++++++----------
 8 files changed, 84 insertions(+), 54 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 23a76692b..a0e5b16bc 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -30,7 +30,7 @@ export SP_RUN=`pwd`
 
 shapepipe_run -c cfis/config_Git_vos.ini
 ls -l data_tiles/ | wc; mv -i output/run_sp_Git_*/get_images_runner/output/CFIS.???.???.*fits* data_tiles; ls -l data_tiles/ | wc
-rm -rf output/run_sp_Git_*; update_run_log_file.py
+rm -rf output/run_sp_Git_*; update_runs_log_file.py
 # repeat the above block
 
 ### Find exposures; this run can be stopped after Fe
@@ -41,9 +41,9 @@ shapepipe_run -c cfis/config_GitFe_symlink.ini
 shapepipe_run -c cfis/config_Gie_vos.ini
 mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp
 rm -rf output/run_sp_Gie_*
-update_run_log_file.py
+update_runs_log_file.py
 # repeat the above; or:
-while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp;  ls -l data_exp/ | wc; rm -rf output/run_sp_Git_*; update_run_log_file.py; done
+while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp;  ls -l data_exp/ | wc; rm -rf output/run_sp_Git_*; update_runs_log_file.py; done
 # Make sure that after all images are downloaded there is no Gie run. This would
 # mess up later modules since last:get_image_runner could point to this run.
 
diff --git a/example/cfis/config_exp_Sp.ini b/example/cfis/config_exp_Sp.ini
index 491b17bdf..f8ee85757 100644
--- a/example/cfis/config_exp_Sp.ini
+++ b/example/cfis/config_exp_Sp.ini
@@ -9,10 +9,10 @@
 VERBOSE = True
 
 # Name of run (optional) default: shapepipe_run
-RUN_NAME = run_sp_exp_Sp
+RUN_NAME = run_sp_exp_SpMh
 
 # Add date and time to RUN_NAME, optional, default: True
-; RUN_DATETIME = False
+RUN_DATETIME = False
 
 
 ## ShapePipe execution options
@@ -45,7 +45,7 @@ OUTPUT_DIR = $SP_RUN/output
 [JOB]
 
 # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial
-SMP_BATCH_SIZE = 8
+SMP_BATCH_SIZE = 16
 
 # Timeout value (optional), default is None, i.e. no timeout limit applied
 TIMEOUT = 96:00:00
diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 5e1fe5a53..62924f472 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -168,7 +168,10 @@ def set_jobs_v2_pre_v2(patch, verbose):
         verbose=verbose,
     )
 
-    n_sh = 8
+    if patch == 2:
+        n_sh = 1
+    else:
+        n_sh = 8
     run_dirs = [f"run_sp_tile_ngmix_Ng{idx+1}u" for idx in range(n_sh)]
     output_path_missing_IDs = [
         f"{path_main}/summary/missing_job_128_ngmix_runner_{idx+1}.txt"
diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash
index be1b4f04e..c264f3cbf 100755
--- a/scripts/sh/combine_runs.bash
+++ b/scripts/sh/combine_runs.bash
@@ -50,11 +50,12 @@ done
 ## Check options
 if [ "$cat" != "final" ] \
   && [ "$cat" != "flag_tile" ] \
+  && [ "$cat" != "tile_detection" ] \
   && [ "$cat" != "flag_exp" ] \
   && [ "$cat" != "psf" ] \
   && [ "$cat" != "psf_conv" ] \
   && [ "$cat" != "image" ]; then
-  echo "cat (option -c) needs to be 'final', 'flag_tile', 'flag_exp', 'psf', 'psf_conv' or 'image'"
+  echo "cat (option -c) needs to be 'final', 'tile_detection', 'flag_tile', 'flag_exp', 'psf', 'psf_conv' or 'image'"
   exit 2
 fi
 
@@ -109,6 +110,12 @@ if [ "$cat" == "final" ]; then
   module="make_catalog_runner"
   pattern="final_cat-*"
 
+elif [ "$cat" == "tile_detection" ]; then
+
+  run_in="$pwd/P?/tile_runs/*/$out_base/run_sp_tile_Sx_*"
+  module="sextractor_runner"
+  pattern="sexcat-*"
+
 elif [ "$cat" == "flag_tile" ]; then
 
   # v1
diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 85d55c1e2..6d67bded1 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -69,7 +69,7 @@ while [ $# -gt 0 ]; do
       shift
       ;;
     -p|--psf)
-      job="$2"
+      psf="$2"
       shift
       ;;
     -m|--mh_local)
@@ -148,6 +148,7 @@ fi
 RESOURCES="ram=4&cores=$N_SMP"
 dir=`pwd`
 
+
 # Return argument for local script to be called via curl
 function set_arg() {
   my_arg="-j $job -p $psf -e $ID -N $N_SMP $arg_dry_run -d $dir -m $mh_local --debug_out $debug_out"
@@ -172,7 +173,7 @@ function call_curl() {
 
   if [ "$debug_out" != "=1" ]; then
     echo "${pat}call_curl $my_name $my_arg" >> $debug_out
-    echo "Running ${cmd[@]} (dry_run=$dry_run)" >> $debug_out
+    echo "${pat}Running ${cmd[@]} (dry_run=$dry_run)" >> $debug_out
   fi
   echo "${cmd[@]} (dry_run=$dry_run)"
 
diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index c5e9663ad..eb02455f5 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -196,7 +196,7 @@ function command () {
    if [ "$debug_out" != "-1" ]; then
       echo "${pat}pwd = `pwd`" >> $debug_out
       echo "${pat}SP_RUN = $SP_RUN" >> $debug_out
-      echo "${pat}SP_CONFIG = $SP_CONFIG" >> $ddebug_out
+      echo "${pat}SP_CONFIG = $SP_CONFIG" >> $debug_out
     fi
 
    if [ $# == 2 ]; then
diff --git a/scripts/sh/stats_jobs_canfar.sh b/scripts/sh/stats_jobs_canfar.sh
index 166292a06..f3db019d0 100755
--- a/scripts/sh/stats_jobs_canfar.sh
+++ b/scripts/sh/stats_jobs_canfar.sh
@@ -63,10 +63,12 @@ esac
 curl -E $SSL $SESSION &> /dev/null > $tmpfile_jobs
 
 # Get headless job IDs
-cat $tmpfile_jobs | grep headless -B 4 -A 12 | grep \"id | perl -F\" -ane 'print "$F[3]\n"' > $tmpfile_ids
+#cat $tmpfile_jobs | grep headless -B 4 -A 12 | grep \"id | perl -F\" -ane 'print "$F[3]\n"' > $tmpfile_ids
+cat $tmpfile_jobs | grep headless -B 4 -A 2 | grep Running -A 1 > $tmpfile_ids
+
 
 # Get running job info
-cat $tmpfile_jobs | grep Running -A 1 | grep name | perl -F\- -ane 'chomp; $F[4] =~ s/[",]//g; print "$F[3].$F[4]"' > $tmpfile_running
+cat $tmpfile_ids | grep name | perl -F\- -ane 'chomp; $F[4] =~ s/[",]//g; print "$F[3].$F[4]"' > $tmpfile_running
 
 # Number of jobs
 n_headless=`cat $tmpfile_ids | wc -l`
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 140edf0d9..6171905b5 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -15,7 +15,7 @@
 
 from tqdm import tqdm
 
-print("summaary v1.2")
+print("summaary v1.4")
 
 
 def init_par_runtime(list_tile_IDs):
@@ -169,20 +169,20 @@ def check_special_one(module, path):
                 if m:
                     value = int(m[1])
                     if value < 2:
+                        code = 0
                         msg = (
                             f"Not enough stars for random split:"
                             + f"  #stars = {value}"
                         )
-                        return msg
+                        return msg, code
                     break
                 m = re.search("Mode computation failed", line)
                 if m:
+                    code = 1
                     msg = "Mode computation of stellar locus failed"
-                    return msg
+                    return msg, code
 
-
-    return None
- 
+    return None, None 
 
 
 class job_data(object):
@@ -290,11 +290,8 @@ def print_stats_header(self):
 
         """
         logging.info(
-            "module                          expected     found   miss_expl"
-            + " missing uniq_miss  fr_found"
-        #logging.info(
-            #"module                          expected     found"
-            #+ "   missing uniq_miss  fr_found"
+            "module                          expected     found"
+            + "   missing uniq_miss  fr_found"
         )
         logging.info("=" * 100)
 
@@ -303,7 +300,7 @@ def print_stats(
         module,
         n_expected,
         n_found,
-        n_missing_explained,
+        n_special,
         n_missing,
         idx,
     ):
@@ -319,28 +316,34 @@ def print_stats(
             number of expected files
         n_found: int
             number of found files
-        n_missing_explained: int
-            number of missing but explained files
+        n_special: int
+            number of special cases
         n_missing: int
             number of missing files
         idx: int
             module index
 
         """
-        if n_expected > 0:
-            fraction_found = n_found / n_expected
-        else:
-            fraction_found = 1
-
-        n_missing_per_mult = n_missing / self._n_mult[idx]
-
         module_str = module
-        if self._special[idx]:
+        
+        if not self._special[idx]:
+            if n_expected > 0:
+                fraction_found = n_found / n_expected
+            else:
+                fraction_found = 1
+                
+            n_missing_per_mult = n_missing / self._n_mult[idx]
+            
+        else:
             module_str = f"{module_str} (special)"
+            n_found = n_special
+            n_missing = -1
+            n_missing_per_mult = -1
+            fraction_found = n_found / n_expected
+            n_expected = -1
 
         logging.info(
             f"{module_str:30s} {n_expected:9d} {n_found:9d}"
-            + f" {n_missing_explained:9d}"
             + f" {n_missing:9d}"
             + f" {n_missing_per_mult:9.1f} {fraction_found:9.1%}"
         )
@@ -409,26 +412,40 @@ def write_IDs_to_file(self, output_path, IDs):
 
     def check_special(self, module, idx):
 
-        messages = []
+        messages = {}
+        
         if self._special[idx]:
+            
+            # Loop over input file names and paths
             for name, path in zip(self._names_in_dir[idx], self._paths_in_dir[idx]):
 
-                msg = check_special_one(module, path)
+                # Check if special case is found
+                msg, code = check_special_one(module, path)
                 if msg:
-                    messages.append(f"{name} {msg}")
-    
-
-            if messages:
-                output_path = (
-                    f"{self._path_main}/summary/special_job_{self._bit}"
-                    + f"_{module}.txt"
-                )
-                with open(output_path, "w") as f_out:
-                    for msg in messages:
-                        print(msg, file=f_out)
-
-        return len(messages)
-
+                    # First time occurance: create empty list for this code 
+                    if code not in messages:
+                        messages[code] = [msg]
+                    else:
+                        # Append file name, message, and code 
+                        messages[code].append(f"{name} {code} {msg}")
+
+            if len(messages) > 0:
+                # Loop over codes = key in messages dict
+                for code in messages:
+                    # Create output file for this code
+                    output_path = (
+                        f"{self._path_main}/summary/special_job_{self._bit}"
+                        + f"_{module}_{code}.txt"
+                    )
+                    # Write all messages
+                    with open(output_path, "w") as f_out:
+                        for msg in messages[code]:
+                            print(msg, file=f_out)
+
+        # Count all special cases = sum of cases over all codes 
+        n_all = sum([len(messages[code]) for code in messages])
+        return n_all
+        
     def output_missing(
         self,
         module,
@@ -684,7 +701,7 @@ def check_numbers(self, par_runtime=None, indices=None):
             n_expected = n_expected_base * self._n_mult[idx]
             n_missing = n_expected - n_found
 
-            n_missing_explained = self.check_special(
+            n_special = self.check_special(
                 module,
                 idx,
             )
@@ -694,7 +711,7 @@ def check_numbers(self, par_runtime=None, indices=None):
                 module,
                 n_expected,
                 n_found,
-                n_missing_explained,
+                n_special,
                 n_missing,
                 idx,
             )

From 08d7a7cbfcafb32c5dee7159bc67d4f58ac0392a Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 06:57:28 +0000
Subject: [PATCH 195/207] cleaned up convery pix script

---
 scripts/python/convert_psf_pix2world.py | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/scripts/python/convert_psf_pix2world.py b/scripts/python/convert_psf_pix2world.py
index bfe136236..dea99656b 100755
--- a/scripts/python/convert_psf_pix2world.py
+++ b/scripts/python/convert_psf_pix2world.py
@@ -379,6 +379,7 @@ def params_default(self):
             "input_base_dir": ".",
             "output_base_dir": ".",
             "mode": "merge",
+            "patches": "",
             "psf": "psfex",
             "file_pattern_psfint": "validation_psf",
         }
@@ -387,6 +388,7 @@ def params_default(self):
             "input_base_dir": "-i",
             "mode": "-m",
             "psf": "-p",
+            "patches": "-P",
         }
 
         self._types = {}
@@ -401,6 +403,7 @@ def params_default(self):
                 "run mode, allowed are 'merge', 'test'; default is" + " '{}'"
             ),
             "psf": "PSF model, allowed are 'psfex' and 'mccd'; default is {}",
+            "patches": "(list of) input patches",
         }
 
         # Output column names with types
@@ -432,7 +435,8 @@ def update_params(self):
 
         """
         if self._params["psf"] == "psfex":
-            self._params["sub_dir_pattern"] = "run_sp_exp_202"
+            #self._params["sub_dir_pattern"] = "run_sp_exp_202"
+            self._params["sub_dir_pattern"] = "run_sp_combined_psf"
             self._params["sub_dir_psfint"] = "psfex_interp_runner"
         elif self._params["psf"] == "mccd":
             self._params["sub_dir_pattern"] = "run_sp_exp_SxSePsf_202"
@@ -453,9 +457,7 @@ def run(self):
         if self._params["mode"] == "test":
             patch_nums = ["3", "4"]
         else:
-            n_patch = 7
-            # patch_nums = [idx for idx in np.arange(n_patch) + 1]
-            patch_nums = [1, 3, 4]
+            patch_nums = cs_args.my_string_split(self._params["patches"])
 
         do_parallel = True
 

From 8b4619cbdd7e2a422e85164ea6cd98a6987c4b61 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 06:58:22 +0000
Subject: [PATCH 196/207] summary added special, n_sh as variable

---
 scripts/python/summary_params_pre_v2.py | 11 ++++++++---
 shapepipe/utilities/summary.py          | 21 ++++++++++++++++++++-
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py
index 62924f472..70eda073c 100644
--- a/scripts/python/summary_params_pre_v2.py
+++ b/scripts/python/summary_params_pre_v2.py
@@ -155,20 +155,23 @@ def set_jobs_v2_pre_v2(patch, verbose):
         "64",
         "run_sp_tile_PsViSmVi",
         [
+            "psfex_interp_runner",
             "psfex_interp_runner",
             "vignetmaker_runner_run_1",
             "spread_model_runner",
             "vignetmaker_runner_run_2",
         ],
         "tile_IDs",
-        n_mult=[1, 1, 1, 4],
+        n_mult=[1, 1, 1, 1, 4],
         path_main=path_main,
         path_left="tile_runs",
         output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot],
+        path_output=["output", "logs", "output", "output", "output"],
+        special=[False, True, False, False, False],
         verbose=verbose,
     )
 
-    if patch == 2:
+    if patch in ("P2", "P5"):
         n_sh = 1
     else:
         n_sh = 8
@@ -180,7 +183,7 @@ def set_jobs_v2_pre_v2(patch, verbose):
     jobs["128"] = job_data(
         "128",
         run_dirs,
-        ["ngmix_runner"] * 8,
+        ["ngmix_runner"] * n_sh,
         "tile_IDs",
         path_main=path_main,
         path_left="tile_runs",
@@ -233,3 +236,5 @@ def set_jobs_v2_pre_v2(patch, verbose):
     )
 
     return jobs, list_tile_IDs_dot
+
+
diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py
index 6171905b5..201cbcd30 100755
--- a/shapepipe/utilities/summary.py
+++ b/shapepipe/utilities/summary.py
@@ -182,6 +182,23 @@ def check_special_one(module, path):
                     msg = "Mode computation of stellar locus failed"
                     return msg, code
 
+            if module == "psfex_interp_runner":
+                m = re.search("Key N_EPOCH not found", line)
+                if m:
+                    code = 2
+                    msg = "N_EPOCH not in SEx cat, rerun job 16"
+                    return msg, code
+
+                m = re.search(
+                    "ValueError: cannot reshape array of size 0 into shape",
+                    line,
+                )
+                if m:
+                    code = 3
+                    msg = "found array of size 0"
+                    return msg, code
+
+
     return None, None 
 
 
@@ -485,7 +502,9 @@ def output_missing(
                 ID = match.group()
                 IDs.append(ID)
             else:
-                raise ValueError(f"No ID found in {name}")
+                msg = f"No ID found in {name}"
+                #raise ValueError(msg)
+                print(f"Warning: msg, continuing")
 
 
         ## Count occurences

From e5c8046634477c9ea9e591ff98266de795b43e2f Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 06:58:38 +0000
Subject: [PATCH 197/207] debugging curl canfar

---
 scripts/sh/curl_canfar_local.sh | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh
index 6d67bded1..13e087936 100755
--- a/scripts/sh/curl_canfar_local.sh
+++ b/scripts/sh/curl_canfar_local.sh
@@ -20,7 +20,7 @@ cmd_remote="$HOME/shapepipe/scripts/sh/init_run_exclusive_canfar.sh"
 batch_max=200
 dry_run=0
 mh_local=0
-debug_out=-1
+debug_out="-1"
 
 pat="- "
 
@@ -163,19 +163,20 @@ function call_curl() {
   my_arg=$(set_arg)
 
   if [ "$dry_run" == "0" ]; then
-  
-    my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${my_name}" -d "cmd=$cmd_remote" --data-urlencode "args=${my_arg[@]}"`
-    # &> /dev/null`
+
+    cp ~/sicher.pem ~/.ssl/cadcproxy.pem 
+    my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${my_name}" -d "cmd=$cmd_remote" --data-urlencode "args=${my_arg[@]}" &> /dev/null`
   fi
 
 
   cmd=("curl" "-E" "$SSL" "$SESSION?$RESOURCES" "-d" "image=$IMAGE:$version" "-d" "name=${my_name}" "-d" "cmd=$cmd_remote" "--data-urlencode" "args=\"${my_arg}\"")
 
-  if [ "$debug_out" != "=1" ]; then
+  if [ "$debug_out" != "-1" ]; then
     echo "${pat}call_curl $my_name $my_arg" >> $debug_out
     echo "${pat}Running ${cmd[@]} (dry_run=$dry_run)" >> $debug_out
   fi
   echo "${cmd[@]} (dry_run=$dry_run)"
+  cp ~/sicher.pem ~/.ssl/cadcproxy.pem 
 
 
   # Running $cmd does not work due to unknown problems with passing of args
@@ -288,6 +289,8 @@ else
 
 fi
 
+echo "Done $(basename "$0")" 
+
 if [ "$debug_out" != "-1" ]; then
   echo "${pat}End $(basename "$0")" >> $debug_out
 fi

From c8f657a3a73da362484c37e1200d08defd1c7e8b Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 06:58:58 +0000
Subject: [PATCH 198/207] clarified doc on merging star cat

---
 docs/source/pipeline_canfar.md | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index a0e5b16bc..833278ee5 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -111,13 +111,15 @@ shapepipe_run -c $SP_CONFIG/config_Pl_$psf.ini
 # Convert star cat to WCS
 ## Convert all input validation psf files and create directories par patch
 ## psf_conv_all/P?
-cd star_cat
-convert_psf_pix2world.py -i .. -v -p mccd
+cd ../star_cat
+ ~/shapepipe/scripts/python/convert_psf_pix2world.py -i ../ -P $patch -v
 
 # Combine previously created files within one SP run dir
+cd P$patch
 combine_runs.bash -p psfex -c psf_conv
 
 # Merge all converted star catalogues and create final-starcat.fits
+export SP_RUN=`pwd`
 shapepipe_run -c ~/shapepipe/example/cfis/config_Ms_psfex_conv.ini
 
 

From e0eb0f4fca45d951f85f400eac90358a0885a972 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 07:00:20 +0000
Subject: [PATCH 199/207] Added checks and improved messages for keys in FITS
 files

---
 scripts/python/merge_final_cat.py             | 11 +++++-
 .../merge_starcat_package/merge_starcat.py    | 16 +++++---
 shapepipe/modules/ngmix_package/ngmix.py      | 37 +++++++++++++------
 shapepipe/modules/ngmix_runner.py             |  2 +
 4 files changed, 49 insertions(+), 17 deletions(-)

diff --git a/scripts/python/merge_final_cat.py b/scripts/python/merge_final_cat.py
index e634cd723..ed0b962e8 100755
--- a/scripts/python/merge_final_cat.py
+++ b/scripts/python/merge_final_cat.py
@@ -285,6 +285,7 @@ def get_data(path, hdu_num, param_list):
 
 def main(argv=None):
 
+
     # Set default parameters
     p_def = params_default()
 
@@ -296,18 +297,26 @@ def main(argv=None):
 
     param = update_param(p_def, options)
 
+    if param.verbose:
+        print("Start")
+
     # Save command line arguments to log file
     f_log = cfis.log_command(argv, close_no_return=False)
 
     path = param.input_path
 
+    if param.verbose:
+        print("Read parameter file")
     param.param_list = read_param_file(param.param_path, verbose=param.verbose)
 
     # read (optional) input tile ID file
     if param.tile_ID_list_path:
+        if param.verbose:
+            print("Read tile ID list")
         tile_ID_list = cfis.read_list(param.tile_ID_list_path)
 
-    # find input catalogue FITS files
+    if param.verbose:
+        print("Find input catalogue FITS files")
     l = os.listdir(path=path)
     ext = "fits"
     lpath = []
diff --git a/shapepipe/modules/merge_starcat_package/merge_starcat.py b/shapepipe/modules/merge_starcat_package/merge_starcat.py
index 884c45498..67c258f96 100644
--- a/shapepipe/modules/merge_starcat_package/merge_starcat.py
+++ b/shapepipe/modules/merge_starcat_package/merge_starcat.py
@@ -235,13 +235,14 @@ def process(self):
         my_mask[inside_circle] = True
 
         for name in self._input_file_list:
-            starcat_j = fits.open(name[0], memmap=False)
-
             try:
-                stars = np.copy(starcat_j[self._hdu_table].data["VIGNET_LIST"])
+                starcat_j = fits.open(name[0], memmap=False, ignore_missing_simple=True)
             except ValueError:
                 print(f"Error for file {name[0]}, check FITS file integrity")
-                raise
+                #raise
+                continue
+
+            stars = np.copy(starcat_j[self._hdu_table].data["VIGNET_LIST"])
             stars[stars < -1e6] = 0
             psfs = np.copy(starcat_j[self._hdu_table].data["PSF_VIGNET_LIST"])
 
@@ -542,7 +543,12 @@ def process(self):
         )
 
         for name in self._input_file_list:
-            starcat_j = fits.open(name[0], memmap=False)
+            try:
+                starcat_j = fits.open(name[0], memmap=False, ignore_missing_simple=True)
+            except OSError as e:
+                print(f"Error while opening file '{name[0]}'")
+                #raise
+                continue
 
             data_j = starcat_j[self._hdu_table].data
 
diff --git a/shapepipe/modules/ngmix_package/ngmix.py b/shapepipe/modules/ngmix_package/ngmix.py
index fe471c6a0..9a731d66e 100644
--- a/shapepipe/modules/ngmix_package/ngmix.py
+++ b/shapepipe/modules/ngmix_package/ngmix.py
@@ -323,12 +323,12 @@ def save_results(self, output_dict):
 
 
     @classmethod
-    def check_key(self, expccd_name_tmp, vign_cat[str_id_tmp], path):
-        if expccd_name_tmp not in vign_cat[str_id_tmp]:
+    def check_key(self, expccd_name_tmp, vign_cat, vignet_path):
+        if expccd_name_tmp not in vign_cat:
             raise KeyError(
-                "Key '{expccd_name_tmp}' (exposure CCD ID from PSF postage stamp list)" +
-                + " not found in postage stamp database" +
-                + f" file '{self._vignet_path}'"
+                f"Key '{expccd_name_tmp}' (exposure CCD ID from PSF postage stamp list)"
+                + " not found in postage stamp database"
+                + f" file '{vignet_path}'"
             )
 
     def process(self):
@@ -367,6 +367,7 @@ def process(self):
         id_first = -1
         id_last = -1
 
+        self._w_log.info(f"Processing objects # {self._id_obj_min} ... {self._id_obj_max}")
         for i_tile, id_tmp in enumerate(obj_id):
 
             if self._id_obj_min > 0 and id_tmp < self._id_obj_min:
@@ -385,10 +386,15 @@ def process(self):
             weight_vign = []
             flag_vign = []
             jacob_list = []
-            if psf_vign_cat[str(id_tmp)] == "empty":
+            if psf_vign_cat[str_id_tmp] == "empty":
                 self._w_log.info(f"Skipping object {id_tmp}: empty PSF vignet")
                 continue
-            if gal_vign_cat[str(id_tmp)] == "empty":
+
+            self.check_key(str_id_tmp, gal_vign_cat, self._gal_vignet_path)
+            self.check_key(str_id_tmp, bkg_vign_cat, self._bkg_vignet_path)
+            self.check_key(str_id_tmp, flag_vign_cat, self._flag_vignet_path)
+            self.check_key(str_id_tmp, weight_vign_cat, self._weight_vignet_path)
+            if gal_vign_cat[str_id_tmp] == "empty":
                 self._w_log.info(
                     f"Skipping object {id_tmp}: empty galaxy vignet"
                 )
@@ -397,10 +403,10 @@ def process(self):
             psf_expccd_name = list(psf_vign_cat[str(id_tmp)].keys())
             for expccd_name_tmp in psf_expccd_name:
 
-                check_key(expccd_name_tmp, gal_vign_cat[str_id_tmp], self._gal_vignet_path)
-                check_key(expccd_name_tmp, bkg_vign_cat[str_id_tmp], self._bkg_vignet_path)
-                check_key(expccd_name_tmp, flag_vign_cat[str_id_tmp], self._flag_vignet_path)
-                check_key(expccd_name_tmp, weight_vign_cat[str_id_tmp], self._weight_vignet_path)
+                self.check_key(expccd_name_tmp, gal_vign_cat[str_id_tmp], self._gal_vignet_path)
+                self.check_key(expccd_name_tmp, bkg_vign_cat[str_id_tmp], self._bkg_vignet_path)
+                self.check_key(expccd_name_tmp, flag_vign_cat[str_id_tmp], self._flag_vignet_path)
+                self.check_key(expccd_name_tmp, weight_vign_cat[str_id_tmp], self._weight_vignet_path)
 
                 exp_name, ccd_n = re.split("-", expccd_name_tmp)
 
@@ -408,6 +414,9 @@ def process(self):
                     "VIGNET"
                 ]
                 if len(np.where(gal_vign_tmp.ravel() == 0)[0]) != 0:
+                    self._w_log.info(
+                        f"Skipping exp {expccd_name_tmp} for object {id_tmp}: zero-length galaxy vignet"
+                    )
                     continue
 
                 bkg_vign_tmp = bkg_vign_cat[str_id_tmp][expccd_name_tmp][
@@ -425,6 +434,9 @@ def process(self):
                 flag_vign_tmp[np.where(tile_vign_tmp == -1e30)] = 2**10
                 v_flag_tmp = flag_vign_tmp.ravel()
                 if len(np.where(v_flag_tmp != 0)[0]) / (51 * 51) > 1 / 3.0:
+                    self._w_log.info(
+                        f"Skipping exp {expccd_name_tmp} for object {id_tmp}: mask > 1/3"
+                    )
                     continue
 
                 weight_vign_tmp = weight_vign_cat[str_id_tmp][expccd_name_tmp][
@@ -459,6 +471,9 @@ def process(self):
                 jacob_list.append(jacob_tmp)
 
             if len(gal_vign) == 0:
+                self._w_log.info(
+                    f"Skipping object {id_tmp}: no exposure vignets added"
+                )
                 continue
             try:
                 res = do_ngmix_metacal(
diff --git a/shapepipe/modules/ngmix_runner.py b/shapepipe/modules/ngmix_runner.py
index 80d8e2ea7..9c2c5ca08 100644
--- a/shapepipe/modules/ngmix_runner.py
+++ b/shapepipe/modules/ngmix_runner.py
@@ -66,7 +66,9 @@ def ngmix_runner(
     )
 
     # Process ngmix shape measurement and metacalibration
+    w_log.info("ngmix processing start")
     ngmix_inst.process()
+    w_log.info("ngmix end")
 
     # No return objects
     return None, None

From ba3a0d8107e540c98bc14752f857b3d982e0bcdc Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 07:00:44 +0000
Subject: [PATCH 200/207] debugging curl canfar

---
 scripts/sh/stats_jobs_canfar.sh | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/scripts/sh/stats_jobs_canfar.sh b/scripts/sh/stats_jobs_canfar.sh
index f3db019d0..940b26cbf 100755
--- a/scripts/sh/stats_jobs_canfar.sh
+++ b/scripts/sh/stats_jobs_canfar.sh
@@ -60,6 +60,7 @@ esac
 # Main program
 
 # Get all instances
+echo curl -E $SSL $SESSION
 curl -E $SSL $SESSION &> /dev/null > $tmpfile_jobs
 
 # Get headless job IDs
@@ -71,7 +72,7 @@ cat $tmpfile_jobs | grep headless -B 4 -A 2 | grep Running -A 1 > $tmpfile_ids
 cat $tmpfile_ids | grep name | perl -F\- -ane 'chomp; $F[4] =~ s/[",]//g; print "$F[3].$F[4]"' > $tmpfile_running
 
 # Number of jobs
-n_headless=`cat $tmpfile_ids | wc -l`
+n_headless=`cat $tmpfile_ids | grep Running | wc -l`
 
 if [ "$mode" == "count" ]; then
 
@@ -82,10 +83,13 @@ elif [ "$mode" == "delete" ]; then
   echo -n "Delete $n_headless jobs? [y|n] "
   read answer
   if [ "$answer" == "y" ]; then
+    cat $tmpfile_jobs | grep headless -B 34 -A 6 | grep Running -A 34 | grep id | grep -v user | perl -F\"  -ane 'print "$F[3]\n"' > $tmpfile_ids
     for ID in `cat $tmpfile_ids`; do
       echo $ID
       # Delete headless jobs
-      #curl -X DELETE -E $SSL $SESSION/$ID
+      echo "curl -X DELETE -E $SSL $SESSION/$ID"
+      curl -X DELETE -E $SSL $SESSION/$ID
+      echo $?
     done
   fi
 

From ca7f3e5d1948a80ad36069f61a35954c82ca5f1d Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 07:09:25 +0000
Subject: [PATCH 201/207] Pi psfex HDU number changed

---
 example/cfis/config_Pl_psfex.ini | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/example/cfis/config_Pl_psfex.ini b/example/cfis/config_Pl_psfex.ini
index 932263a18..f1c8904cf 100644
--- a/example/cfis/config_Pl_psfex.ini
+++ b/example/cfis/config_Pl_psfex.ini
@@ -61,7 +61,7 @@ NUMBERING_SCHEME = -0000000
 FILE_PATTERN = full_starcat
 FILE_EXT = .fits
 
-HDU = 2
+HDU = 1
 
 PSF = psfex
 

From e219400061b6d2da7f64b4048f3b54b819f78cf0 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Tue, 8 Oct 2024 07:09:46 +0000
Subject: [PATCH 202/207] cosmetic changes

---
 scripts/sh/job_sp_canfar.bash | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash
index eb02455f5..19c51eafb 100755
--- a/scripts/sh/job_sp_canfar.bash
+++ b/scripts/sh/job_sp_canfar.bash
@@ -181,7 +181,7 @@ export VCP="vcp --certfile=$CERTFILE"
 
 # Print string, executes command, and prints return value.
 function command () {
-  cmd=$1
+   cmd=$1
    str=$2
 
    RED='\033[0;31m'

From 34edaafe459125989191b6c717b399e7aac78986 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 21 Oct 2024 11:44:39 +0000
Subject: [PATCH 203/207] doc canfar: options sp_local=0,1

---
 docs/source/pipeline_canfar.md | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md
index 833278ee5..9f867b85e 100644
--- a/docs/source/pipeline_canfar.md
+++ b/docs/source/pipeline_canfar.md
@@ -35,6 +35,7 @@ rm -rf output/run_sp_Git_*; update_runs_log_file.py
 
 ### Find exposures; this run can be stopped after Fe
 shapepipe_run -c cfis/config_GitFe_symlink.ini
+# You can also run Fe alone
 
 ### Download and move exposures
 
@@ -43,15 +44,15 @@ mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp
 rm -rf output/run_sp_Gie_*
 update_runs_log_file.py
 # repeat the above; or:
-while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp;  ls -l data_exp/ | wc; rm -rf output/run_sp_Git_*; update_runs_log_file.py; done
+while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp;  ls -l data_exp/ | wc; rm -rf output/run_sp_Gie_*; update_runs_log_file.py; done
 # Make sure that after all images are downloaded there is no Gie run. This would
 # mess up later modules since last:get_image_runner could point to this run.
 
 ### Create links (and re-run Fe, not necessary)
 job_sp_canfar.bash -p $psf `cat tile_numbers.txt` -j 1 -r symlink
 
-# Uncompress weights,  split exposures into single HDUs
-job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 2
+# Get single-HDU single-exposure IDs file (from missing 32 job) 
+~/shapepipe/scripts/python/summary_run.py P$patch [32]
 
 # Mask tiles
 
@@ -61,6 +62,19 @@ job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 4
 ## Combine all runs
 combine_runs.bash -c flag_tile
 
+# Tile detection
+curl_canfar_local.sh -j 16 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS
+
+# Option 0, global split and exp masks: sp_local=0
+# Todo: split Uz and SpMh
+
+# For sp_local=- both mh_local (0, 1) are ok
+export mh_local=0
+#export mh_local=1
+
+## Uncompress weights,  split exposures into single HDUs
+job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 2
+
 # Mask exposures
 
 ## Run repeatedly if necessary
@@ -69,17 +83,19 @@ job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 8
 # Combine all runs
 combine_runs.bash -c flag_exp
 
+# Option 1: sp_local=1, local split and mask exp
+export mh_local=1
 
-# Tile detection
-curl_canfar_local.sh -j 16 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS
+# Split exposures
+curl_canfar_local.sh -j 2 -f all.txt -p $psf -N $OMP_NUM_THREADS
 
+# Mask exposures
+curl_canfar_local.sh -j 8 -f all.txt -p $psf -N $OMP_NUM_THREADS
 
 # Exposure detection
-## Get single-HDU single-exposure IDs
-~/shapepipe/scripts/python/summary_run.py
 
 cp summary/missing_job_32_sextractor.txt all.txt
-curl_canfar_local.sh -j 32 -f all.txt -p $psf -N $OMP_NUM_THREADS
+curl_canfar_local.sh -j 32 -m $mh_local -f all.txt -p $psf -N $OMP_NUM_THREADS
 
 # Tile preparation
 curl_canfar_local.sh -j 64 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS

From 96ec184ecc39fdadee612aa6c78dbdfea9da95ea Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 21 Oct 2024 11:45:18 +0000
Subject: [PATCH 204/207] split image config more flexible

---
 example/cfis/config_exp_Sp.ini    | 4 ++--
 example/cfis/config_exp_psfex.ini | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/example/cfis/config_exp_Sp.ini b/example/cfis/config_exp_Sp.ini
index f8ee85757..2ee1676b8 100644
--- a/example/cfis/config_exp_Sp.ini
+++ b/example/cfis/config_exp_Sp.ini
@@ -1,5 +1,5 @@
 # ShapePipe configuration file for single-exposures,
-# split images
+# split images, merge headers
 
 
 ## Default ShapePipe options
@@ -9,7 +9,7 @@
 VERBOSE = True
 
 # Name of run (optional) default: shapepipe_run
-RUN_NAME = run_sp_exp_SpMh
+RUN_NAME = run_sp_exp_Sp
 
 # Add date and time to RUN_NAME, optional, default: True
 RUN_DATETIME = False
diff --git a/example/cfis/config_exp_psfex.ini b/example/cfis/config_exp_psfex.ini
index a5ac5d8a1..22bc877f4 100644
--- a/example/cfis/config_exp_psfex.ini
+++ b/example/cfis/config_exp_psfex.ini
@@ -58,7 +58,8 @@ TIMEOUT = 96:00:00
 [SEXTRACTOR_RUNNER]
 
 # Input from two modules
-INPUT_DIR = last:split_exp_runner, run_sp_Ma_exp:mask_runner
+#INPUT_DIR = last:split_exp_runner, run_sp_Ma_exp:mask_runner
+INPUT_DIR = last:split_exp_runner, last:mask_runner
 
 # Read pipeline flag files created by mask module
 FILE_PATTERN = image, weight, pipeline_flag

From 45384c917669c9b12cc1716f301221c0d740b332 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martin.kilbinger@cea.fr>
Date: Mon, 21 Oct 2024 11:47:12 +0000
Subject: [PATCH 205/207] init_curl script: allowing for individual -j 2, 8
 (sp_local=1)

---
 scripts/jupyter/summary_run.ipynb       |  20 +++-
 scripts/sh/init_run_exclusive_canfar.sh | 124 ++++++++++++++++++------
 scripts/sh/stats_jobs_canfar.sh         |  13 ++-
 3 files changed, 123 insertions(+), 34 deletions(-)

diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb
index f527e4159..44f2f2545 100644
--- a/scripts/jupyter/summary_run.ipynb
+++ b/scripts/jupyter/summary_run.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "id": "130112a4-f2ca-4d26-b884-d8b054676f9c",
    "metadata": {
     "tags": []
@@ -16,12 +16,24 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 1,
    "id": "196beca5-10a1-4cf5-9462-be145167cc70",
    "metadata": {
     "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "ename": "ModuleNotFoundError",
+     "evalue": "No module named 'shapepipe'",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
+      "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mshapepipe\u001b[39;00m\n\u001b[1;32m      2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mshapepipe\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutilities\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msummary\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m\n",
+      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'shapepipe'"
+     ]
+    }
+   ],
    "source": [
     "import shapepipe\n",
     "from shapepipe.utilities.summary import *"
@@ -379,7 +391,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.7.12"
+   "version": "3.11.9"
   }
  },
  "nbformat": 4,
diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh
index 9f8e0d2a9..1faedc767 100755
--- a/scripts/sh/init_run_exclusive_canfar.sh
+++ b/scripts/sh/init_run_exclusive_canfar.sh
@@ -14,6 +14,10 @@ debug_out=-1
 # mh_local is 0 (1) if merge_header_runner is run on all exposures,
 # which is standard so far (run on exposures of given tile only; new)
 mh_local=0
+
+# sp_local is 0 (1) is split_headers_runner and mask_runner is run
+# on all exposures (locally). Not 100% automatic yet. 
+sp_local=1
 VERBOSE=1
 
 pat="-- "
@@ -164,7 +168,7 @@ if [ "$debug_out" != "-1" ]; then
 fi
 
 # Set kind
-job_to_test=16
+job_to_test=2
 kind="none"
 
 # loop over possible job numbers
@@ -180,6 +184,20 @@ while  [ $job_to_test -le 1024 ]; do
         fi
 
         # job=32 -> set kind to exp
+        kind="exp"
+      elif [ $job_to_test == 2 ]; then
+        if [ "$kind" == "tile" ]; then
+          echo "Error: Invalid job $job. mixing tile and exp kinds"
+          exit 6
+        fi
+
+        kind="exp"
+      elif [ $job_to_test == 8 ]; then
+        if [ "$kind" == "tile" ]; then
+          echo "Error: Invalid job $job. mixing tile and exp kinds"
+          exit 6
+        fi
+
         kind="exp"
       else
         if [ "$kind" == "exp" ]; then
@@ -207,11 +225,6 @@ if [ "$dry_run" == 1 ]; then
   echo "in dry run mode"
 fi
 
-#. /opt/conda/etc/profile.d/conda.sh
-# the following line will look for /opt/...
-#conda activate shapepipe
-#conda activate $HOME/.conda/envs/shapepipe
-#CONDA_PREFIX=$HOME/.conda/envs/shapepipe
 CONDA_PREFIX=/arc/home/kilbinger/.conda/envs/shapepipe
 PATH=$PATH:$CONDA_PREFIX/bin
 if [ "$debug_out"  != "-1" ]; then
@@ -257,11 +270,68 @@ fi
 for my_dir in $dir/output/run_sp_[GU]*; do
   command "ln -sf $my_dir" $dry_run
 done
+
 # Combined flags
+
+## Tiles
 command "ln -sf $dir/output/run_sp_Ma_tile" $dry_run
-command "ln -sf $dir/output/run_sp_Ma_exp" $dry_run
-# exp Sp
-command "ln -sf $dir/output/run_sp_exp_SpMh" $dry_run
+
+if [ "$sp_local" == "0" ]; then
+  # Exposures
+  command "ln -sf $dir/output/run_sp_Ma_exp" $dry_run
+else
+  command "rm -f $dir/output/run_sp_Ma_exp" $dry_run
+fi
+
+# Check for existing exp SpMh dir
+if [[ -d "$dir/output/run_sp_exp_SpMh" ]]; then
+  # create link
+  command "ln -sf $dir/output/run_sp_exp_SpMh" $dry_run
+else
+  echo "No global SpMh directory found"
+fi
+
+(( do_job = $job & 2 ))
+if [ $do_job != 0 ] && [ "$sp_local" == "1" ]; then
+  # run local Sp; works only with mh_local=1; this step needs to be done
+  # before following mh_local=1 steps 
+  command "rm -rf run_sp_GitFeGie*" $dry_run
+  command "rm -rf run_sp_Gie*" $dry_run
+  command "rm -rf run_sp_exp_Sp*" $dry_run
+
+  # Create new get_image dir
+  new_dir="run_sp_Gie/get_images_runner_run_2/output"
+  command "rm -rf $new_dir" $dry_run
+  command "mkdir -p $new_dir" $dry_run
+
+  # Link to image, weight, and flag file of current exposure
+
+  # Remove HDU extension
+  command "cd $new_dir" $dry_run
+  exp_ID=$(echo "$ID" | sed 's/-[0-9]\{1,2\}//')
+  for file in $dir/output//run_sp_GitFeGie_20*/get_images_runner_run_2/output/*${exp_ID}* ; do
+    echo $file
+    command "ln -s $file" $dry_run
+  done
+  command "cd ../../.." $dry_run
+
+  # Run Sp
+  cd ..
+  command "update_runs_log_file.py" $dry_run
+  export SP_RUN=`pwd`
+  command "shapepipe_run -c cfis/config_exp_Sp.ini -e $exp_ID" $dry_run
+
+  # Only keep CCD of this ID 
+  command "mkdir -p output/run_sp_exp_Sp_shdu/split_exp_runner/output" $dry_run
+  command "mv output/run_sp_exp_Sp/split_exp_runner/output/*$ID* output/run_sp_exp_Sp_shdu/split_exp_runner/output" $dry_run
+  command "mv output/run_sp_exp_Sp/split_exp_runner/output/headers* output/run_sp_exp_Sp_shdu/split_exp_runner/output" $dry_run
+  command "rm -rf output/run_sp_exp_Sp" $dry_run
+  command "update_runs_log_file.py" $dry_run
+  cd output
+
+  # Exception: Do not carry out actual job call
+  exit 0
+fi
 
 if [ "$mh_local" == "1" ]; then
 
@@ -284,19 +354,19 @@ if [ "$mh_local" == "1" ]; then
 
   echo "Creating local mh file"
 
-  # Remove previous (local) split_exp dir
-  command "rm -rf run_sp_exp_Sp" $dry_run
+  ## Remove previous (local) split_exp dir
+  #command "rm -rf run_sp_exp_Sp" $dry_run
 
-  # Create new split exp run dir
-  new_dir="run_sp_exp_Sp//split_exp_runner/output"
-  command "mkdir -p $new_dir" $dry_run
+  ## Create new split exp run dir
+  #new_dir="run_sp_exp_Sp//split_exp_runner/output"
+  #command "mkdir -p $new_dir" $dry_run
 
-  # Link to all header files of exposures used for the current tile
-  IDs=`echo $ID | tr "." "-"`
-  for exp_ID in `cat run_sp_GitFeGie_*/find_exposures_runner/output/exp_numbers-$IDs.txt` ; do
-    x=`echo $exp_ID | tr -d p `
-    command "ln -s $dir/output/run_sp_exp_SpMh/split_exp_runner/output/headers-$x.npy $new_dir/headers-$x.npy" $dry_run
-  done
+  ## Link to all header files of exposures used for the current tile
+  #IDs=`echo $ID | tr "." "-"`
+  #for exp_ID in `cat run_sp_GitFeGie_*/find_exposures_runner/output/exp_numbers-$IDs.txt` ; do
+    #x=`echo $exp_ID | tr -d p `
+    #command "ln -s $dir/output/run_sp_exp_SpMh/split_exp_runner/output/headers-$x.npy $new_dir/headers-$x.npy" $dry_run
+  #done
 
   # Run merge_headers_runner on local exposure selection
   cd ..
@@ -307,6 +377,13 @@ if [ "$mh_local" == "1" ]; then
 
 fi
 
+(( do_job = $job & 8 ))
+if [ $do_job != 0 ] && [ "$sp_local" == "1" ]; then
+  # Remove previous local Ma runs
+  echo "cdsclient = $CDSCLIENT"
+  command "rm -rf run_sp_exp_Ma*" $dry_run
+fi
+
 (( do_job = $job & 16 ))
 if [[ $do_job != 0 ]]; then
   # Remove previous Sx runs
@@ -334,13 +411,6 @@ if [[ $do_job != 0 ]]; then
   fi
 fi
 
-(( do_job = $job & 256 ))
-if [[ $do_job != 0 ]]; then
-  # Remove previous runs of this job
-  rm -rf run_sp_tile_??ViSmVi_20??_*
-
-fi
-
 (( do_job = $job & 256 ))
 if [[ $do_job != 0 ]]; then
 
diff --git a/scripts/sh/stats_jobs_canfar.sh b/scripts/sh/stats_jobs_canfar.sh
index 940b26cbf..3d1ddb156 100755
--- a/scripts/sh/stats_jobs_canfar.sh
+++ b/scripts/sh/stats_jobs_canfar.sh
@@ -60,8 +60,17 @@ esac
 # Main program
 
 # Get all instances
-echo curl -E $SSL $SESSION
+#echo curl -E $SSL $SESSION
 curl -E $SSL $SESSION &> /dev/null > $tmpfile_jobs
+res=$?
+
+if [ "$res" == "0" ]; then
+  # Number of jobs
+  n_headless=`cat $tmpfile_ids | grep Running | wc -l`
+else
+    # Failure: set to very high number
+    n_headless=10000
+fi
 
 # Get headless job IDs
 #cat $tmpfile_jobs | grep headless -B 4 -A 12 | grep \"id | perl -F\" -ane 'print "$F[3]\n"' > $tmpfile_ids
@@ -71,8 +80,6 @@ cat $tmpfile_jobs | grep headless -B 4 -A 2 | grep Running -A 1 > $tmpfile_ids
 # Get running job info
 cat $tmpfile_ids | grep name | perl -F\- -ane 'chomp; $F[4] =~ s/[",]//g; print "$F[3].$F[4]"' > $tmpfile_running
 
-# Number of jobs
-n_headless=`cat $tmpfile_ids | grep Running | wc -l`
 
 if [ "$mode" == "count" ]; then
 

From f1ed5a803a85e7140e5f38ac71e139fdfafa1361 Mon Sep 17 00:00:00 2001
From: Martin Kilbinger <martin.kilbinger@cea.fr>
Date: Mon, 21 Oct 2024 16:25:05 +0200
Subject: [PATCH 206/207] added vos

---
 environment.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/environment.yml b/environment.yml
index 2f9c2edea..de62b5a37 100644
--- a/environment.yml
+++ b/environment.yml
@@ -27,6 +27,7 @@ dependencies:
     - modopt
     - PyQt5
     - pyqtgraph
+    - python-pysap==0.2.1
     - reproject
     - shear_psf_leakage
     - skaha
@@ -36,5 +37,6 @@ dependencies:
     - termcolor
     - tqdm
     - treecorr
+    - vos
     - git+https://github.com/aguinot/ngmix@stable_version
     - git+https://github.com/tobias-liaudat/Stile@v0.1

From 7944b96ee92f4c444ad3cf7de9a550c919e991b5 Mon Sep 17 00:00:00 2001
From: martinkilbinger <martinkilbinger@cea.fr>
Date: Mon, 21 Oct 2024 16:52:22 +0200
Subject: [PATCH 207/207] added python-pysap to env

---
 environment.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/environment.yml b/environment.yml
index 25bbae252..d7f2d0896 100644
--- a/environment.yml
+++ b/environment.yml
@@ -18,9 +18,11 @@ dependencies:
   - numpy==1.26.4
   - pip:
     - cs_util==0.1
+    - mccd==1.2.4
     - modopt
     - PyQt5
     - pyqtgraph
+    - python-pysap=0.2.1
     - reproject
     - shear_psf_leakage
     - skaha