commit f0f362eeeeb2310fb953aca4ebef69ba4e991f26 Author: Laureηt Date: Fri Jun 23 19:34:09 2023 +0200 init diff --git a/BE/01_RingD/Makefile b/BE/01_RingD/Makefile new file mode 100644 index 0000000..10b9623 --- /dev/null +++ b/BE/01_RingD/Makefile @@ -0,0 +1,17 @@ +MPICC=smpicc +CFLAGS=-g -O4 + +DIR=01_RingD +SRC=ringd + +all: ${SRC} + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +${SRC}: ${SRC}.o + $(MPICC) -o $@ $^ + +clean: + rm -rf *.o ${SRC} diff --git a/BE/01_RingD/ringd.c b/BE/01_RingD/ringd.c new file mode 100644 index 0000000..fdeca44 --- /dev/null +++ b/BE/01_RingD/ringd.c @@ -0,0 +1,136 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + + MPI_Init(&argc, &argv); + + int comm_size; + MPI_Comm_size(MPI_COMM_WORLD, &comm_size); + if (comm_size % 2 != 0) + { + printf("This application is meant to be run with an even number of MPI processes, not %d.\n", comm_size); + MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); + } + + // Get my rank in the global communicator + int my_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + // Determine the colour and key based on whether my rank is even. + char subcommunicator; + int colour; + int key; + if (my_rank % 2 == 0) + { + subcommunicator = 'E'; + colour = 0; + key = my_rank; + } + else + { + subcommunicator = 'O'; + colour = 1; + key = comm_size - my_rank; + } + + // Split of the global communicator + MPI_Comm new_comm; + MPI_Comm_split(MPI_COMM_WORLD, colour, key, &new_comm); + + int my_new_comm_rank, new_comm_size; + // Get my rank in the new communicator + MPI_Comm_rank(new_comm, &my_new_comm_rank); + // Get the size of the new communicator + MPI_Comm_size(new_comm, &new_comm_size); + + // Print my new rank and new communicator + printf("[MPI process %d] I am now MPI process %d in subcommunicator %c.\n", my_rank, my_new_comm_rank, subcommunicator); + + // barriere pour clean un peu le stdout + // MPI_Barrier(MPI_COMM_WORLD); + + int previous, next; + // determine my neighbours according to my rank in my subcommunicator + if (my_new_comm_rank == 0) + { + previous = new_comm_size - 1; + next = my_new_comm_rank + 1; + } + else if (my_new_comm_rank == new_comm_size - 1) + { + previous = my_new_comm_rank - 1; + next = 0; + } + else + { + previous = my_new_comm_rank - 1; + next = my_new_comm_rank + 1; + } + + // printf("[MPI process %d] new %d previous %d next %d in subcommunicator %c.\n", my_rank, my_new_comm_rank, previous, next, subcommunicator); + + float value = 1.0; + MPI_Status status; + + // Even: clockwise + multiplication + if (subcommunicator == 'E') + { + // receive value from previous node + if (my_new_comm_rank != 0) + { + MPI_Recv(&value, 1, MPI_FLOAT, previous, 0, new_comm, &status); + printf("[MPI process %d_%c] RECEIVED from process %d of %d, value = %f\n", my_rank, subcommunicator, my_new_comm_rank, new_comm_size, value); + value = value * 2.0; + printf("[MPI process %d_%c] UPDATE, value = %f\n", my_rank, subcommunicator, value); + } + else + { + printf("[MPI process %d_%c] START, value = %f\n", my_rank, subcommunicator, value); + } + + // send value to next node + if (my_new_comm_rank != new_comm_size - 1) + { + MPI_Send(&value, 1, MPI_FLOAT, next, 0, new_comm); + printf("[MPI process %d_%c] SENT to process %d of %d, value = %f\n", my_rank, subcommunicator, my_new_comm_rank, new_comm_size, value); + } + } + + // Odd: counter-clockwise + division + if (subcommunicator == 'O') + { + // receive value from next node + if (my_new_comm_rank != 0) + { + MPI_Recv(&value, 1, MPI_FLOAT, next, 0, new_comm, &status); + printf("[MPI process %d_%c] RECEIVED from process %d of %d, value = %f\n", my_rank, subcommunicator, my_new_comm_rank, new_comm_size, value); + value = value / 2.0; + printf("[MPI process %d_%c] UPDATE, value = %f\n", my_rank, subcommunicator, value); + } + else + { + printf("[MPI process %d_%c] START, value = %f\n", my_rank, subcommunicator, value); + } + + // send value to previous node + if (my_new_comm_rank != 1) + { + MPI_Send(&value, 1, MPI_FLOAT, previous, 0, new_comm); + printf("[MPI process %d_%c] SENT to process %d of %d, value = %f\n", my_rank, subcommunicator, my_new_comm_rank, new_comm_size, value); + } + } + + // barrière pour clean un peu le stdout + // MPI_Barrier(MPI_COMM_WORLD); + + // the end + printf("[MPI process %d_%c] The End\n", my_rank, subcommunicator); + + // Free the communicator + MPI_Finalize(); + + return EXIT_SUCCESS; +} diff --git a/BE/02_normA/Makefile b/BE/02_normA/Makefile new file mode 100644 index 0000000..41566df --- /dev/null +++ b/BE/02_normA/Makefile @@ -0,0 +1,17 @@ +MPICC=smpicc +CFLAGS=-g -O4 + +DIR=02_normA +SRC=normA + +all: ${SRC} + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +${SRC}: ${SRC}.o + $(MPICC) -o $@ $^ + +clean: + rm -rf *.o ${SRC} ${DIR} diff --git a/BE/02_normA/normA.c b/BE/02_normA/normA.c new file mode 100644 index 0000000..e195a81 --- /dev/null +++ b/BE/02_normA/normA.c @@ -0,0 +1,159 @@ +#include +#include +#include +#include + +void multAv(double x[], double *A, double y[], int m, int n); + +void init0(double x[], int n); + +double dot(double x[], double y[], int n); + +int main(int argc, char *argv[]) +{ + int size; + int const n = 12; + int my_rank; + double local_dot, global_dot, normA, reference; + + MPI_Init(&argc, &argv); + + // Get number of processes and check that 4 processes are used + MPI_Comm_size(MPI_COMM_WORLD, &size); + if (size != 4) + { + printf("This application is meant to be run with 4 MPI processes.\n"); + MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); + } + + // Get my rank + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + // Declaration and Initialization of A (one for all components) + // the blocking on rows, b, is the same for all nodes + // (if you don't change the constants) + int b = n / size; + double *A; + + A = (double *)malloc(b * n * sizeof(double)); + + for (int i = 0; i < b; i++) + { + for (int j = 0; j < n; j++) + { + A[i * n + j] = 1.0; + reference = 66.000000; // sum_{i=1}^{12-1} + + // A[i*n + j] = (double) my_rank; + // reference = 97.488461; + + // A[i*n + j] = (double) my_rank*(i+1)+(j+1); + // reference = 239.899979; + + // printf("Process [%d], A[%d][%d] = %f\n", my_rank, i, j, A[i*n+j]); + } + } + + // reference vector to verify that the global vector is correct + double v_ref[n]; + for (int i = 0; i < n; i++) + { + v_ref[i] = (double)i; + } + + // local vector + double x_local[b]; + for (int i = 0; i < b; i++) + { + x_local[i] = (double)b * my_rank + i; + // printf("Process [%d], v_local[%d] = %f\n", my_rank, i, v_local[i]); + } + + // global vector + double x_global[n]; + init0(x_global, n); + + // Use a collective communication in order to gather on ALL the nodes the + // part of the local vector into the global vector + MPI_Allgather(x_local, b, MPI_DOUBLE, x_global, b, MPI_DOUBLE, MPI_COMM_WORLD); + + // the node 2 checks if the global vector is correct (should be 0 for all components) + if (my_rank == 2) + { + for (int i = 0; i < n; i++) + { + printf("Process [%d], vérif[%d] = %f\n", my_rank, i, x_global[i] - v_ref[i]); + } + } + + MPI_Barrier(MPI_COMM_WORLD); + + // vector y_local = A * x_global + double y_local[b]; + init0(y_local, b); + + // Perform the multiplication + multAv(y_local, A, x_global, b, n); + + // each node displays y (with A, full of ones, all the components of x + // should be the same) + for (int i = 0; i < b; i++) + { + printf("Process [%d] y_local[%d] = %f\n", my_rank, i, y_local[i]); + } + + // Perform the dot product on the local x + local_dot = dot(x_local, y_local, b); + printf("Process [%d] local dot %f\n", my_rank, local_dot); + + // Use one single collective communication to perfom the reduction in + // global_dot + MPI_Allreduce(&local_dot, &global_dot, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + + // the norm is the square root of the global_dot + normA = sqrt(global_dot); + + // Another node displays the norm + if (my_rank == 2) + { + printf("Process [%d] normA = %f, reference = %f\n", my_rank, normA, reference); + } + + MPI_Finalize(); + + return EXIT_SUCCESS; +} + +void multAv(double x[], double *A, double y[], int m, int n) +{ + for (int i = 0; i < m; i++) + { + x[i] = 0.0; + for (int j = 0; j < n; j++) + { + x[i] += A[i * n + j] * y[j]; + } + } + return; +} + +void init0(double x[], int n) +{ + for (int i = 0; i < n; i++) + { + x[i] = 0.0; + } + return; +} + +double dot(double x[], double y[], int n) +{ + double res = 0.0; + + for (int i = 0; i < n; i++) + { + res += x[i] * y[i]; + } + + return res; +} diff --git a/BE/03_overmean/Makefile b/BE/03_overmean/Makefile new file mode 100644 index 0000000..f27d306 --- /dev/null +++ b/BE/03_overmean/Makefile @@ -0,0 +1,18 @@ +MPICC=smpicc +CFLAGS=-g -O4 + + +DIR=03_overmean +SRC=overmean + +all: ${SRC} + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +${SRC}: ${SRC}.o + $(MPICC) -o $@ $^ + +clean: + rm -rf *.o ${SRC} ${DIR} diff --git a/BE/03_overmean/overmean.c b/BE/03_overmean/overmean.c new file mode 100644 index 0000000..f6f78f6 --- /dev/null +++ b/BE/03_overmean/overmean.c @@ -0,0 +1,120 @@ +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + // comment this line, if you want the same vector for each run + srand(time(NULL)); + + MPI_Init(&argc, &argv); + + // Get number of processes + int nb_process; + MPI_Comm_size(MPI_COMM_WORLD, &nb_process); + + // Fix root's rank + int root_rank = 0; + + // Get my rank + int my_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + // global size (only the root know its value) + int global_size = 0; + // local size (we fix this value in order to be regular) + int local_size = 3; + // local vector + int *local_vector = NULL; + int *global_vector = NULL; + + // root process + if (my_rank == root_rank) + { + global_size = nb_process * local_size; // to be able to split + // the global vector into sub-vectors + // with the same size + printf("global_size = %d\n", global_size); + global_vector = (int *)malloc(sizeof(int) * global_size); + for (int i = 0; i < global_size; i++) + { + // global_vector[i] = i; + global_vector[i] = rand() % 101; + printf("global_vector[%d] = %d\n", i, global_vector[i]); + } + } + + // Each process gets its part of the global vector + local_vector = (int *)malloc(sizeof(int) * local_size); + MPI_Scatter(global_vector, local_size, MPI_INT, local_vector, local_size, MPI_INT, root_rank, MPI_COMM_WORLD); + + // print the local vector + for(int i = 0; i < local_size; i++) + { + printf("[%d] local_vector[%d] = %d\n", my_rank, i, local_vector[i]); + } + + // barriere pour clean un peu le stdout + // MPI_Barrier(MPI_COMM_WORLD); + + // compute the local sum + int local_sum = 0.0; + for (int i = 0; i < local_size; i++) + { + local_sum += local_vector[i]; + } + printf("Process %d computed its local sum = %d.\n", my_rank, local_sum); + + // compute the global sum by a reduction + int global_sum; + MPI_Reduce(&local_sum, &global_sum, 1, MPI_INT, MPI_SUM, root_rank, MPI_COMM_WORLD); + + // print the global sum + if (my_rank == root_rank) { + printf("Process %d got the global sum = %d.\n", my_rank, global_sum); + } + + // barriere pour clean un peu le stdout + // MPI_Barrier(MPI_COMM_WORLD); + + float mean; // float!! + + // the root computes the mean (only one to know the global size) + if (my_rank == root_rank) + { + mean = ((float)global_sum) / global_size; + printf("Process %d computed the mean = %f.\n", my_rank, mean); + } + + // broadcast of the mean to all process + MPI_Bcast(&mean, 1, MPI_FLOAT, root_rank, MPI_COMM_WORLD); + + // print the mean + printf("Process %d got the mean = %f.\n", my_rank, mean); + + // barriere pour clean un peu le stdout + // MPI_Barrier(MPI_COMM_WORLD); + + // compute the number of values (from the local vector) over the mean + int local_number = 0; + for (int i = 0; i < local_size; i++) + { + if (local_vector[i] >= mean) + local_number++; + } + printf("Process %d has %d values over the mean.\n", my_rank, local_number); + + // reduce these numbers on root process + int over_the_mean; + MPI_Reduce(&local_number, &over_the_mean, 1, MPI_INT, MPI_SUM, root_rank, MPI_COMM_WORLD); + + // print the total number of values over the mean + if (my_rank == root_rank) { + printf("the total number of values over the mean is %d.\n", over_the_mean); + } + + MPI_Finalize(); + + return EXIT_SUCCESS; +} diff --git a/BE/04_n-corps/n-corps.md b/BE/04_n-corps/n-corps.md new file mode 100644 index 0000000..dce1aff --- /dev/null +++ b/BE/04_n-corps/n-corps.md @@ -0,0 +1,170 @@ +# Exercice 4 : problème aux N-corps + +Ce fichier fait partie du rendu évalué pour le BE de Calcul parallèle. + +## Question 1 + +Déterminer quels calculs peuvent être parallélisés et quelles communications mettre en place dans le code séquentiel suivant. Proposer une réécriture parallèle avectransmission de messages de ce code. + +``` +variables : force[1,...,N], data[1,...,N] +for t in 1, nb_steps do + for i in 1, N do + force[i] = 0 + for j in 1, N do + force[i] = force[i] + interaction(data[i], data[j]) + end for + end for + for i in 1, N do + data[i] = update(data[i], force[i]) + end for +end for +``` + +### Réponse Q2 + +On suppose que l'on possède K processus, tels que N divise K. +Par exemple K = 2N. + +```C +variables (globales) : K, N, ratio +variables (locales) : ik, force[1,...,ratio] +variables : data[1,...,N] + +// data est à la fois globale et locale car on le communique entre les processus + +ratio = K / N + +// Chaque processus k va s'occuper de `ratio` corps +// par exemple si `ratio` = 2 +// processus 0 -> corps 0 + corps 1 +// processus 1 -> corps 2 + corps 3 +// ... + +// Chaque processus doit connaitre `data` +// (seul le process 0 connait `data` au début) +// -> Broadcast data from 0 to all + +// cette boucle n'est pas parallélisable +// on a besoin de t-1 pour calculer t +for t in 1, nb_steps do + + ik = 0 + + // cette boucle est parralélisable + // dans le code on va "split" `N` par paquets de `ratio` + for i in 1, N do + if je_mocuppe_de_ce_corps(i, N, K) // on peut split de cette manière + + // on reset les forces + force[ik] = 0 + + // on calcule la force totale des corps qu'on s'occupe + for j in 1, N do + force[ik] = force[ik] + interaction(data[i], data[j]) + end for + + // on update notre `data` local + data[i] = update(data[i], force[ik]) + ik++ + + end if + end for + + // une fois chaque `data` updaté localement (dans chaque processus) + // il faut rassembler toutes ces infos + // -> All_Gather des data locaux + // on obtient un `data` synchronisé entre tous les processus, + // comme lors du premier broadcast + +end for +``` + +## Question 2 + +Proposer une version parallèle du code suivant. + +``` +variables : force[1,...,N], data[1,...,N] +for t in 1, nb_steps do + for i in 1, N do + force[i] = 0 + end for + for i in 1, N do + for j in 1, i-1 do + f = interaction(data[i],data[j]) + force[i] = force[i] + f + force[j] = force[j] - f + end for + end for + for i in 1, N do + data[i] = update(data[i], force[i]) + end for +end for +``` + +### Réponse Q2 + + +```C +variables (globales) : force[1,...,N], data[1,...,N] + +// Chaque processus doit connaitre `data` +// (seul le process 0 connait `data` au début) +// -> Broadcast data from 0 to all + +// cette boucle n'est pas parallélisable +// on a besoin de t-1 pour calculer t +for t in 1, nb_steps do + + // on calcul les forces (plus efficacement) + // on effectue N(N-1)/2 appels à `interaction` + for i in 1, N do + if je_mocuppe_de_ce_corps(i, N, K) // je m'occupe de cette "colonne" + + // on reset les forces + force[i] = 0 + + // on calcule la force totale des corps qu'on s'occupe + for j in 1, i-1 do + f = interaction(data[i],data[j]) + force[i] = force[i] + f + force[j] = force[j] - f + end for + + // on reduce les forces que l'on a calculé pour chaque corps + // -> All_reduce + + // on update notre `data` local + data[i] = update(data[i], force[i]) + end if + end for + + // une fois chaque `data` updaté localement (dans chaque processus) + // il faut rassembler toutes ces infos + // -> All_Gather des data locaux + // on obtient un `data` synchronisé entre tous les processus, + // comme lors du premier broadcast + +end for +``` + +## Question 3 + +Quels sont les inconvénients de cette version ? +Proposer une solution pour les atténuer. + +### Réponse Q3 + +L'inconvénient de cette version est que l'on doit désormais répartir des calculs "en triangle". En effet puisque l'on ne calcul aucune redondance de interaction, on effectue les calculs suivants: + +| | 0 | 1 | 2 | 3 | +|:-:|:-:|:-:|:-:|:-:| +| 0 | | x | x | x | +| 1 | | | x | x | +| 2 | | | | x | +| 3 | | | | | + +On doit alors effectuer $\frac{N(N-1)}2$ calculs, ce qui est plus compliqué à répartir sur $K = \frac{N}{ratio}$ processus. La manière naïve que j'ai utilisé pour paralléliser le code Question 2 est sous optimal puisque la chaque de calcul entre chaque processus n'est pas égal. + +Une manière plus efficace serait, un peu comme dans openMP, de créer des tasks pour chaque calcul de `interaction` et de répartir uniformément ces tasks entre chaque processus. diff --git a/BE/Makefile b/BE/Makefile new file mode 100644 index 0000000..8a0b0ca --- /dev/null +++ b/BE/Makefile @@ -0,0 +1,11 @@ +SOURCES=01_RingD 02_normA 03_overmean 04_n-corps + +all: collect + + +collect: + echo ${USER} + (cd 01_RingD; make clean) + (cd 02_normA; make clean) + (cd 03_overmean; make clean) + tar cvf Calcul_${USER}_`hostname | cut -d'.' -f1`.tar ${SOURCES} diff --git a/BE/init.sh b/BE/init.sh new file mode 100644 index 0000000..2051436 --- /dev/null +++ b/BE/init.sh @@ -0,0 +1,6 @@ +#!/bin/bash +SIMGRID=/mnt/n7fs/ens/tp_guivarch/opt2021/simgrid-3.31 + +export PATH=${SIMGRID}/bin:${PATH} + +alias smpirun="smpirun -hostfile ${SIMGRID}/archis/cluster_hostfile.txt -platform ${SIMGRID}/archis/cluster_crossbar.xml" diff --git a/TP1/00_Who_am_i/Makefile b/TP1/00_Who_am_i/Makefile new file mode 100644 index 0000000..4208ce4 --- /dev/null +++ b/TP1/00_Who_am_i/Makefile @@ -0,0 +1,15 @@ +MPICC=smpicc +CFLAGS=-g -O4 + +all: who_am_i + +clean: + rm -f *.o who_am_i + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +who_am_i: who_am_i.o + $(MPICC) -o $@ $^ + diff --git a/TP1/00_Who_am_i/who_am_i.c b/TP1/00_Who_am_i/who_am_i.c new file mode 100644 index 0000000..42fad59 --- /dev/null +++ b/TP1/00_Who_am_i/who_am_i.c @@ -0,0 +1,26 @@ +#include +#include + +int main( int argc, char *argv[] ) { + + int rank, size; + int l; + char name[MPI_MAX_PROCESSOR_NAME]; + + MPI_Init( &argc, &argv ); + + // Get rank + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + // Get size + MPI_Comm_size(MPI_COMM_WORLD, &size); + + // Get name + MPI_Get_processor_name (name , &l); + + printf("Hello world from process %d of %d on processor named %s\n", rank, size, name); + + MPI_Finalize(); + + return 0; +} diff --git a/TP1/01_Ring/Makefile b/TP1/01_Ring/Makefile new file mode 100644 index 0000000..0539fcd --- /dev/null +++ b/TP1/01_Ring/Makefile @@ -0,0 +1,14 @@ +MPICC=smpicc +CFLAGS=-g -O4 + +all: ring + +clean: + rm -rf *.o ring + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +ring: ring.o + $(MPICC) -o $@ $^ diff --git a/TP1/01_Ring/ring.c b/TP1/01_Ring/ring.c new file mode 100644 index 0000000..5209989 --- /dev/null +++ b/TP1/01_Ring/ring.c @@ -0,0 +1,74 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + + int value; + int my_rank, size; + int previous, next; + MPI_Status status; + + MPI_Init(NULL, NULL); + + // Get number of processes + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + // determine my neighbours according to my rank + if (my_rank == 0) + { + previous = size - 1; + next = my_rank + 1; + } + else if (my_rank == size - 1) + { + previous = my_rank - 1; + next = 0; + } + else + { + previous = my_rank - 1; + next = my_rank + 1; + } + + value = 1; + + // The nodes, starting with node 0, transmit the value to each other, + // each time multiplying it by 2. + // At the end of the transmission, node 0 receives the value 2^(size-1) + // + // Instruction: before each send and after each receive, each node displays + // - its rank + // - the type communication (send, recv) + // - the value + + // receive value from previous node + if (my_rank != 0) + { + MPI_Recv(&value, 1, MPI_INT, previous, 0, MPI_COMM_WORLD, &status); + printf("RECEIVED from process %d of %d, value = %d\n", my_rank, size, value); + value = value * 2; + } + else + { + printf("START, value = %d\n", value); + } + + printf("SENDING from process %d of %d, value = %d\n", my_rank, size, value); + + // send value to next node + if (my_rank != size - 1) + { + MPI_Send(&value, 1, MPI_INT, next, 0, MPI_COMM_WORLD); + } + else + { + printf("The End, value = %d\n", value); + } + + MPI_Finalize(); + + return EXIT_SUCCESS; +} diff --git a/TP1/02_Limite/Makefile b/TP1/02_Limite/Makefile new file mode 100644 index 0000000..950470c --- /dev/null +++ b/TP1/02_Limite/Makefile @@ -0,0 +1,14 @@ +MPICC=smpicc +CFLAGS=-g -O4 + +all: limite + +clean: + rm -rf *.o limite + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +limite: limite.o + $(MPICC) -Dhave_mpi -o $@ $^ diff --git a/TP1/02_Limite/limite.c b/TP1/02_Limite/limite.c new file mode 100644 index 0000000..ad3e108 --- /dev/null +++ b/TP1/02_Limite/limite.c @@ -0,0 +1,86 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ + + int size; + int my_rank; + int data_size = -100; + int *buffer_send, *buffer_recv; + int tag; + MPI_Status status; + int l; + char name[MPI_MAX_PROCESSOR_NAME]; + + // Make sure that the command line has one argument (the size of the data) + + if (argc != 2) + { + printf("usage : limite \n"); + return EXIT_FAILURE; + } + + MPI_Init(&argc, &argv); + + // Make sure exactly 2 MPI processes are used + MPI_Comm_size(MPI_COMM_WORLD, &size); + if (size != 2) + { + printf("%d MPI processes used, please use 2.\n", size); + MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); + } + + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + MPI_Get_processor_name(name, &l); + printf("process %d of %d on processor named %s\n", my_rank, size, name); + + // Prepare parameters + + data_size = atoi(argv[1]); + printf("The size of the data is %d\n", data_size); + + buffer_send = (int *)malloc(data_size * sizeof(int)); + buffer_recv = (int *)malloc(data_size * sizeof(int)); + buffer_send[0] = (my_rank == 0) ? 12345 : 67890; + + tag = 0; + + if (my_rank == 0) + { + // node 0 sends its buffer buffer_send of size data_size to node 1 + MPI_Send(buffer_send, data_size, MPI_INT, 1, tag, MPI_COMM_WORLD); + // node 0 receives in its buffer buffer_recv data from node 1 + MPI_Recv(buffer_recv, data_size, MPI_INT, 1, tag, MPI_COMM_WORLD, &status); + printf("MPI process %d received value %d from MPI process %d.\n", my_rank, buffer_recv[0], 1); + } + else + { + // node 1 sends its buffer buffer_send of size data_size to node 0 + MPI_Send(buffer_send, data_size, MPI_INT, 0, tag, MPI_COMM_WORLD); + // node 1 receives in its buffer buffer_recv data from node 0 + MPI_Recv(buffer_recv, data_size, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); + printf("MPI process %d received value %d from MPI process %d.\n", my_rank, buffer_recv[0], 0); + } + + free(buffer_send); + free(buffer_recv); + + MPI_Finalize(); + + return EXIT_SUCCESS; +} + +// (a) rappelez pour quelle taille de message (petite, grande), MPI Send aura un comportement asynchrone (resp. synchrone) +// -> + +// (b) que va-t-il se passer quand votre programme, compl ́et ́e comme indiqu ́e, sera appel ́e avec une taille de message qui fera que MPI Send sera synchrone ? +// -> deadlock, on passe en synchrone + +// (c) estimez `a 10 entiers pr`es, la taille limite sur deux noeuds du mˆeme ordinateur ? +// -> 16383 + +// (d) proposez une solution pour que l’ ́echange entre les deux noeuds puissent se faire au del`a de cette limite (plusieurs r ́eponses possibles). Vous avez la possibilit ́e de les tester en dehors de la s ́eance. +// -> découper le buffer de telle manière à n'envoyer que des petits buffers en asynchrone +// -> changer ordre send/recv du deuxième noeud \ No newline at end of file diff --git a/TP1/03_Dot/Makefile b/TP1/03_Dot/Makefile new file mode 100644 index 0000000..96194db --- /dev/null +++ b/TP1/03_Dot/Makefile @@ -0,0 +1,14 @@ +MPICC=smpicc +CFLAGS=-g -O4 + +all: dotp + +clean: + rm -rf *.o dotp + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +dotp: dotp.o + $(MPICC) -o $@ $^ -lm diff --git a/TP1/03_Dot/dotp.c b/TP1/03_Dot/dotp.c new file mode 100644 index 0000000..cafa627 --- /dev/null +++ b/TP1/03_Dot/dotp.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include + +// perform the dot product between the two vectors x and y of size n +float dot(float x[], float y[], int n); + +int main(int argc, char *argv[]) +{ + + int const local_data_size = 5; + float local_x[local_data_size], local_y[local_data_size]; + float local_dot, global_dot1, global_dot2, reference; + int borne; + + int my_rank, size; + + MPI_Init(NULL, NULL); + + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + borne = size * local_data_size - 1; + reference = (float)(borne * (borne + 1) * (2 * borne + 1) / 6); + + // Initialization of both local vectors with the same values + // the global vectors would be [0, 1, ..., local_data_size -1] + for (int i = 0; i < local_data_size; i++) + { + local_x[i] = (float)(local_data_size * my_rank + i); + local_y[i] = (float)(local_data_size * my_rank + i); + // printf("[MPI process %d] value[%d]: %f\n", my_rank, i, local_x[i]); + } + + local_dot = dot(local_x, local_y, local_data_size); + + printf("[MPI process %d] my local dot product: %f\n", my_rank, local_dot); + + /* Two-step operation */ + + global_dot1 = 0.0; + + // Step 1 + // Use a collective communication to compute the global dot product + // in such a way that the node 0 gets this value + MPI_Reduce(&local_dot, &global_dot1, 1, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); + + // Node 0 displays the global value and the reference (sum of first integer ^ 2) + if (my_rank == 0) + { + printf("[MPI process %d] *Two-step collective operation* global dot product: %f == %f\n", my_rank, global_dot1, reference); + } + + // Step 2 + // Use a collective communication to broadcast the global value on each node + MPI_Bcast(&global_dot1, 1, MPI_FLOAT, 0, MPI_COMM_WORLD); + + // A node i (i different from 0) displays the global value + if (my_rank != 0) + { + printf("[MPI process %d] *Two-step collective operation* global dot product: %f == %f\n", my_rank, global_dot1, reference); + } + + /* One-step operation */ + + global_dot2 = 0; + + // Step 3 + // Now use one single collective communication to perfom both step 1 and 2 + MPI_Allreduce(&local_dot, &global_dot2, 1, MPI_FLOAT, MPI_SUM, MPI_COMM_WORLD); + + // Another node displays the global value + printf("[MPI process %d] *One-step collective operation* global dot product: %f == %f\n", my_rank, global_dot2, reference); + + MPI_Finalize(); + + return EXIT_SUCCESS; +} + +float dot(float x[], float y[], int n) +{ + float res = 0.0; + + for (int i = 0; i < n; i++) + { + res += x[i] * y[i]; + } + + return res; +} diff --git a/TP1/04_Mult/Makefile b/TP1/04_Mult/Makefile new file mode 100644 index 0000000..127a06f --- /dev/null +++ b/TP1/04_Mult/Makefile @@ -0,0 +1,14 @@ +MPICC=smpicc +CFLAGS=-g -O4 + +all: MultAv + +clean: + rm -rf *.o MultAv + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +MultAv: MultAv.o + $(MPICC) -o $@ $^ diff --git a/TP1/04_Mult/MultAv.c b/TP1/04_Mult/MultAv.c new file mode 100644 index 0000000..3cb0ca9 --- /dev/null +++ b/TP1/04_Mult/MultAv.c @@ -0,0 +1,119 @@ +#include +#include +#include + +void multAv(double x[], double *A, double y[], int m, int n); + +void init0(double x[], int n); + +int main(int argc, char *argv[]) +{ + int size; + int const n = 12; + int my_rank; + MPI_Init(&argc, &argv); + + // Get number of processes and check that 4 processes are used + MPI_Comm_size(MPI_COMM_WORLD, &size); + if (size != 4) + { + printf("This application is meant to be run with 4 MPI processes.\n"); + MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); + } + + // Get my rank + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + // Declaration and Initialization of A (one for all components) + // the number of bloc of lines, b, is the same for all node + // (if you don't change the constants) + int b = n / size; + double *A; + + A = (double *)malloc(b * n * sizeof(double)); + + for (int i = 0; i < b; i++) + { + for (int j = 0; j < n; j++) + { + A[i * n + j] = 1.0; + // A[i*n + j] = (double) my_rank; + // A[i*n + j] = (double) my_rank*(i+1)+(j+1); + // printf("Process [%d], A[%d][%d] = %f\n", my_rank, i, j, A[i*n+j]); + } + } + + // reference vector to verify that the global vector is correct + double v_ref[n]; + for (int i = 0; i < n; i++) + { + v_ref[i] = (double)i; + } + + // local vector + double v_local[b]; + for (int i = 0; i < b; i++) + { + v_local[i] = (double)b * my_rank + i; + // printf("Process [%d], v_local[%d] = %f\n", my_rank, i, v_local[i]); + } + + // global vector + double v_global[n]; + init0(v_global, n); + + // Use a collective communication in order to gather on ALL the nodes the + // part of the local vector into the global vector + + MPI_Allgather(v_local, b, MPI_DOUBLE, v_global, b, MPI_DOUBLE, MPI_COMM_WORLD); + + // the node 2 checks if the global vector is correct + if (my_rank == 2) + { + for (int i = 0; i < n; i++) + { + printf("Process [%d], vérif[%d] = %f\n", my_rank, i, v_global[i] - v_ref[i]); + } + } + + MPI_Barrier(MPI_COMM_WORLD); + + // vector x_loc = A * v_global + double x_loc[b]; + init0(x_loc, b); + + // Perform the multiplication + multAv(x_loc, A, v_global, b, n); + + // each node displays x (with A, full of ones, all the components of x should be the same) + for (int i = 0; i < b; i++) + { + printf("Process [%d], x_loc[%d] = %f\n", my_rank, i, x_loc[i]); + } + + MPI_Finalize(); + + return EXIT_SUCCESS; +} + +void multAv(double x[], double *A, double y[], int m, int n) +{ + for (int i = 0; i < m; i++) + { + x[i] = 0.0; + for (int j = 0; j < n; j++) + { + x[i] += A[i * n + j] * y[j]; + } + } + return; +} + +void init0(double x[], int n) +{ + for (int i = 0; i < n; i++) + { + x[i] = 0.0; + } + return; +} diff --git a/TP1/05_CG/CG_par b/TP1/05_CG/CG_par new file mode 100755 index 0000000..54d3b9b Binary files /dev/null and b/TP1/05_CG/CG_par differ diff --git a/TP1/05_CG/CG_par.c b/TP1/05_CG/CG_par.c new file mode 100644 index 0000000..7d6f520 --- /dev/null +++ b/TP1/05_CG/CG_par.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include + +#include "util.h" + +void cg_par(double *A_local, double *rhs_local, int N, int b, float tol) +{ + + int size; + int my_rank; + + // Get number of processes + MPI_Comm_size(MPI_COMM_WORLD, &size); + + // Get my rank + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + //**************** Parallel CG (M == N) + int num_it, max_it; + double x[b], r[b], Ap[b]; + double p_local[b], p_global[N]; + double nr_global, nr_local; + double np2_global, np2_local; + double epsilon; + double alpha, beta; + + max_it = 100; + + // initialization of the solution (local vector) + for (int i = 0; i < b; i++) + { + x[i] = 0.0; + } + + // compute the global norm of the rhs_local (dot product, then sqrt); + // all the nodes must have this value + nr_local = dot(rhs_local, rhs_local, b); + MPI_Allreduce(&nr_local, &nr_global, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + nr_global = sqrt(nr_global); + // if (my_rank == 0) printf("nr = %lg\n", nr_global); + + // threshold of the CG + epsilon = tol * nr_global; + + // Initialization of p_local and r (local vectors) + copy_v(p_local, rhs_local, b); + copy_v(r, rhs_local, b); + + // number of iterations + num_it = 0; + + printf("num_it %d -- epsilon %lg -- nr_global %lg\n", num_it, epsilon, nr_global); + + while ((nr_global > epsilon) && (num_it < max_it)) + { + + // Compute the local vector Ap = A_local*p_global + // => gather p_local vectors to p_global + MPI_Allgather(p_local, b, MPI_DOUBLE, p_global, b, MPI_DOUBLE, MPI_COMM_WORLD); + + // display p_global + if (my_rank == 0) + printf("p_global = %lg\n", p_global); + + // do the matrix-vector multiplication + multAv(Ap, A_local, p_global, b, N); + + // compute the global dot product np2_global = (Ap_global, p_global) + // all the node must have this value + np2_local = dot(p_local, Ap, b); + MPI_Allreduce(&np2_local, &np2_global, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + if (my_rank == 0) + printf("np2 = %lg\n", np2_global); + + // alpha + alpha = (nr_global * nr_global) / np2_global; + // if(my_rank == 0) printf("alpha = %lg\n", alpha); + + // compute the new x and r (local vectors) + axpy(alpha, x, p_local, b); + axpy(-alpha, r, Ap, b); + + // compute the global norm of the residual (dot product, then sqrt); + // all the nodes must have this value + nr_local = dot(r, r, b); + MPI_Allreduce(&nr_local, &nr_global, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + nr_global = sqrt(nr_global); + // if(my_rank == 0) printf("nr = %lg\n", nr_global); + + // beta + beta = (nr_global * nr_global) / (alpha * np2_global); + // if(my_rank == 0) printf("beta = %lg\n", beta); + + // compute the new p_local (local vector) + xpay(beta, r, p_local, b); + + // increase the number of iterations + num_it++; + + // if(my_rank == 0) printf("num_it %d -- nr_global %lg\n", num_it, nr_global); + } + + free(A_local); + + // gather the solution on the node 0 + double x_global[N]; + MPI_Gather(x, b, MPI_DOUBLE, x_global, b, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + // display the solution + if (my_rank == 0) + { + for (int i = 0; i < N; i++) + { + printf("x[%d] = %lg\n", i, x_global[i]); + } + } + + return; +} diff --git a/TP1/05_CG/CG_par.h b/TP1/05_CG/CG_par.h new file mode 100644 index 0000000..f436ded --- /dev/null +++ b/TP1/05_CG/CG_par.h @@ -0,0 +1 @@ +void cg_par(double *A_local, double *rhs, int N, int b, float tol); diff --git a/TP1/05_CG/CG_sq.c b/TP1/05_CG/CG_sq.c new file mode 100644 index 0000000..b770fd5 --- /dev/null +++ b/TP1/05_CG/CG_sq.c @@ -0,0 +1,85 @@ +#include +#include +#include + +#include "util.h" + +void cg_sq(double *A, double *rhs, int N, double tol) +{ + + int num_it, max_it; + double x[N], p[N], r[N], Ap[N]; + double nr; + double epsilon; + double np2, alpha, beta; + + max_it = 100; + + // initialization of the solution + for (int i = 0; i < N; i++) + { + // b[i] = (float) i; + x[i] = 0.0; + } + + // compute the norm of the rhs (dot product, then sqrt) + nr = dot(rhs, rhs, N); + nr = sqrt(nr); + printf("nr = %lg\n", nr); + + // threshold of the CG + epsilon = tol * nr; + + // Initialization of p and r + copy_v(p, rhs, N); + copy_v(r, rhs, N); + + // number of iterations + num_it = 0; + + printf("num_it %d -- epsilon %lg -- nr %lg\n", num_it, epsilon, nr); + + while ((nr > epsilon) && (num_it < max_it)) + { + + // Compute the vector Ap = A*p + multAv(Ap, A, p, N, N); + + // compute the dot product np2 = (Ap, p) + np2 = dot(p, Ap, N); + printf("np2 = %lg\n", np2); + + // alpha + alpha = (nr * nr) / np2; + // printf("alpha = %lg\n", alpha); + + // compute the new x and r + axpy(alpha, x, p, N); + axpy(-alpha, r, Ap, N); + + // compute the norm of the residual (dot product, then sqrt) + nr = dot(r, r, N); + nr = sqrt(nr); + // printf("nr = %lg\n", nr); + + // beta + beta = (nr * nr) / (alpha * np2); + // printf("beta = %lg\n", beta); + + // compute the new p + xpay(beta, r, p, N); + + // increase the number of iterations + num_it++; + + // printf("num_it %d -- nr %lg \n", num_it, nr); + } + + // display the solution + for (int i = 0; i < N; i++) + { + printf("x[%d] = %lg\n", i, x[i]); + } + + return; +} diff --git a/TP1/05_CG/CG_sq.h b/TP1/05_CG/CG_sq.h new file mode 100644 index 0000000..5d2ed9d --- /dev/null +++ b/TP1/05_CG/CG_sq.h @@ -0,0 +1 @@ +void cg_sq(double *A, double *rhs, int N, double tol); diff --git a/TP1/05_CG/Laplacien.mtx b/TP1/05_CG/Laplacien.mtx new file mode 100644 index 0000000..02aef86 --- /dev/null +++ b/TP1/05_CG/Laplacien.mtx @@ -0,0 +1,21 @@ +%%MatrixMarket matrix coordinate real symmetric +%------------------------------------------------------------------------------- +% UF Sparse Matrix Collection, Tim Davis +% http://www.cise.ufl.edu/research/sparse/matrices/HB/nos3 +% name: HB/nos3 +% [SYMMETRIC MATRIX, FE APPROXIMATION TO BIHARMONIC OPERATOR ON PLATE] +% id: 219 +% date: 1982 +% author: H. Simon +% ed: I. Duff, R. Grimes, J. Lewis +% fields: title A name id date author ed kind +% kind: structural problem +%------------------------------------------------------------------------------- +4 4 7 +1 1 2.0 +1 2 -1.0 +2 2 2.0 +2 3 -1.0 +3 3 2.0 +3 4 -1.0 +4 4 2.0 diff --git a/TP1/05_CG/Makefile b/TP1/05_CG/Makefile new file mode 100644 index 0000000..a63ece9 --- /dev/null +++ b/TP1/05_CG/Makefile @@ -0,0 +1,18 @@ +CC=gcc +MPICC=smpicc +CFLAGS=-g -O4 + +all: CG_par CG_sq + +clean: + rm -rf *.o CG_par CG_sq + +%.o: %.c + echo $@ + $(MPICC) -c -Wall -o $@ $< + +CG_par: util.o CG_par.o main_par.o + $(MPICC) -o $@ $^ -lm + +CG_sq: util.o CG_sq.o main_sq.o + $(MPICC) -o $@ $^ -lm diff --git a/TP1/05_CG/main_par.c b/TP1/05_CG/main_par.c new file mode 100644 index 0000000..db83c4b --- /dev/null +++ b/TP1/05_CG/main_par.c @@ -0,0 +1,98 @@ +#include +#include +#include +#include + +#include "util.h" +#include "CG_par.h" + +int main(int argc, char* argv[]) { + + int size; + int my_rank; + + FILE *f; + int M, N, nz; + + double *A = NULL; + double *rhs; + + double tol = 1e-6; + + // Make sure that the command line has one argument (name of the matrix file) + + if(argc != 2){ + printf("usage : CG_par \n"); + return EXIT_FAILURE; + } + + //**************** MPI Initialization + + MPI_Init(&argc, &argv); + + // Get number of processes and check that 4 processes are used + MPI_Comm_size(MPI_COMM_WORLD, &size); + + if(size != 4) { + printf("This application is meant to be run with 4 MPI processes.\n"); + MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); + } + + // Get my rank + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + //**************** READING OF THE MATRICE AND DISTRIBUTION OF THE BLOCS OF LINES TO EACH NODE + + // You have the possibility to test with a small matrice ("Laplacien.txt") + // or a larger one ("nos3.mtx") + + f = fopen(argv[1], "r"); + + // All nodes get the sizes + mm_read_mtx_crd_size(f, &M, &N, &nz); + //printf("%d %d %d\n", M, N, nz); + + // Reading the matrix by node 0 + if(my_rank == 0) { + + A = (double *) malloc(M*N*sizeof(double)); + read_A(f, A, M, N, nz); + + // increase diagonal to be sure to converge easily + for (int i = 0; i < M; i++) { + *(A+i*N+i) = *(A+i*N+i) + 10.0; + } + + } + + if (f != stdin) fclose(f); + + // DISTRIBUTION OF BLOCS => A_local(b, N) + int b = M / size; + double *A_local; + + A_local = (double *) malloc(b*N*sizeof(double)); + MPI_Scatter(A, b*N, MPI_DOUBLE, A_local, b*N, MPI_DOUBLE, 0, MPI_COMM_WORLD); + + if(my_rank == 0) free(A); + + //**************** END OF THE READING OF THE MATRICE AND THE DISTRIBUTION OF THE BLOCS OF LINES TO EACH NODE + + //**************** PARALLEL CG (M == N) + + rhs = (double *) malloc(b*sizeof(double)); + + // initialization of the right hand side (local vector) + for(int i = 0; i < b; i++){ + rhs[i] = (float) (b*my_rank + i); + } + + cg_par(A_local, rhs, N, b, tol); + + //**************** END OF PARALLEL CG + + MPI_Finalize(); + printf("The End\n"); + + return EXIT_SUCCESS; +} diff --git a/TP1/05_CG/main_sq.c b/TP1/05_CG/main_sq.c new file mode 100644 index 0000000..8c56e53 --- /dev/null +++ b/TP1/05_CG/main_sq.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include + +#include "util.h" +#include "CG_sq.h" + + +int main(int argc, char* argv[]) { + + int size; + + FILE *f; + int M, N, nz; + + double *A = NULL; + + double *rhs; + + double tol = 1e-6; + + // Make sure that the command line has one argument (name of the matrix file) + + if(argc != 2){ + printf("usage : CG_sq \n"); + return EXIT_FAILURE; + } + + MPI_Init(&argc, &argv); + + // Get number of processes and check that only 1 process is used + MPI_Comm_size(MPI_COMM_WORLD, &size); + + if(size != 1) { + printf("This application is meant to be run with 1 MPI process.\n"); + MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); + } + + + //**************** READING THE MATRICE + + // You have the possibility to test with a small matrice ("Laplacien.txt") + // or a larger one ("nos3.mtx") + + f = fopen(argv[1], "r"); + + mm_read_mtx_crd_size(f, &M, &N, &nz); + //printf("%d %d %d\n", M, N, nz); + + A = (double *) malloc(M*N*sizeof(double)); + read_A(f, A, M, N, nz); + + // increase diagonal to be sure to converge easily + for (int i = 0; i < M; i++) { + *(A+i*N+i) = *(A+i*N+i) + 10.0; + } + + if (f !=stdin) fclose(f); + + //**************** END OF READING THE MATRICE + + //**************** SEQUENTIAL CG (M == N) + + rhs = (double *) malloc(N*sizeof(double)); + + // initialization of the right-hand side + for(int i = 0; i < N; i++){ + rhs[i] = (float) i; + } + cg_sq(A, rhs, N, tol); + + //**************** END OF SEQUENTIAL CG + + MPI_Finalize(); + printf("The End\n"); + + return EXIT_SUCCESS; +} diff --git a/TP1/05_CG/nos3.mtx b/TP1/05_CG/nos3.mtx new file mode 100644 index 0000000..ccdae2e --- /dev/null +++ b/TP1/05_CG/nos3.mtx @@ -0,0 +1,8416 @@ +%%MatrixMarket matrix coordinate real symmetric +%------------------------------------------------------------------------------- +% UF Sparse Matrix Collection, Tim Davis +% http://www.cise.ufl.edu/research/sparse/matrices/HB/nos3 +% name: HB/nos3 +% [SYMMETRIC MATRIX, FE APPROXIMATION TO BIHARMONIC OPERATOR ON PLATE] +% id: 219 +% date: 1982 +% author: H. Simon +% ed: I. Duff, R. Grimes, J. Lewis +% fields: title A name id date author ed kind +% kind: structural problem +%------------------------------------------------------------------------------- +960 960 8402 +1 1 86.86781 +2 1 4.8849813e-15 +3 1 -17.463532 +4 1 -4.8849813e-15 +41 1 -12.985187 +42 1 1.3736264 +43 1 -21.716953 +44 1 17.857143 +2 2 132.18945 +3 2 -4.8849813e-15 +4 2 -107.89795 +41 2 -1.3736264 +42 2 20.901614 +43 2 17.857143 +44 2 -33.047362 +3 3 173.73562 +4 3 8.8817842e-15 +5 3 -17.463532 +6 3 -3.7747583e-15 +41 3 -21.716953 +42 3 -17.857143 +43 3 -25.970373 +44 3 1.9984014e-15 +45 3 -21.716953 +46 3 17.857143 +4 4 264.3789 +5 4 -3.7747583e-15 +6 4 -107.89795 +41 4 -17.857143 +42 4 -33.047362 +43 4 1.7763568e-15 +44 4 41.803228 +45 4 17.857143 +46 4 -33.047362 +5 5 173.73562 +6 5 1.2878587e-14 +7 5 -17.463532 +8 5 -9.547918e-15 +43 5 -21.716953 +44 5 -17.857143 +45 5 -25.970373 +46 5 7.1054274e-15 +47 5 -21.716953 +48 5 17.857143 +6 6 264.3789 +7 6 -9.7699626e-15 +8 6 -107.89795 +43 6 -17.857143 +44 6 -33.047362 +45 6 7.327472e-15 +46 6 41.803228 +47 6 17.857143 +48 6 -33.047362 +7 7 173.73562 +8 7 1.9539925e-14 +9 7 -17.463532 +10 7 -9.9920072e-15 +45 7 -21.716953 +46 7 -17.857143 +47 7 -25.970373 +48 7 7.7715612e-15 +49 7 -21.716953 +50 7 17.857143 +8 8 264.3789 +9 8 -9.9920072e-15 +10 8 -107.89795 +45 8 -17.857143 +46 8 -33.047362 +47 8 7.7715612e-15 +48 8 41.803228 +49 8 17.857143 +50 8 -33.047362 +9 9 173.73562 +10 9 1.1546319e-14 +11 9 -17.463532 +12 9 -2.4424907e-15 +47 9 -21.716953 +48 9 -17.857143 +49 9 -25.970373 +50 9 5.1070259e-15 +51 9 -21.716953 +52 9 17.857143 +10 10 264.3789 +11 10 -2.4424907e-15 +12 10 -107.89795 +47 10 -17.857143 +48 10 -33.047362 +49 10 5.1070259e-15 +50 10 41.803228 +51 10 17.857143 +52 10 -33.047362 +11 11 173.73562 +12 11 3.1086245e-15 +13 11 -17.463532 +14 11 -6.6613381e-16 +49 11 -21.716953 +50 11 -17.857143 +51 11 -25.970373 +52 11 4.8849813e-15 +53 11 -21.716953 +54 11 17.857143 +12 12 264.3789 +13 12 -4.4408921e-16 +14 12 -107.89795 +49 12 -17.857143 +50 12 -33.047362 +51 12 4.6629367e-15 +52 12 41.803228 +53 12 17.857143 +54 12 -33.047362 +13 13 173.73562 +14 13 4.8849813e-15 +15 13 -17.463532 +16 13 -3.7747583e-15 +51 13 -21.716953 +52 13 -17.857143 +53 13 -25.970373 +54 13 2.8865799e-15 +55 13 -21.716953 +56 13 17.857143 +14 14 264.3789 +15 14 -3.7747583e-15 +16 14 -107.89795 +51 14 -17.857143 +52 14 -33.047362 +53 14 3.1086245e-15 +54 14 41.803228 +55 14 17.857143 +56 14 -33.047362 +15 15 173.73562 +16 15 1.110223e-14 +17 15 -17.463532 +18 15 -7.327472e-15 +53 15 -21.716953 +54 15 -17.857143 +55 15 -25.970373 +56 15 2.6645353e-15 +57 15 -21.716953 +58 15 17.857143 +16 16 264.3789 +17 16 -7.1054274e-15 +18 16 -107.89795 +53 16 -17.857143 +54 16 -33.047362 +55 16 2.6645353e-15 +56 16 41.803228 +57 16 17.857143 +58 16 -33.047362 +17 17 173.73562 +18 17 1.1990409e-14 +19 17 -17.463532 +20 17 -4.8849813e-15 +55 17 -21.716953 +56 17 -17.857143 +57 17 -25.970373 +58 17 5.1070259e-15 +59 17 -21.716953 +60 17 17.857143 +18 18 264.3789 +19 18 -4.8849813e-15 +20 18 -107.89795 +55 18 -17.857143 +56 18 -33.047362 +57 18 5.1070259e-15 +58 18 41.803228 +59 18 17.857143 +60 18 -33.047362 +19 19 173.73562 +20 19 4.4408921e-15 +21 19 -17.463532 +22 19 4.4408921e-16 +57 19 -21.716953 +58 19 -17.857143 +59 19 -25.970373 +60 19 4.2188475e-15 +61 19 -21.716953 +62 19 17.857143 +20 20 264.3789 +21 20 4.4408921e-16 +22 20 -107.89795 +57 20 -17.857143 +58 20 -33.047362 +59 20 4.4408921e-15 +60 20 41.803228 +61 20 17.857143 +62 20 -33.047362 +21 21 173.73562 +22 21 4.4408921e-16 +23 21 -17.463532 +24 21 -1.110223e-15 +59 21 -21.716953 +60 21 -17.857143 +61 21 -25.970373 +62 21 3.5527137e-15 +63 21 -21.716953 +64 21 17.857143 +22 22 264.3789 +23 22 -1.110223e-15 +24 22 -107.89795 +59 22 -17.857143 +60 22 -33.047362 +61 22 3.5527137e-15 +62 22 41.803228 +63 22 17.857143 +64 22 -33.047362 +23 23 173.73562 +24 23 8.8817842e-16 +25 23 -17.463532 +26 23 6.6613381e-16 +61 23 -21.716953 +62 23 -17.857143 +63 23 -25.970373 +64 23 2.8865799e-15 +65 23 -21.716953 +66 23 17.857143 +24 24 264.3789 +25 24 6.6613381e-16 +26 24 -107.89795 +61 24 -17.857143 +62 24 -33.047362 +63 24 3.1086245e-15 +64 24 41.803228 +65 24 17.857143 +66 24 -33.047362 +25 25 173.73562 +26 25 4.4408921e-16 +27 25 -17.463532 +28 25 -8.8817842e-16 +63 25 -21.716953 +64 25 -17.857143 +65 25 -25.970373 +66 25 1.110223e-15 +67 25 -21.716953 +68 25 17.857143 +26 26 264.3789 +27 26 -8.8817842e-16 +28 26 -107.89795 +63 26 -17.857143 +64 26 -33.047362 +65 26 1.110223e-15 +66 26 41.803228 +67 26 17.857143 +68 26 -33.047362 +27 27 173.73562 +28 27 1.7763568e-15 +29 27 -17.463532 +30 27 -8.8817842e-16 +65 27 -21.716953 +66 27 -17.857143 +67 27 -25.970373 +68 27 2.220446e-16 +69 27 -21.716953 +70 27 17.857143 +28 28 264.3789 +29 28 -8.8817842e-16 +30 28 -107.89795 +65 28 -17.857143 +66 28 -33.047362 +67 28 2.220446e-16 +68 28 41.803228 +69 28 17.857143 +70 28 -33.047362 +29 29 173.73562 +30 29 8.8817842e-16 +31 29 -17.463532 +67 29 -21.716953 +68 29 -17.857143 +69 29 -25.970373 +71 29 -21.716953 +72 29 17.857143 +30 30 264.3789 +32 30 -107.89795 +67 30 -17.857143 +68 30 -33.047362 +70 30 41.803228 +71 30 17.857143 +72 30 -33.047362 +31 31 173.73562 +32 31 8.8817842e-16 +33 31 -17.463532 +34 31 -8.8817842e-16 +69 31 -21.716953 +70 31 -17.857143 +71 31 -25.970373 +72 31 2.220446e-16 +73 31 -21.716953 +74 31 17.857143 +32 32 264.3789 +33 32 -8.8817842e-16 +34 32 -107.89795 +69 32 -17.857143 +70 32 -33.047362 +71 32 2.220446e-16 +72 32 41.803228 +73 32 17.857143 +74 32 -33.047362 +33 33 173.73562 +34 33 1.3322676e-15 +35 33 -17.463532 +36 33 -4.4408921e-16 +71 33 -21.716953 +72 33 -17.857143 +73 33 -25.970373 +74 33 2.220446e-16 +75 33 -21.716953 +76 33 17.857143 +34 34 264.3789 +35 34 -4.4408921e-16 +36 34 -107.89795 +71 34 -17.857143 +72 34 -33.047362 +73 34 2.220446e-16 +74 34 41.803228 +75 34 17.857143 +76 34 -33.047362 +35 35 173.73562 +36 35 4.4408921e-16 +37 35 -17.463532 +73 35 -21.716953 +74 35 -17.857143 +75 35 -25.970373 +77 35 -21.716953 +78 35 17.857143 +36 36 264.3789 +38 36 -107.89795 +73 36 -17.857143 +74 36 -33.047362 +76 36 41.803228 +77 36 17.857143 +78 36 -33.047362 +37 37 173.73562 +39 37 -17.463532 +75 37 -21.716953 +76 37 -17.857143 +77 37 -25.970373 +79 37 -21.716953 +80 37 17.857143 +38 38 264.3789 +40 38 -107.89795 +75 38 -17.857143 +76 38 -33.047362 +78 38 41.803228 +79 38 17.857143 +80 38 -33.047362 +39 39 86.86781 +77 39 -21.716953 +78 39 -17.857143 +79 39 -12.985187 +80 39 -1.3736264 +40 40 132.18945 +77 40 -17.857143 +78 40 -33.047362 +79 40 1.3736264 +80 40 20.901614 +41 41 86.86781 +42 41 9.7699626e-15 +43 41 -17.463532 +44 41 -1.0214052e-14 +81 41 -12.985187 +82 41 1.3736264 +83 41 -21.716953 +84 41 17.857143 +42 42 132.18945 +43 42 -1.0214052e-14 +44 42 -107.89795 +81 42 -1.3736264 +82 42 20.901614 +83 42 17.857143 +84 42 -33.047362 +43 43 173.73562 +44 43 2.3980817e-14 +45 43 -17.463532 +46 43 -1.398881e-14 +81 43 -21.716953 +82 43 -17.857143 +83 43 -25.970373 +84 43 1.0214052e-14 +85 43 -21.716953 +86 43 17.857143 +44 44 264.3789 +45 44 -1.4210855e-14 +46 44 -107.89795 +81 44 -17.857143 +82 44 -33.047362 +83 44 1.0214052e-14 +84 44 41.803228 +85 44 17.857143 +86 44 -33.047362 +45 45 173.73562 +46 45 2.8865799e-14 +47 45 -17.463532 +48 45 -1.5321078e-14 +83 45 -21.716953 +84 45 -17.857143 +85 45 -25.970373 +86 45 7.7715612e-15 +87 45 -21.716953 +88 45 17.857143 +46 46 264.3789 +47 46 -1.5099033e-14 +48 46 -107.89795 +83 46 -17.857143 +84 46 -33.047362 +85 46 7.7715612e-15 +86 46 41.803228 +87 46 17.857143 +88 46 -33.047362 +47 47 173.73562 +48 47 2.4868996e-14 +49 47 -17.463532 +50 47 -9.9920072e-15 +85 47 -21.716953 +86 47 -17.857143 +87 47 -25.970373 +88 47 5.3290705e-15 +89 47 -21.716953 +90 47 17.857143 +48 48 264.3789 +49 48 -9.9920072e-15 +50 48 -107.89795 +85 48 -17.857143 +86 48 -33.047362 +87 48 5.3290705e-15 +88 48 41.803228 +89 48 17.857143 +90 48 -33.047362 +49 49 173.73562 +50 49 1.1990409e-14 +51 49 -17.463532 +52 49 -2.6645353e-15 +87 49 -21.716953 +88 49 -17.857143 +89 49 -25.970373 +90 49 1.5543122e-15 +91 49 -21.716953 +92 49 17.857143 +50 50 264.3789 +51 50 -2.6645353e-15 +52 50 -107.89795 +87 50 -17.857143 +88 50 -33.047362 +89 50 1.5543122e-15 +90 50 41.803228 +91 50 17.857143 +92 50 -33.047362 +51 51 173.73562 +52 51 3.9968029e-15 +53 51 -17.463532 +54 51 -8.8817842e-16 +89 51 -21.716953 +90 51 -17.857143 +91 51 -25.970373 +92 51 -3.1086245e-15 +93 51 -21.716953 +94 51 17.857143 +52 52 264.3789 +53 52 -1.110223e-15 +54 52 -107.89795 +89 52 -17.857143 +90 52 -33.047362 +91 52 -3.3306691e-15 +92 52 41.803228 +93 52 17.857143 +94 52 -33.047362 +53 53 173.73562 +54 53 4.8849813e-15 +55 53 -17.463532 +56 53 -3.7747583e-15 +91 53 -21.716953 +92 53 -17.857143 +93 53 -25.970373 +94 53 -1.110223e-15 +95 53 -21.716953 +96 53 17.857143 +54 54 264.3789 +55 54 -3.7747583e-15 +56 54 -107.89795 +91 54 -17.857143 +92 54 -33.047362 +93 54 -8.8817842e-16 +94 54 41.803228 +95 54 17.857143 +96 54 -33.047362 +55 55 173.73562 +56 55 1.110223e-14 +57 55 -17.463532 +58 55 -7.327472e-15 +93 55 -21.716953 +94 55 -17.857143 +95 55 -25.970373 +96 55 2.6645353e-15 +97 55 -21.716953 +98 55 17.857143 +56 56 264.3789 +57 56 -7.1054274e-15 +58 56 -107.89795 +93 56 -17.857143 +94 56 -33.047362 +95 56 2.6645353e-15 +96 56 41.803228 +97 56 17.857143 +98 56 -33.047362 +57 57 173.73562 +58 57 1.1990409e-14 +59 57 -17.463532 +60 57 -5.1070259e-15 +95 57 -21.716953 +96 57 -17.857143 +97 57 -25.970373 +98 57 1.3322676e-15 +99 57 -21.716953 +100 57 17.857143 +58 58 264.3789 +59 58 -5.1070259e-15 +60 58 -107.89795 +95 58 -17.857143 +96 58 -33.047362 +97 58 1.3322676e-15 +98 58 41.803228 +99 58 17.857143 +100 58 -33.047362 +59 59 173.73562 +60 59 4.4408921e-15 +61 59 -17.463532 +62 59 4.4408921e-16 +97 59 -21.716953 +98 59 -17.857143 +99 59 -25.970373 +100 59 -2.220446e-15 +101 59 -21.716953 +102 59 17.857143 +60 60 264.3789 +61 60 4.4408921e-16 +62 60 -107.89795 +97 60 -17.857143 +98 60 -33.047362 +99 60 -2.4424907e-15 +100 60 41.803228 +101 60 17.857143 +102 60 -33.047362 +61 61 173.73562 +62 61 3.5527137e-15 +63 61 -17.463532 +64 61 -3.7747583e-15 +99 61 -21.716953 +100 61 -17.857143 +101 61 -25.970373 +102 61 -2.220446e-15 +103 61 -21.716953 +104 61 17.857143 +62 62 264.3789 +63 62 -3.7747583e-15 +64 62 -107.89795 +99 62 -17.857143 +100 62 -33.047362 +101 62 -1.9984014e-15 +102 62 41.803228 +103 62 17.857143 +104 62 -33.047362 +63 63 173.73562 +64 63 5.3290705e-15 +65 63 -17.463532 +66 63 -1.110223e-15 +101 63 -21.716953 +102 63 -17.857143 +103 63 -25.970373 +104 63 -6.6613381e-16 +105 63 -21.716953 +106 63 17.857143 +64 64 264.3789 +65 64 -1.3322676e-15 +66 64 -107.89795 +101 64 -17.857143 +102 64 -33.047362 +103 64 -6.6613381e-16 +104 64 41.803228 +105 64 17.857143 +106 64 -33.047362 +65 65 173.73562 +66 65 2.220446e-15 +67 65 -17.463532 +68 65 -8.8817842e-16 +103 65 -21.716953 +104 65 -17.857143 +105 65 -25.970373 +106 65 -2.220446e-16 +107 65 -21.716953 +108 65 17.857143 +66 66 264.3789 +67 66 -8.8817842e-16 +68 66 -107.89795 +103 66 -17.857143 +104 66 -33.047362 +105 66 -2.220446e-16 +106 66 41.803228 +107 66 17.857143 +108 66 -33.047362 +67 67 173.73562 +68 67 1.7763568e-15 +69 67 -17.463532 +70 67 -8.8817842e-16 +105 67 -21.716953 +106 67 -17.857143 +107 67 -25.970373 +108 67 2.220446e-16 +109 67 -21.716953 +110 67 17.857143 +68 68 264.3789 +69 68 -8.8817842e-16 +70 68 -107.89795 +105 68 -17.857143 +106 68 -33.047362 +107 68 2.220446e-16 +108 68 41.803228 +109 68 17.857143 +110 68 -33.047362 +69 69 173.73562 +70 69 8.8817842e-16 +71 69 -17.463532 +107 69 -21.716953 +108 69 -17.857143 +109 69 -25.970373 +111 69 -21.716953 +112 69 17.857143 +70 70 264.3789 +72 70 -107.89795 +107 70 -17.857143 +108 70 -33.047362 +110 70 41.803228 +111 70 17.857143 +112 70 -33.047362 +71 71 173.73562 +72 71 8.8817842e-16 +73 71 -17.463532 +74 71 -8.8817842e-16 +109 71 -21.716953 +110 71 -17.857143 +111 71 -25.970373 +112 71 2.220446e-16 +113 71 -21.716953 +114 71 17.857143 +72 72 264.3789 +73 72 -8.8817842e-16 +74 72 -107.89795 +109 72 -17.857143 +110 72 -33.047362 +111 72 2.220446e-16 +112 72 41.803228 +113 72 17.857143 +114 72 -33.047362 +73 73 173.73562 +74 73 1.3322676e-15 +75 73 -17.463532 +76 73 -4.4408921e-16 +111 73 -21.716953 +112 73 -17.857143 +113 73 -25.970373 +114 73 2.220446e-16 +115 73 -21.716953 +116 73 17.857143 +74 74 264.3789 +75 74 -4.4408921e-16 +76 74 -107.89795 +111 74 -17.857143 +112 74 -33.047362 +113 74 2.220446e-16 +114 74 41.803228 +115 74 17.857143 +116 74 -33.047362 +75 75 173.73562 +76 75 4.4408921e-16 +77 75 -17.463532 +113 75 -21.716953 +114 75 -17.857143 +115 75 -25.970373 +117 75 -21.716953 +118 75 17.857143 +76 76 264.3789 +78 76 -107.89795 +113 76 -17.857143 +114 76 -33.047362 +116 76 41.803228 +117 76 17.857143 +118 76 -33.047362 +77 77 173.73562 +79 77 -17.463532 +115 77 -21.716953 +116 77 -17.857143 +117 77 -25.970373 +119 77 -21.716953 +120 77 17.857143 +78 78 264.3789 +80 78 -107.89795 +115 78 -17.857143 +116 78 -33.047362 +118 78 41.803228 +119 78 17.857143 +120 78 -33.047362 +79 79 86.86781 +117 79 -21.716953 +118 79 -17.857143 +119 79 -12.985187 +120 79 -1.3736264 +80 80 132.18945 +117 80 -17.857143 +118 80 -33.047362 +119 80 1.3736264 +120 80 20.901614 +81 81 86.86781 +82 81 1.5099033e-14 +83 81 -17.463532 +84 81 -1.5321078e-14 +121 81 -12.985187 +122 81 1.3736264 +123 81 -21.716953 +124 81 17.857143 +82 82 132.18945 +83 82 -1.5321078e-14 +84 82 -107.89795 +121 82 -1.3736264 +122 82 20.901614 +123 82 17.857143 +124 82 -33.047362 +83 83 173.73562 +84 83 3.0198066e-14 +85 83 -17.463532 +86 83 -1.5321078e-14 +121 83 -21.716953 +122 83 -17.857143 +123 83 -25.970373 +124 83 5.3290705e-15 +125 83 -21.716953 +126 83 17.857143 +84 84 264.3789 +85 84 -1.5099033e-14 +86 84 -107.89795 +121 84 -17.857143 +122 84 -33.047362 +123 84 5.3290705e-15 +124 84 41.803228 +125 84 17.857143 +126 84 -33.047362 +85 85 173.73562 +86 85 2.4868996e-14 +87 85 -17.463532 +88 85 -9.9920072e-15 +123 85 -21.716953 +124 85 -17.857143 +125 85 -25.970373 +126 85 5.3290705e-15 +127 85 -21.716953 +128 85 17.857143 +86 86 264.3789 +87 86 -9.9920072e-15 +88 86 -107.89795 +123 86 -17.857143 +124 86 -33.047362 +125 86 5.3290705e-15 +126 86 41.803228 +127 86 17.857143 +128 86 -33.047362 +87 87 173.73562 +88 87 1.9539925e-14 +89 87 -17.463532 +90 87 -9.9920072e-15 +125 87 -21.716953 +126 87 -17.857143 +127 87 -25.970373 +128 87 5.3290705e-15 +129 87 -21.716953 +130 87 17.857143 +88 88 264.3789 +89 88 -9.9920072e-15 +90 88 -107.89795 +125 88 -17.857143 +126 88 -33.047362 +127 88 5.3290705e-15 +128 88 41.803228 +129 88 17.857143 +130 88 -33.047362 +89 89 173.73562 +90 89 1.1546319e-14 +91 89 -17.463532 +92 89 -2.4424907e-15 +127 89 -21.716953 +128 89 -17.857143 +129 89 -25.970373 +130 89 5.1070259e-15 +131 89 -21.716953 +132 89 17.857143 +90 90 264.3789 +91 90 -2.4424907e-15 +92 90 -107.89795 +127 90 -17.857143 +128 90 -33.047362 +129 90 5.1070259e-15 +130 90 41.803228 +131 90 17.857143 +132 90 -33.047362 +91 91 173.73562 +92 91 3.1086245e-15 +93 91 -17.463532 +94 91 -6.6613381e-16 +129 91 -21.716953 +130 91 -17.857143 +131 91 -25.970373 +132 91 4.8849813e-15 +133 91 -21.716953 +134 91 17.857143 +92 92 264.3789 +93 92 -4.4408921e-16 +94 92 -107.89795 +129 92 -17.857143 +130 92 -33.047362 +131 92 4.6629367e-15 +132 92 41.803228 +133 92 17.857143 +134 92 -33.047362 +93 93 173.73562 +94 93 4.8849813e-15 +95 93 -17.463532 +96 93 -3.7747583e-15 +131 93 -21.716953 +132 93 -17.857143 +133 93 -25.970373 +134 93 2.8865799e-15 +135 93 -21.716953 +136 93 17.857143 +94 94 264.3789 +95 94 -3.7747583e-15 +96 94 -107.89795 +131 94 -17.857143 +132 94 -33.047362 +133 94 3.1086245e-15 +134 94 41.803228 +135 94 17.857143 +136 94 -33.047362 +95 95 173.73562 +96 95 1.110223e-14 +97 95 -17.463532 +98 95 -7.327472e-15 +133 95 -21.716953 +134 95 -17.857143 +135 95 -25.970373 +136 95 2.6645353e-15 +137 95 -21.716953 +138 95 17.857143 +96 96 264.3789 +97 96 -7.1054274e-15 +98 96 -107.89795 +133 96 -17.857143 +134 96 -33.047362 +135 96 2.6645353e-15 +136 96 41.803228 +137 96 17.857143 +138 96 -33.047362 +97 97 173.73562 +98 97 1.1990409e-14 +99 97 -17.463532 +100 97 -4.8849813e-15 +135 97 -21.716953 +136 97 -17.857143 +137 97 -25.970373 +138 97 5.1070259e-15 +139 97 -21.716953 +140 97 17.857143 +98 98 264.3789 +99 98 -4.8849813e-15 +100 98 -107.89795 +135 98 -17.857143 +136 98 -33.047362 +137 98 5.1070259e-15 +138 98 41.803228 +139 98 17.857143 +140 98 -33.047362 +99 99 173.73562 +100 99 4.4408921e-15 +101 99 -17.463532 +102 99 4.4408921e-16 +137 99 -21.716953 +138 99 -17.857143 +139 99 -25.970373 +140 99 4.2188475e-15 +141 99 -21.716953 +142 99 17.857143 +100 100 264.3789 +101 100 4.4408921e-16 +102 100 -107.89795 +137 100 -17.857143 +138 100 -33.047362 +139 100 4.4408921e-15 +140 100 41.803228 +141 100 17.857143 +142 100 -33.047362 +101 101 173.73562 +102 101 -1.7763568e-15 +103 101 -17.463532 +104 101 1.3322676e-15 +139 101 -21.716953 +140 101 -17.857143 +141 101 -25.970373 +142 101 8.8817842e-16 +143 101 -21.716953 +144 101 17.857143 +102 102 264.3789 +103 102 1.3322676e-15 +104 102 -107.89795 +139 102 -17.857143 +140 102 -33.047362 +141 102 1.110223e-15 +142 102 41.803228 +143 102 17.857143 +144 102 -33.047362 +103 103 173.73562 +104 103 -2.6645353e-15 +105 103 -17.463532 +106 103 1.3322676e-15 +141 103 -21.716953 +142 103 -17.857143 +143 103 -25.970373 +144 103 -6.6613381e-16 +145 103 -21.716953 +146 103 17.857143 +104 104 264.3789 +105 104 1.3322676e-15 +106 104 -107.89795 +141 104 -17.857143 +142 104 -33.047362 +143 104 -6.6613381e-16 +144 104 41.803228 +145 104 17.857143 +146 104 -33.047362 +105 105 173.73562 +106 105 -4.4408921e-16 +107 105 -17.463532 +108 105 -8.8817842e-16 +143 105 -21.716953 +144 105 -17.857143 +145 105 -25.970373 +146 105 -2.220446e-16 +147 105 -21.716953 +148 105 17.857143 +106 106 264.3789 +107 106 -8.8817842e-16 +108 106 -107.89795 +143 106 -17.857143 +144 106 -33.047362 +145 106 -2.220446e-16 +146 106 41.803228 +147 106 17.857143 +148 106 -33.047362 +107 107 173.73562 +108 107 1.7763568e-15 +109 107 -17.463532 +110 107 -8.8817842e-16 +145 107 -21.716953 +146 107 -17.857143 +147 107 -25.970373 +148 107 2.220446e-16 +149 107 -21.716953 +150 107 17.857143 +108 108 264.3789 +109 108 -8.8817842e-16 +110 108 -107.89795 +145 108 -17.857143 +146 108 -33.047362 +147 108 2.220446e-16 +148 108 41.803228 +149 108 17.857143 +150 108 -33.047362 +109 109 173.73562 +110 109 8.8817842e-16 +111 109 -17.463532 +147 109 -21.716953 +148 109 -17.857143 +149 109 -25.970373 +151 109 -21.716953 +152 109 17.857143 +110 110 264.3789 +112 110 -107.89795 +147 110 -17.857143 +148 110 -33.047362 +150 110 41.803228 +151 110 17.857143 +152 110 -33.047362 +111 111 173.73562 +112 111 8.8817842e-16 +113 111 -17.463532 +114 111 -8.8817842e-16 +149 111 -21.716953 +150 111 -17.857143 +151 111 -25.970373 +152 111 2.220446e-16 +153 111 -21.716953 +154 111 17.857143 +112 112 264.3789 +113 112 -8.8817842e-16 +114 112 -107.89795 +149 112 -17.857143 +150 112 -33.047362 +151 112 2.220446e-16 +152 112 41.803228 +153 112 17.857143 +154 112 -33.047362 +113 113 173.73562 +114 113 1.3322676e-15 +115 113 -17.463532 +116 113 -4.4408921e-16 +151 113 -21.716953 +152 113 -17.857143 +153 113 -25.970373 +154 113 2.220446e-16 +155 113 -21.716953 +156 113 17.857143 +114 114 264.3789 +115 114 -4.4408921e-16 +116 114 -107.89795 +151 114 -17.857143 +152 114 -33.047362 +153 114 2.220446e-16 +154 114 41.803228 +155 114 17.857143 +156 114 -33.047362 +115 115 173.73562 +116 115 4.4408921e-16 +117 115 -17.463532 +153 115 -21.716953 +154 115 -17.857143 +155 115 -25.970373 +157 115 -21.716953 +158 115 17.857143 +116 116 264.3789 +118 116 -107.89795 +153 116 -17.857143 +154 116 -33.047362 +156 116 41.803228 +157 116 17.857143 +158 116 -33.047362 +117 117 173.73562 +119 117 -17.463532 +155 117 -21.716953 +156 117 -17.857143 +157 117 -25.970373 +159 117 -21.716953 +160 117 17.857143 +118 118 264.3789 +120 118 -107.89795 +155 118 -17.857143 +156 118 -33.047362 +158 118 41.803228 +159 118 17.857143 +160 118 -33.047362 +119 119 86.86781 +157 119 -21.716953 +158 119 -17.857143 +159 119 -12.985187 +160 119 -1.3736264 +120 120 132.18945 +157 120 -17.857143 +158 120 -33.047362 +159 120 1.3736264 +160 120 20.901614 +121 121 86.86781 +122 121 9.7699626e-15 +123 121 -17.463532 +124 121 -9.7699626e-15 +161 121 -12.985187 +162 121 1.3736264 +163 121 -21.716953 +164 121 17.857143 +122 122 132.18945 +123 122 -9.7699626e-15 +124 122 -107.89795 +161 122 -1.3736264 +162 122 20.901614 +163 122 17.857143 +164 122 -33.047362 +123 123 173.73562 +124 123 1.9539925e-14 +125 123 -17.463532 +126 123 -9.7699626e-15 +161 123 -21.716953 +162 123 -17.857143 +163 123 -25.970373 +164 123 5.1070259e-15 +165 123 -21.716953 +166 123 17.857143 +124 124 264.3789 +125 124 -9.7699626e-15 +126 124 -107.89795 +161 124 -17.857143 +162 124 -33.047362 +163 124 5.1070259e-15 +164 124 41.803228 +165 124 17.857143 +166 124 -33.047362 +125 125 173.73562 +126 125 1.9539925e-14 +127 125 -17.463532 +128 125 -9.7699626e-15 +163 125 -21.716953 +164 125 -17.857143 +165 125 -25.970373 +166 125 5.1070259e-15 +167 125 -21.716953 +168 125 17.857143 +126 126 264.3789 +127 126 -9.7699626e-15 +128 126 -107.89795 +163 126 -17.857143 +164 126 -33.047362 +165 126 5.1070259e-15 +166 126 41.803228 +167 126 17.857143 +168 126 -33.047362 +127 127 173.73562 +128 127 1.9539925e-14 +129 127 -17.463532 +130 127 -9.7699626e-15 +165 127 -21.716953 +166 127 -17.857143 +167 127 -25.970373 +168 127 5.1070259e-15 +169 127 -21.716953 +170 127 17.857143 +128 128 264.3789 +129 128 -9.7699626e-15 +130 128 -107.89795 +165 128 -17.857143 +166 128 -33.047362 +167 128 5.1070259e-15 +168 128 41.803228 +169 128 17.857143 +170 128 -33.047362 +129 129 173.73562 +130 129 1.2434498e-14 +131 129 -17.463532 +132 129 -2.6645353e-15 +167 129 -21.716953 +168 129 -17.857143 +169 129 -25.970373 +170 129 1.3322676e-15 +171 129 -21.716953 +172 129 17.857143 +130 130 264.3789 +131 130 -2.6645353e-15 +132 130 -107.89795 +167 130 -17.857143 +168 130 -33.047362 +169 130 1.3322676e-15 +170 130 41.803228 +171 130 17.857143 +172 130 -33.047362 +131 131 173.73562 +132 131 3.9968029e-15 +133 131 -17.463532 +134 131 -8.8817842e-16 +169 131 -21.716953 +170 131 -17.857143 +171 131 -25.970373 +172 131 -3.5527137e-15 +173 131 -21.716953 +174 131 17.857143 +132 132 264.3789 +133 132 -1.110223e-15 +134 132 -107.89795 +169 132 -17.857143 +170 132 -33.047362 +171 132 -3.5527137e-15 +172 132 41.803228 +173 132 17.857143 +174 132 -33.047362 +133 133 173.73562 +134 133 4.8849813e-15 +135 133 -17.463532 +136 133 -3.7747583e-15 +171 133 -21.716953 +172 133 -17.857143 +173 133 -25.970373 +174 133 -8.8817842e-16 +175 133 -21.716953 +176 133 17.857143 +134 134 264.3789 +135 134 -3.7747583e-15 +136 134 -107.89795 +171 134 -17.857143 +172 134 -33.047362 +173 134 -8.8817842e-16 +174 134 41.803228 +175 134 17.857143 +176 134 -33.047362 +135 135 173.73562 +136 135 1.110223e-14 +137 135 -17.463532 +138 135 -7.327472e-15 +173 135 -21.716953 +174 135 -17.857143 +175 135 -25.970373 +176 135 2.6645353e-15 +177 135 -21.716953 +178 135 17.857143 +136 136 264.3789 +137 136 -7.1054274e-15 +138 136 -107.89795 +173 136 -17.857143 +174 136 -33.047362 +175 136 2.6645353e-15 +176 136 41.803228 +177 136 17.857143 +178 136 -33.047362 +137 137 173.73562 +138 137 1.1546319e-14 +139 137 -17.463532 +140 137 -5.1070259e-15 +175 137 -21.716953 +176 137 -17.857143 +177 137 -25.970373 +178 137 1.3322676e-15 +179 137 -21.716953 +180 137 17.857143 +138 138 264.3789 +139 138 -4.8849813e-15 +140 138 -107.89795 +175 138 -17.857143 +176 138 -33.047362 +177 138 1.5543122e-15 +178 138 41.803228 +179 138 17.857143 +180 138 -33.047362 +139 139 173.73562 +140 139 5.3290705e-15 +141 139 -17.463532 +142 139 2.220446e-16 +177 139 -21.716953 +178 139 -17.857143 +179 139 -25.970373 +180 139 -2.220446e-15 +181 139 -21.716953 +182 139 17.857143 +140 140 264.3789 +141 140 2.220446e-16 +142 140 -107.89795 +177 140 -17.857143 +178 140 -33.047362 +179 140 -2.4424907e-15 +180 140 41.803228 +181 140 17.857143 +182 140 -33.047362 +141 141 173.73562 +142 141 -1.3322676e-15 +143 141 -17.463532 +144 141 1.110223e-15 +179 141 -21.716953 +180 141 -17.857143 +181 141 -25.970373 +182 141 -1.9984014e-15 +183 141 -21.716953 +184 141 17.857143 +142 142 264.3789 +143 142 1.110223e-15 +144 142 -107.89795 +179 142 -17.857143 +180 142 -33.047362 +181 142 -1.9984014e-15 +182 142 41.803228 +183 142 17.857143 +184 142 -33.047362 +143 143 173.73562 +144 143 -2.220446e-15 +145 143 -17.463532 +146 143 1.3322676e-15 +181 143 -21.716953 +182 143 -17.857143 +183 143 -25.970373 +184 143 -6.6613381e-16 +185 143 -21.716953 +186 143 17.857143 +144 144 264.3789 +145 144 1.3322676e-15 +146 144 -107.89795 +181 144 -17.857143 +182 144 -33.047362 +183 144 -6.6613381e-16 +184 144 41.803228 +185 144 17.857143 +186 144 -33.047362 +145 145 173.73562 +147 145 -17.463532 +148 145 -8.8817842e-16 +183 145 -21.716953 +184 145 -17.857143 +185 145 -25.970373 +186 145 -2.220446e-16 +187 145 -21.716953 +188 145 17.857143 +146 146 264.3789 +147 146 -8.8817842e-16 +148 146 -107.89795 +183 146 -17.857143 +184 146 -33.047362 +185 146 -2.220446e-16 +186 146 41.803228 +187 146 17.857143 +188 146 -33.047362 +147 147 173.73562 +148 147 1.7763568e-15 +149 147 -17.463532 +150 147 -8.8817842e-16 +185 147 -21.716953 +186 147 -17.857143 +187 147 -25.970373 +189 147 -21.716953 +190 147 17.857143 +148 148 264.3789 +149 148 -8.8817842e-16 +150 148 -107.89795 +185 148 -17.857143 +186 148 -33.047362 +188 148 41.803228 +189 148 17.857143 +190 148 -33.047362 +149 149 173.73562 +150 149 8.8817842e-16 +151 149 -17.463532 +152 149 -2.220446e-16 +187 149 -21.716953 +188 149 -17.857143 +189 149 -25.970373 +190 149 -2.220446e-16 +191 149 -21.716953 +192 149 17.857143 +150 150 264.3789 +151 150 -2.220446e-16 +152 150 -107.89795 +187 150 -17.857143 +188 150 -33.047362 +189 150 -2.220446e-16 +190 150 41.803228 +191 150 17.857143 +192 150 -33.047362 +151 151 173.73562 +152 151 1.3322676e-15 +153 151 -17.463532 +154 151 -8.8817842e-16 +189 151 -21.716953 +190 151 -17.857143 +191 151 -25.970373 +193 151 -21.716953 +194 151 17.857143 +152 152 264.3789 +153 152 -8.8817842e-16 +154 152 -107.89795 +189 152 -17.857143 +190 152 -33.047362 +192 152 41.803228 +193 152 17.857143 +194 152 -33.047362 +153 153 173.73562 +154 153 1.3322676e-15 +155 153 -17.463532 +156 153 -6.6613381e-16 +191 153 -21.716953 +192 153 -17.857143 +193 153 -25.970373 +195 153 -21.716953 +196 153 17.857143 +154 154 264.3789 +155 154 -6.6613381e-16 +156 154 -107.89795 +191 154 -17.857143 +192 154 -33.047362 +194 154 41.803228 +195 154 17.857143 +196 154 -33.047362 +155 155 173.73562 +156 155 8.8817842e-16 +157 155 -17.463532 +158 155 -2.220446e-16 +193 155 -21.716953 +194 155 -17.857143 +195 155 -25.970373 +196 155 -2.220446e-16 +197 155 -21.716953 +198 155 17.857143 +156 156 264.3789 +157 156 -2.220446e-16 +158 156 -107.89795 +193 156 -17.857143 +194 156 -33.047362 +195 156 -2.220446e-16 +196 156 41.803228 +197 156 17.857143 +198 156 -33.047362 +157 157 173.73562 +158 157 4.4408921e-16 +159 157 -17.463532 +160 157 -2.220446e-16 +195 157 -21.716953 +196 157 -17.857143 +197 157 -25.970373 +198 157 -2.220446e-16 +199 157 -21.716953 +200 157 17.857143 +158 158 264.3789 +159 158 -2.220446e-16 +160 158 -107.89795 +195 158 -17.857143 +196 158 -33.047362 +197 158 -2.220446e-16 +198 158 41.803228 +199 158 17.857143 +200 158 -33.047362 +159 159 86.86781 +160 159 4.4408921e-16 +197 159 -21.716953 +198 159 -17.857143 +199 159 -12.985187 +200 159 -1.3736264 +160 160 132.18945 +197 160 -17.857143 +198 160 -33.047362 +199 160 1.3736264 +200 160 20.901614 +161 161 86.86781 +162 161 1.0214052e-14 +163 161 -17.463532 +164 161 -9.7699626e-15 +201 161 -12.985187 +202 161 1.3736264 +203 161 -21.716953 +204 161 17.857143 +162 162 132.18945 +163 162 -9.9920072e-15 +164 162 -107.89795 +201 162 -1.3736264 +202 162 20.901614 +203 162 17.857143 +204 162 -33.047362 +163 163 173.73562 +164 163 1.9539925e-14 +165 163 -17.463532 +166 163 -9.7699626e-15 +201 163 -21.716953 +202 163 -17.857143 +203 163 -25.970373 +204 163 5.3290705e-15 +205 163 -21.716953 +206 163 17.857143 +164 164 264.3789 +165 164 -9.9920072e-15 +166 164 -107.89795 +201 164 -17.857143 +202 164 -33.047362 +203 164 5.3290705e-15 +204 164 41.803228 +205 164 17.857143 +206 164 -33.047362 +165 165 173.73562 +166 165 1.9539925e-14 +167 165 -17.463532 +168 165 -9.7699626e-15 +203 165 -21.716953 +204 165 -17.857143 +205 165 -25.970373 +206 165 5.3290705e-15 +207 165 -21.716953 +208 165 17.857143 +166 166 264.3789 +167 166 -9.9920072e-15 +168 166 -107.89795 +203 166 -17.857143 +204 166 -33.047362 +205 166 5.3290705e-15 +206 166 41.803228 +207 166 17.857143 +208 166 -33.047362 +167 167 173.73562 +168 167 1.9539925e-14 +169 167 -17.463532 +170 167 -9.7699626e-15 +205 167 -21.716953 +206 167 -17.857143 +207 167 -25.970373 +208 167 5.3290705e-15 +209 167 -21.716953 +210 167 17.857143 +168 168 264.3789 +169 168 -9.9920072e-15 +170 168 -107.89795 +205 168 -17.857143 +206 168 -33.047362 +207 168 5.3290705e-15 +208 168 41.803228 +209 168 17.857143 +210 168 -33.047362 +169 169 173.73562 +170 169 1.1990409e-14 +171 169 -17.463532 +172 169 -2.6645353e-15 +207 169 -21.716953 +208 169 -17.857143 +209 169 -25.970373 +210 169 5.1070259e-15 +211 169 -21.716953 +212 169 17.857143 +170 170 264.3789 +171 170 -2.6645353e-15 +172 170 -107.89795 +207 170 -17.857143 +208 170 -33.047362 +209 170 5.1070259e-15 +210 170 41.803228 +211 170 17.857143 +212 170 -33.047362 +171 171 173.73562 +172 171 3.1086245e-15 +173 171 -17.463532 +174 171 -2.220446e-16 +209 171 -21.716953 +210 171 -17.857143 +211 171 -25.970373 +212 171 4.8849813e-15 +213 171 -21.716953 +214 171 17.857143 +172 172 264.3789 +173 172 -2.220446e-16 +174 172 -107.89795 +209 172 -17.857143 +210 172 -33.047362 +211 172 4.6629367e-15 +212 172 41.803228 +213 172 17.857143 +214 172 -33.047362 +173 173 173.73562 +174 173 3.9968029e-15 +175 173 -17.463532 +176 173 -3.5527137e-15 +211 173 -21.716953 +212 173 -17.857143 +213 173 -25.970373 +214 173 2.8865799e-15 +215 173 -21.716953 +216 173 17.857143 +174 174 264.3789 +175 174 -3.7747583e-15 +176 174 -107.89795 +211 174 -17.857143 +212 174 -33.047362 +213 174 3.1086245e-15 +214 174 41.803228 +215 174 17.857143 +216 174 -33.047362 +175 175 173.73562 +176 175 1.0658141e-14 +177 175 -17.463532 +178 175 -7.1054274e-15 +213 175 -21.716953 +214 175 -17.857143 +215 175 -25.970373 +216 175 2.6645353e-15 +217 175 -21.716953 +218 175 17.857143 +176 176 264.3789 +177 176 -7.1054274e-15 +178 176 -107.89795 +213 176 -17.857143 +214 176 -33.047362 +215 176 2.6645353e-15 +216 176 41.803228 +217 176 17.857143 +218 176 -33.047362 +177 177 173.73562 +178 177 1.1990409e-14 +179 177 -17.463532 +180 177 -4.4408921e-15 +215 177 -21.716953 +216 177 -17.857143 +217 177 -25.970373 +218 177 5.1070259e-15 +219 177 -21.716953 +220 177 17.857143 +178 178 264.3789 +179 178 -4.6629367e-15 +180 178 -107.89795 +215 178 -17.857143 +216 178 -33.047362 +217 178 5.1070259e-15 +218 178 41.803228 +219 178 17.857143 +220 178 -33.047362 +179 179 173.73562 +180 179 3.9968029e-15 +181 179 -17.463532 +182 179 4.4408921e-16 +217 179 -21.716953 +218 179 -17.857143 +219 179 -25.970373 +220 179 4.2188475e-15 +221 179 -21.716953 +222 179 17.857143 +180 180 264.3789 +181 180 4.4408921e-16 +182 180 -107.89795 +217 180 -17.857143 +218 180 -33.047362 +219 180 4.4408921e-15 +220 180 41.803228 +221 180 17.857143 +222 180 -33.047362 +181 181 173.73562 +182 181 -1.7763568e-15 +183 181 -17.463532 +184 181 1.110223e-15 +219 181 -21.716953 +220 181 -17.857143 +221 181 -25.970373 +222 181 8.8817842e-16 +223 181 -21.716953 +224 181 17.857143 +182 182 264.3789 +183 182 1.110223e-15 +184 182 -107.89795 +219 182 -17.857143 +220 182 -33.047362 +221 182 1.110223e-15 +222 182 41.803228 +223 182 17.857143 +224 182 -33.047362 +183 183 173.73562 +184 183 -2.6645353e-15 +185 183 -17.463532 +186 183 1.3322676e-15 +221 183 -21.716953 +222 183 -17.857143 +223 183 -25.970373 +224 183 -6.6613381e-16 +225 183 -21.716953 +226 183 17.857143 +184 184 264.3789 +185 184 1.3322676e-15 +186 184 -107.89795 +221 184 -17.857143 +222 184 -33.047362 +223 184 -6.6613381e-16 +224 184 41.803228 +225 184 17.857143 +226 184 -33.047362 +185 185 173.73562 +186 185 -4.4408921e-16 +187 185 -17.463532 +188 185 -8.8817842e-16 +223 185 -21.716953 +224 185 -17.857143 +225 185 -25.970373 +226 185 -2.220446e-16 +227 185 -21.716953 +228 185 17.857143 +186 186 264.3789 +187 186 -8.8817842e-16 +188 186 -107.89795 +223 186 -17.857143 +224 186 -33.047362 +225 186 -2.220446e-16 +226 186 41.803228 +227 186 17.857143 +228 186 -33.047362 +187 187 173.73562 +188 187 1.7763568e-15 +189 187 -17.463532 +190 187 -8.8817842e-16 +225 187 -21.716953 +226 187 -17.857143 +227 187 -25.970373 +228 187 2.220446e-16 +229 187 -21.716953 +230 187 17.857143 +188 188 264.3789 +189 188 -8.8817842e-16 +190 188 -107.89795 +225 188 -17.857143 +226 188 -33.047362 +227 188 2.220446e-16 +228 188 41.803228 +229 188 17.857143 +230 188 -33.047362 +189 189 173.73562 +190 189 8.8817842e-16 +191 189 -17.463532 +227 189 -21.716953 +228 189 -17.857143 +229 189 -25.970373 +231 189 -21.716953 +232 189 17.857143 +190 190 264.3789 +192 190 -107.89795 +227 190 -17.857143 +228 190 -33.047362 +230 190 41.803228 +231 190 17.857143 +232 190 -33.047362 +191 191 173.73562 +192 191 8.8817842e-16 +193 191 -17.463532 +194 191 -8.8817842e-16 +229 191 -21.716953 +230 191 -17.857143 +231 191 -25.970373 +232 191 2.220446e-16 +233 191 -21.716953 +234 191 17.857143 +192 192 264.3789 +193 192 -8.8817842e-16 +194 192 -107.89795 +229 192 -17.857143 +230 192 -33.047362 +231 192 2.220446e-16 +232 192 41.803228 +233 192 17.857143 +234 192 -33.047362 +193 193 173.73562 +194 193 1.3322676e-15 +195 193 -17.463532 +196 193 -2.220446e-16 +231 193 -21.716953 +232 193 -17.857143 +233 193 -25.970373 +234 193 2.220446e-16 +235 193 -21.716953 +236 193 17.857143 +194 194 264.3789 +195 194 -2.220446e-16 +196 194 -107.89795 +231 194 -17.857143 +232 194 -33.047362 +233 194 2.220446e-16 +234 194 41.803228 +235 194 17.857143 +236 194 -33.047362 +195 195 173.73562 +197 195 -17.463532 +233 195 -21.716953 +234 195 -17.857143 +235 195 -25.970373 +237 195 -21.716953 +238 195 17.857143 +196 196 264.3789 +198 196 -107.89795 +233 196 -17.857143 +234 196 -33.047362 +236 196 41.803228 +237 196 17.857143 +238 196 -33.047362 +197 197 173.73562 +199 197 -17.463532 +235 197 -21.716953 +236 197 -17.857143 +237 197 -25.970373 +239 197 -21.716953 +240 197 17.857143 +198 198 264.3789 +200 198 -107.89795 +235 198 -17.857143 +236 198 -33.047362 +238 198 41.803228 +239 198 17.857143 +240 198 -33.047362 +199 199 86.86781 +237 199 -21.716953 +238 199 -17.857143 +239 199 -12.985187 +240 199 -1.3736264 +200 200 132.18945 +237 200 -17.857143 +238 200 -33.047362 +239 200 1.3736264 +240 200 20.901614 +201 201 86.86781 +202 201 9.7699626e-15 +203 201 -17.463532 +204 201 -9.7699626e-15 +241 201 -12.985187 +242 201 1.3736264 +243 201 -21.716953 +244 201 17.857143 +202 202 132.18945 +203 202 -9.7699626e-15 +204 202 -107.89795 +241 202 -1.3736264 +242 202 20.901614 +243 202 17.857143 +244 202 -33.047362 +203 203 173.73562 +204 203 1.9539925e-14 +205 203 -17.463532 +206 203 -9.7699626e-15 +241 203 -21.716953 +242 203 -17.857143 +243 203 -25.970373 +244 203 4.8849813e-15 +245 203 -21.716953 +246 203 17.857143 +204 204 264.3789 +205 204 -9.7699626e-15 +206 204 -107.89795 +241 204 -17.857143 +242 204 -33.047362 +243 204 4.8849813e-15 +244 204 41.803228 +245 204 17.857143 +246 204 -33.047362 +205 205 173.73562 +206 205 1.9539925e-14 +207 205 -17.463532 +208 205 -9.7699626e-15 +243 205 -21.716953 +244 205 -17.857143 +245 205 -25.970373 +246 205 4.8849813e-15 +247 205 -21.716953 +248 205 17.857143 +206 206 264.3789 +207 206 -9.7699626e-15 +208 206 -107.89795 +243 206 -17.857143 +244 206 -33.047362 +245 206 4.8849813e-15 +246 206 41.803228 +247 206 17.857143 +248 206 -33.047362 +207 207 173.73562 +208 207 1.9539925e-14 +209 207 -17.463532 +210 207 -9.7699626e-15 +245 207 -21.716953 +246 207 -17.857143 +247 207 -25.970373 +248 207 4.8849813e-15 +249 207 -21.716953 +250 207 17.857143 +208 208 264.3789 +209 208 -9.7699626e-15 +210 208 -107.89795 +245 208 -17.857143 +246 208 -33.047362 +247 208 4.8849813e-15 +248 208 41.803228 +249 208 17.857143 +250 208 -33.047362 +209 209 173.73562 +210 209 1.2434498e-14 +211 209 -17.463532 +212 209 -2.8865799e-15 +247 209 -21.716953 +248 209 -17.857143 +249 209 -25.970373 +250 209 1.3322676e-15 +251 209 -21.716953 +252 209 17.857143 +210 210 264.3789 +211 210 -2.6645353e-15 +212 210 -107.89795 +247 210 -17.857143 +248 210 -33.047362 +249 210 1.110223e-15 +250 210 41.803228 +251 210 17.857143 +252 210 -33.047362 +211 211 173.73562 +212 211 3.1086245e-15 +213 211 -17.463532 +214 211 -6.6613381e-16 +249 211 -21.716953 +250 211 -17.857143 +251 211 -25.970373 +252 211 -3.3306691e-15 +253 211 -21.716953 +254 211 17.857143 +212 212 264.3789 +213 212 -6.6613381e-16 +214 212 -107.89795 +249 212 -17.857143 +250 212 -33.047362 +251 212 -3.1086245e-15 +252 212 41.803228 +253 212 17.857143 +254 212 -33.047362 +213 213 173.73562 +214 213 4.8849813e-15 +215 213 -17.463532 +216 213 -3.9968029e-15 +251 213 -21.716953 +252 213 -17.857143 +253 213 -25.970373 +254 213 -8.8817842e-16 +255 213 -21.716953 +256 213 17.857143 +214 214 264.3789 +215 214 -3.9968029e-15 +216 214 -107.89795 +251 214 -17.857143 +252 214 -33.047362 +253 214 -8.8817842e-16 +254 214 41.803228 +255 214 17.857143 +256 214 -33.047362 +215 215 173.73562 +216 215 1.0658141e-14 +217 215 -17.463532 +218 215 -7.5495166e-15 +253 215 -21.716953 +254 215 -17.857143 +255 215 -25.970373 +256 215 2.6645353e-15 +257 215 -21.716953 +258 215 17.857143 +216 216 264.3789 +217 216 -7.1054274e-15 +218 216 -107.89795 +253 216 -17.857143 +254 216 -33.047362 +255 216 2.6645353e-15 +256 216 41.803228 +257 216 17.857143 +258 216 -33.047362 +217 217 173.73562 +218 217 1.687539e-14 +219 217 -17.463532 +220 217 -9.9920072e-15 +255 217 -21.716953 +256 217 -17.857143 +257 217 -25.970373 +258 217 3.7747583e-15 +259 217 -21.716953 +260 217 17.857143 +218 218 264.3789 +219 218 -9.7699626e-15 +220 218 -107.89795 +255 218 -17.857143 +256 218 -33.047362 +257 218 3.7747583e-15 +258 218 41.803228 +259 218 17.857143 +260 218 -33.047362 +219 219 173.73562 +220 219 1.2878587e-14 +221 219 -17.463532 +222 219 -3.1086245e-15 +257 219 -21.716953 +258 219 -17.857143 +259 219 -25.970373 +260 219 1.7763568e-15 +261 219 -21.716953 +262 219 17.857143 +220 220 264.3789 +221 220 -3.1086245e-15 +222 220 -107.89795 +257 220 -17.857143 +258 220 -33.047362 +259 220 1.7763568e-15 +260 220 41.803228 +261 220 17.857143 +262 220 -33.047362 +221 221 173.73562 +222 221 2.220446e-15 +223 221 -17.463532 +224 221 1.110223e-15 +259 221 -21.716953 +260 221 -17.857143 +261 221 -25.970373 +262 221 -4.4408921e-16 +263 221 -21.716953 +264 221 17.857143 +222 222 264.3789 +223 222 1.110223e-15 +224 222 -107.89795 +259 222 -17.857143 +260 222 -33.047362 +261 222 -4.4408921e-16 +262 222 41.803228 +263 222 17.857143 +264 222 -33.047362 +223 223 173.73562 +224 223 -2.220446e-15 +225 223 -17.463532 +226 223 1.3322676e-15 +261 223 -21.716953 +262 223 -17.857143 +263 223 -25.970373 +264 223 -1.110223e-15 +265 223 -21.716953 +266 223 17.857143 +224 224 264.3789 +225 224 1.3322676e-15 +226 224 -107.89795 +261 224 -17.857143 +262 224 -33.047362 +263 224 -1.110223e-15 +264 224 41.803228 +265 224 17.857143 +266 224 -33.047362 +225 225 173.73562 +227 225 -17.463532 +228 225 -8.8817842e-16 +263 225 -21.716953 +264 225 -17.857143 +265 225 -25.970373 +266 225 -2.220446e-16 +267 225 -21.716953 +268 225 17.857143 +226 226 264.3789 +227 226 -8.8817842e-16 +228 226 -107.89795 +263 226 -17.857143 +264 226 -33.047362 +265 226 -2.220446e-16 +266 226 41.803228 +267 226 17.857143 +268 226 -33.047362 +227 227 173.73562 +228 227 1.7763568e-15 +229 227 -17.463532 +230 227 -8.8817842e-16 +265 227 -21.716953 +266 227 -17.857143 +267 227 -25.970373 +268 227 2.220446e-16 +269 227 -21.716953 +270 227 17.857143 +228 228 264.3789 +229 228 -8.8817842e-16 +230 228 -107.89795 +265 228 -17.857143 +266 228 -33.047362 +267 228 2.220446e-16 +268 228 41.803228 +269 228 17.857143 +270 228 -33.047362 +229 229 173.73562 +230 229 8.8817842e-16 +231 229 -17.463532 +232 229 -2.220446e-16 +267 229 -21.716953 +268 229 -17.857143 +269 229 -25.970373 +271 229 -21.716953 +272 229 17.857143 +230 230 264.3789 +231 230 -2.220446e-16 +232 230 -107.89795 +267 230 -17.857143 +268 230 -33.047362 +270 230 41.803228 +271 230 17.857143 +272 230 -33.047362 +231 231 173.73562 +232 231 1.3322676e-15 +233 231 -17.463532 +234 231 -8.8817842e-16 +269 231 -21.716953 +270 231 -17.857143 +271 231 -25.970373 +272 231 -2.220446e-16 +273 231 -21.716953 +274 231 17.857143 +232 232 264.3789 +233 232 -8.8817842e-16 +234 232 -107.89795 +269 232 -17.857143 +270 232 -33.047362 +271 232 -2.220446e-16 +272 232 41.803228 +273 232 17.857143 +274 232 -33.047362 +233 233 173.73562 +234 233 8.8817842e-16 +235 233 -17.463532 +236 233 -4.4408921e-16 +271 233 -21.716953 +272 233 -17.857143 +273 233 -25.970373 +275 233 -21.716953 +276 233 17.857143 +234 234 264.3789 +235 234 -4.4408921e-16 +236 234 -107.89795 +271 234 -17.857143 +272 234 -33.047362 +274 234 41.803228 +275 234 17.857143 +276 234 -33.047362 +235 235 173.73562 +236 235 8.8817842e-16 +237 235 -17.463532 +238 235 -2.220446e-16 +273 235 -21.716953 +274 235 -17.857143 +275 235 -25.970373 +276 235 -2.220446e-16 +277 235 -21.716953 +278 235 17.857143 +236 236 264.3789 +237 236 -2.220446e-16 +238 236 -107.89795 +273 236 -17.857143 +274 236 -33.047362 +275 236 -2.220446e-16 +276 236 41.803228 +277 236 17.857143 +278 236 -33.047362 +237 237 173.73562 +238 237 4.4408921e-16 +239 237 -17.463532 +240 237 -2.220446e-16 +275 237 -21.716953 +276 237 -17.857143 +277 237 -25.970373 +278 237 -2.220446e-16 +279 237 -21.716953 +280 237 17.857143 +238 238 264.3789 +239 238 -2.220446e-16 +240 238 -107.89795 +275 238 -17.857143 +276 238 -33.047362 +277 238 -2.220446e-16 +278 238 41.803228 +279 238 17.857143 +280 238 -33.047362 +239 239 86.86781 +240 239 4.4408921e-16 +277 239 -21.716953 +278 239 -17.857143 +279 239 -12.985187 +280 239 -1.3736264 +240 240 132.18945 +277 240 -17.857143 +278 240 -33.047362 +279 240 1.3736264 +280 240 20.901614 +241 241 86.86781 +242 241 1.0214052e-14 +243 241 -17.463532 +244 241 -9.7699626e-15 +281 241 -12.985187 +282 241 1.3736264 +283 241 -21.716953 +284 241 17.857143 +242 242 132.18945 +243 242 -9.9920072e-15 +244 242 -107.89795 +281 242 -1.3736264 +282 242 20.901614 +283 242 17.857143 +284 242 -33.047362 +243 243 173.73562 +244 243 1.9539925e-14 +245 243 -17.463532 +246 243 -9.7699626e-15 +281 243 -21.716953 +282 243 -17.857143 +283 243 -25.970373 +284 243 5.3290705e-15 +285 243 -21.716953 +286 243 17.857143 +244 244 264.3789 +245 244 -9.9920072e-15 +246 244 -107.89795 +281 244 -17.857143 +282 244 -33.047362 +283 244 5.3290705e-15 +284 244 41.803228 +285 244 17.857143 +286 244 -33.047362 +245 245 173.73562 +246 245 1.9539925e-14 +247 245 -17.463532 +248 245 -9.7699626e-15 +283 245 -21.716953 +284 245 -17.857143 +285 245 -25.970373 +286 245 5.3290705e-15 +287 245 -21.716953 +288 245 17.857143 +246 246 264.3789 +247 246 -9.9920072e-15 +248 246 -107.89795 +283 246 -17.857143 +284 246 -33.047362 +285 246 5.3290705e-15 +286 246 41.803228 +287 246 17.857143 +288 246 -33.047362 +247 247 173.73562 +248 247 1.9539925e-14 +249 247 -17.463532 +250 247 -9.7699626e-15 +285 247 -21.716953 +286 247 -17.857143 +287 247 -25.970373 +288 247 5.3290705e-15 +289 247 -21.716953 +290 247 17.857143 +248 248 264.3789 +249 248 -9.9920072e-15 +250 248 -107.89795 +285 248 -17.857143 +286 248 -33.047362 +287 248 5.3290705e-15 +288 248 41.803228 +289 248 17.857143 +290 248 -33.047362 +249 249 173.73562 +250 249 1.1990409e-14 +251 249 -17.463532 +252 249 -2.6645353e-15 +287 249 -21.716953 +288 249 -17.857143 +289 249 -25.970373 +290 249 5.1070259e-15 +291 249 -21.716953 +292 249 17.857143 +250 250 264.3789 +251 250 -2.6645353e-15 +252 250 -107.89795 +287 250 -17.857143 +288 250 -33.047362 +289 250 5.1070259e-15 +290 250 41.803228 +291 250 17.857143 +292 250 -33.047362 +251 251 173.73562 +252 251 3.5527137e-15 +253 251 -17.463532 +254 251 -4.4408921e-16 +289 251 -21.716953 +290 251 -17.857143 +291 251 -25.970373 +292 251 4.8849813e-15 +293 251 -21.716953 +294 251 17.857143 +252 252 264.3789 +253 252 -4.4408921e-16 +254 252 -107.89795 +289 252 -17.857143 +290 252 -33.047362 +291 252 4.6629367e-15 +292 252 41.803228 +293 252 17.857143 +294 252 -33.047362 +253 253 173.73562 +254 253 3.9968029e-15 +255 253 -17.463532 +256 253 -3.5527137e-15 +291 253 -21.716953 +292 253 -17.857143 +293 253 -25.970373 +294 253 2.8865799e-15 +295 253 -21.716953 +296 253 17.857143 +254 254 264.3789 +255 254 -3.7747583e-15 +256 254 -107.89795 +291 254 -17.857143 +292 254 -33.047362 +293 254 3.1086245e-15 +294 254 41.803228 +295 254 17.857143 +296 254 -33.047362 +255 255 173.73562 +256 255 1.110223e-14 +257 255 -17.463532 +258 255 -7.327472e-15 +293 255 -21.716953 +294 255 -17.857143 +295 255 -25.970373 +296 255 2.6645353e-15 +297 255 -21.716953 +298 255 17.857143 +256 256 264.3789 +257 256 -7.5495166e-15 +258 256 -107.89795 +293 256 -17.857143 +294 256 -33.047362 +295 256 2.6645353e-15 +296 256 41.803228 +297 256 17.857143 +298 256 -33.047362 +257 257 173.73562 +258 257 1.4654944e-14 +259 257 -17.463532 +260 257 -7.327472e-15 +295 257 -21.716953 +296 257 -17.857143 +297 257 -25.970373 +298 257 3.7747583e-15 +299 257 -21.716953 +300 257 17.857143 +258 258 264.3789 +259 258 -7.5495166e-15 +260 258 -107.89795 +295 258 -17.857143 +296 258 -33.047362 +297 258 3.7747583e-15 +298 258 41.803228 +299 258 17.857143 +300 258 -33.047362 +259 259 173.73562 +260 259 7.5495166e-15 +261 259 -17.463532 +262 259 -2.220446e-16 +297 259 -21.716953 +298 259 -17.857143 +299 259 -25.970373 +300 259 1.9984014e-15 +301 259 -21.716953 +302 259 17.857143 +260 260 264.3789 +261 260 -2.220446e-16 +262 260 -107.89795 +297 260 -17.857143 +298 260 -33.047362 +299 260 1.9984014e-15 +300 260 41.803228 +301 260 17.857143 +302 260 -33.047362 +261 261 173.73562 +262 261 -1.3322676e-15 +263 261 -17.463532 +264 261 1.110223e-15 +299 261 -21.716953 +300 261 -17.857143 +301 261 -25.970373 +302 261 -4.4408921e-16 +303 261 -21.716953 +304 261 17.857143 +262 262 264.3789 +263 262 1.110223e-15 +264 262 -107.89795 +299 262 -17.857143 +300 262 -33.047362 +301 262 -4.4408921e-16 +302 262 41.803228 +303 262 17.857143 +304 262 -33.047362 +263 263 173.73562 +264 263 -2.6645353e-15 +265 263 -17.463532 +266 263 1.3322676e-15 +301 263 -21.716953 +302 263 -17.857143 +303 263 -25.970373 +304 263 -6.6613381e-16 +305 263 -21.716953 +306 263 17.857143 +264 264 264.3789 +265 264 1.3322676e-15 +266 264 -107.89795 +301 264 -17.857143 +302 264 -33.047362 +303 264 -6.6613381e-16 +304 264 41.803228 +305 264 17.857143 +306 264 -33.047362 +265 265 173.73562 +266 265 -4.4408921e-16 +267 265 -17.463532 +268 265 -8.8817842e-16 +303 265 -21.716953 +304 265 -17.857143 +305 265 -25.970373 +306 265 -2.220446e-16 +307 265 -21.716953 +308 265 17.857143 +266 266 264.3789 +267 266 -8.8817842e-16 +268 266 -107.89795 +303 266 -17.857143 +304 266 -33.047362 +305 266 -2.220446e-16 +306 266 41.803228 +307 266 17.857143 +308 266 -33.047362 +267 267 173.73562 +268 267 1.7763568e-15 +269 267 -17.463532 +270 267 -8.8817842e-16 +305 267 -21.716953 +306 267 -17.857143 +307 267 -25.970373 +308 267 2.220446e-16 +309 267 -21.716953 +310 267 17.857143 +268 268 264.3789 +269 268 -8.8817842e-16 +270 268 -107.89795 +305 268 -17.857143 +306 268 -33.047362 +307 268 2.220446e-16 +308 268 41.803228 +309 268 17.857143 +310 268 -33.047362 +269 269 173.73562 +270 269 8.8817842e-16 +271 269 -17.463532 +307 269 -21.716953 +308 269 -17.857143 +309 269 -25.970373 +311 269 -21.716953 +312 269 17.857143 +270 270 264.3789 +272 270 -107.89795 +307 270 -17.857143 +308 270 -33.047362 +310 270 41.803228 +311 270 17.857143 +312 270 -33.047362 +271 271 173.73562 +272 271 8.8817842e-16 +273 271 -17.463532 +274 271 -8.8817842e-16 +309 271 -21.716953 +310 271 -17.857143 +311 271 -25.970373 +312 271 2.220446e-16 +313 271 -21.716953 +314 271 17.857143 +272 272 264.3789 +273 272 -8.8817842e-16 +274 272 -107.89795 +309 272 -17.857143 +310 272 -33.047362 +311 272 2.220446e-16 +312 272 41.803228 +313 272 17.857143 +314 272 -33.047362 +273 273 173.73562 +274 273 1.7763568e-15 +275 273 -17.463532 +276 273 -4.4408921e-16 +311 273 -21.716953 +312 273 -17.857143 +313 273 -25.970373 +314 273 2.220446e-16 +315 273 -21.716953 +316 273 17.857143 +274 274 264.3789 +275 274 -4.4408921e-16 +276 274 -107.89795 +311 274 -17.857143 +312 274 -33.047362 +313 274 2.220446e-16 +314 274 41.803228 +315 274 17.857143 +316 274 -33.047362 +275 275 173.73562 +277 275 -17.463532 +313 275 -21.716953 +314 275 -17.857143 +315 275 -25.970373 +317 275 -21.716953 +318 275 17.857143 +276 276 264.3789 +278 276 -107.89795 +313 276 -17.857143 +314 276 -33.047362 +316 276 41.803228 +317 276 17.857143 +318 276 -33.047362 +277 277 173.73562 +279 277 -17.463532 +315 277 -21.716953 +316 277 -17.857143 +317 277 -25.970373 +319 277 -21.716953 +320 277 17.857143 +278 278 264.3789 +280 278 -107.89795 +315 278 -17.857143 +316 278 -33.047362 +318 278 41.803228 +319 278 17.857143 +320 278 -33.047362 +279 279 86.86781 +317 279 -21.716953 +318 279 -17.857143 +319 279 -12.985187 +320 279 -1.3736264 +280 280 132.18945 +317 280 -17.857143 +318 280 -33.047362 +319 280 1.3736264 +320 280 20.901614 +281 281 86.86781 +282 281 9.7699626e-15 +283 281 -17.463532 +284 281 -9.7699626e-15 +321 281 -12.985187 +322 281 1.3736264 +323 281 -21.716953 +324 281 17.857143 +282 282 132.18945 +283 282 -9.7699626e-15 +284 282 -107.89795 +321 282 -1.3736264 +322 282 20.901614 +323 282 17.857143 +324 282 -33.047362 +283 283 173.73562 +284 283 1.9539925e-14 +285 283 -17.463532 +286 283 -9.7699626e-15 +321 283 -21.716953 +322 283 -17.857143 +323 283 -25.970373 +324 283 4.8849813e-15 +325 283 -21.716953 +326 283 17.857143 +284 284 264.3789 +285 284 -9.7699626e-15 +286 284 -107.89795 +321 284 -17.857143 +322 284 -33.047362 +323 284 4.8849813e-15 +324 284 41.803228 +325 284 17.857143 +326 284 -33.047362 +285 285 173.73562 +286 285 1.9539925e-14 +287 285 -17.463532 +288 285 -9.7699626e-15 +323 285 -21.716953 +324 285 -17.857143 +325 285 -25.970373 +326 285 4.8849813e-15 +327 285 -21.716953 +328 285 17.857143 +286 286 264.3789 +287 286 -9.7699626e-15 +288 286 -107.89795 +323 286 -17.857143 +324 286 -33.047362 +325 286 4.8849813e-15 +326 286 41.803228 +327 286 17.857143 +328 286 -33.047362 +287 287 173.73562 +288 287 1.9539925e-14 +289 287 -17.463532 +290 287 -9.7699626e-15 +325 287 -21.716953 +326 287 -17.857143 +327 287 -25.970373 +328 287 4.8849813e-15 +329 287 -21.716953 +330 287 17.857143 +288 288 264.3789 +289 288 -9.7699626e-15 +290 288 -107.89795 +325 288 -17.857143 +326 288 -33.047362 +327 288 4.8849813e-15 +328 288 41.803228 +329 288 17.857143 +330 288 -33.047362 +289 289 173.73562 +290 289 1.2434498e-14 +291 289 -17.463532 +292 289 -2.8865799e-15 +327 289 -21.716953 +328 289 -17.857143 +329 289 -25.970373 +330 289 1.3322676e-15 +331 289 -21.716953 +332 289 17.857143 +290 290 264.3789 +291 290 -2.6645353e-15 +292 290 -107.89795 +327 290 -17.857143 +328 290 -33.047362 +329 290 1.3322676e-15 +330 290 41.803228 +331 290 17.857143 +332 290 -33.047362 +291 291 173.73562 +292 291 3.9968029e-15 +293 291 -17.463532 +294 291 -8.8817842e-16 +329 291 -21.716953 +330 291 -17.857143 +331 291 -25.970373 +332 291 -3.5527137e-15 +333 291 -21.716953 +334 291 17.857143 +292 292 264.3789 +293 292 -1.110223e-15 +294 292 -107.89795 +329 292 -17.857143 +330 292 -33.047362 +331 292 -3.3306691e-15 +332 292 41.803228 +333 292 17.857143 +334 292 -33.047362 +293 293 173.73562 +294 293 4.8849813e-15 +295 293 -17.463532 +296 293 -3.7747583e-15 +331 293 -21.716953 +332 293 -17.857143 +333 293 -25.970373 +334 293 -8.8817842e-16 +335 293 -21.716953 +336 293 17.857143 +294 294 264.3789 +295 294 -3.7747583e-15 +296 294 -107.89795 +331 294 -17.857143 +332 294 -33.047362 +333 294 -8.8817842e-16 +334 294 41.803228 +335 294 17.857143 +336 294 -33.047362 +295 295 173.73562 +296 295 1.0214052e-14 +297 295 -17.463532 +298 295 -7.327472e-15 +333 295 -21.716953 +334 295 -17.857143 +335 295 -25.970373 +336 295 2.6645353e-15 +337 295 -21.716953 +338 295 17.857143 +296 296 264.3789 +297 296 -7.1054274e-15 +298 296 -107.89795 +333 296 -17.857143 +334 296 -33.047362 +335 296 2.6645353e-15 +336 296 41.803228 +337 296 17.857143 +338 296 -33.047362 +297 297 173.73562 +298 297 1.3766766e-14 +299 297 -17.463532 +300 297 -7.327472e-15 +335 297 -21.716953 +336 297 -17.857143 +337 297 -25.970373 +338 297 3.9968029e-15 +339 297 -21.716953 +340 297 17.857143 +298 298 264.3789 +299 298 -7.1054274e-15 +300 298 -107.89795 +335 298 -17.857143 +336 298 -33.047362 +337 298 3.9968029e-15 +338 298 41.803228 +339 298 17.857143 +340 298 -33.047362 +299 299 173.73562 +300 299 7.5495166e-15 +301 299 -17.463532 +302 299 -2.220446e-16 +337 299 -21.716953 +338 299 -17.857143 +339 299 -25.970373 +340 299 1.7763568e-15 +341 299 -21.716953 +342 299 17.857143 +300 300 264.3789 +301 300 -2.220446e-16 +302 300 -107.89795 +337 300 -17.857143 +338 300 -33.047362 +339 300 1.9984014e-15 +340 300 41.803228 +341 300 17.857143 +342 300 -33.047362 +301 301 173.73562 +302 301 -1.3322676e-15 +303 301 -17.463532 +304 301 1.110223e-15 +339 301 -21.716953 +340 301 -17.857143 +341 301 -25.970373 +342 301 -6.6613381e-16 +343 301 -21.716953 +344 301 17.857143 +302 302 264.3789 +303 302 1.110223e-15 +304 302 -107.89795 +339 302 -17.857143 +340 302 -33.047362 +341 302 -6.6613381e-16 +342 302 41.803228 +343 302 17.857143 +344 302 -33.047362 +303 303 173.73562 +304 303 -2.220446e-15 +305 303 -17.463532 +306 303 1.3322676e-15 +341 303 -21.716953 +342 303 -17.857143 +343 303 -25.970373 +344 303 -6.6613381e-16 +345 303 -21.716953 +346 303 17.857143 +304 304 264.3789 +305 304 1.3322676e-15 +306 304 -107.89795 +341 304 -17.857143 +342 304 -33.047362 +343 304 -6.6613381e-16 +344 304 41.803228 +345 304 17.857143 +346 304 -33.047362 +305 305 173.73562 +307 305 -17.463532 +308 305 -8.8817842e-16 +343 305 -21.716953 +344 305 -17.857143 +345 305 -25.970373 +346 305 -4.4408921e-16 +347 305 -21.716953 +348 305 17.857143 +306 306 264.3789 +307 306 -8.8817842e-16 +308 306 -107.89795 +343 306 -17.857143 +344 306 -33.047362 +345 306 -4.4408921e-16 +346 306 41.803228 +347 306 17.857143 +348 306 -33.047362 +307 307 173.73562 +308 307 1.7763568e-15 +309 307 -17.463532 +310 307 -8.8817842e-16 +345 307 -21.716953 +346 307 -17.857143 +347 307 -25.970373 +348 307 2.220446e-16 +349 307 -21.716953 +350 307 17.857143 +308 308 264.3789 +309 308 -8.8817842e-16 +310 308 -107.89795 +345 308 -17.857143 +346 308 -33.047362 +347 308 2.220446e-16 +348 308 41.803228 +349 308 17.857143 +350 308 -33.047362 +309 309 173.73562 +310 309 8.8817842e-16 +311 309 -17.463532 +312 309 -2.220446e-16 +347 309 -21.716953 +348 309 -17.857143 +349 309 -25.970373 +351 309 -21.716953 +352 309 17.857143 +310 310 264.3789 +311 310 -2.220446e-16 +312 310 -107.89795 +347 310 -17.857143 +348 310 -33.047362 +350 310 41.803228 +351 310 17.857143 +352 310 -33.047362 +311 311 173.73562 +312 311 1.3322676e-15 +313 311 -17.463532 +314 311 -8.8817842e-16 +349 311 -21.716953 +350 311 -17.857143 +351 311 -25.970373 +352 311 -2.220446e-16 +353 311 -21.716953 +354 311 17.857143 +312 312 264.3789 +313 312 -8.8817842e-16 +314 312 -107.89795 +349 312 -17.857143 +350 312 -33.047362 +351 312 -2.220446e-16 +352 312 41.803228 +353 312 17.857143 +354 312 -33.047362 +313 313 173.73562 +314 313 1.3322676e-15 +315 313 -17.463532 +316 313 -6.6613381e-16 +351 313 -21.716953 +352 313 -17.857143 +353 313 -25.970373 +355 313 -21.716953 +356 313 17.857143 +314 314 264.3789 +315 314 -6.6613381e-16 +316 314 -107.89795 +351 314 -17.857143 +352 314 -33.047362 +354 314 41.803228 +355 314 17.857143 +356 314 -33.047362 +315 315 173.73562 +316 315 8.8817842e-16 +317 315 -17.463532 +318 315 -2.220446e-16 +353 315 -21.716953 +354 315 -17.857143 +355 315 -25.970373 +356 315 -2.220446e-16 +357 315 -21.716953 +358 315 17.857143 +316 316 264.3789 +317 316 -2.220446e-16 +318 316 -107.89795 +353 316 -17.857143 +354 316 -33.047362 +355 316 -2.220446e-16 +356 316 41.803228 +357 316 17.857143 +358 316 -33.047362 +317 317 173.73562 +318 317 4.4408921e-16 +319 317 -17.463532 +320 317 -2.220446e-16 +355 317 -21.716953 +356 317 -17.857143 +357 317 -25.970373 +358 317 -2.220446e-16 +359 317 -21.716953 +360 317 17.857143 +318 318 264.3789 +319 318 -2.220446e-16 +320 318 -107.89795 +355 318 -17.857143 +356 318 -33.047362 +357 318 -2.220446e-16 +358 318 41.803228 +359 318 17.857143 +360 318 -33.047362 +319 319 86.86781 +320 319 4.4408921e-16 +357 319 -21.716953 +358 319 -17.857143 +359 319 -12.985187 +360 319 -1.3736264 +320 320 132.18945 +357 320 -17.857143 +358 320 -33.047362 +359 320 1.3736264 +360 320 20.901614 +321 321 86.86781 +322 321 9.7699626e-15 +323 321 -17.463532 +324 321 -9.7699626e-15 +361 321 -12.985187 +362 321 1.3736264 +363 321 -21.716953 +364 321 17.857143 +322 322 132.18945 +323 322 -9.7699626e-15 +324 322 -107.89795 +361 322 -1.3736264 +362 322 20.901614 +363 322 17.857143 +364 322 -33.047362 +323 323 173.73562 +324 323 1.9539925e-14 +325 323 -17.463532 +326 323 -9.7699626e-15 +361 323 -21.716953 +362 323 -17.857143 +363 323 -25.970373 +364 323 4.8849813e-15 +365 323 -21.716953 +366 323 17.857143 +324 324 264.3789 +325 324 -9.7699626e-15 +326 324 -107.89795 +361 324 -17.857143 +362 324 -33.047362 +363 324 4.8849813e-15 +364 324 41.803228 +365 324 17.857143 +366 324 -33.047362 +325 325 173.73562 +326 325 1.9539925e-14 +327 325 -17.463532 +328 325 -9.7699626e-15 +363 325 -21.716953 +364 325 -17.857143 +365 325 -25.970373 +366 325 4.8849813e-15 +367 325 -21.716953 +368 325 17.857143 +326 326 264.3789 +327 326 -9.7699626e-15 +328 326 -107.89795 +363 326 -17.857143 +364 326 -33.047362 +365 326 4.8849813e-15 +366 326 41.803228 +367 326 17.857143 +368 326 -33.047362 +327 327 173.73562 +328 327 1.9539925e-14 +329 327 -17.463532 +330 327 -9.7699626e-15 +365 327 -21.716953 +366 327 -17.857143 +367 327 -25.970373 +368 327 4.8849813e-15 +369 327 -21.716953 +370 327 17.857143 +328 328 264.3789 +329 328 -9.7699626e-15 +330 328 -107.89795 +365 328 -17.857143 +366 328 -33.047362 +367 328 4.8849813e-15 +368 328 41.803228 +369 328 17.857143 +370 328 -33.047362 +329 329 173.73562 +330 329 1.1546319e-14 +331 329 -17.463532 +332 329 -2.220446e-15 +367 329 -21.716953 +368 329 -17.857143 +369 329 -25.970373 +370 329 4.8849813e-15 +371 329 -21.716953 +372 329 17.857143 +330 330 264.3789 +331 330 -1.9984014e-15 +332 330 -107.89795 +367 330 -17.857143 +368 330 -33.047362 +369 330 4.8849813e-15 +370 330 41.803228 +371 330 17.857143 +372 330 -33.047362 +331 331 173.73562 +332 331 3.5527137e-15 +333 331 -17.463532 +334 331 -6.6613381e-16 +369 331 -21.716953 +370 331 -17.857143 +371 331 -25.970373 +372 331 4.6629367e-15 +373 331 -21.716953 +374 331 17.857143 +332 332 264.3789 +333 332 -6.6613381e-16 +334 332 -107.89795 +369 332 -17.857143 +370 332 -33.047362 +371 332 4.4408921e-15 +372 332 41.803228 +373 332 17.857143 +374 332 -33.047362 +333 333 173.73562 +334 333 4.4408921e-15 +335 333 -17.463532 +336 333 -3.7747583e-15 +371 333 -21.716953 +372 333 -17.857143 +373 333 -25.970373 +374 333 3.1086245e-15 +375 333 -21.716953 +376 333 17.857143 +334 334 264.3789 +335 334 -3.9968029e-15 +336 334 -107.89795 +371 334 -17.857143 +372 334 -33.047362 +373 334 3.1086245e-15 +374 334 41.803228 +375 334 17.857143 +376 334 -33.047362 +335 335 173.73562 +336 335 1.0214052e-14 +337 335 -17.463532 +338 335 -7.327472e-15 +373 335 -21.716953 +374 335 -17.857143 +375 335 -25.970373 +376 335 2.6645353e-15 +377 335 -21.716953 +378 335 17.857143 +336 336 264.3789 +337 336 -7.1054274e-15 +338 336 -107.89795 +373 336 -17.857143 +374 336 -33.047362 +375 336 2.6645353e-15 +376 336 41.803228 +377 336 17.857143 +378 336 -33.047362 +337 337 173.73562 +338 337 1.4210855e-14 +339 337 -17.463532 +340 337 -7.327472e-15 +375 337 -21.716953 +376 337 -17.857143 +377 337 -25.970373 +378 337 3.7747583e-15 +379 337 -21.716953 +380 337 17.857143 +338 338 264.3789 +339 338 -7.1054274e-15 +340 338 -107.89795 +375 338 -17.857143 +376 338 -33.047362 +377 338 3.7747583e-15 +378 338 41.803228 +379 338 17.857143 +380 338 -33.047362 +339 339 173.73562 +340 339 7.9936058e-15 +341 339 -17.463532 +342 339 -6.6613381e-16 +377 339 -21.716953 +378 339 -17.857143 +379 339 -25.970373 +380 339 1.7763568e-15 +381 339 -21.716953 +382 339 17.857143 +340 340 264.3789 +341 340 -6.6613381e-16 +342 340 -107.89795 +377 340 -17.857143 +378 340 -33.047362 +379 340 1.7763568e-15 +380 340 41.803228 +381 340 17.857143 +382 340 -33.047362 +341 341 173.73562 +343 341 -17.463532 +344 341 8.8817842e-16 +379 341 -21.716953 +380 341 -17.857143 +381 341 -25.970373 +382 341 -4.4408921e-16 +383 341 -21.716953 +384 341 17.857143 +342 342 264.3789 +343 342 8.8817842e-16 +344 342 -107.89795 +379 342 -17.857143 +380 342 -33.047362 +381 342 -4.4408921e-16 +382 342 41.803228 +383 342 17.857143 +384 342 -33.047362 +343 343 173.73562 +344 343 -2.220446e-15 +345 343 -17.463532 +346 343 1.3322676e-15 +381 343 -21.716953 +382 343 -17.857143 +383 343 -25.970373 +384 343 -1.110223e-15 +385 343 -21.716953 +386 343 17.857143 +344 344 264.3789 +345 344 1.3322676e-15 +346 344 -107.89795 +381 344 -17.857143 +382 344 -33.047362 +383 344 -1.110223e-15 +384 344 41.803228 +385 344 17.857143 +386 344 -33.047362 +345 345 173.73562 +347 345 -17.463532 +348 345 -8.8817842e-16 +383 345 -21.716953 +384 345 -17.857143 +385 345 -25.970373 +386 345 -2.220446e-16 +387 345 -21.716953 +388 345 17.857143 +346 346 264.3789 +347 346 -8.8817842e-16 +348 346 -107.89795 +383 346 -17.857143 +384 346 -33.047362 +385 346 -2.220446e-16 +386 346 41.803228 +387 346 17.857143 +388 346 -33.047362 +347 347 173.73562 +348 347 1.7763568e-15 +349 347 -17.463532 +350 347 -8.8817842e-16 +385 347 -21.716953 +386 347 -17.857143 +387 347 -25.970373 +388 347 2.220446e-16 +389 347 -21.716953 +390 347 17.857143 +348 348 264.3789 +349 348 -8.8817842e-16 +350 348 -107.89795 +385 348 -17.857143 +386 348 -33.047362 +387 348 2.220446e-16 +388 348 41.803228 +389 348 17.857143 +390 348 -33.047362 +349 349 173.73562 +350 349 8.8817842e-16 +351 349 -17.463532 +352 349 -2.220446e-16 +387 349 -21.716953 +388 349 -17.857143 +389 349 -25.970373 +391 349 -21.716953 +392 349 17.857143 +350 350 264.3789 +351 350 -2.220446e-16 +352 350 -107.89795 +387 350 -17.857143 +388 350 -33.047362 +390 350 41.803228 +391 350 17.857143 +392 350 -33.047362 +351 351 173.73562 +352 351 1.3322676e-15 +353 351 -17.463532 +354 351 -8.8817842e-16 +389 351 -21.716953 +390 351 -17.857143 +391 351 -25.970373 +392 351 -2.220446e-16 +393 351 -21.716953 +394 351 17.857143 +352 352 264.3789 +353 352 -8.8817842e-16 +354 352 -107.89795 +389 352 -17.857143 +390 352 -33.047362 +391 352 -2.220446e-16 +392 352 41.803228 +393 352 17.857143 +394 352 -33.047362 +353 353 173.73562 +354 353 8.8817842e-16 +355 353 -17.463532 +356 353 -4.4408921e-16 +391 353 -21.716953 +392 353 -17.857143 +393 353 -25.970373 +395 353 -21.716953 +396 353 17.857143 +354 354 264.3789 +355 354 -4.4408921e-16 +356 354 -107.89795 +391 354 -17.857143 +392 354 -33.047362 +394 354 41.803228 +395 354 17.857143 +396 354 -33.047362 +355 355 173.73562 +356 355 4.4408921e-16 +357 355 -17.463532 +358 355 -2.220446e-16 +393 355 -21.716953 +394 355 -17.857143 +395 355 -25.970373 +396 355 -2.220446e-16 +397 355 -21.716953 +398 355 17.857143 +356 356 264.3789 +357 356 -2.220446e-16 +358 356 -107.89795 +393 356 -17.857143 +394 356 -33.047362 +395 356 -2.220446e-16 +396 356 41.803228 +397 356 17.857143 +398 356 -33.047362 +357 357 173.73562 +358 357 4.4408921e-16 +359 357 -17.463532 +360 357 -2.220446e-16 +395 357 -21.716953 +396 357 -17.857143 +397 357 -25.970373 +398 357 -2.220446e-16 +399 357 -21.716953 +400 357 17.857143 +358 358 264.3789 +359 358 -2.220446e-16 +360 358 -107.89795 +395 358 -17.857143 +396 358 -33.047362 +397 358 -2.220446e-16 +398 358 41.803228 +399 358 17.857143 +400 358 -33.047362 +359 359 86.86781 +360 359 4.4408921e-16 +397 359 -21.716953 +398 359 -17.857143 +399 359 -12.985187 +400 359 -1.3736264 +360 360 132.18945 +397 360 -17.857143 +398 360 -33.047362 +399 360 1.3736264 +400 360 20.901614 +361 361 86.86781 +362 361 7.5495166e-15 +363 361 -17.463532 +364 361 -3.3306691e-15 +401 361 -12.985187 +402 361 1.3736264 +403 361 -21.716953 +404 361 17.857143 +362 362 132.18945 +363 362 -3.7747583e-15 +364 362 -107.89795 +401 362 -1.3736264 +402 362 20.901614 +403 362 17.857143 +404 362 -33.047362 +363 363 173.73562 +364 363 8.8817842e-15 +365 363 -17.463532 +366 363 -4.6629367e-15 +401 363 -21.716953 +402 363 -17.857143 +403 363 -25.970373 +404 363 -8.8817842e-16 +405 363 -21.716953 +406 363 17.857143 +364 364 264.3789 +365 364 -4.8849813e-15 +366 364 -107.89795 +401 364 -17.857143 +402 364 -33.047362 +403 364 -8.8817842e-16 +404 364 41.803228 +405 364 17.857143 +406 364 -33.047362 +365 365 173.73562 +366 365 1.110223e-14 +367 365 -17.463532 +368 365 -9.7699626e-15 +403 365 -21.716953 +404 365 -17.857143 +405 365 -25.970373 +406 365 4.6629367e-15 +407 365 -21.716953 +408 365 17.857143 +366 366 264.3789 +367 366 -9.9920072e-15 +368 366 -107.89795 +403 366 -17.857143 +404 366 -33.047362 +405 366 4.6629367e-15 +406 366 41.803228 +407 366 17.857143 +408 366 -33.047362 +367 367 173.73562 +368 367 1.9539925e-14 +369 367 -17.463532 +370 367 -9.7699626e-15 +405 367 -21.716953 +406 367 -17.857143 +407 367 -25.970373 +408 367 5.3290705e-15 +409 367 -21.716953 +410 367 17.857143 +368 368 264.3789 +369 368 -9.9920072e-15 +370 368 -107.89795 +405 368 -17.857143 +406 368 -33.047362 +407 368 5.3290705e-15 +408 368 41.803228 +409 368 17.857143 +410 368 -33.047362 +369 369 173.73562 +370 369 1.4210855e-14 +371 369 -17.463532 +372 369 -4.8849813e-15 +407 369 -21.716953 +408 369 -17.857143 +409 369 -25.970373 +410 369 2.6645353e-15 +411 369 -21.716953 +412 369 17.857143 +370 370 264.3789 +371 370 -4.8849813e-15 +372 370 -107.89795 +407 370 -17.857143 +408 370 -33.047362 +409 370 2.6645353e-15 +410 370 41.803228 +411 370 17.857143 +412 370 -33.047362 +371 371 173.73562 +372 371 8.8817842e-15 +373 371 -17.463532 +374 371 -3.7747583e-15 +409 371 -21.716953 +410 371 -17.857143 +411 371 -25.970373 +412 371 -4.4408921e-16 +413 371 -21.716953 +414 371 17.857143 +372 372 264.3789 +373 372 -3.7747583e-15 +374 372 -107.89795 +409 372 -17.857143 +410 372 -33.047362 +411 372 -4.4408921e-16 +412 372 41.803228 +413 372 17.857143 +414 372 -33.047362 +373 373 173.73562 +374 373 7.5495166e-15 +375 373 -17.463532 +376 373 -3.5527137e-15 +411 373 -21.716953 +412 373 -17.857143 +413 373 -25.970373 +414 373 4.4408921e-16 +415 373 -21.716953 +416 373 17.857143 +374 374 264.3789 +375 374 -3.7747583e-15 +376 374 -107.89795 +411 374 -17.857143 +412 374 -33.047362 +413 374 4.4408921e-16 +414 374 41.803228 +415 374 17.857143 +416 374 -33.047362 +375 375 173.73562 +376 375 1.110223e-14 +377 375 -17.463532 +378 375 -7.327472e-15 +413 375 -21.716953 +414 375 -17.857143 +415 375 -25.970373 +416 375 2.6645353e-15 +417 375 -21.716953 +418 375 17.857143 +376 376 264.3789 +377 376 -7.5495166e-15 +378 376 -107.89795 +413 376 -17.857143 +414 376 -33.047362 +415 376 2.6645353e-15 +416 376 41.803228 +417 376 17.857143 +418 376 -33.047362 +377 377 173.73562 +378 377 1.4654944e-14 +379 377 -17.463532 +380 377 -7.327472e-15 +415 377 -21.716953 +416 377 -17.857143 +417 377 -25.970373 +418 377 3.7747583e-15 +419 377 -21.716953 +420 377 17.857143 +378 378 264.3789 +379 378 -7.5495166e-15 +380 378 -107.89795 +415 378 -17.857143 +416 378 -33.047362 +417 378 3.7747583e-15 +418 378 41.803228 +419 378 17.857143 +420 378 -33.047362 +379 379 173.73562 +380 379 7.5495166e-15 +381 379 -17.463532 +382 379 -2.220446e-16 +417 379 -21.716953 +418 379 -17.857143 +419 379 -25.970373 +420 379 1.9984014e-15 +421 379 -21.716953 +422 379 17.857143 +380 380 264.3789 +381 380 -2.220446e-16 +382 380 -107.89795 +417 380 -17.857143 +418 380 -33.047362 +419 380 1.9984014e-15 +420 380 41.803228 +421 380 17.857143 +422 380 -33.047362 +381 381 173.73562 +382 381 -1.3322676e-15 +383 381 -17.463532 +384 381 1.110223e-15 +419 381 -21.716953 +420 381 -17.857143 +421 381 -25.970373 +422 381 -4.4408921e-16 +423 381 -21.716953 +424 381 17.857143 +382 382 264.3789 +383 382 1.110223e-15 +384 382 -107.89795 +419 382 -17.857143 +420 382 -33.047362 +421 382 -4.4408921e-16 +422 382 41.803228 +423 382 17.857143 +424 382 -33.047362 +383 383 173.73562 +384 383 -2.6645353e-15 +385 383 -17.463532 +386 383 1.3322676e-15 +421 383 -21.716953 +422 383 -17.857143 +423 383 -25.970373 +424 383 -6.6613381e-16 +425 383 -21.716953 +426 383 17.857143 +384 384 264.3789 +385 384 1.3322676e-15 +386 384 -107.89795 +421 384 -17.857143 +422 384 -33.047362 +423 384 -6.6613381e-16 +424 384 41.803228 +425 384 17.857143 +426 384 -33.047362 +385 385 173.73562 +386 385 -4.4408921e-16 +387 385 -17.463532 +388 385 -8.8817842e-16 +423 385 -21.716953 +424 385 -17.857143 +425 385 -25.970373 +426 385 -2.220446e-16 +427 385 -21.716953 +428 385 17.857143 +386 386 264.3789 +387 386 -8.8817842e-16 +388 386 -107.89795 +423 386 -17.857143 +424 386 -33.047362 +425 386 -2.220446e-16 +426 386 41.803228 +427 386 17.857143 +428 386 -33.047362 +387 387 173.73562 +388 387 1.7763568e-15 +389 387 -17.463532 +390 387 -8.8817842e-16 +425 387 -21.716953 +426 387 -17.857143 +427 387 -25.970373 +428 387 2.220446e-16 +429 387 -21.716953 +430 387 17.857143 +388 388 264.3789 +389 388 -8.8817842e-16 +390 388 -107.89795 +425 388 -17.857143 +426 388 -33.047362 +427 388 2.220446e-16 +428 388 41.803228 +429 388 17.857143 +430 388 -33.047362 +389 389 173.73562 +390 389 8.8817842e-16 +391 389 -17.463532 +427 389 -21.716953 +428 389 -17.857143 +429 389 -25.970373 +431 389 -21.716953 +432 389 17.857143 +390 390 264.3789 +392 390 -107.89795 +427 390 -17.857143 +428 390 -33.047362 +430 390 41.803228 +431 390 17.857143 +432 390 -33.047362 +391 391 173.73562 +392 391 8.8817842e-16 +393 391 -17.463532 +394 391 -8.8817842e-16 +429 391 -21.716953 +430 391 -17.857143 +431 391 -25.970373 +432 391 2.220446e-16 +433 391 -21.716953 +434 391 17.857143 +392 392 264.3789 +393 392 -8.8817842e-16 +394 392 -107.89795 +429 392 -17.857143 +430 392 -33.047362 +431 392 2.220446e-16 +432 392 41.803228 +433 392 17.857143 +434 392 -33.047362 +393 393 173.73562 +394 393 3.9968029e-15 +395 393 -17.463532 +396 393 8.8817842e-16 +431 393 -21.716953 +432 393 -17.857143 +433 393 -25.970373 +434 393 -2.220446e-15 +435 393 -21.716953 +436 393 17.857143 +394 394 264.3789 +395 394 8.8817842e-16 +396 394 -107.89795 +431 394 -17.857143 +432 394 -33.047362 +433 394 -2.220446e-15 +434 394 41.803228 +435 394 17.857143 +436 394 -33.047362 +395 395 173.73562 +397 395 -17.463532 +398 395 -1.5543122e-15 +433 395 -21.716953 +434 395 -17.857143 +435 395 -25.970373 +437 395 -21.716953 +438 395 17.857143 +396 396 264.3789 +397 396 -1.3322676e-15 +398 396 -107.89795 +433 396 -17.857143 +434 396 -33.047362 +436 396 41.803228 +437 396 17.857143 +438 396 -33.047362 +397 397 173.73562 +399 397 -17.463532 +400 397 1.3322676e-15 +435 397 -21.716953 +436 397 -17.857143 +437 397 -25.970373 +439 397 -21.716953 +440 397 17.857143 +398 398 264.3789 +399 398 1.5543122e-15 +400 398 -107.89795 +435 398 -17.857143 +436 398 -33.047362 +438 398 41.803228 +439 398 17.857143 +440 398 -33.047362 +399 399 86.86781 +400 399 2.220446e-15 +437 399 -21.716953 +438 399 -17.857143 +439 399 -12.985187 +440 399 -1.3736264 +400 400 132.18945 +437 400 -17.857143 +438 400 -33.047362 +439 400 1.3736264 +440 400 20.901614 +401 401 86.86781 +402 401 1.5099033e-14 +403 401 -17.463532 +404 401 -7.327472e-15 +441 401 -12.985187 +442 401 1.3736264 +443 401 -21.716953 +444 401 17.857143 +402 402 132.18945 +403 402 -7.1054274e-15 +404 402 -107.89795 +441 402 -1.3736264 +442 402 20.901614 +443 402 17.857143 +444 402 -33.047362 +403 403 173.73562 +404 403 2.0872193e-14 +405 403 -17.463532 +406 403 -1.0436096e-14 +441 403 -21.716953 +442 403 -17.857143 +443 403 -25.970373 +444 403 8.8817842e-15 +445 403 -21.716953 +446 403 17.857143 +404 404 264.3789 +405 404 -1.0658141e-14 +406 404 -107.89795 +441 404 -17.857143 +442 404 -33.047362 +443 404 8.6597396e-15 +444 404 41.803228 +445 404 17.857143 +446 404 -33.047362 +405 405 173.73562 +406 405 1.5099033e-14 +407 405 -17.463532 +408 405 -9.9920072e-15 +443 405 -21.716953 +444 405 -17.857143 +445 405 -25.970373 +446 405 9.1038288e-15 +447 405 -21.716953 +448 405 17.857143 +406 406 264.3789 +407 406 -9.9920072e-15 +408 406 -107.89795 +443 406 -17.857143 +444 406 -33.047362 +445 406 9.3258734e-15 +446 406 41.803228 +447 406 17.857143 +448 406 -33.047362 +407 407 173.73562 +408 407 1.9539925e-14 +409 407 -17.463532 +410 407 -9.9920072e-15 +445 407 -21.716953 +446 407 -17.857143 +447 407 -25.970373 +448 407 5.3290705e-15 +449 407 -21.716953 +450 407 17.857143 +408 408 264.3789 +409 408 -9.9920072e-15 +410 408 -107.89795 +445 408 -17.857143 +446 408 -33.047362 +447 408 5.3290705e-15 +448 408 41.803228 +449 408 17.857143 +450 408 -33.047362 +409 409 173.73562 +410 409 9.3258734e-15 +411 409 -17.463532 +447 409 -21.716953 +448 409 -17.857143 +449 409 -25.970373 +450 409 2.6645353e-15 +451 409 -21.716953 +452 409 17.857143 +410 410 264.3789 +412 410 -107.89795 +447 410 -17.857143 +448 410 -33.047362 +449 410 2.6645353e-15 +450 410 41.803228 +451 410 17.857143 +452 410 -33.047362 +411 411 173.73562 +412 411 -1.3322676e-15 +413 411 -17.463532 +414 411 1.3322676e-15 +449 411 -21.716953 +450 411 -17.857143 +451 411 -25.970373 +452 411 -4.4408921e-16 +453 411 -21.716953 +454 411 17.857143 +412 412 264.3789 +413 412 1.3322676e-15 +414 412 -107.89795 +449 412 -17.857143 +450 412 -33.047362 +451 412 -4.4408921e-16 +452 412 41.803228 +453 412 17.857143 +454 412 -33.047362 +413 413 173.73562 +414 413 2.6645353e-15 +415 413 -17.463532 +416 413 -3.7747583e-15 +451 413 -21.716953 +452 413 -17.857143 +453 413 -25.970373 +454 413 4.4408921e-16 +455 413 -21.716953 +456 413 17.857143 +414 414 264.3789 +415 414 -3.7747583e-15 +416 414 -107.89795 +451 414 -17.857143 +452 414 -33.047362 +453 414 4.4408921e-16 +454 414 41.803228 +455 414 17.857143 +456 414 -33.047362 +415 415 173.73562 +416 415 1.110223e-14 +417 415 -17.463532 +418 415 -7.327472e-15 +453 415 -21.716953 +454 415 -17.857143 +455 415 -25.970373 +456 415 2.6645353e-15 +457 415 -21.716953 +458 415 17.857143 +416 416 264.3789 +417 416 -7.1054274e-15 +418 416 -107.89795 +453 416 -17.857143 +454 416 -33.047362 +455 416 2.6645353e-15 +456 416 41.803228 +457 416 17.857143 +458 416 -33.047362 +417 417 173.73562 +418 417 1.4210855e-14 +419 417 -17.463532 +420 417 -7.327472e-15 +455 417 -21.716953 +456 417 -17.857143 +457 417 -25.970373 +458 417 3.7747583e-15 +459 417 -21.716953 +460 417 17.857143 +418 418 264.3789 +419 418 -7.1054274e-15 +420 418 -107.89795 +455 418 -17.857143 +456 418 -33.047362 +457 418 3.7747583e-15 +458 418 41.803228 +459 418 17.857143 +460 418 -33.047362 +419 419 173.73562 +420 419 7.5495166e-15 +421 419 -17.463532 +422 419 -2.220446e-16 +457 419 -21.716953 +458 419 -17.857143 +459 419 -25.970373 +460 419 1.9984014e-15 +461 419 -21.716953 +462 419 17.857143 +420 420 264.3789 +421 420 -2.220446e-16 +422 420 -107.89795 +457 420 -17.857143 +458 420 -33.047362 +459 420 1.9984014e-15 +460 420 41.803228 +461 420 17.857143 +462 420 -33.047362 +421 421 173.73562 +422 421 -1.7763568e-15 +423 421 -17.463532 +424 421 1.3322676e-15 +459 421 -21.716953 +460 421 -17.857143 +461 421 -25.970373 +462 421 -4.4408921e-16 +463 421 -21.716953 +464 421 17.857143 +422 422 264.3789 +423 422 1.3322676e-15 +424 422 -107.89795 +459 422 -17.857143 +460 422 -33.047362 +461 422 -4.4408921e-16 +462 422 41.803228 +463 422 17.857143 +464 422 -33.047362 +423 423 173.73562 +424 423 -2.6645353e-15 +425 423 -17.463532 +426 423 1.3322676e-15 +461 423 -21.716953 +462 423 -17.857143 +463 423 -25.970373 +464 423 -6.6613381e-16 +465 423 -21.716953 +466 423 17.857143 +424 424 264.3789 +425 424 1.3322676e-15 +426 424 -107.89795 +461 424 -17.857143 +462 424 -33.047362 +463 424 -6.6613381e-16 +464 424 41.803228 +465 424 17.857143 +466 424 -33.047362 +425 425 173.73562 +426 425 -4.4408921e-16 +427 425 -17.463532 +428 425 -8.8817842e-16 +463 425 -21.716953 +464 425 -17.857143 +465 425 -25.970373 +466 425 -2.220446e-16 +467 425 -21.716953 +468 425 17.857143 +426 426 264.3789 +427 426 -8.8817842e-16 +428 426 -107.89795 +463 426 -17.857143 +464 426 -33.047362 +465 426 -2.220446e-16 +466 426 41.803228 +467 426 17.857143 +468 426 -33.047362 +427 427 173.73562 +428 427 1.7763568e-15 +429 427 -17.463532 +430 427 -8.8817842e-16 +465 427 -21.716953 +466 427 -17.857143 +467 427 -25.970373 +468 427 2.220446e-16 +469 427 -21.716953 +470 427 17.857143 +428 428 264.3789 +429 428 -8.8817842e-16 +430 428 -107.89795 +465 428 -17.857143 +466 428 -33.047362 +467 428 2.220446e-16 +468 428 41.803228 +469 428 17.857143 +470 428 -33.047362 +429 429 173.73562 +430 429 8.8817842e-16 +431 429 -17.463532 +467 429 -21.716953 +468 429 -17.857143 +469 429 -25.970373 +471 429 -21.716953 +472 429 17.857143 +430 430 264.3789 +432 430 -107.89795 +467 430 -17.857143 +468 430 -33.047362 +470 430 41.803228 +471 430 17.857143 +472 430 -33.047362 +431 431 173.73562 +432 431 8.8817842e-16 +433 431 -17.463532 +434 431 -8.8817842e-16 +469 431 -21.716953 +470 431 -17.857143 +471 431 -25.970373 +472 431 2.220446e-16 +473 431 -21.716953 +474 431 17.857143 +432 432 264.3789 +433 432 -8.8817842e-16 +434 432 -107.89795 +469 432 -17.857143 +470 432 -33.047362 +471 432 2.220446e-16 +472 432 41.803228 +473 432 17.857143 +474 432 -33.047362 +433 433 173.73562 +434 433 6.6613381e-15 +435 433 -17.463532 +436 433 2.220446e-15 +471 433 -21.716953 +472 433 -17.857143 +473 433 -25.970373 +474 433 -2.8865799e-15 +475 433 -21.716953 +476 433 17.857143 +434 434 264.3789 +435 434 2.4424907e-15 +436 434 -107.89795 +471 434 -17.857143 +472 434 -33.047362 +473 434 -2.8865799e-15 +474 434 41.803228 +475 434 17.857143 +476 434 -33.047362 +435 435 173.73562 +436 435 2.220446e-15 +437 435 -17.463532 +438 435 -2.220446e-15 +473 435 -21.716953 +474 435 -17.857143 +475 435 -25.970373 +476 435 -1.3322676e-15 +477 435 -21.716953 +478 435 17.857143 +436 436 264.3789 +437 436 -1.9984014e-15 +438 436 -107.89795 +473 436 -17.857143 +474 436 -33.047362 +475 436 -1.5543122e-15 +476 436 41.803228 +477 436 17.857143 +478 436 -33.047362 +437 437 173.73562 +438 437 1.3322676e-15 +439 437 -17.463532 +440 437 2.6645353e-15 +475 437 -21.716953 +476 437 -17.857143 +477 437 -25.970373 +478 437 -1.3322676e-15 +479 437 -21.716953 +480 437 17.857143 +438 438 264.3789 +439 438 2.6645353e-15 +440 438 -107.89795 +475 438 -17.857143 +476 438 -33.047362 +477 438 -1.3322676e-15 +478 438 41.803228 +479 438 17.857143 +480 438 -33.047362 +439 439 86.86781 +440 439 5.3290705e-15 +477 439 -21.716953 +478 439 -17.857143 +479 439 -12.985187 +480 439 -1.3736264 +440 440 132.18945 +477 440 -17.857143 +478 440 -33.047362 +479 440 1.3736264 +480 440 20.901614 +441 441 86.86781 +442 441 1.4210855e-14 +443 441 -17.463532 +444 441 -7.9936058e-15 +481 441 -12.985187 +482 441 1.3736264 +483 441 -21.716953 +484 441 17.857143 +442 442 132.18945 +443 442 -7.9936058e-15 +444 442 -107.89795 +481 442 -1.3736264 +482 442 20.901614 +483 442 17.857143 +484 442 -33.047362 +443 443 173.73562 +444 443 2.0428104e-14 +445 443 -17.463532 +446 443 -9.9920072e-15 +481 443 -21.716953 +482 443 -17.857143 +483 443 -25.970373 +484 443 -4.4408921e-16 +485 443 -21.716953 +486 443 17.857143 +444 444 264.3789 +445 444 -9.7699626e-15 +446 444 -107.89795 +481 444 -17.857143 +482 444 -33.047362 +483 444 -4.4408921e-16 +484 444 41.803228 +485 444 17.857143 +486 444 -33.047362 +445 445 173.73562 +446 445 1.6431301e-14 +447 445 -17.463532 +448 445 -9.3258734e-15 +483 445 -21.716953 +484 445 -17.857143 +485 445 -25.970373 +486 445 1.9984014e-15 +487 445 -21.716953 +488 445 17.857143 +446 446 264.3789 +447 446 -9.3258734e-15 +448 446 -107.89795 +483 446 -17.857143 +484 446 -33.047362 +485 446 1.9984014e-15 +486 446 41.803228 +487 446 17.857143 +488 446 -33.047362 +447 447 173.73562 +448 447 1.9539925e-14 +449 447 -17.463532 +450 447 -1.0214052e-14 +485 447 -21.716953 +486 447 -17.857143 +487 447 -25.970373 +488 447 5.1070259e-15 +489 447 -21.716953 +490 447 17.857143 +448 448 264.3789 +449 448 -1.0214052e-14 +450 448 -107.89795 +485 448 -17.857143 +486 448 -33.047362 +487 448 5.1070259e-15 +488 448 41.803228 +489 448 17.857143 +490 448 -33.047362 +449 449 173.73562 +450 449 8.8817842e-15 +451 449 -17.463532 +487 449 -21.716953 +488 449 -17.857143 +489 449 -25.970373 +490 449 3.3306691e-15 +491 449 -21.716953 +492 449 17.857143 +450 450 264.3789 +452 450 -107.89795 +487 450 -17.857143 +488 450 -33.047362 +489 450 3.3306691e-15 +490 450 41.803228 +491 450 17.857143 +492 450 -33.047362 +451 451 173.73562 +452 451 -1.3322676e-15 +453 451 -17.463532 +454 451 1.3322676e-15 +489 451 -21.716953 +490 451 -17.857143 +491 451 -25.970373 +492 451 -4.4408921e-16 +493 451 -21.716953 +494 451 17.857143 +452 452 264.3789 +453 452 1.3322676e-15 +454 452 -107.89795 +489 452 -17.857143 +490 452 -33.047362 +491 452 -4.4408921e-16 +492 452 41.803228 +493 452 17.857143 +494 452 -33.047362 +453 453 173.73562 +454 453 2.6645353e-15 +455 453 -17.463532 +456 453 -3.7747583e-15 +491 453 -21.716953 +492 453 -17.857143 +493 453 -25.970373 +494 453 4.4408921e-16 +495 453 -21.716953 +496 453 17.857143 +454 454 264.3789 +455 454 -3.7747583e-15 +456 454 -107.89795 +491 454 -17.857143 +492 454 -33.047362 +493 454 4.4408921e-16 +494 454 41.803228 +495 454 17.857143 +496 454 -33.047362 +455 455 173.73562 +456 455 1.110223e-14 +457 455 -17.463532 +458 455 -7.327472e-15 +493 455 -21.716953 +494 455 -17.857143 +495 455 -25.970373 +496 455 2.6645353e-15 +497 455 -21.716953 +498 455 17.857143 +456 456 264.3789 +457 456 -7.1054274e-15 +458 456 -107.89795 +493 456 -17.857143 +494 456 -33.047362 +495 456 2.6645353e-15 +496 456 41.803228 +497 456 17.857143 +498 456 -33.047362 +457 457 173.73562 +458 457 1.4210855e-14 +459 457 -17.463532 +460 457 -7.327472e-15 +495 457 -21.716953 +496 457 -17.857143 +497 457 -25.970373 +498 457 3.7747583e-15 +499 457 -21.716953 +500 457 17.857143 +458 458 264.3789 +459 458 -7.1054274e-15 +460 458 -107.89795 +495 458 -17.857143 +496 458 -33.047362 +497 458 3.9968029e-15 +498 458 41.803228 +499 458 17.857143 +500 458 -33.047362 +459 459 173.73562 +460 459 7.9936058e-15 +461 459 -17.463532 +462 459 -2.220446e-16 +497 459 -21.716953 +498 459 -17.857143 +499 459 -25.970373 +500 459 1.7763568e-15 +501 459 -21.716953 +502 459 17.857143 +460 460 264.3789 +461 460 -2.220446e-16 +462 460 -107.89795 +497 460 -17.857143 +498 460 -33.047362 +499 460 1.7763568e-15 +500 460 41.803228 +501 460 17.857143 +502 460 -33.047362 +461 461 173.73562 +462 461 -1.3322676e-15 +463 461 -17.463532 +464 461 1.3322676e-15 +499 461 -21.716953 +500 461 -17.857143 +501 461 -25.970373 +502 461 -4.4408921e-16 +503 461 -21.716953 +504 461 17.857143 +462 462 264.3789 +463 462 1.3322676e-15 +464 462 -107.89795 +499 462 -17.857143 +500 462 -33.047362 +501 462 -4.4408921e-16 +502 462 41.803228 +503 462 17.857143 +504 462 -33.047362 +463 463 173.73562 +464 463 -2.6645353e-15 +465 463 -17.463532 +466 463 1.3322676e-15 +501 463 -21.716953 +502 463 -17.857143 +503 463 -25.970373 +504 463 -6.6613381e-16 +505 463 -21.716953 +506 463 17.857143 +464 464 264.3789 +465 464 1.3322676e-15 +466 464 -107.89795 +501 464 -17.857143 +502 464 -33.047362 +503 464 -6.6613381e-16 +504 464 41.803228 +505 464 17.857143 +506 464 -33.047362 +465 465 173.73562 +466 465 -4.4408921e-16 +467 465 -17.463532 +468 465 -8.8817842e-16 +503 465 -21.716953 +504 465 -17.857143 +505 465 -25.970373 +507 465 -21.716953 +508 465 17.857143 +466 466 264.3789 +467 466 -8.8817842e-16 +468 466 -107.89795 +503 466 -17.857143 +504 466 -33.047362 +506 466 41.803228 +507 466 17.857143 +508 466 -33.047362 +467 467 173.73562 +468 467 1.7763568e-15 +469 467 -17.463532 +470 467 -8.8817842e-16 +505 467 -21.716953 +506 467 -17.857143 +507 467 -25.970373 +509 467 -21.716953 +510 467 17.857143 +468 468 264.3789 +469 468 -8.8817842e-16 +470 468 -107.89795 +505 468 -17.857143 +506 468 -33.047362 +508 468 41.803228 +509 468 17.857143 +510 468 -33.047362 +469 469 173.73562 +470 469 1.7763568e-15 +471 469 -17.463532 +472 469 4.4408921e-16 +507 469 -21.716953 +508 469 -17.857143 +509 469 -25.970373 +510 469 -8.8817842e-16 +511 469 -21.716953 +512 469 17.857143 +470 470 264.3789 +471 470 4.4408921e-16 +472 470 -107.89795 +507 470 -17.857143 +508 470 -33.047362 +509 470 -8.8817842e-16 +510 470 41.803228 +511 470 17.857143 +512 470 -33.047362 +471 471 173.73562 +472 471 8.8817842e-16 +473 471 -17.463532 +474 471 -1.110223e-15 +509 471 -21.716953 +510 471 -17.857143 +511 471 -25.970373 +513 471 -21.716953 +514 471 17.857143 +472 472 264.3789 +473 472 -1.110223e-15 +474 472 -107.89795 +509 472 -17.857143 +510 472 -33.047362 +512 472 41.803228 +513 472 17.857143 +514 472 -33.047362 +473 473 173.73562 +474 473 3.5527137e-15 +475 473 -17.463532 +476 473 1.7763568e-15 +511 473 -21.716953 +512 473 -17.857143 +513 473 -25.970373 +514 473 2.220446e-16 +515 473 -21.716953 +516 473 17.857143 +474 474 264.3789 +475 474 1.5543122e-15 +476 474 -107.89795 +511 474 -17.857143 +512 474 -33.047362 +513 474 2.220446e-16 +514 474 41.803228 +515 474 17.857143 +516 474 -33.047362 +475 475 173.73562 +476 475 2.220446e-15 +477 475 -17.463532 +478 475 -1.110223e-15 +513 475 -21.716953 +514 475 -17.857143 +515 475 -25.970373 +516 475 -2.220446e-16 +517 475 -21.716953 +518 475 17.857143 +476 476 264.3789 +477 476 -1.110223e-15 +478 476 -107.89795 +513 476 -17.857143 +514 476 -33.047362 +515 476 -2.220446e-16 +516 476 41.803228 +517 476 17.857143 +518 476 -33.047362 +477 477 173.73562 +478 477 8.8817842e-16 +479 477 -17.463532 +480 477 2.220446e-15 +515 477 -21.716953 +516 477 -17.857143 +517 477 -25.970373 +519 477 -21.716953 +520 477 17.857143 +478 478 264.3789 +479 478 1.9984014e-15 +480 478 -107.89795 +515 478 -17.857143 +516 478 -33.047362 +518 478 41.803228 +519 478 17.857143 +520 478 -33.047362 +479 479 86.86781 +480 479 4.4408921e-15 +517 479 -21.716953 +518 479 -17.857143 +519 479 -12.985187 +520 479 -1.3736264 +480 480 132.18945 +517 480 -17.857143 +518 480 -33.047362 +519 480 1.3736264 +520 480 20.901614 +481 481 86.86781 +482 481 1.0658141e-14 +483 481 -17.463532 +484 481 -9.7699626e-15 +521 481 -12.985187 +522 481 1.3736264 +523 481 -21.716953 +524 481 17.857143 +482 482 132.18945 +483 482 -9.7699626e-15 +484 482 -107.89795 +521 482 -1.3736264 +522 482 20.901614 +523 482 17.857143 +524 482 -33.047362 +483 483 173.73562 +484 483 1.8651747e-14 +485 483 -17.463532 +486 483 -8.8817842e-15 +521 483 -21.716953 +522 483 -17.857143 +523 483 -25.970373 +524 483 1.0214052e-14 +525 483 -21.716953 +526 483 17.857143 +484 484 264.3789 +485 484 -8.8817842e-15 +486 484 -107.89795 +521 484 -17.857143 +522 484 -33.047362 +523 484 1.0214052e-14 +524 484 41.803228 +525 484 17.857143 +526 484 -33.047362 +485 485 173.73562 +486 485 1.8207658e-14 +487 485 -17.463532 +488 485 -9.547918e-15 +523 485 -21.716953 +524 485 -17.857143 +525 485 -25.970373 +526 485 7.327472e-15 +527 485 -21.716953 +528 485 17.857143 +486 486 264.3789 +487 486 -9.7699626e-15 +488 486 -107.89795 +523 486 -17.857143 +524 486 -33.047362 +525 486 7.327472e-15 +526 486 41.803228 +527 486 17.857143 +528 486 -33.047362 +487 487 173.73562 +488 487 1.9539925e-14 +489 487 -17.463532 +490 487 -9.9920072e-15 +525 487 -21.716953 +526 487 -17.857143 +527 487 -25.970373 +528 487 5.3290705e-15 +529 487 -21.716953 +530 487 17.857143 +488 488 264.3789 +489 488 -9.9920072e-15 +490 488 -107.89795 +525 488 -17.857143 +526 488 -33.047362 +527 488 5.3290705e-15 +528 488 41.803228 +529 488 17.857143 +530 488 -33.047362 +489 489 173.73562 +490 489 8.8817842e-15 +491 489 -17.463532 +527 489 -21.716953 +528 489 -17.857143 +529 489 -25.970373 +530 489 2.6645353e-15 +531 489 -21.716953 +532 489 17.857143 +490 490 264.3789 +492 490 -107.89795 +527 490 -17.857143 +528 490 -33.047362 +529 490 2.6645353e-15 +530 490 41.803228 +531 490 17.857143 +532 490 -33.047362 +491 491 173.73562 +492 491 -1.3322676e-15 +493 491 -17.463532 +494 491 1.110223e-15 +529 491 -21.716953 +530 491 -17.857143 +531 491 -25.970373 +532 491 -4.4408921e-16 +533 491 -21.716953 +534 491 17.857143 +492 492 264.3789 +493 492 1.110223e-15 +494 492 -107.89795 +529 492 -17.857143 +530 492 -33.047362 +531 492 -4.4408921e-16 +532 492 41.803228 +533 492 17.857143 +534 492 -33.047362 +493 493 173.73562 +494 493 2.6645353e-15 +495 493 -17.463532 +496 493 -3.5527137e-15 +531 493 -21.716953 +532 493 -17.857143 +533 493 -25.970373 +534 493 4.4408921e-16 +535 493 -21.716953 +536 493 17.857143 +494 494 264.3789 +495 494 -3.7747583e-15 +496 494 -107.89795 +531 494 -17.857143 +532 494 -33.047362 +533 494 4.4408921e-16 +534 494 41.803228 +535 494 17.857143 +536 494 -33.047362 +495 495 173.73562 +496 495 1.0658141e-14 +497 495 -17.463532 +498 495 -7.327472e-15 +533 495 -21.716953 +534 495 -17.857143 +535 495 -25.970373 +536 495 2.6645353e-15 +537 495 -21.716953 +538 495 17.857143 +496 496 264.3789 +497 496 -7.1054274e-15 +498 496 -107.89795 +533 496 -17.857143 +534 496 -33.047362 +535 496 2.6645353e-15 +536 496 41.803228 +537 496 17.857143 +538 496 -33.047362 +497 497 173.73562 +498 497 1.4654944e-14 +499 497 -17.463532 +500 497 -7.327472e-15 +535 497 -21.716953 +536 497 -17.857143 +537 497 -25.970373 +538 497 3.7747583e-15 +539 497 -21.716953 +540 497 17.857143 +498 498 264.3789 +499 498 -7.5495166e-15 +500 498 -107.89795 +535 498 -17.857143 +536 498 -33.047362 +537 498 3.9968029e-15 +538 498 41.803228 +539 498 17.857143 +540 498 -33.047362 +499 499 173.73562 +500 499 7.9936058e-15 +501 499 -17.463532 +502 499 -2.220446e-16 +537 499 -21.716953 +538 499 -17.857143 +539 499 -25.970373 +540 499 1.7763568e-15 +541 499 -21.716953 +542 499 17.857143 +500 500 264.3789 +501 500 -2.220446e-16 +502 500 -107.89795 +537 500 -17.857143 +538 500 -33.047362 +539 500 1.7763568e-15 +540 500 41.803228 +541 500 17.857143 +542 500 -33.047362 +501 501 173.73562 +502 501 -1.3322676e-15 +503 501 -17.463532 +504 501 1.110223e-15 +539 501 -21.716953 +540 501 -17.857143 +541 501 -25.970373 +542 501 -4.4408921e-16 +543 501 -21.716953 +544 501 17.857143 +502 502 264.3789 +503 502 1.110223e-15 +504 502 -107.89795 +539 502 -17.857143 +540 502 -33.047362 +541 502 -4.4408921e-16 +542 502 41.803228 +543 502 17.857143 +544 502 -33.047362 +503 503 173.73562 +504 503 -2.6645353e-15 +505 503 -17.463532 +506 503 1.3322676e-15 +541 503 -21.716953 +542 503 -17.857143 +543 503 -25.970373 +544 503 -6.6613381e-16 +545 503 -21.716953 +546 503 17.857143 +504 504 264.3789 +505 504 1.3322676e-15 +506 504 -107.89795 +541 504 -17.857143 +542 504 -33.047362 +543 504 -6.6613381e-16 +544 504 41.803228 +545 504 17.857143 +546 504 -33.047362 +505 505 173.73562 +506 505 -4.4408921e-16 +507 505 -17.463532 +508 505 -8.8817842e-16 +543 505 -21.716953 +544 505 -17.857143 +545 505 -25.970373 +547 505 -21.716953 +548 505 17.857143 +506 506 264.3789 +507 506 -8.8817842e-16 +508 506 -107.89795 +543 506 -17.857143 +544 506 -33.047362 +546 506 41.803228 +547 506 17.857143 +548 506 -33.047362 +507 507 173.73562 +508 507 1.7763568e-15 +509 507 -17.463532 +510 507 -8.8817842e-16 +545 507 -21.716953 +546 507 -17.857143 +547 507 -25.970373 +549 507 -21.716953 +550 507 17.857143 +508 508 264.3789 +509 508 -8.8817842e-16 +510 508 -107.89795 +545 508 -17.857143 +546 508 -33.047362 +548 508 41.803228 +549 508 17.857143 +550 508 -33.047362 +509 509 173.73562 +510 509 1.3322676e-15 +511 509 -17.463532 +512 509 6.6613381e-16 +547 509 -21.716953 +548 509 -17.857143 +549 509 -25.970373 +550 509 -2.220446e-16 +551 509 -21.716953 +552 509 17.857143 +510 510 264.3789 +511 510 6.6613381e-16 +512 510 -107.89795 +547 510 -17.857143 +548 510 -33.047362 +549 510 -2.220446e-16 +550 510 41.803228 +551 510 17.857143 +552 510 -33.047362 +511 511 173.73562 +512 511 8.8817842e-16 +513 511 -17.463532 +514 511 -1.110223e-15 +549 511 -21.716953 +550 511 -17.857143 +551 511 -25.970373 +553 511 -21.716953 +554 511 17.857143 +512 512 264.3789 +513 512 -1.110223e-15 +514 512 -107.89795 +549 512 -17.857143 +550 512 -33.047362 +552 512 41.803228 +553 512 17.857143 +554 512 -33.047362 +513 513 173.73562 +514 513 8.8817842e-16 +515 513 -17.463532 +551 513 -21.716953 +552 513 -17.857143 +553 513 -25.970373 +554 513 -2.220446e-16 +555 513 -21.716953 +556 513 17.857143 +514 514 264.3789 +516 514 -107.89795 +551 514 -17.857143 +552 514 -33.047362 +553 514 -2.220446e-16 +554 514 41.803228 +555 514 17.857143 +556 514 -33.047362 +515 515 173.73562 +516 515 4.4408921e-16 +517 515 -17.463532 +518 515 -2.220446e-16 +553 515 -21.716953 +554 515 -17.857143 +555 515 -25.970373 +557 515 -21.716953 +558 515 17.857143 +516 516 264.3789 +517 516 -2.220446e-16 +518 516 -107.89795 +553 516 -17.857143 +554 516 -33.047362 +556 516 41.803228 +557 516 17.857143 +558 516 -33.047362 +517 517 173.73562 +519 517 -17.463532 +520 517 4.4408921e-16 +555 517 -21.716953 +556 517 -17.857143 +557 517 -25.970373 +558 517 2.220446e-16 +559 517 -21.716953 +560 517 17.857143 +518 518 264.3789 +519 518 4.4408921e-16 +520 518 -107.89795 +555 518 -17.857143 +556 518 -33.047362 +557 518 2.220446e-16 +558 518 41.803228 +559 518 17.857143 +560 518 -33.047362 +519 519 86.86781 +520 519 8.8817842e-16 +557 519 -21.716953 +558 519 -17.857143 +559 519 -12.985187 +560 519 -1.3736264 +520 520 132.18945 +557 520 -17.857143 +558 520 -33.047362 +559 520 1.3736264 +560 520 20.901614 +521 521 86.86781 +522 521 1.9095836e-14 +523 521 -17.463532 +524 521 -1.3100632e-14 +561 521 -12.985187 +562 521 1.3736264 +563 521 -21.716953 +564 521 17.857143 +522 522 132.18945 +523 522 -1.3100632e-14 +524 522 -107.89795 +561 522 -1.3736264 +562 522 20.901614 +563 522 17.857143 +564 522 -33.047362 +523 523 173.73562 +524 523 2.9753977e-14 +525 523 -17.463532 +526 523 -1.687539e-14 +561 523 -21.716953 +562 523 -17.857143 +563 523 -25.970373 +564 523 4.8849813e-15 +565 523 -21.716953 +566 523 17.857143 +524 524 264.3789 +525 524 -1.687539e-14 +526 524 -107.89795 +561 524 -17.857143 +562 524 -33.047362 +563 524 4.8849813e-15 +564 524 41.803228 +565 524 17.857143 +566 524 -33.047362 +525 525 173.73562 +526 525 2.5313085e-14 +527 525 -17.463532 +528 525 -7.7715612e-15 +563 525 -21.716953 +564 525 -17.857143 +565 525 -25.970373 +566 525 5.1070259e-15 +567 525 -21.716953 +568 525 17.857143 +526 526 264.3789 +527 526 -7.7715612e-15 +528 526 -107.89795 +563 526 -17.857143 +564 526 -33.047362 +565 526 5.3290705e-15 +566 526 41.803228 +567 526 17.857143 +568 526 -33.047362 +527 527 173.73562 +528 527 1.9539925e-14 +529 527 -17.463532 +530 527 -1.1768364e-14 +565 527 -21.716953 +566 527 -17.857143 +567 527 -25.970373 +568 527 4.8849813e-15 +569 527 -21.716953 +570 527 17.857143 +528 528 264.3789 +529 528 -1.1768364e-14 +530 528 -107.89795 +565 528 -17.857143 +566 528 -33.047362 +567 528 4.8849813e-15 +568 528 41.803228 +569 528 17.857143 +570 528 -33.047362 +529 529 173.73562 +530 529 7.9936058e-15 +531 529 -17.463532 +532 529 4.2188475e-15 +567 529 -21.716953 +568 529 -17.857143 +569 529 -25.970373 +570 529 1.3322676e-15 +571 529 -21.716953 +572 529 17.857143 +530 530 264.3789 +531 530 4.4408921e-15 +532 530 -107.89795 +567 530 -17.857143 +568 530 -33.047362 +569 530 1.5543122e-15 +570 530 41.803228 +571 530 17.857143 +572 530 -33.047362 +531 531 173.73562 +532 531 -6.2172489e-15 +533 531 -17.463532 +534 531 2.220446e-15 +569 531 -21.716953 +570 531 -17.857143 +571 531 -25.970373 +572 531 -3.3306691e-15 +573 531 -21.716953 +574 531 17.857143 +532 532 264.3789 +533 532 2.220446e-15 +534 532 -107.89795 +569 532 -17.857143 +570 532 -33.047362 +571 532 -3.5527137e-15 +572 532 41.803228 +573 532 17.857143 +574 532 -33.047362 +533 533 173.73562 +534 533 -4.4408921e-15 +535 533 -17.463532 +536 533 -3.5527137e-15 +571 533 -21.716953 +572 533 -17.857143 +573 533 -25.970373 +574 533 3.1086245e-15 +575 533 -21.716953 +576 533 17.857143 +534 534 264.3789 +535 534 -3.7747583e-15 +536 534 -107.89795 +571 534 -17.857143 +572 534 -33.047362 +573 534 3.1086245e-15 +574 534 41.803228 +575 534 17.857143 +576 534 -33.047362 +535 535 173.73562 +536 535 1.0658141e-14 +537 535 -17.463532 +538 535 -7.327472e-15 +573 535 -21.716953 +574 535 -17.857143 +575 535 -25.970373 +576 535 2.6645353e-15 +577 535 -21.716953 +578 535 17.857143 +536 536 264.3789 +537 536 -7.1054274e-15 +538 536 -107.89795 +573 536 -17.857143 +574 536 -33.047362 +575 536 2.6645353e-15 +576 536 41.803228 +577 536 17.857143 +578 536 -33.047362 +537 537 173.73562 +538 537 1.4654944e-14 +539 537 -17.463532 +540 537 -7.327472e-15 +575 537 -21.716953 +576 537 -17.857143 +577 537 -25.970373 +578 537 3.7747583e-15 +579 537 -21.716953 +580 537 17.857143 +538 538 264.3789 +539 538 -7.5495166e-15 +540 538 -107.89795 +575 538 -17.857143 +576 538 -33.047362 +577 538 3.7747583e-15 +578 538 41.803228 +579 538 17.857143 +580 538 -33.047362 +539 539 173.73562 +540 539 7.5495166e-15 +541 539 -17.463532 +542 539 -2.220446e-16 +577 539 -21.716953 +578 539 -17.857143 +579 539 -25.970373 +580 539 1.9984014e-15 +581 539 -21.716953 +582 539 17.857143 +540 540 264.3789 +541 540 -2.220446e-16 +542 540 -107.89795 +577 540 -17.857143 +578 540 -33.047362 +579 540 1.9984014e-15 +580 540 41.803228 +581 540 17.857143 +582 540 -33.047362 +541 541 173.73562 +542 541 -1.7763568e-15 +543 541 -17.463532 +544 541 1.110223e-15 +579 541 -21.716953 +580 541 -17.857143 +581 541 -25.970373 +582 541 -4.4408921e-16 +583 541 -21.716953 +584 541 17.857143 +542 542 264.3789 +543 542 1.110223e-15 +544 542 -107.89795 +579 542 -17.857143 +580 542 -33.047362 +581 542 -4.4408921e-16 +582 542 41.803228 +583 542 17.857143 +584 542 -33.047362 +543 543 173.73562 +544 543 -2.6645353e-15 +545 543 -17.463532 +546 543 1.3322676e-15 +581 543 -21.716953 +582 543 -17.857143 +583 543 -25.970373 +584 543 -6.6613381e-16 +585 543 -21.716953 +586 543 17.857143 +544 544 264.3789 +545 544 1.3322676e-15 +546 544 -107.89795 +581 544 -17.857143 +582 544 -33.047362 +583 544 -6.6613381e-16 +584 544 41.803228 +585 544 17.857143 +586 544 -33.047362 +545 545 173.73562 +546 545 3.5527137e-15 +547 545 -17.463532 +548 545 1.110223e-15 +583 545 -21.716953 +584 545 -17.857143 +585 545 -25.970373 +586 545 -3.9968029e-15 +587 545 -21.716953 +588 545 17.857143 +546 546 264.3789 +547 546 1.110223e-15 +548 546 -107.89795 +583 546 -17.857143 +584 546 -33.047362 +585 546 -3.9968029e-15 +586 546 41.803228 +587 546 17.857143 +588 546 -33.047362 +547 547 173.73562 +548 547 1.3322676e-15 +549 547 -17.463532 +550 547 -2.6645353e-15 +585 547 -21.716953 +586 547 -17.857143 +587 547 -25.970373 +588 547 2.220446e-16 +589 547 -21.716953 +590 547 17.857143 +548 548 264.3789 +549 548 -2.6645353e-15 +550 548 -107.89795 +585 548 -17.857143 +586 548 -33.047362 +587 548 4.4408921e-16 +588 548 41.803228 +589 548 17.857143 +590 548 -33.047362 +549 549 173.73562 +550 549 8.8817842e-16 +551 549 -17.463532 +552 549 1.5543122e-15 +587 549 -21.716953 +588 549 -17.857143 +589 549 -25.970373 +591 549 -21.716953 +592 549 17.857143 +550 550 264.3789 +551 550 1.7763568e-15 +552 550 -107.89795 +587 550 -17.857143 +588 550 -33.047362 +589 550 2.220446e-16 +590 550 41.803228 +591 550 17.857143 +592 550 -33.047362 +551 551 173.73562 +552 551 8.8817842e-16 +553 551 -17.463532 +554 551 -2.6645353e-15 +589 551 -21.716953 +590 551 -17.857143 +591 551 -25.970373 +593 551 -21.716953 +594 551 17.857143 +552 552 264.3789 +553 552 -2.4424907e-15 +554 552 -107.89795 +589 552 -17.857143 +590 552 -33.047362 +592 552 41.803228 +593 552 17.857143 +594 552 -33.047362 +553 553 173.73562 +554 553 1.3322676e-15 +555 553 -17.463532 +556 553 1.3322676e-15 +591 553 -21.716953 +592 553 -17.857143 +593 553 -25.970373 +594 553 4.4408921e-16 +595 553 -21.716953 +596 553 17.857143 +554 554 264.3789 +555 554 1.3322676e-15 +556 554 -107.89795 +591 554 -17.857143 +592 554 -33.047362 +593 554 2.220446e-16 +594 554 41.803228 +595 554 17.857143 +596 554 -33.047362 +555 555 173.73562 +556 555 8.8817842e-16 +557 555 -17.463532 +558 555 -1.9984014e-15 +593 555 -21.716953 +594 555 -17.857143 +595 555 -25.970373 +596 555 -2.220446e-16 +597 555 -21.716953 +598 555 17.857143 +556 556 264.3789 +557 556 -1.7763568e-15 +558 556 -107.89795 +593 556 -17.857143 +594 556 -33.047362 +595 556 -2.220446e-16 +596 556 41.803228 +597 556 17.857143 +598 556 -33.047362 +557 557 173.73562 +558 557 4.4408921e-16 +559 557 -17.463532 +560 557 1.7763568e-15 +595 557 -21.716953 +596 557 -17.857143 +597 557 -25.970373 +598 557 -2.220446e-16 +599 557 -21.716953 +600 557 17.857143 +558 558 264.3789 +559 558 1.9984014e-15 +560 558 -107.89795 +595 558 -17.857143 +596 558 -33.047362 +597 558 -4.4408921e-16 +598 558 41.803228 +599 558 17.857143 +600 558 -33.047362 +559 559 86.86781 +560 559 4.4408921e-15 +597 559 -21.716953 +598 559 -17.857143 +599 559 -12.985187 +600 559 -1.3736264 +560 560 132.18945 +597 560 -17.857143 +598 560 -33.047362 +599 560 1.3736264 +600 560 20.901614 +561 561 86.86781 +562 561 1.687539e-14 +563 561 -17.463532 +564 561 -6.2172489e-15 +601 561 -12.985187 +602 561 1.3736264 +603 561 -21.716953 +604 561 17.857143 +562 562 132.18945 +563 562 -6.2172489e-15 +564 562 -107.89795 +601 562 -1.3736264 +602 562 20.901614 +603 562 17.857143 +604 562 -33.047362 +563 563 173.73562 +564 563 1.9984014e-14 +565 563 -17.463532 +566 563 -1.3766766e-14 +601 563 -21.716953 +602 563 -17.857143 +603 563 -25.970373 +604 563 5.1070259e-15 +605 563 -21.716953 +606 563 17.857143 +564 564 264.3789 +565 564 -1.398881e-14 +566 564 -107.89795 +601 564 -17.857143 +602 564 -33.047362 +603 564 5.1070259e-15 +604 564 41.803228 +605 564 17.857143 +606 564 -33.047362 +565 565 173.73562 +566 565 1.9984014e-14 +567 565 -17.463532 +568 565 -6.2172489e-15 +603 565 -21.716953 +604 565 -17.857143 +605 565 -25.970373 +606 565 4.8849813e-15 +607 565 -21.716953 +608 565 17.857143 +566 566 264.3789 +567 566 -6.2172489e-15 +568 566 -107.89795 +603 566 -17.857143 +604 566 -33.047362 +605 566 4.8849813e-15 +606 566 41.803228 +607 566 17.857143 +608 566 -33.047362 +567 567 173.73562 +568 567 1.9984014e-14 +569 567 -17.463532 +570 567 -1.3766766e-14 +605 567 -21.716953 +606 567 -17.857143 +607 567 -25.970373 +608 567 5.1070259e-15 +609 567 -21.716953 +610 567 17.857143 +568 568 264.3789 +569 568 -1.398881e-14 +570 568 -107.89795 +605 568 -17.857143 +606 568 -33.047362 +607 568 5.1070259e-15 +608 568 41.803228 +609 568 17.857143 +610 568 -33.047362 +569 569 173.73562 +570 569 1.2434498e-14 +571 569 -17.463532 +572 569 1.3322676e-15 +607 569 -21.716953 +608 569 -17.857143 +609 569 -25.970373 +610 569 4.8849813e-15 +611 569 -21.716953 +612 569 17.857143 +570 570 264.3789 +571 570 1.110223e-15 +572 570 -107.89795 +607 570 -17.857143 +608 570 -33.047362 +609 570 4.8849813e-15 +610 570 41.803228 +611 570 17.857143 +612 570 -33.047362 +571 571 173.73562 +572 571 3.9968029e-15 +573 571 -17.463532 +574 571 -4.2188475e-15 +609 571 -21.716953 +610 571 -17.857143 +611 571 -25.970373 +612 571 4.8849813e-15 +613 571 -21.716953 +614 571 17.857143 +572 572 264.3789 +573 572 -4.2188475e-15 +574 572 -107.89795 +609 572 -17.857143 +610 572 -33.047362 +611 572 4.8849813e-15 +612 572 41.803228 +613 572 17.857143 +614 572 -33.047362 +573 573 173.73562 +574 573 -2.220446e-15 +575 573 -17.463532 +576 573 -3.7747583e-15 +611 573 -21.716953 +612 573 -17.857143 +613 573 -25.970373 +614 573 6.2172489e-15 +615 573 -21.716953 +616 573 17.857143 +574 574 264.3789 +575 574 -3.7747583e-15 +576 574 -107.89795 +611 574 -17.857143 +612 574 -33.047362 +613 574 6.2172489e-15 +614 574 41.803228 +615 574 17.857143 +616 574 -33.047362 +575 575 173.73562 +576 575 1.110223e-14 +577 575 -17.463532 +578 575 -7.327472e-15 +613 575 -21.716953 +614 575 -17.857143 +615 575 -25.970373 +616 575 2.6645353e-15 +617 575 -21.716953 +618 575 17.857143 +576 576 264.3789 +577 576 -7.1054274e-15 +578 576 -107.89795 +613 576 -17.857143 +614 576 -33.047362 +615 576 2.6645353e-15 +616 576 41.803228 +617 576 17.857143 +618 576 -33.047362 +577 577 173.73562 +578 577 1.4210855e-14 +579 577 -17.463532 +580 577 -7.327472e-15 +615 577 -21.716953 +616 577 -17.857143 +617 577 -25.970373 +618 577 3.7747583e-15 +619 577 -21.716953 +620 577 17.857143 +578 578 264.3789 +579 578 -7.1054274e-15 +580 578 -107.89795 +615 578 -17.857143 +616 578 -33.047362 +617 578 3.7747583e-15 +618 578 41.803228 +619 578 17.857143 +620 578 -33.047362 +579 579 173.73562 +580 579 7.5495166e-15 +581 579 -17.463532 +582 579 -2.220446e-16 +617 579 -21.716953 +618 579 -17.857143 +619 579 -25.970373 +620 579 1.9984014e-15 +621 579 -21.716953 +622 579 17.857143 +580 580 264.3789 +581 580 -2.220446e-16 +582 580 -107.89795 +617 580 -17.857143 +618 580 -33.047362 +619 580 1.9984014e-15 +620 580 41.803228 +621 580 17.857143 +622 580 -33.047362 +581 581 173.73562 +582 581 -1.7763568e-15 +583 581 -17.463532 +584 581 1.3322676e-15 +619 581 -21.716953 +620 581 -17.857143 +621 581 -25.970373 +622 581 -4.4408921e-16 +623 581 -21.716953 +624 581 17.857143 +582 582 264.3789 +583 582 1.3322676e-15 +584 582 -107.89795 +619 582 -17.857143 +620 582 -33.047362 +621 582 -4.4408921e-16 +622 582 41.803228 +623 582 17.857143 +624 582 -33.047362 +583 583 173.73562 +584 583 -2.6645353e-15 +585 583 -17.463532 +586 583 1.3322676e-15 +621 583 -21.716953 +622 583 -17.857143 +623 583 -25.970373 +624 583 -6.6613381e-16 +625 583 -21.716953 +626 583 17.857143 +584 584 264.3789 +585 584 1.3322676e-15 +586 584 -107.89795 +621 584 -17.857143 +622 584 -33.047362 +623 584 -6.6613381e-16 +624 584 41.803228 +625 584 17.857143 +626 584 -33.047362 +585 585 173.73562 +586 585 6.2172489e-15 +587 585 -17.463532 +588 585 2.6645353e-15 +623 585 -21.716953 +624 585 -17.857143 +625 585 -25.970373 +626 585 -3.3306691e-15 +627 585 -21.716953 +628 585 17.857143 +586 586 264.3789 +587 586 2.6645353e-15 +588 586 -107.89795 +623 586 -17.857143 +624 586 -33.047362 +625 586 -3.3306691e-15 +626 586 41.803228 +627 586 17.857143 +628 586 -33.047362 +587 587 173.73562 +588 587 1.7763568e-15 +589 587 -17.463532 +590 587 -4.2188475e-15 +625 587 -21.716953 +626 587 -17.857143 +627 587 -25.970373 +629 587 -21.716953 +630 587 17.857143 +588 588 264.3789 +589 588 -4.4408921e-15 +590 588 -107.89795 +625 588 -17.857143 +626 588 -33.047362 +628 588 41.803228 +629 588 17.857143 +630 588 -33.047362 +589 589 173.73562 +590 589 1.3322676e-15 +591 589 -17.463532 +592 589 3.5527137e-15 +627 589 -21.716953 +628 589 -17.857143 +629 589 -25.970373 +631 589 -21.716953 +632 589 17.857143 +590 590 264.3789 +591 590 3.5527137e-15 +592 590 -107.89795 +627 590 -17.857143 +628 590 -33.047362 +630 590 41.803228 +631 590 17.857143 +632 590 -33.047362 +591 591 173.73562 +592 591 8.8817842e-16 +593 591 -17.463532 +594 591 -4.4408921e-15 +629 591 -21.716953 +630 591 -17.857143 +631 591 -25.970373 +632 591 2.220446e-16 +633 591 -21.716953 +634 591 17.857143 +592 592 264.3789 +593 592 -4.4408921e-15 +594 592 -107.89795 +629 592 -17.857143 +630 592 -33.047362 +631 592 2.220446e-16 +632 592 41.803228 +633 592 17.857143 +634 592 -33.047362 +593 593 173.73562 +594 593 1.3322676e-15 +595 593 -17.463532 +596 593 3.3306691e-15 +631 593 -21.716953 +632 593 -17.857143 +633 593 -25.970373 +634 593 2.220446e-16 +635 593 -21.716953 +636 593 17.857143 +594 594 264.3789 +595 594 3.3306691e-15 +596 594 -107.89795 +631 594 -17.857143 +632 594 -33.047362 +633 594 2.220446e-16 +634 594 41.803228 +635 594 17.857143 +636 594 -33.047362 +595 595 173.73562 +596 595 4.4408921e-16 +597 595 -17.463532 +598 595 -3.7747583e-15 +633 595 -21.716953 +634 595 -17.857143 +635 595 -25.970373 +637 595 -21.716953 +638 595 17.857143 +596 596 264.3789 +597 596 -3.7747583e-15 +598 596 -107.89795 +633 596 -17.857143 +634 596 -33.047362 +636 596 41.803228 +637 596 17.857143 +638 596 -33.047362 +597 597 173.73562 +598 597 8.8817842e-16 +599 597 -17.463532 +600 597 3.5527137e-15 +635 597 -21.716953 +636 597 -17.857143 +637 597 -25.970373 +639 597 -21.716953 +640 597 17.857143 +598 598 264.3789 +599 598 3.5527137e-15 +600 598 -107.89795 +635 598 -17.857143 +636 598 -33.047362 +638 598 41.803228 +639 598 17.857143 +640 598 -33.047362 +599 599 86.86781 +600 599 7.1054274e-15 +637 599 -21.716953 +638 599 -17.857143 +639 599 -12.985187 +640 599 -1.3736264 +600 600 132.18945 +637 600 -17.857143 +638 600 -33.047362 +639 600 1.3736264 +640 600 20.901614 +601 601 86.86781 +602 601 1.687539e-14 +603 601 -17.463532 +604 601 -5.9952043e-15 +641 601 -12.985187 +642 601 1.3736264 +643 601 -21.716953 +644 601 17.857143 +602 602 132.18945 +603 602 -5.9952043e-15 +604 602 -107.89795 +641 602 -1.3736264 +642 602 20.901614 +643 602 17.857143 +644 602 -33.047362 +603 603 173.73562 +604 603 1.9984014e-14 +605 603 -17.463532 +606 603 -1.3322676e-14 +641 603 -21.716953 +642 603 -17.857143 +643 603 -25.970373 +644 603 5.3290705e-15 +645 603 -21.716953 +646 603 17.857143 +604 604 264.3789 +605 604 -1.3544721e-14 +606 604 -107.89795 +641 604 -17.857143 +642 604 -33.047362 +643 604 5.1070259e-15 +644 604 41.803228 +645 604 17.857143 +646 604 -33.047362 +605 605 173.73562 +606 605 1.9095836e-14 +607 605 -17.463532 +608 605 -5.9952043e-15 +643 605 -21.716953 +644 605 -17.857143 +645 605 -25.970373 +646 605 5.1070259e-15 +647 605 -21.716953 +648 605 17.857143 +606 606 264.3789 +607 606 -5.9952043e-15 +608 606 -107.89795 +643 606 -17.857143 +644 606 -33.047362 +645 606 5.3290705e-15 +646 606 41.803228 +647 606 17.857143 +648 606 -33.047362 +607 607 173.73562 +608 607 1.9984014e-14 +609 607 -17.463532 +610 607 -1.3322676e-14 +645 607 -21.716953 +646 607 -17.857143 +647 607 -25.970373 +648 607 5.3290705e-15 +649 607 -21.716953 +650 607 17.857143 +608 608 264.3789 +609 608 -1.3544721e-14 +610 608 -107.89795 +645 608 -17.857143 +646 608 -33.047362 +647 608 5.1070259e-15 +648 608 41.803228 +649 608 17.857143 +650 608 -33.047362 +609 609 173.73562 +610 609 1.2434498e-14 +611 609 -17.463532 +612 609 8.8817842e-16 +647 609 -21.716953 +648 609 -17.857143 +649 609 -25.970373 +650 609 1.110223e-15 +651 609 -21.716953 +652 609 17.857143 +610 610 264.3789 +611 610 1.110223e-15 +612 610 -107.89795 +647 610 -17.857143 +648 610 -33.047362 +649 610 1.3322676e-15 +650 610 41.803228 +651 610 17.857143 +652 610 -33.047362 +611 611 173.73562 +612 611 3.9968029e-15 +613 611 -17.463532 +614 611 -4.6629367e-15 +649 611 -21.716953 +650 611 -17.857143 +651 611 -25.970373 +652 611 -2.8865799e-15 +653 611 -21.716953 +654 611 17.857143 +612 612 264.3789 +613 612 -4.2188475e-15 +614 612 -107.89795 +649 612 -17.857143 +650 612 -33.047362 +651 612 -3.1086245e-15 +652 612 41.803228 +653 612 17.857143 +654 612 -33.047362 +613 613 173.73562 +614 613 1.3322676e-15 +615 613 -17.463532 +616 613 -1.7763568e-15 +651 613 -21.716953 +652 613 -17.857143 +653 613 -25.970373 +654 613 -8.8817842e-16 +655 613 -21.716953 +656 613 17.857143 +614 614 264.3789 +615 614 -1.7763568e-15 +616 614 -107.89795 +651 614 -17.857143 +652 614 -33.047362 +653 614 -8.8817842e-16 +654 614 41.803228 +655 614 17.857143 +656 614 -33.047362 +615 615 173.73562 +616 615 1.0658141e-14 +617 615 -17.463532 +618 615 -9.1038288e-15 +653 615 -21.716953 +654 615 -17.857143 +655 615 -25.970373 +656 615 2.220446e-15 +657 615 -21.716953 +658 615 17.857143 +616 616 264.3789 +617 616 -8.8817842e-15 +618 616 -107.89795 +653 616 -17.857143 +654 616 -33.047362 +655 616 2.220446e-15 +656 616 41.803228 +657 616 17.857143 +658 616 -33.047362 +617 617 173.73562 +618 617 1.0658141e-14 +619 617 -17.463532 +620 617 -7.327472e-15 +655 617 -21.716953 +656 617 -17.857143 +657 617 -25.970373 +658 617 7.5495166e-15 +659 617 -21.716953 +660 617 17.857143 +618 618 264.3789 +619 618 -7.1054274e-15 +620 618 -107.89795 +655 618 -17.857143 +656 618 -33.047362 +657 618 7.5495166e-15 +658 618 41.803228 +659 618 17.857143 +660 618 -33.047362 +619 619 173.73562 +620 619 7.5495166e-15 +621 619 -17.463532 +622 619 -2.220446e-16 +657 619 -21.716953 +658 619 -17.857143 +659 619 -25.970373 +660 619 1.7763568e-15 +661 619 -21.716953 +662 619 17.857143 +620 620 264.3789 +621 620 -2.220446e-16 +622 620 -107.89795 +657 620 -17.857143 +658 620 -33.047362 +659 620 1.9984014e-15 +660 620 41.803228 +661 620 17.857143 +662 620 -33.047362 +621 621 173.73562 +622 621 2.6645353e-15 +623 621 -17.463532 +624 621 3.3306691e-15 +659 621 -21.716953 +660 621 -17.857143 +661 621 -25.970373 +662 621 -3.9968029e-15 +663 621 -21.716953 +664 621 17.857143 +622 622 264.3789 +623 622 3.3306691e-15 +624 622 -107.89795 +659 622 -17.857143 +660 622 -33.047362 +661 622 -4.2188475e-15 +662 622 41.803228 +663 622 17.857143 +664 622 -33.047362 +623 623 173.73562 +624 623 -3.5527137e-15 +625 623 -17.463532 +626 623 -6.6613381e-16 +661 623 -21.716953 +662 623 -17.857143 +663 623 -25.970373 +664 623 -2.220446e-16 +665 623 -21.716953 +666 623 17.857143 +624 624 264.3789 +625 624 -4.4408921e-16 +626 624 -107.89795 +661 624 -17.857143 +662 624 -33.047362 +663 624 -4.4408921e-16 +664 624 41.803228 +665 624 17.857143 +666 624 -33.047362 +625 625 173.73562 +626 625 2.220446e-15 +627 625 -17.463532 +628 625 2.8865799e-15 +663 625 -21.716953 +664 625 -17.857143 +665 625 -25.970373 +667 625 -21.716953 +668 625 17.857143 +626 626 264.3789 +627 626 2.8865799e-15 +628 626 -107.89795 +663 626 -17.857143 +664 626 -33.047362 +666 626 41.803228 +667 626 17.857143 +668 626 -33.047362 +627 627 173.73562 +628 627 1.3322676e-15 +629 627 -17.463532 +630 627 -3.9968029e-15 +665 627 -21.716953 +666 627 -17.857143 +667 627 -25.970373 +668 627 4.4408921e-16 +669 627 -21.716953 +670 627 17.857143 +628 628 264.3789 +629 628 -4.2188475e-15 +630 628 -107.89795 +665 628 -17.857143 +666 628 -33.047362 +667 628 2.220446e-16 +668 628 41.803228 +669 628 17.857143 +670 628 -33.047362 +629 629 173.73562 +630 629 4.4408921e-16 +631 629 -17.463532 +632 629 3.7747583e-15 +667 629 -21.716953 +668 629 -17.857143 +669 629 -25.970373 +670 629 2.220446e-16 +671 629 -21.716953 +672 629 17.857143 +630 630 264.3789 +631 630 3.7747583e-15 +632 630 -107.89795 +667 630 -17.857143 +668 630 -33.047362 +669 630 2.220446e-16 +670 630 41.803228 +671 630 17.857143 +672 630 -33.047362 +631 631 173.73562 +632 631 8.8817842e-16 +633 631 -17.463532 +634 631 -4.4408921e-15 +669 631 -21.716953 +670 631 -17.857143 +671 631 -25.970373 +672 631 2.220446e-16 +673 631 -21.716953 +674 631 17.857143 +632 632 264.3789 +633 632 -4.4408921e-15 +634 632 -107.89795 +669 632 -17.857143 +670 632 -33.047362 +671 632 4.4408921e-16 +672 632 41.803228 +673 632 17.857143 +674 632 -33.047362 +633 633 173.73562 +634 633 8.8817842e-16 +635 633 -17.463532 +636 633 3.3306691e-15 +671 633 -21.716953 +672 633 -17.857143 +673 633 -25.970373 +674 633 4.4408921e-16 +675 633 -21.716953 +676 633 17.857143 +634 634 264.3789 +635 634 3.3306691e-15 +636 634 -107.89795 +671 634 -17.857143 +672 634 -33.047362 +673 634 2.220446e-16 +674 634 41.803228 +675 634 17.857143 +676 634 -33.047362 +635 635 173.73562 +636 635 4.4408921e-16 +637 635 -17.463532 +638 635 -3.5527137e-15 +673 635 -21.716953 +674 635 -17.857143 +675 635 -25.970373 +676 635 -2.220446e-16 +677 635 -21.716953 +678 635 17.857143 +636 636 264.3789 +637 636 -3.3306691e-15 +638 636 -107.89795 +673 636 -17.857143 +674 636 -33.047362 +675 636 -2.220446e-16 +676 636 41.803228 +677 636 17.857143 +678 636 -33.047362 +637 637 173.73562 +639 637 -17.463532 +640 637 3.5527137e-15 +675 637 -21.716953 +676 637 -17.857143 +677 637 -25.970373 +679 637 -21.716953 +680 637 17.857143 +638 638 264.3789 +639 638 3.7747583e-15 +640 638 -107.89795 +675 638 -17.857143 +676 638 -33.047362 +678 638 41.803228 +679 638 17.857143 +680 638 -33.047362 +639 639 86.86781 +640 639 7.5495166e-15 +677 639 -21.716953 +678 639 -17.857143 +679 639 -12.985187 +680 639 -1.3736264 +640 640 132.18945 +677 640 -17.857143 +678 640 -33.047362 +679 640 1.3736264 +680 640 20.901614 +641 641 86.86781 +642 641 1.6431301e-14 +643 641 -17.463532 +644 641 -6.4392935e-15 +681 641 -12.985187 +682 641 1.3736264 +683 641 -21.716953 +684 641 17.857143 +642 642 132.18945 +643 642 -6.4392935e-15 +644 642 -107.89795 +681 642 -1.3736264 +682 642 20.901614 +683 642 17.857143 +684 642 -33.047362 +643 643 173.73562 +644 643 2.0428104e-14 +645 643 -17.463532 +646 643 -1.3766766e-14 +681 643 -21.716953 +682 643 -17.857143 +683 643 -25.970373 +684 643 5.1070259e-15 +685 643 -21.716953 +686 643 17.857143 +644 644 264.3789 +645 644 -1.398881e-14 +646 644 -107.89795 +681 644 -17.857143 +682 644 -33.047362 +683 644 5.1070259e-15 +684 644 41.803228 +685 644 17.857143 +686 644 -33.047362 +645 645 173.73562 +646 645 1.9984014e-14 +647 645 -17.463532 +648 645 -6.4392935e-15 +683 645 -21.716953 +684 645 -17.857143 +685 645 -25.970373 +686 645 5.1070259e-15 +687 645 -21.716953 +688 645 17.857143 +646 646 264.3789 +647 646 -6.4392935e-15 +648 646 -107.89795 +683 646 -17.857143 +684 646 -33.047362 +685 646 5.1070259e-15 +686 646 41.803228 +687 646 17.857143 +688 646 -33.047362 +647 647 173.73562 +648 647 2.0428104e-14 +649 647 -17.463532 +650 647 -1.3766766e-14 +685 647 -21.716953 +686 647 -17.857143 +687 647 -25.970373 +688 647 5.1070259e-15 +689 647 -21.716953 +690 647 17.857143 +648 648 264.3789 +649 648 -1.398881e-14 +650 648 -107.89795 +685 648 -17.857143 +686 648 -33.047362 +687 648 5.1070259e-15 +688 648 41.803228 +689 648 17.857143 +690 648 -33.047362 +649 649 173.73562 +650 649 1.2878587e-14 +651 649 -17.463532 +652 649 1.3322676e-15 +687 649 -21.716953 +688 649 -17.857143 +689 649 -25.970373 +690 649 5.1070259e-15 +691 649 -21.716953 +692 649 17.857143 +650 650 264.3789 +651 650 1.110223e-15 +652 650 -107.89795 +687 650 -17.857143 +688 650 -33.047362 +689 650 5.1070259e-15 +690 650 41.803228 +691 650 17.857143 +692 650 -33.047362 +651 651 173.73562 +652 651 2.6645353e-15 +653 651 -17.463532 +654 651 -4.2188475e-15 +689 651 -21.716953 +690 651 -17.857143 +691 651 -25.970373 +692 651 4.6629367e-15 +693 651 -21.716953 +694 651 17.857143 +652 652 264.3789 +653 652 -4.2188475e-15 +654 652 -107.89795 +689 652 -17.857143 +690 652 -33.047362 +691 652 4.6629367e-15 +692 652 41.803228 +693 652 17.857143 +694 652 -33.047362 +653 653 173.73562 +654 653 4.8849813e-15 +655 653 -17.463532 +656 653 -2.220446e-16 +691 653 -21.716953 +692 653 -17.857143 +693 653 -25.970373 +694 653 3.1086245e-15 +695 653 -21.716953 +696 653 17.857143 +654 654 264.3789 +655 654 -2.220446e-16 +656 654 -107.89795 +691 654 -17.857143 +692 654 -33.047362 +693 654 2.8865799e-15 +694 654 41.803228 +695 654 17.857143 +696 654 -33.047362 +655 655 173.73562 +656 655 1.110223e-14 +657 655 -17.463532 +658 655 -1.1324275e-14 +693 655 -21.716953 +694 655 -17.857143 +695 655 -25.970373 +696 655 2.6645353e-15 +697 655 -21.716953 +698 655 17.857143 +656 656 264.3789 +657 656 -1.1324275e-14 +658 656 -107.89795 +693 656 -17.857143 +694 656 -33.047362 +695 656 2.8865799e-15 +696 656 41.803228 +697 656 17.857143 +698 656 -33.047362 +657 657 173.73562 +658 657 7.9936058e-15 +659 657 -17.463532 +660 657 -7.1054274e-15 +695 657 -21.716953 +696 657 -17.857143 +697 657 -25.970373 +698 657 6.4392935e-15 +699 657 -21.716953 +700 657 17.857143 +658 658 264.3789 +659 658 -7.1054274e-15 +660 658 -107.89795 +695 658 -17.857143 +696 658 -33.047362 +697 658 6.6613381e-15 +698 658 41.803228 +699 658 17.857143 +700 658 -33.047362 +659 659 173.73562 +660 659 7.5495166e-15 +661 659 -17.463532 +662 659 -2.220446e-16 +697 659 -21.716953 +698 659 -17.857143 +699 659 -25.970373 +700 659 1.7763568e-15 +701 659 -21.716953 +702 659 17.857143 +660 660 264.3789 +661 660 -2.220446e-16 +662 660 -107.89795 +697 660 -17.857143 +698 660 -33.047362 +699 660 1.9984014e-15 +700 660 41.803228 +701 660 17.857143 +702 660 -33.047362 +661 661 173.73562 +662 661 5.7731597e-15 +663 661 -17.463532 +664 661 4.4408921e-15 +699 661 -21.716953 +700 661 -17.857143 +701 661 -25.970373 +702 661 -3.3306691e-15 +703 661 -21.716953 +704 661 17.857143 +662 662 264.3789 +663 662 4.4408921e-15 +664 662 -107.89795 +699 662 -17.857143 +700 662 -33.047362 +701 662 -3.3306691e-15 +702 662 41.803228 +703 662 17.857143 +704 662 -33.047362 +663 663 173.73562 +664 663 -2.6645353e-15 +665 663 -17.463532 +666 663 -2.6645353e-15 +701 663 -21.716953 +702 663 -17.857143 +703 663 -25.970373 +704 663 -8.8817842e-16 +705 663 -21.716953 +706 663 17.857143 +664 664 264.3789 +665 664 -2.220446e-15 +666 664 -107.89795 +701 664 -17.857143 +702 664 -33.047362 +703 664 -6.6613381e-16 +704 664 41.803228 +705 664 17.857143 +706 664 -33.047362 +665 665 173.73562 +667 665 -17.463532 +668 665 2.6645353e-15 +703 665 -21.716953 +704 665 -17.857143 +705 665 -25.970373 +706 665 -2.220446e-16 +707 665 -21.716953 +708 665 17.857143 +666 666 264.3789 +667 666 2.4424907e-15 +668 666 -107.89795 +703 666 -17.857143 +704 666 -33.047362 +705 666 -2.220446e-16 +706 666 41.803228 +707 666 17.857143 +708 666 -33.047362 +667 667 173.73562 +668 667 2.220446e-15 +669 667 -17.463532 +670 667 -4.2188475e-15 +705 667 -21.716953 +706 667 -17.857143 +707 667 -25.970373 +709 667 -21.716953 +710 667 17.857143 +668 668 264.3789 +669 668 -4.4408921e-15 +670 668 -107.89795 +705 668 -17.857143 +706 668 -33.047362 +708 668 41.803228 +709 668 17.857143 +710 668 -33.047362 +669 669 173.73562 +670 669 1.3322676e-15 +671 669 -17.463532 +672 669 3.5527137e-15 +707 669 -21.716953 +708 669 -17.857143 +709 669 -25.970373 +711 669 -21.716953 +712 669 17.857143 +670 670 264.3789 +671 670 3.5527137e-15 +672 670 -107.89795 +707 670 -17.857143 +708 670 -33.047362 +709 670 2.220446e-16 +710 670 41.803228 +711 670 17.857143 +712 670 -33.047362 +671 671 173.73562 +672 671 4.4408921e-16 +673 671 -17.463532 +674 671 -4.4408921e-15 +709 671 -21.716953 +710 671 -17.857143 +711 671 -25.970373 +713 671 -21.716953 +714 671 17.857143 +672 672 264.3789 +673 672 -4.4408921e-15 +674 672 -107.89795 +709 672 -17.857143 +710 672 -33.047362 +712 672 41.803228 +713 672 17.857143 +714 672 -33.047362 +673 673 173.73562 +674 673 1.3322676e-15 +675 673 -17.463532 +676 673 3.1086245e-15 +711 673 -21.716953 +712 673 -17.857143 +713 673 -25.970373 +715 673 -21.716953 +716 673 17.857143 +674 674 264.3789 +675 674 2.8865799e-15 +676 674 -107.89795 +711 674 -17.857143 +712 674 -33.047362 +714 674 41.803228 +715 674 17.857143 +716 674 -33.047362 +675 675 173.73562 +676 675 4.4408921e-16 +677 675 -17.463532 +678 675 -3.9968029e-15 +713 675 -21.716953 +714 675 -17.857143 +715 675 -25.970373 +717 675 -21.716953 +718 675 17.857143 +676 676 264.3789 +677 676 -3.9968029e-15 +678 676 -107.89795 +713 676 -17.857143 +714 676 -33.047362 +716 676 41.803228 +717 676 17.857143 +718 676 -33.047362 +677 677 173.73562 +678 677 4.4408921e-16 +679 677 -17.463532 +680 677 3.1086245e-15 +715 677 -21.716953 +716 677 -17.857143 +717 677 -25.970373 +718 677 -2.220446e-16 +719 677 -21.716953 +720 677 17.857143 +678 678 264.3789 +679 678 3.3306691e-15 +680 678 -107.89795 +715 678 -17.857143 +716 678 -33.047362 +717 678 -2.220446e-16 +718 678 41.803228 +719 678 17.857143 +720 678 -33.047362 +679 679 86.86781 +680 679 7.1054274e-15 +717 679 -21.716953 +718 679 -17.857143 +719 679 -12.985187 +720 679 -1.3736264 +680 680 132.18945 +717 680 -17.857143 +718 680 -33.047362 +719 680 1.3736264 +720 680 20.901614 +681 681 86.86781 +682 681 1.3322676e-14 +683 681 -17.463532 +684 681 -7.7715612e-15 +721 681 -12.985187 +722 681 1.3736264 +723 681 -21.716953 +724 681 17.857143 +682 682 132.18945 +683 682 -7.7715612e-15 +684 682 -107.89795 +721 682 -1.3736264 +722 682 20.901614 +723 682 17.857143 +724 682 -33.047362 +683 683 173.73562 +684 683 1.9984014e-14 +685 683 -17.463532 +686 683 -1.1768364e-14 +721 683 -21.716953 +722 683 -17.857143 +723 683 -25.970373 +724 683 5.1070259e-15 +725 683 -21.716953 +726 683 17.857143 +684 684 264.3789 +685 684 -1.1990409e-14 +686 684 -107.89795 +721 684 -17.857143 +722 684 -33.047362 +723 684 5.1070259e-15 +724 684 41.803228 +725 684 17.857143 +726 684 -33.047362 +685 685 173.73562 +686 685 1.8207658e-14 +687 685 -17.463532 +688 685 -7.7715612e-15 +723 685 -21.716953 +724 685 -17.857143 +725 685 -25.970373 +726 685 4.8849813e-15 +727 685 -21.716953 +728 685 17.857143 +686 686 264.3789 +687 686 -7.7715612e-15 +688 686 -107.89795 +723 686 -17.857143 +724 686 -33.047362 +725 686 4.8849813e-15 +726 686 41.803228 +727 686 17.857143 +728 686 -33.047362 +687 687 173.73562 +688 687 1.9984014e-14 +689 687 -17.463532 +690 687 -1.1768364e-14 +725 687 -21.716953 +726 687 -17.857143 +727 687 -25.970373 +728 687 5.1070259e-15 +729 687 -21.716953 +730 687 17.857143 +688 688 264.3789 +689 688 -1.1990409e-14 +690 688 -107.89795 +725 688 -17.857143 +726 688 -33.047362 +727 688 5.1070259e-15 +728 688 41.803228 +729 688 17.857143 +730 688 -33.047362 +689 689 173.73562 +690 689 1.110223e-14 +691 689 -17.463532 +692 689 -6.6613381e-16 +727 689 -21.716953 +728 689 -17.857143 +729 689 -25.970373 +730 689 1.110223e-15 +731 689 -21.716953 +732 689 17.857143 +690 690 264.3789 +691 690 -6.6613381e-16 +692 690 -107.89795 +727 690 -17.857143 +728 690 -33.047362 +729 690 1.110223e-15 +730 690 41.803228 +731 690 17.857143 +732 690 -33.047362 +691 691 173.73562 +692 691 3.5527137e-15 +693 691 -17.463532 +694 691 -2.8865799e-15 +729 691 -21.716953 +730 691 -17.857143 +731 691 -25.970373 +732 691 -3.3306691e-15 +733 691 -21.716953 +734 691 17.857143 +692 692 264.3789 +693 692 -2.8865799e-15 +694 692 -107.89795 +729 692 -17.857143 +730 692 -33.047362 +731 692 -3.5527137e-15 +732 692 41.803228 +733 692 17.857143 +734 692 -33.047362 +693 693 173.73562 +694 693 4.8849813e-15 +695 693 -17.463532 +696 693 -1.9984014e-15 +731 693 -21.716953 +732 693 -17.857143 +733 693 -25.970373 +734 693 -8.8817842e-16 +735 693 -21.716953 +736 693 17.857143 +694 694 264.3789 +695 694 -1.7763568e-15 +696 694 -107.89795 +731 694 -17.857143 +732 694 -33.047362 +733 694 -8.8817842e-16 +734 694 41.803228 +735 694 17.857143 +736 694 -33.047362 +695 695 173.73562 +696 695 1.0658141e-14 +697 695 -17.463532 +698 695 -9.547918e-15 +733 695 -21.716953 +734 695 -17.857143 +735 695 -25.970373 +736 695 3.1086245e-15 +737 695 -21.716953 +738 695 17.857143 +696 696 264.3789 +697 696 -9.3258734e-15 +698 696 -107.89795 +733 696 -17.857143 +734 696 -33.047362 +735 696 3.1086245e-15 +736 696 41.803228 +737 696 17.857143 +738 696 -33.047362 +697 697 173.73562 +698 697 5.7731597e-15 +699 697 -17.463532 +700 697 -1.9984014e-15 +735 697 -21.716953 +736 697 -17.857143 +737 697 -25.970373 +738 697 1.3322676e-15 +739 697 -21.716953 +740 697 17.857143 +698 698 264.3789 +699 698 -1.7763568e-15 +700 698 -107.89795 +735 698 -17.857143 +736 698 -33.047362 +737 698 1.110223e-15 +738 698 41.803228 +739 698 17.857143 +740 698 -33.047362 +699 699 173.73562 +700 699 -4.4408921e-16 +701 699 -17.463532 +702 699 2.4424907e-15 +737 699 -21.716953 +738 699 -17.857143 +739 699 -25.970373 +740 699 -1.9984014e-15 +741 699 -21.716953 +742 699 17.857143 +700 700 264.3789 +701 700 2.4424907e-15 +702 700 -107.89795 +737 700 -17.857143 +738 700 -33.047362 +739 700 -1.7763568e-15 +740 700 41.803228 +741 700 17.857143 +742 700 -33.047362 +701 701 173.73562 +702 701 -1.3322676e-15 +703 701 -17.463532 +704 701 3.3306691e-15 +739 701 -21.716953 +740 701 -17.857143 +741 701 -25.970373 +742 701 -1.7763568e-15 +743 701 -21.716953 +744 701 17.857143 +702 702 264.3789 +703 702 3.1086245e-15 +704 702 -107.89795 +739 702 -17.857143 +740 702 -33.047362 +741 702 -1.9984014e-15 +742 702 41.803228 +743 702 17.857143 +744 702 -33.047362 +703 703 173.73562 +704 703 -2.6645353e-15 +705 703 -17.463532 +706 703 -6.6613381e-16 +741 703 -21.716953 +742 703 -17.857143 +743 703 -25.970373 +744 703 -8.8817842e-16 +745 703 -21.716953 +746 703 17.857143 +704 704 264.3789 +705 704 -6.6613381e-16 +706 704 -107.89795 +741 704 -17.857143 +742 704 -33.047362 +743 704 -6.6613381e-16 +744 704 41.803228 +745 704 17.857143 +746 704 -33.047362 +705 705 173.73562 +706 705 -1.3322676e-15 +707 705 -17.463532 +708 705 1.7763568e-15 +743 705 -21.716953 +744 705 -17.857143 +745 705 -25.970373 +746 705 2.220446e-16 +747 705 -21.716953 +748 705 17.857143 +706 706 264.3789 +707 706 1.5543122e-15 +708 706 -107.89795 +743 706 -17.857143 +744 706 -33.047362 +745 706 2.220446e-16 +746 706 41.803228 +747 706 17.857143 +748 706 -33.047362 +707 707 173.73562 +708 707 1.7763568e-15 +709 707 -17.463532 +710 707 -2.8865799e-15 +745 707 -21.716953 +746 707 -17.857143 +747 707 -25.970373 +749 707 -21.716953 +750 707 17.857143 +708 708 264.3789 +709 708 -3.1086245e-15 +710 708 -107.89795 +745 708 -17.857143 +746 708 -33.047362 +748 708 41.803228 +749 708 17.857143 +750 708 -33.047362 +709 709 173.73562 +710 709 4.4408921e-16 +711 709 -17.463532 +712 709 1.9984014e-15 +747 709 -21.716953 +748 709 -17.857143 +749 709 -25.970373 +750 709 4.4408921e-16 +751 709 -21.716953 +752 709 17.857143 +710 710 264.3789 +711 710 1.9984014e-15 +712 710 -107.89795 +747 710 -17.857143 +748 710 -33.047362 +749 710 6.6613381e-16 +750 710 41.803228 +751 710 17.857143 +752 710 -33.047362 +711 711 173.73562 +712 711 8.8817842e-16 +713 711 -17.463532 +714 711 -2.6645353e-15 +749 711 -21.716953 +750 711 -17.857143 +751 711 -25.970373 +753 711 -21.716953 +754 711 17.857143 +712 712 264.3789 +713 712 -2.8865799e-15 +714 712 -107.89795 +749 712 -17.857143 +750 712 -33.047362 +752 712 41.803228 +753 712 17.857143 +754 712 -33.047362 +713 713 173.73562 +714 713 4.4408921e-16 +715 713 -17.463532 +716 713 1.9984014e-15 +751 713 -21.716953 +752 713 -17.857143 +753 713 -25.970373 +755 713 -21.716953 +756 713 17.857143 +714 714 264.3789 +715 714 1.7763568e-15 +716 714 -107.89795 +751 714 -17.857143 +752 714 -33.047362 +754 714 41.803228 +755 714 17.857143 +756 714 -33.047362 +715 715 173.73562 +717 715 -17.463532 +718 715 -1.7763568e-15 +753 715 -21.716953 +754 715 -17.857143 +755 715 -25.970373 +756 715 -2.220446e-16 +757 715 -21.716953 +758 715 17.857143 +716 716 264.3789 +717 716 -1.9984014e-15 +718 716 -107.89795 +753 716 -17.857143 +754 716 -33.047362 +755 716 -2.220446e-16 +756 716 41.803228 +757 716 17.857143 +758 716 -33.047362 +717 717 173.73562 +718 717 -4.4408921e-16 +719 717 -17.463532 +720 717 2.220446e-15 +755 717 -21.716953 +756 717 -17.857143 +757 717 -25.970373 +759 717 -21.716953 +760 717 17.857143 +718 718 264.3789 +719 718 2.220446e-15 +720 718 -107.89795 +755 718 -17.857143 +756 718 -33.047362 +758 718 41.803228 +759 718 17.857143 +760 718 -33.047362 +719 719 86.86781 +720 719 3.9968029e-15 +757 719 -21.716953 +758 719 -17.857143 +759 719 -12.985187 +760 719 -1.3736264 +720 720 132.18945 +757 720 -17.857143 +758 720 -33.047362 +759 720 1.3736264 +760 720 20.901614 +721 721 86.86781 +722 721 1.0658141e-14 +723 721 -17.463532 +724 721 -9.547918e-15 +761 721 -12.985187 +762 721 1.3736264 +763 721 -21.716953 +764 721 17.857143 +722 722 132.18945 +723 722 -9.7699626e-15 +724 722 -107.89795 +761 722 -1.3736264 +762 722 20.901614 +763 722 17.857143 +764 722 -33.047362 +723 723 173.73562 +724 723 1.9539925e-14 +725 723 -17.463532 +726 723 -1.0214052e-14 +761 723 -21.716953 +762 723 -17.857143 +763 723 -25.970373 +764 723 5.1070259e-15 +765 723 -21.716953 +766 723 17.857143 +724 724 264.3789 +725 724 -1.0214052e-14 +726 724 -107.89795 +761 724 -17.857143 +762 724 -33.047362 +763 724 5.1070259e-15 +764 724 41.803228 +765 724 17.857143 +766 724 -33.047362 +725 725 173.73562 +726 725 1.9984014e-14 +727 725 -17.463532 +728 725 -9.547918e-15 +763 725 -21.716953 +764 725 -17.857143 +765 725 -25.970373 +766 725 5.1070259e-15 +767 725 -21.716953 +768 725 17.857143 +726 726 264.3789 +727 726 -9.7699626e-15 +728 726 -107.89795 +763 726 -17.857143 +764 726 -33.047362 +765 726 5.1070259e-15 +766 726 41.803228 +767 726 17.857143 +768 726 -33.047362 +727 727 173.73562 +728 727 1.9539925e-14 +729 727 -17.463532 +730 727 -1.0214052e-14 +765 727 -21.716953 +766 727 -17.857143 +767 727 -25.970373 +768 727 5.1070259e-15 +769 727 -21.716953 +770 727 17.857143 +728 728 264.3789 +729 728 -1.0214052e-14 +730 728 -107.89795 +765 728 -17.857143 +766 728 -33.047362 +767 728 5.1070259e-15 +768 728 41.803228 +769 728 17.857143 +770 728 -33.047362 +729 729 173.73562 +730 729 1.1990409e-14 +731 729 -17.463532 +732 729 -2.4424907e-15 +767 729 -21.716953 +768 729 -17.857143 +769 729 -25.970373 +770 729 5.3290705e-15 +771 729 -21.716953 +772 729 17.857143 +730 730 264.3789 +731 730 -2.4424907e-15 +732 730 -107.89795 +767 730 -17.857143 +768 730 -33.047362 +769 730 5.1070259e-15 +770 730 41.803228 +771 730 17.857143 +772 730 -33.047362 +731 731 173.73562 +732 731 3.9968029e-15 +733 731 -17.463532 +734 731 -8.8817842e-16 +769 731 -21.716953 +770 731 -17.857143 +771 731 -25.970373 +772 731 4.4408921e-15 +773 731 -21.716953 +774 731 17.857143 +732 732 264.3789 +733 732 -8.8817842e-16 +734 732 -107.89795 +769 732 -17.857143 +770 732 -33.047362 +771 732 4.6629367e-15 +772 732 41.803228 +773 732 17.857143 +774 732 -33.047362 +733 733 173.73562 +734 733 4.4408921e-15 +735 733 -17.463532 +736 733 -3.7747583e-15 +771 733 -21.716953 +772 733 -17.857143 +773 733 -25.970373 +774 733 3.1086245e-15 +775 733 -21.716953 +776 733 17.857143 +734 734 264.3789 +735 734 -3.7747583e-15 +736 734 -107.89795 +771 734 -17.857143 +772 734 -33.047362 +773 734 3.3306691e-15 +774 734 41.803228 +775 734 17.857143 +776 734 -33.047362 +735 735 173.73562 +736 735 1.1546319e-14 +737 735 -17.463532 +738 735 -8.2156504e-15 +773 735 -21.716953 +774 735 -17.857143 +775 735 -25.970373 +776 735 2.8865799e-15 +777 735 -21.716953 +778 735 17.857143 +736 736 264.3789 +737 736 -7.9936058e-15 +738 736 -107.89795 +773 736 -17.857143 +774 736 -33.047362 +775 736 2.6645353e-15 +776 736 41.803228 +777 736 17.857143 +778 736 -33.047362 +737 737 173.73562 +738 737 1.3322676e-14 +739 737 -17.463532 +740 737 -4.6629367e-15 +775 737 -21.716953 +776 737 -17.857143 +777 737 -25.970373 +778 737 5.3290705e-15 +779 737 -21.716953 +780 737 17.857143 +738 738 264.3789 +739 738 -4.6629367e-15 +740 738 -107.89795 +775 738 -17.857143 +776 738 -33.047362 +777 738 5.3290705e-15 +778 738 41.803228 +779 738 17.857143 +780 738 -33.047362 +739 739 173.73562 +740 739 4.4408921e-15 +741 739 -17.463532 +742 739 -2.220446e-16 +777 739 -21.716953 +778 739 -17.857143 +779 739 -25.970373 +780 739 4.6629367e-15 +781 739 -21.716953 +782 739 17.857143 +740 740 264.3789 +741 740 -2.220446e-16 +742 740 -107.89795 +777 740 -17.857143 +778 740 -33.047362 +779 740 4.4408921e-15 +780 740 41.803228 +781 740 17.857143 +782 740 -33.047362 +741 741 173.73562 +742 741 -1.3322676e-15 +743 741 -17.463532 +744 741 1.9984014e-15 +779 741 -21.716953 +780 741 -17.857143 +781 741 -25.970373 +782 741 4.4408921e-16 +783 741 -21.716953 +784 741 17.857143 +742 742 264.3789 +743 742 1.7763568e-15 +744 742 -107.89795 +779 742 -17.857143 +780 742 -33.047362 +781 742 4.4408921e-16 +782 742 41.803228 +783 742 17.857143 +784 742 -33.047362 +743 743 173.73562 +744 743 -3.5527137e-15 +745 743 -17.463532 +746 743 1.110223e-15 +781 743 -21.716953 +782 743 -17.857143 +783 743 -25.970373 +784 743 -4.4408921e-16 +785 743 -21.716953 +786 743 17.857143 +744 744 264.3789 +745 744 1.110223e-15 +746 744 -107.89795 +781 744 -17.857143 +782 744 -33.047362 +783 744 -4.4408921e-16 +784 744 41.803228 +785 744 17.857143 +786 744 -33.047362 +745 745 173.73562 +747 745 -17.463532 +748 745 -2.220446e-16 +783 745 -21.716953 +784 745 -17.857143 +785 745 -25.970373 +786 745 -2.220446e-16 +787 745 -21.716953 +788 745 17.857143 +746 746 264.3789 +747 746 -2.220446e-16 +748 746 -107.89795 +783 746 -17.857143 +784 746 -33.047362 +785 746 -2.220446e-16 +786 746 41.803228 +787 746 17.857143 +788 746 -33.047362 +747 747 173.73562 +748 747 1.3322676e-15 +749 747 -17.463532 +750 747 -8.8817842e-16 +785 747 -21.716953 +786 747 -17.857143 +787 747 -25.970373 +788 747 4.4408921e-16 +789 747 -21.716953 +790 747 17.857143 +748 748 264.3789 +749 748 -8.8817842e-16 +750 748 -107.89795 +785 748 -17.857143 +786 748 -33.047362 +787 748 4.4408921e-16 +788 748 41.803228 +789 748 17.857143 +790 748 -33.047362 +749 749 173.73562 +750 749 4.4408921e-16 +751 749 -17.463532 +752 749 8.8817842e-16 +787 749 -21.716953 +788 749 -17.857143 +789 749 -25.970373 +791 749 -21.716953 +792 749 17.857143 +750 750 264.3789 +751 750 8.8817842e-16 +752 750 -107.89795 +787 750 -17.857143 +788 750 -33.047362 +790 750 41.803228 +791 750 17.857143 +792 750 -33.047362 +751 751 173.73562 +752 751 4.4408921e-16 +753 751 -17.463532 +754 751 -1.110223e-15 +789 751 -21.716953 +790 751 -17.857143 +791 751 -25.970373 +792 751 4.4408921e-16 +793 751 -21.716953 +794 751 17.857143 +752 752 264.3789 +753 752 -1.110223e-15 +754 752 -107.89795 +789 752 -17.857143 +790 752 -33.047362 +791 752 4.4408921e-16 +792 752 41.803228 +793 752 17.857143 +794 752 -33.047362 +753 753 173.73562 +754 753 8.8817842e-16 +755 753 -17.463532 +756 753 2.220446e-16 +791 753 -21.716953 +792 753 -17.857143 +793 753 -25.970373 +794 753 -2.220446e-16 +795 753 -21.716953 +796 753 17.857143 +754 754 264.3789 +755 754 2.220446e-16 +756 754 -107.89795 +791 754 -17.857143 +792 754 -33.047362 +793 754 -2.220446e-16 +794 754 41.803228 +795 754 17.857143 +796 754 -33.047362 +755 755 173.73562 +757 755 -17.463532 +758 755 -2.220446e-16 +793 755 -21.716953 +794 755 -17.857143 +795 755 -25.970373 +796 755 2.220446e-16 +797 755 -21.716953 +798 755 17.857143 +756 756 264.3789 +757 756 -2.220446e-16 +758 756 -107.89795 +793 756 -17.857143 +794 756 -33.047362 +795 756 2.220446e-16 +796 756 41.803228 +797 756 17.857143 +798 756 -33.047362 +757 757 173.73562 +759 757 -17.463532 +760 757 4.4408921e-16 +795 757 -21.716953 +796 757 -17.857143 +797 757 -25.970373 +798 757 2.220446e-16 +799 757 -21.716953 +800 757 17.857143 +758 758 264.3789 +759 758 4.4408921e-16 +760 758 -107.89795 +795 758 -17.857143 +796 758 -33.047362 +797 758 2.220446e-16 +798 758 41.803228 +799 758 17.857143 +800 758 -33.047362 +759 759 86.86781 +760 759 4.4408921e-16 +797 759 -21.716953 +798 759 -17.857143 +799 759 -12.985187 +800 759 -1.3736264 +760 760 132.18945 +797 760 -17.857143 +798 760 -33.047362 +799 760 1.3736264 +800 760 20.901614 +761 761 86.86781 +762 761 9.7699626e-15 +763 761 -17.463532 +764 761 -9.7699626e-15 +801 761 -12.985187 +802 761 1.3736264 +803 761 -21.716953 +804 761 17.857143 +762 762 132.18945 +763 762 -9.7699626e-15 +764 762 -107.89795 +801 762 -1.3736264 +802 762 20.901614 +803 762 17.857143 +804 762 -33.047362 +763 763 173.73562 +764 763 1.9984014e-14 +765 763 -17.463532 +766 763 -9.7699626e-15 +801 763 -21.716953 +802 763 -17.857143 +803 763 -25.970373 +804 763 5.3290705e-15 +805 763 -21.716953 +806 763 17.857143 +764 764 264.3789 +765 764 -9.7699626e-15 +766 764 -107.89795 +801 764 -17.857143 +802 764 -33.047362 +803 764 5.3290705e-15 +804 764 41.803228 +805 764 17.857143 +806 764 -33.047362 +765 765 173.73562 +766 765 1.9984014e-14 +767 765 -17.463532 +768 765 -9.7699626e-15 +803 765 -21.716953 +804 765 -17.857143 +805 765 -25.970373 +806 765 5.3290705e-15 +807 765 -21.716953 +808 765 17.857143 +766 766 264.3789 +767 766 -9.7699626e-15 +768 766 -107.89795 +803 766 -17.857143 +804 766 -33.047362 +805 766 5.3290705e-15 +806 766 41.803228 +807 766 17.857143 +808 766 -33.047362 +767 767 173.73562 +768 767 1.9984014e-14 +769 767 -17.463532 +770 767 -9.7699626e-15 +805 767 -21.716953 +806 767 -17.857143 +807 767 -25.970373 +808 767 5.3290705e-15 +809 767 -21.716953 +810 767 17.857143 +768 768 264.3789 +769 768 -9.7699626e-15 +770 768 -107.89795 +805 768 -17.857143 +806 768 -33.047362 +807 768 5.3290705e-15 +808 768 41.803228 +809 768 17.857143 +810 768 -33.047362 +769 769 173.73562 +770 769 1.2878587e-14 +771 769 -17.463532 +772 769 -2.6645353e-15 +807 769 -21.716953 +808 769 -17.857143 +809 769 -25.970373 +810 769 1.5543122e-15 +811 769 -21.716953 +812 769 17.857143 +770 770 264.3789 +771 770 -2.6645353e-15 +772 770 -107.89795 +807 770 -17.857143 +808 770 -33.047362 +809 770 1.5543122e-15 +810 770 41.803228 +811 770 17.857143 +812 770 -33.047362 +771 771 173.73562 +772 771 3.9968029e-15 +773 771 -17.463532 +774 771 -6.6613381e-16 +809 771 -21.716953 +810 771 -17.857143 +811 771 -25.970373 +812 771 -3.5527137e-15 +813 771 -21.716953 +814 771 17.857143 +772 772 264.3789 +773 772 -1.110223e-15 +774 772 -107.89795 +809 772 -17.857143 +810 772 -33.047362 +811 772 -3.7747583e-15 +812 772 41.803228 +813 772 17.857143 +814 772 -33.047362 +773 773 173.73562 +774 773 4.8849813e-15 +775 773 -17.463532 +776 773 -3.7747583e-15 +811 773 -21.716953 +812 773 -17.857143 +813 773 -25.970373 +814 773 -8.8817842e-16 +815 773 -21.716953 +816 773 17.857143 +774 774 264.3789 +775 774 -3.7747583e-15 +776 774 -107.89795 +811 774 -17.857143 +812 774 -33.047362 +813 774 -6.6613381e-16 +814 774 41.803228 +815 774 17.857143 +816 774 -33.047362 +775 775 173.73562 +776 775 1.1546319e-14 +777 775 -17.463532 +778 775 -7.327472e-15 +813 775 -21.716953 +814 775 -17.857143 +815 775 -25.970373 +816 775 2.6645353e-15 +817 775 -21.716953 +818 775 17.857143 +776 776 264.3789 +777 776 -7.1054274e-15 +778 776 -107.89795 +813 776 -17.857143 +814 776 -33.047362 +815 776 2.6645353e-15 +816 776 41.803228 +817 776 17.857143 +818 776 -33.047362 +777 777 173.73562 +778 777 1.6431301e-14 +779 777 -17.463532 +780 777 -2.6645353e-15 +815 777 -21.716953 +816 777 -17.857143 +817 777 -25.970373 +818 777 -3.5527137e-15 +819 777 -21.716953 +820 777 17.857143 +778 778 264.3789 +779 778 -2.6645353e-15 +780 778 -107.89795 +815 778 -17.857143 +816 778 -33.047362 +817 778 -3.3306691e-15 +818 778 41.803228 +819 778 17.857143 +820 778 -33.047362 +779 779 173.73562 +780 779 4.8849813e-15 +781 779 -17.463532 +782 779 -1.7763568e-15 +817 779 -21.716953 +818 779 -17.857143 +819 779 -25.970373 +820 779 -2.220446e-15 +821 779 -21.716953 +822 779 17.857143 +780 780 264.3789 +781 780 -1.7763568e-15 +782 780 -107.89795 +817 780 -17.857143 +818 780 -33.047362 +819 780 -2.220446e-15 +820 780 41.803228 +821 780 17.857143 +822 780 -33.047362 +781 781 173.73562 +782 781 -6.6613381e-15 +783 781 -17.463532 +784 781 1.3322676e-15 +819 781 -21.716953 +820 781 -17.857143 +821 781 -25.970373 +822 781 2.6645353e-15 +823 781 -21.716953 +824 781 17.857143 +782 782 264.3789 +783 782 1.3322676e-15 +784 782 -107.89795 +819 782 -17.857143 +820 782 -33.047362 +821 782 2.6645353e-15 +822 782 41.803228 +823 782 17.857143 +824 782 -33.047362 +783 783 173.73562 +784 783 -2.6645353e-15 +785 783 -17.463532 +786 783 1.3322676e-15 +821 783 -21.716953 +822 783 -17.857143 +823 783 -25.970373 +824 783 -6.6613381e-16 +825 783 -21.716953 +826 783 17.857143 +784 784 264.3789 +785 784 1.3322676e-15 +786 784 -107.89795 +821 784 -17.857143 +822 784 -33.047362 +823 784 -6.6613381e-16 +824 784 41.803228 +825 784 17.857143 +826 784 -33.047362 +785 785 173.73562 +786 785 -4.4408921e-16 +787 785 -17.463532 +788 785 -8.8817842e-16 +823 785 -21.716953 +824 785 -17.857143 +825 785 -25.970373 +827 785 -21.716953 +828 785 17.857143 +786 786 264.3789 +787 786 -8.8817842e-16 +788 786 -107.89795 +823 786 -17.857143 +824 786 -33.047362 +826 786 41.803228 +827 786 17.857143 +828 786 -33.047362 +787 787 173.73562 +788 787 1.7763568e-15 +789 787 -17.463532 +790 787 -8.8817842e-16 +825 787 -21.716953 +826 787 -17.857143 +827 787 -25.970373 +829 787 -21.716953 +830 787 17.857143 +788 788 264.3789 +789 788 -8.8817842e-16 +790 788 -107.89795 +825 788 -17.857143 +826 788 -33.047362 +828 788 41.803228 +829 788 17.857143 +830 788 -33.047362 +789 789 173.73562 +790 789 1.3322676e-15 +791 789 -17.463532 +792 789 -2.220446e-16 +827 789 -21.716953 +828 789 -17.857143 +829 789 -25.970373 +831 789 -21.716953 +832 789 17.857143 +790 790 264.3789 +791 790 -2.220446e-16 +792 790 -107.89795 +827 790 -17.857143 +828 790 -33.047362 +830 790 41.803228 +831 790 17.857143 +832 790 -33.047362 +791 791 173.73562 +792 791 8.8817842e-16 +793 791 -17.463532 +794 791 -8.8817842e-16 +829 791 -21.716953 +830 791 -17.857143 +831 791 -25.970373 +832 791 2.220446e-16 +833 791 -21.716953 +834 791 17.857143 +792 792 264.3789 +793 792 -8.8817842e-16 +794 792 -107.89795 +829 792 -17.857143 +830 792 -33.047362 +831 792 2.220446e-16 +832 792 41.803228 +833 792 17.857143 +834 792 -33.047362 +793 793 173.73562 +794 793 1.3322676e-15 +795 793 -17.463532 +796 793 -8.8817842e-16 +831 793 -21.716953 +832 793 -17.857143 +833 793 -25.970373 +835 793 -21.716953 +836 793 17.857143 +794 794 264.3789 +795 794 -8.8817842e-16 +796 794 -107.89795 +831 794 -17.857143 +832 794 -33.047362 +834 794 41.803228 +835 794 17.857143 +836 794 -33.047362 +795 795 173.73562 +796 795 5.3290705e-15 +797 795 -17.463532 +798 795 2.220446e-15 +833 795 -21.716953 +834 795 -17.857143 +835 795 -25.970373 +836 795 -4.6629367e-15 +837 795 -21.716953 +838 795 17.857143 +796 796 264.3789 +797 796 2.4424907e-15 +798 796 -107.89795 +833 796 -17.857143 +834 796 -33.047362 +835 796 -4.6629367e-15 +836 796 41.803228 +837 796 17.857143 +838 796 -33.047362 +797 797 173.73562 +798 797 8.8817842e-16 +799 797 -17.463532 +800 797 -2.4424907e-15 +835 797 -21.716953 +836 797 -17.857143 +837 797 -25.970373 +838 797 -2.220446e-16 +839 797 -21.716953 +840 797 17.857143 +798 798 264.3789 +799 798 -2.220446e-15 +800 798 -107.89795 +835 798 -17.857143 +836 798 -33.047362 +838 798 41.803228 +839 798 17.857143 +840 798 -33.047362 +799 799 86.86781 +800 799 -4.4408921e-15 +837 799 -21.716953 +838 799 -17.857143 +839 799 -12.985187 +840 799 -1.3736264 +800 800 132.18945 +837 800 -17.857143 +838 800 -33.047362 +839 800 1.3736264 +840 800 20.901614 +801 801 86.86781 +802 801 9.7699626e-15 +803 801 -17.463532 +804 801 -2.6645353e-15 +841 801 -12.985187 +842 801 1.3736264 +843 801 -21.716953 +844 801 17.857143 +802 802 132.18945 +803 802 -2.6645353e-15 +804 802 -107.89795 +841 802 -1.3736264 +842 802 20.901614 +843 802 17.857143 +844 802 -33.047362 +803 803 173.73562 +804 803 9.3258734e-15 +805 803 -17.463532 +806 803 -5.9952043e-15 +841 803 -21.716953 +842 803 -17.857143 +843 803 -25.970373 +844 803 -6.6613381e-16 +845 803 -21.716953 +846 803 17.857143 +804 804 264.3789 +805 804 -6.2172489e-15 +806 804 -107.89795 +841 804 -17.857143 +842 804 -33.047362 +843 804 -4.4408921e-16 +844 804 41.803228 +845 804 17.857143 +846 804 -33.047362 +805 805 173.73562 +806 805 8.8817842e-15 +807 805 -17.463532 +808 805 -9.9920072e-15 +843 805 -21.716953 +844 805 -17.857143 +845 805 -25.970373 +846 805 6.6613381e-15 +847 805 -21.716953 +848 805 17.857143 +806 806 264.3789 +807 806 -9.9920072e-15 +808 806 -107.89795 +843 806 -17.857143 +844 806 -33.047362 +845 806 6.8833828e-15 +846 806 41.803228 +847 806 17.857143 +848 806 -33.047362 +807 807 173.73562 +808 807 1.9539925e-14 +809 807 -17.463532 +810 807 -9.9920072e-15 +845 807 -21.716953 +846 807 -17.857143 +847 807 -25.970373 +848 807 5.3290705e-15 +849 807 -21.716953 +850 807 17.857143 +808 808 264.3789 +809 808 -9.9920072e-15 +810 808 -107.89795 +845 808 -17.857143 +846 808 -33.047362 +847 808 5.3290705e-15 +848 808 41.803228 +849 808 17.857143 +850 808 -33.047362 +809 809 173.73562 +810 809 1.1990409e-14 +811 809 -17.463532 +812 809 -2.6645353e-15 +847 809 -21.716953 +848 809 -17.857143 +849 809 -25.970373 +850 809 5.1070259e-15 +851 809 -21.716953 +852 809 17.857143 +810 810 264.3789 +811 810 -2.6645353e-15 +812 810 -107.89795 +847 810 -17.857143 +848 810 -33.047362 +849 810 5.1070259e-15 +850 810 41.803228 +851 810 17.857143 +852 810 -33.047362 +811 811 173.73562 +812 811 3.1086245e-15 +813 811 -17.463532 +814 811 -2.220446e-16 +849 811 -21.716953 +850 811 -17.857143 +851 811 -25.970373 +852 811 4.8849813e-15 +853 811 -21.716953 +854 811 17.857143 +812 812 264.3789 +813 812 -2.220446e-16 +814 812 -107.89795 +849 812 -17.857143 +850 812 -33.047362 +851 812 4.6629367e-15 +852 812 41.803228 +853 812 17.857143 +854 812 -33.047362 +813 813 173.73562 +814 813 3.9968029e-15 +815 813 -17.463532 +816 813 -3.5527137e-15 +851 813 -21.716953 +852 813 -17.857143 +853 813 -25.970373 +854 813 2.8865799e-15 +855 813 -21.716953 +856 813 17.857143 +814 814 264.3789 +815 814 -3.7747583e-15 +816 814 -107.89795 +851 814 -17.857143 +852 814 -33.047362 +853 814 3.1086245e-15 +854 814 41.803228 +855 814 17.857143 +856 814 -33.047362 +815 815 173.73562 +816 815 1.0658141e-14 +817 815 -17.463532 +818 815 -7.327472e-15 +853 815 -21.716953 +854 815 -17.857143 +855 815 -25.970373 +856 815 2.6645353e-15 +857 815 -21.716953 +858 815 17.857143 +816 816 264.3789 +817 816 -7.1054274e-15 +818 816 -107.89795 +853 816 -17.857143 +854 816 -33.047362 +855 816 2.6645353e-15 +856 816 41.803228 +857 816 17.857143 +858 816 -33.047362 +817 817 173.73562 +818 817 2.3980817e-14 +819 817 -17.463532 +820 817 6.6613381e-16 +855 817 -21.716953 +856 817 -17.857143 +857 817 -25.970373 +858 817 -1.110223e-15 +859 817 -21.716953 +860 817 17.857143 +818 818 264.3789 +819 818 4.4408921e-16 +820 818 -107.89795 +855 818 -17.857143 +856 818 -33.047362 +857 818 -1.110223e-15 +858 818 41.803228 +859 818 17.857143 +860 818 -33.047362 +819 819 173.73562 +820 819 7.9936058e-15 +821 819 -17.463532 +822 819 -3.3306691e-15 +857 819 -21.716953 +858 819 -17.857143 +859 819 -25.970373 +860 819 1.3322676e-15 +861 819 -21.716953 +862 819 17.857143 +820 820 264.3789 +821 820 -3.1086245e-15 +822 820 -107.89795 +857 820 -17.857143 +858 820 -33.047362 +859 820 1.3322676e-15 +860 820 41.803228 +861 820 17.857143 +862 820 -33.047362 +821 821 173.73562 +822 821 -9.7699626e-15 +823 821 -17.463532 +824 821 1.110223e-15 +859 821 -21.716953 +860 821 -17.857143 +861 821 -25.970373 +862 821 3.9968029e-15 +863 821 -21.716953 +864 821 17.857143 +822 822 264.3789 +823 822 1.110223e-15 +824 822 -107.89795 +859 822 -17.857143 +860 822 -33.047362 +861 822 4.2188475e-15 +862 822 41.803228 +863 822 17.857143 +864 822 -33.047362 +823 823 173.73562 +824 823 -2.6645353e-15 +825 823 -17.463532 +826 823 1.3322676e-15 +861 823 -21.716953 +862 823 -17.857143 +863 823 -25.970373 +864 823 -6.6613381e-16 +865 823 -21.716953 +866 823 17.857143 +824 824 264.3789 +825 824 1.3322676e-15 +826 824 -107.89795 +861 824 -17.857143 +862 824 -33.047362 +863 824 -6.6613381e-16 +864 824 41.803228 +865 824 17.857143 +866 824 -33.047362 +825 825 173.73562 +826 825 -4.4408921e-16 +827 825 -17.463532 +828 825 -8.8817842e-16 +863 825 -21.716953 +864 825 -17.857143 +865 825 -25.970373 +866 825 -2.220446e-16 +867 825 -21.716953 +868 825 17.857143 +826 826 264.3789 +827 826 -8.8817842e-16 +828 826 -107.89795 +863 826 -17.857143 +864 826 -33.047362 +865 826 -2.220446e-16 +866 826 41.803228 +867 826 17.857143 +868 826 -33.047362 +827 827 173.73562 +828 827 1.7763568e-15 +829 827 -17.463532 +830 827 -8.8817842e-16 +865 827 -21.716953 +866 827 -17.857143 +867 827 -25.970373 +868 827 2.220446e-16 +869 827 -21.716953 +870 827 17.857143 +828 828 264.3789 +829 828 -8.8817842e-16 +830 828 -107.89795 +865 828 -17.857143 +866 828 -33.047362 +867 828 2.220446e-16 +868 828 41.803228 +869 828 17.857143 +870 828 -33.047362 +829 829 173.73562 +830 829 8.8817842e-16 +831 829 -17.463532 +867 829 -21.716953 +868 829 -17.857143 +869 829 -25.970373 +871 829 -21.716953 +872 829 17.857143 +830 830 264.3789 +832 830 -107.89795 +867 830 -17.857143 +868 830 -33.047362 +870 830 41.803228 +871 830 17.857143 +872 830 -33.047362 +831 831 173.73562 +832 831 4.4408921e-16 +833 831 -17.463532 +834 831 -6.6613381e-16 +869 831 -21.716953 +870 831 -17.857143 +871 831 -25.970373 +872 831 2.220446e-16 +873 831 -21.716953 +874 831 17.857143 +832 832 264.3789 +833 832 -6.6613381e-16 +834 832 -107.89795 +869 832 -17.857143 +870 832 -33.047362 +871 832 2.220446e-16 +872 832 41.803228 +873 832 17.857143 +874 832 -33.047362 +833 833 173.73562 +834 833 5.7731597e-15 +835 833 -17.463532 +836 833 1.9984014e-15 +871 833 -21.716953 +872 833 -17.857143 +873 833 -25.970373 +874 833 -4.4408921e-15 +875 833 -21.716953 +876 833 17.857143 +834 834 264.3789 +835 834 1.9984014e-15 +836 834 -107.89795 +871 834 -17.857143 +872 834 -33.047362 +873 834 -4.4408921e-15 +874 834 41.803228 +875 834 17.857143 +876 834 -33.047362 +835 835 173.73562 +836 835 1.1546319e-14 +837 835 -17.463532 +838 835 3.1086245e-15 +873 835 -21.716953 +874 835 -17.857143 +875 835 -25.970373 +876 835 -6.2172489e-15 +877 835 -21.716953 +878 835 17.857143 +836 836 264.3789 +837 836 2.8865799e-15 +838 836 -107.89795 +873 836 -17.857143 +874 836 -33.047362 +875 836 -6.4392935e-15 +876 836 41.803228 +877 836 17.857143 +878 836 -33.047362 +837 837 173.73562 +838 837 3.5527137e-15 +839 837 -17.463532 +840 837 -2.220446e-15 +875 837 -21.716953 +876 837 -17.857143 +877 837 -25.970373 +878 837 -3.3306691e-15 +879 837 -21.716953 +880 837 17.857143 +838 838 264.3789 +839 838 -2.220446e-15 +840 838 -107.89795 +875 838 -17.857143 +876 838 -33.047362 +877 838 -3.1086245e-15 +878 838 41.803228 +879 838 17.857143 +880 838 -33.047362 +839 839 86.86781 +840 839 -2.6645353e-15 +877 839 -21.716953 +878 839 -17.857143 +879 839 -12.985187 +880 839 -1.3736264 +840 840 132.18945 +877 840 -17.857143 +878 840 -33.047362 +879 840 1.3736264 +880 840 20.901614 +841 841 86.86781 +842 841 2.0872193e-14 +843 841 -17.463532 +844 841 -4.2188475e-15 +881 841 -12.985187 +882 841 1.3736264 +883 841 -21.716953 +884 841 17.857143 +842 842 132.18945 +843 842 -4.2188475e-15 +844 842 -107.89795 +881 842 -1.3736264 +882 842 20.901614 +883 842 17.857143 +884 842 -33.047362 +843 843 173.73562 +844 843 2.4868996e-14 +845 843 -17.463532 +846 843 -3.7747583e-15 +881 843 -21.716953 +882 843 -17.857143 +883 843 -25.970373 +884 843 -3.7747583e-15 +885 843 -21.716953 +886 843 17.857143 +844 844 264.3789 +845 844 -3.7747583e-15 +846 844 -107.89795 +881 844 -17.857143 +882 844 -33.047362 +883 844 -3.7747583e-15 +884 844 41.803228 +885 844 17.857143 +886 844 -33.047362 +845 845 173.73562 +846 845 4.4408921e-16 +847 845 -17.463532 +848 845 -8.2156504e-15 +883 845 -21.716953 +884 845 -17.857143 +885 845 -25.970373 +886 845 5.1070259e-15 +887 845 -21.716953 +888 845 17.857143 +846 846 264.3789 +847 846 -8.2156504e-15 +848 846 -107.89795 +883 846 -17.857143 +884 846 -33.047362 +885 846 5.3290705e-15 +886 846 41.803228 +887 846 17.857143 +888 846 -33.047362 +847 847 173.73562 +848 847 6.6613381e-15 +849 847 -17.463532 +850 847 -9.9920072e-15 +885 847 -21.716953 +886 847 -17.857143 +887 847 -25.970373 +888 847 1.0436096e-14 +889 847 -21.716953 +890 847 17.857143 +848 848 264.3789 +849 848 -9.9920072e-15 +850 848 -107.89795 +885 848 -17.857143 +886 848 -33.047362 +887 848 1.0436096e-14 +888 848 41.803228 +889 848 17.857143 +890 848 -33.047362 +849 849 173.73562 +850 849 1.1990409e-14 +851 849 -17.463532 +852 849 -2.6645353e-15 +887 849 -21.716953 +888 849 -17.857143 +889 849 -25.970373 +890 849 1.5543122e-15 +891 849 -21.716953 +892 849 17.857143 +850 850 264.3789 +851 850 -2.6645353e-15 +852 850 -107.89795 +887 850 -17.857143 +888 850 -33.047362 +889 850 1.5543122e-15 +890 850 41.803228 +891 850 17.857143 +892 850 -33.047362 +851 851 173.73562 +852 851 3.9968029e-15 +853 851 -17.463532 +854 851 -8.8817842e-16 +889 851 -21.716953 +890 851 -17.857143 +891 851 -25.970373 +892 851 -3.1086245e-15 +893 851 -21.716953 +894 851 17.857143 +852 852 264.3789 +853 852 -1.110223e-15 +854 852 -107.89795 +889 852 -17.857143 +890 852 -33.047362 +891 852 -3.3306691e-15 +892 852 41.803228 +893 852 17.857143 +894 852 -33.047362 +853 853 173.73562 +854 853 4.8849813e-15 +855 853 -17.463532 +856 853 -3.7747583e-15 +891 853 -21.716953 +892 853 -17.857143 +893 853 -25.970373 +894 853 -1.110223e-15 +895 853 -21.716953 +896 853 17.857143 +854 854 264.3789 +855 854 -3.7747583e-15 +856 854 -107.89795 +891 854 -17.857143 +892 854 -33.047362 +893 854 -8.8817842e-16 +894 854 41.803228 +895 854 17.857143 +896 854 -33.047362 +855 855 173.73562 +856 855 1.110223e-14 +857 855 -17.463532 +858 855 -7.327472e-15 +893 855 -21.716953 +894 855 -17.857143 +895 855 -25.970373 +896 855 2.6645353e-15 +897 855 -21.716953 +898 855 17.857143 +856 856 264.3789 +857 856 -7.1054274e-15 +858 856 -107.89795 +893 856 -17.857143 +894 856 -33.047362 +895 856 2.6645353e-15 +896 856 41.803228 +897 856 17.857143 +898 856 -33.047362 +857 857 173.73562 +858 857 2.6201263e-14 +859 857 -17.463532 +860 857 2.220446e-15 +895 857 -21.716953 +896 857 -17.857143 +897 857 -25.970373 +898 857 -6.6613381e-15 +899 857 -21.716953 +900 857 17.857143 +858 858 264.3789 +859 858 2.220446e-15 +860 858 -107.89795 +895 858 -17.857143 +896 858 -33.047362 +897 858 -6.4392935e-15 +898 858 41.803228 +899 858 17.857143 +900 858 -33.047362 +859 859 173.73562 +860 859 6.6613381e-15 +861 859 -17.463532 +862 859 -4.8849813e-15 +897 859 -21.716953 +898 859 -17.857143 +899 859 -25.970373 +900 859 -1.9984014e-15 +901 859 -21.716953 +902 859 17.857143 +860 860 264.3789 +861 860 -5.1070259e-15 +862 860 -107.89795 +897 860 -17.857143 +898 860 -33.047362 +899 860 -2.4424907e-15 +900 860 41.803228 +901 860 17.857143 +902 860 -33.047362 +861 861 173.73562 +862 861 -7.5495166e-15 +863 861 -17.463532 +864 861 7.5495166e-15 +899 861 -21.716953 +900 861 -17.857143 +901 861 -25.970373 +902 861 -3.1086245e-15 +903 861 -21.716953 +904 861 17.857143 +862 862 264.3789 +863 862 7.5495166e-15 +864 862 -107.89795 +899 862 -17.857143 +900 862 -33.047362 +901 862 -2.8865799e-15 +902 862 41.803228 +903 862 17.857143 +904 862 -33.047362 +863 863 173.73562 +864 863 -6.6613381e-15 +865 863 -17.463532 +866 863 -6.6613381e-16 +901 863 -21.716953 +902 863 -17.857143 +903 863 -25.970373 +904 863 -3.1086245e-15 +905 863 -21.716953 +906 863 17.857143 +864 864 264.3789 +865 864 -6.6613381e-16 +866 864 -107.89795 +901 864 -17.857143 +902 864 -33.047362 +903 864 -3.3306691e-15 +904 864 41.803228 +905 864 17.857143 +906 864 -33.047362 +865 865 173.73562 +866 865 -1.0214052e-14 +867 865 -17.463532 +868 865 -8.8817842e-16 +903 865 -21.716953 +904 865 -17.857143 +905 865 -25.970373 +906 865 6.8833828e-15 +907 865 -21.716953 +908 865 17.857143 +866 866 264.3789 +867 866 -8.8817842e-16 +868 866 -107.89795 +903 866 -17.857143 +904 866 -33.047362 +905 866 7.1054274e-15 +906 866 41.803228 +907 866 17.857143 +908 866 -33.047362 +867 867 173.73562 +868 867 1.7763568e-15 +869 867 -17.463532 +870 867 -8.8817842e-16 +905 867 -21.716953 +906 867 -17.857143 +907 867 -25.970373 +908 867 2.220446e-16 +909 867 -21.716953 +910 867 17.857143 +868 868 264.3789 +869 868 -8.8817842e-16 +870 868 -107.89795 +905 868 -17.857143 +906 868 -33.047362 +907 868 2.220446e-16 +908 868 41.803228 +909 868 17.857143 +910 868 -33.047362 +869 869 173.73562 +870 869 8.8817842e-16 +871 869 -17.463532 +907 869 -21.716953 +908 869 -17.857143 +909 869 -25.970373 +911 869 -21.716953 +912 869 17.857143 +870 870 264.3789 +872 870 -107.89795 +907 870 -17.857143 +908 870 -33.047362 +910 870 41.803228 +911 870 17.857143 +912 870 -33.047362 +871 871 173.73562 +872 871 8.8817842e-16 +873 871 -17.463532 +874 871 -8.8817842e-16 +909 871 -21.716953 +910 871 -17.857143 +911 871 -25.970373 +912 871 2.220446e-16 +913 871 -21.716953 +914 871 17.857143 +872 872 264.3789 +873 872 -8.8817842e-16 +874 872 -107.89795 +909 872 -17.857143 +910 872 -33.047362 +911 872 2.220446e-16 +912 872 41.803228 +913 872 17.857143 +914 872 -33.047362 +873 873 173.73562 +874 873 1.2434498e-14 +875 873 -17.463532 +876 873 4.6629367e-15 +911 873 -21.716953 +912 873 -17.857143 +913 873 -25.970373 +914 873 -5.9952043e-15 +915 873 -21.716953 +916 873 17.857143 +874 874 264.3789 +875 874 4.6629367e-15 +876 874 -107.89795 +911 874 -17.857143 +912 874 -33.047362 +913 874 -6.2172489e-15 +914 874 41.803228 +915 874 17.857143 +916 874 -33.047362 +875 875 173.73562 +876 875 1.7319479e-14 +877 875 -17.463532 +878 875 3.3306691e-15 +913 875 -21.716953 +914 875 -17.857143 +915 875 -25.970373 +916 875 -1.1324275e-14 +917 875 -21.716953 +918 875 17.857143 +876 876 264.3789 +877 876 3.3306691e-15 +878 876 -107.89795 +913 876 -17.857143 +914 876 -33.047362 +915 876 -1.1324275e-14 +916 876 41.803228 +917 876 17.857143 +918 876 -33.047362 +877 877 173.73562 +878 877 6.2172489e-15 +879 877 -17.463532 +915 877 -21.716953 +916 877 -17.857143 +917 877 -25.970373 +918 877 -3.1086245e-15 +919 877 -21.716953 +920 877 17.857143 +878 878 264.3789 +880 878 -107.89795 +915 878 -17.857143 +916 878 -33.047362 +917 878 -3.1086245e-15 +918 878 41.803228 +919 878 17.857143 +920 878 -33.047362 +879 879 86.86781 +880 879 -4.4408921e-16 +917 879 -21.716953 +918 879 -17.857143 +919 879 -12.985187 +920 879 -1.3736264 +880 880 132.18945 +917 880 -17.857143 +918 880 -33.047362 +919 880 1.3736264 +920 880 20.901614 +881 881 86.86781 +882 881 2.1316282e-14 +883 881 -17.463532 +884 881 -1.1768364e-14 +921 881 -12.985187 +922 881 1.3736264 +923 881 -21.716953 +924 881 17.857143 +882 882 132.18945 +883 882 -1.1768364e-14 +884 882 -107.89795 +921 882 -1.3736264 +922 882 20.901614 +923 882 17.857143 +924 882 -33.047362 +883 883 173.73562 +884 883 5.062617e-14 +885 883 -17.463532 +886 883 -7.9936058e-15 +921 883 -21.716953 +922 883 -17.857143 +923 883 -25.970373 +924 883 -1.7763568e-15 +925 883 -21.716953 +926 883 17.857143 +884 884 264.3789 +885 884 -7.9936058e-15 +886 884 -107.89795 +921 884 -17.857143 +922 884 -33.047362 +923 884 -1.7763568e-15 +924 884 41.803228 +925 884 17.857143 +926 884 -33.047362 +885 885 173.73562 +886 885 2.4868996e-14 +887 885 -17.463532 +888 885 -1.6431301e-14 +923 885 -21.716953 +924 885 -17.857143 +925 885 -25.970373 +926 885 7.327472e-15 +927 885 -21.716953 +928 885 17.857143 +886 886 264.3789 +887 886 -1.6653345e-14 +888 886 -107.89795 +923 886 -17.857143 +924 886 -33.047362 +925 886 7.327472e-15 +926 886 41.803228 +927 886 17.857143 +928 886 -33.047362 +887 887 173.73562 +888 887 4.4408921e-15 +889 887 -17.463532 +890 887 -9.9920072e-15 +925 887 -21.716953 +926 887 -17.857143 +927 887 -25.970373 +928 887 1.4210855e-14 +929 887 -21.716953 +930 887 17.857143 +888 888 264.3789 +889 888 -9.9920072e-15 +890 888 -107.89795 +925 888 -17.857143 +926 888 -33.047362 +927 888 1.4210855e-14 +928 888 41.803228 +929 888 17.857143 +930 888 -33.047362 +889 889 173.73562 +890 889 1.1546319e-14 +891 889 -17.463532 +892 889 -2.4424907e-15 +927 889 -21.716953 +928 889 -17.857143 +929 889 -25.970373 +930 889 5.1070259e-15 +931 889 -21.716953 +932 889 17.857143 +890 890 264.3789 +891 890 -2.4424907e-15 +892 890 -107.89795 +927 890 -17.857143 +928 890 -33.047362 +929 890 5.1070259e-15 +930 890 41.803228 +931 890 17.857143 +932 890 -33.047362 +891 891 173.73562 +892 891 3.1086245e-15 +893 891 -17.463532 +894 891 -6.6613381e-16 +929 891 -21.716953 +930 891 -17.857143 +931 891 -25.970373 +932 891 4.8849813e-15 +933 891 -21.716953 +934 891 17.857143 +892 892 264.3789 +893 892 -4.4408921e-16 +894 892 -107.89795 +929 892 -17.857143 +930 892 -33.047362 +931 892 4.6629367e-15 +932 892 41.803228 +933 892 17.857143 +934 892 -33.047362 +893 893 173.73562 +894 893 4.8849813e-15 +895 893 -17.463532 +896 893 -3.7747583e-15 +931 893 -21.716953 +932 893 -17.857143 +933 893 -25.970373 +934 893 2.8865799e-15 +935 893 -21.716953 +936 893 17.857143 +894 894 264.3789 +895 894 -3.7747583e-15 +896 894 -107.89795 +931 894 -17.857143 +932 894 -33.047362 +933 894 3.1086245e-15 +934 894 41.803228 +935 894 17.857143 +936 894 -33.047362 +895 895 173.73562 +896 895 1.110223e-14 +897 895 -17.463532 +898 895 -7.327472e-15 +933 895 -21.716953 +934 895 -17.857143 +935 895 -25.970373 +936 895 2.6645353e-15 +937 895 -21.716953 +938 895 17.857143 +896 896 264.3789 +897 896 -7.1054274e-15 +898 896 -107.89795 +933 896 -17.857143 +934 896 -33.047362 +935 896 2.6645353e-15 +936 896 41.803228 +937 896 17.857143 +938 896 -33.047362 +897 897 173.73562 +898 897 2.9753977e-14 +899 897 -17.463532 +900 897 3.5527137e-15 +935 897 -21.716953 +936 897 -17.857143 +937 897 -25.970373 +938 897 -4.4408921e-15 +939 897 -21.716953 +940 897 17.857143 +898 898 264.3789 +899 898 3.7747583e-15 +900 898 -107.89795 +935 898 -17.857143 +936 898 -33.047362 +937 898 -4.4408921e-15 +938 898 41.803228 +939 898 17.857143 +940 898 -33.047362 +899 899 173.73562 +900 899 7.1054274e-15 +901 899 -17.463532 +902 899 -6.4392935e-15 +937 899 -21.716953 +938 899 -17.857143 +939 899 -25.970373 +940 899 1.110223e-15 +941 899 -21.716953 +942 899 17.857143 +900 900 264.3789 +901 900 -6.4392935e-15 +902 900 -107.89795 +937 900 -17.857143 +938 900 -33.047362 +939 900 1.3322676e-15 +940 900 41.803228 +941 900 17.857143 +942 900 -33.047362 +901 901 173.73562 +902 901 3.5527137e-15 +903 901 -17.463532 +904 901 7.5495166e-15 +939 901 -21.716953 +940 901 -17.857143 +941 901 -25.970373 +942 901 4.4408921e-16 +943 901 -21.716953 +944 901 17.857143 +902 902 264.3789 +903 902 7.5495166e-15 +904 902 -107.89795 +939 902 -17.857143 +940 902 -33.047362 +941 902 4.4408921e-16 +942 902 41.803228 +943 902 17.857143 +944 902 -33.047362 +903 903 173.73562 +904 903 3.5527137e-15 +905 903 -17.463532 +906 903 -6.4392935e-15 +941 903 -21.716953 +942 903 -17.857143 +943 903 -25.970373 +945 903 -21.716953 +946 903 17.857143 +904 904 264.3789 +905 904 -6.4392935e-15 +906 904 -107.89795 +941 904 -17.857143 +942 904 -33.047362 +943 904 -2.220446e-16 +944 904 41.803228 +945 904 17.857143 +946 904 -33.047362 +905 905 173.73562 +906 905 -1.3766766e-14 +907 905 -17.463532 +908 905 -8.8817842e-16 +943 905 -21.716953 +944 905 -17.857143 +945 905 -25.970373 +946 905 7.5495166e-15 +947 905 -21.716953 +948 905 17.857143 +906 906 264.3789 +907 906 -8.8817842e-16 +908 906 -107.89795 +943 906 -17.857143 +944 906 -33.047362 +945 906 7.5495166e-15 +946 906 41.803228 +947 906 17.857143 +948 906 -33.047362 +907 907 173.73562 +908 907 1.7763568e-15 +909 907 -17.463532 +910 907 -8.8817842e-16 +945 907 -21.716953 +946 907 -17.857143 +947 907 -25.970373 +948 907 2.220446e-16 +949 907 -21.716953 +950 907 17.857143 +908 908 264.3789 +909 908 -8.8817842e-16 +910 908 -107.89795 +945 908 -17.857143 +946 908 -33.047362 +947 908 2.220446e-16 +948 908 41.803228 +949 908 17.857143 +950 908 -33.047362 +909 909 173.73562 +910 909 8.8817842e-16 +911 909 -17.463532 +947 909 -21.716953 +948 909 -17.857143 +949 909 -25.970373 +951 909 -21.716953 +952 909 17.857143 +910 910 264.3789 +912 910 -107.89795 +947 910 -17.857143 +948 910 -33.047362 +950 910 41.803228 +951 910 17.857143 +952 910 -33.047362 +911 911 173.73562 +912 911 8.8817842e-16 +913 911 -17.463532 +914 911 -8.8817842e-16 +949 911 -21.716953 +950 911 -17.857143 +951 911 -25.970373 +952 911 2.220446e-16 +953 911 -21.716953 +954 911 17.857143 +912 912 264.3789 +913 912 -8.8817842e-16 +914 912 -107.89795 +949 912 -17.857143 +950 912 -33.047362 +951 912 2.220446e-16 +952 912 41.803228 +953 912 17.857143 +954 912 -33.047362 +913 913 173.73562 +914 913 7.5495166e-15 +915 913 -17.463532 +916 913 2.4424907e-15 +951 913 -21.716953 +952 913 -17.857143 +953 913 -25.970373 +954 913 2.220446e-16 +955 913 -21.716953 +956 913 17.857143 +914 914 264.3789 +915 914 2.4424907e-15 +916 914 -107.89795 +951 914 -17.857143 +952 914 -33.047362 +953 914 2.220446e-16 +954 914 41.803228 +955 914 17.857143 +956 914 -33.047362 +915 915 173.73562 +916 915 2.1316282e-14 +917 915 -17.463532 +918 915 6.8833828e-15 +953 915 -21.716953 +954 915 -17.857143 +955 915 -25.970373 +956 915 -9.547918e-15 +957 915 -21.716953 +958 915 17.857143 +916 916 264.3789 +917 916 7.1054274e-15 +918 916 -107.89795 +953 916 -17.857143 +954 916 -33.047362 +955 916 -9.547918e-15 +956 916 41.803228 +957 916 17.857143 +958 916 -33.047362 +917 917 173.73562 +918 917 7.1054274e-15 +919 917 -17.463532 +920 917 -3.7747583e-15 +955 917 -21.716953 +956 917 -17.857143 +957 917 -25.970373 +958 917 -3.5527137e-15 +959 917 -21.716953 +960 917 17.857143 +918 918 264.3789 +919 918 -3.7747583e-15 +920 918 -107.89795 +955 918 -17.857143 +956 918 -33.047362 +957 918 -3.3306691e-15 +958 918 41.803228 +959 918 17.857143 +960 918 -33.047362 +919 919 86.86781 +920 919 -7.5495166e-15 +957 919 -21.716953 +958 919 -17.857143 +959 919 -12.985187 +960 919 -1.3736264 +920 920 132.18945 +957 920 -17.857143 +958 920 -33.047362 +959 920 1.3736264 +960 920 20.901614 +921 921 43.433905 +922 921 17.857143 +923 921 -8.731766 +924 921 1.3736264 +922 922 66.094725 +923 922 -1.3736264 +924 922 -53.948977 +923 923 86.86781 +924 923 2.3980817e-14 +925 923 -8.731766 +926 923 1.3736264 +924 924 132.18945 +925 924 -1.3736264 +926 924 -53.948977 +925 925 86.86781 +926 925 2.3092639e-14 +927 925 -8.731766 +928 925 1.3736264 +926 926 132.18945 +927 926 -1.3736264 +928 926 -53.948977 +927 927 86.86781 +928 927 8.437695e-15 +929 927 -8.731766 +930 927 1.3736264 +928 928 132.18945 +929 928 -1.3736264 +930 928 -53.948977 +929 929 86.86781 +930 929 9.7699626e-15 +931 929 -8.731766 +932 929 1.3736264 +930 930 132.18945 +931 930 -1.3736264 +932 930 -53.948977 +931 931 86.86781 +932 931 9.7699626e-15 +933 931 -8.731766 +934 931 1.3736264 +932 932 132.18945 +933 932 -1.3736264 +934 932 -53.948977 +933 933 86.86781 +934 933 6.6613381e-15 +935 933 -8.731766 +936 933 1.3736264 +934 934 132.18945 +935 934 -1.3736264 +936 934 -53.948977 +935 935 86.86781 +936 935 5.3290705e-15 +937 935 -8.731766 +938 935 1.3736264 +936 936 132.18945 +937 936 -1.3736264 +938 936 -53.948977 +937 937 86.86781 +938 937 1.9095836e-14 +939 937 -8.731766 +940 937 1.3736264 +938 938 132.18945 +939 938 -1.3736264 +940 938 -53.948977 +939 939 86.86781 +940 939 1.1546319e-14 +941 939 -8.731766 +942 939 1.3736264 +940 940 132.18945 +941 940 -1.3736264 +942 940 -53.948977 +941 941 86.86781 +942 941 9.7699626e-15 +943 941 -8.731766 +944 941 1.3736264 +942 942 132.18945 +943 942 -1.3736264 +944 942 -53.948977 +943 943 86.86781 +944 943 9.7699626e-15 +945 943 -8.731766 +946 943 1.3736264 +944 944 132.18945 +945 944 -1.3736264 +946 944 -53.948977 +945 945 86.86781 +946 945 -3.9968029e-15 +947 945 -8.731766 +948 945 1.3736264 +946 946 132.18945 +947 946 -1.3736264 +948 946 -53.948977 +947 947 86.86781 +948 947 8.8817842e-16 +949 947 -8.731766 +950 947 1.3736264 +948 948 132.18945 +949 948 -1.3736264 +950 948 -53.948977 +949 949 86.86781 +950 949 4.4408921e-16 +951 949 -8.731766 +952 949 1.3736264 +950 950 132.18945 +951 950 -1.3736264 +952 950 -53.948977 +951 951 86.86781 +952 951 4.4408921e-16 +953 951 -8.731766 +954 951 1.3736264 +952 952 132.18945 +953 952 -1.3736264 +954 952 -53.948977 +953 953 86.86781 +954 953 4.4408921e-16 +955 953 -8.731766 +956 953 1.3736264 +954 954 132.18945 +955 954 -1.3736264 +956 954 -53.948977 +955 955 86.86781 +956 955 9.7699626e-15 +957 955 -8.731766 +958 955 1.3736264 +956 956 132.18945 +957 956 -1.3736264 +958 956 -53.948977 +957 957 86.86781 +958 957 3.1086245e-15 +959 957 -8.731766 +960 957 1.3736264 +958 958 132.18945 +959 958 -1.3736264 +960 958 -53.948977 +959 959 43.433905 +960 959 -17.857143 +960 960 66.094725 diff --git a/TP1/05_CG/util.c b/TP1/05_CG/util.c new file mode 100644 index 0000000..df22bbc --- /dev/null +++ b/TP1/05_CG/util.c @@ -0,0 +1,114 @@ +#include +#include +#include +#include +#include + +#include "util.h" + +void multAv(double x[], double *A, double y[], int m, int n){ + + for(int i = 0; i < m; i++){ + x[i] = 0.0; + for(int j = 0; j < n; j++){ + x[i] += A[i*n + j] * y[j]; + } + } + return; +} + +void copy_v(double x[], double y[], int n){ + + for(int i = 0; i < n; i++){ + x[i] = y[i]; + } + + return; +} + +double dot(double x[], double y[], int n){ + double res = 0.0; + + for(int i = 0; i < n; i++){ + res += x[i]*y[i]; + } + + return res; +} + +void axpy(double a, double x[], double y[], int n){ + + for(int i = 0; i < n; i++){ + x[i] = x[i] + a*y[i]; + } + + return; +} + +void xpay(double a, double x[], double y[], int n){ + + for(int i = 0; i < n; i++){ + y[i] = x[i] + a*y[i]; + } + + return; +} + +int read_A(FILE *f, double *A, int M, int N, int nz){ + int i, j, k; + double val; + int error; + + for (i = 0; i < M; i++) { + for(j = 0; j < N; j++) { + *(A+i*N+j) = 0.0; + } + } + + for (k = 0; k < nz; k++) { + error = fscanf(f, "%d %d %lg\n", &i, &j, &val); + if(!error) exit(0); + //printf("-- %d -- %d -- %lg\n", i, j, val); + *(A + (i-1)*N + (j-1)) = val; + // this is a symmetric matrix + *(A + (j-1)*N + (i-1)) = val; + } + + /* + for (k = 0; k < nz; k++) { + printf("---- %lg\n", *(A+k)); + } + */ + + return 0; +} + +int mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz ) +{ + char line[MM_MAX_LINE_LENGTH]; + int num_items_read; + + /* set return null parameter values, in case we exit with errors */ + *M = *N = *nz = 0; + + /* now continue scanning until you reach the end-of-comments */ + do + { + if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL) + return MM_PREMATURE_EOF; + }while (line[0] == '%'); + + /* line[] is either blank or has M,N, nz */ + if (sscanf(line, "%d %d %d", M, N, nz) == 3) + return 0; + + else + do + { + num_items_read = fscanf(f, "%d %d %d", M, N, nz); + if (num_items_read == EOF) return MM_PREMATURE_EOF; + } + while (num_items_read != 3); + + return 0; +} diff --git a/TP1/05_CG/util.h b/TP1/05_CG/util.h new file mode 100644 index 0000000..2479bf6 --- /dev/null +++ b/TP1/05_CG/util.h @@ -0,0 +1,21 @@ +#include + +#define MM_MAX_LINE_LENGTH 1025 +#define MatrixMarketBanner "%%MatrixMarket" +#define MM_MAX_TOKEN_LENGTH 64 +#define MM_PREMATURE_EOF 12 + +void multAv(double x[], double *A, double y[], int m, int n); + +void copy_v(double x[], double y[], int n); + +double dot(double x[], double y[], int n); + +void axpy(double a, double x[], double y[], int n); + +void xpay(double a, double x[], double y[], int n); + +int read_A(FILE *f, double *A, int M, int N, int nz); + +int mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz); + diff --git a/TP1/init.sh b/TP1/init.sh new file mode 100755 index 0000000..2051436 --- /dev/null +++ b/TP1/init.sh @@ -0,0 +1,6 @@ +#!/bin/bash +SIMGRID=/mnt/n7fs/ens/tp_guivarch/opt2021/simgrid-3.31 + +export PATH=${SIMGRID}/bin:${PATH} + +alias smpirun="smpirun -hostfile ${SIMGRID}/archis/cluster_hostfile.txt -platform ${SIMGRID}/archis/cluster_crossbar.xml" diff --git a/TP1/tp_mpi.pdf b/TP1/tp_mpi.pdf new file mode 100644 index 0000000..1c24204 Binary files /dev/null and b/TP1/tp_mpi.pdf differ diff --git a/TP2/.vscode/settings.json b/TP2/.vscode/settings.json new file mode 100644 index 0000000..ae8cca2 --- /dev/null +++ b/TP2/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "files.associations": { + "*.html": "html", + "*.toml": "toml", + "*.bak": "c" + } +} \ No newline at end of file diff --git a/TP2/Makefile b/TP2/Makefile new file mode 100644 index 0000000..64e7cc0 --- /dev/null +++ b/TP2/Makefile @@ -0,0 +1,26 @@ +CC=gcc +MPICC=smpicc +LD=smpicc +LDFLAGS= +CFLAGS=-O4 +CLIBS=-lblas -llapack +INCLUDES= +SOURCEDIR=src +BUILDDIR=build + +all: dir main # test + +test_env: dir who_am_i + +dir: + mkdir -p $(BUILDDIR)/bin + +clean: + rm -rf $(BUILDDIR) + +%.o: $(SOURCEDIR)/%.c + echo $@ + $(MPICC) -c -Wall -o $(BUILDDIR)/$@ $< $(CFLAGS) $(INCLUDES) + +main: main.o gemms.o ex1.o ex2.o ex3.o utils.o dsmat.o + $(LD) -o $(BUILDDIR)/bin/$@ $(addprefix $(BUILDDIR)/,$^) $(CLIBS) $(LDFLAGS) diff --git a/TP2/README b/TP2/README new file mode 100644 index 0000000..b023f29 --- /dev/null +++ b/TP2/README @@ -0,0 +1 @@ +https://laurent.fainsin.bzh/assets/CalcPar/ \ No newline at end of file diff --git a/TP2/bench.csv b/TP2/bench.csv new file mode 100644 index 0000000..4a67c02 --- /dev/null +++ b/TP2/bench.csv @@ -0,0 +1,151 @@ +m,n,k,b,p,q,algo,lookahead,gflops +1024,1024,1024,256,2,2,p2p,0,7.475035 +1024,1024,1024,256,2,2,p2p,0,7.475035 +1024,1024,1024,256,2,2,p2p,0,7.475036 +1024,1024,1024,256,2,2,p2p,0,7.475036 +1024,1024,1024,256,2,2,p2p,0,7.475036 +1024,1024,1024,256,2,2,bcast,0,7.471268 +1024,1024,1024,256,2,2,bcast,0,7.471269 +1024,1024,1024,256,2,2,bcast,0,7.471268 +1024,1024,1024,256,2,2,bcast,0,7.471268 +1024,1024,1024,256,2,2,bcast,0,7.471269 +1024,1024,1024,256,2,2,p2p-i-la,1,14.306685 +1024,1024,1024,256,2,2,p2p-i-la,1,14.306689 +1024,1024,1024,256,2,2,p2p-i-la,1,14.306691 +1024,1024,1024,256,2,2,p2p-i-la,1,14.306689 +1024,1024,1024,256,2,2,p2p-i-la,1,14.306691 +1024,1024,1024,256,2,2,p2p-i-la,2,9.856253 +1024,1024,1024,256,2,2,p2p-i-la,2,9.856253 +1024,1024,1024,256,2,2,p2p-i-la,2,9.856254 +1024,1024,1024,256,2,2,p2p-i-la,2,9.856254 +1024,1024,1024,256,2,2,p2p-i-la,2,9.856254 +1024,1024,1024,256,2,2,p2p-i-la,3,14.317787 +1024,1024,1024,256,2,2,p2p-i-la,3,14.317789 +1024,1024,1024,256,2,2,p2p-i-la,3,14.317793 +1024,1024,1024,256,2,2,p2p-i-la,3,14.317793 +1024,1024,1024,256,2,2,p2p-i-la,3,14.317793 +1024,1024,1024,256,2,2,p2p-i-la,4,14.317787 +1024,1024,1024,256,2,2,p2p-i-la,4,14.317787 +1024,1024,1024,256,2,2,p2p-i-la,4,14.317793 +1024,1024,1024,256,2,2,p2p-i-la,4,14.317793 +1024,1024,1024,256,2,2,p2p-i-la,4,14.317793 +2048,2048,2048,256,2,2,p2p,0,14.951931 +2048,2048,2048,256,2,2,p2p,0,14.951932 +2048,2048,2048,256,2,2,p2p,0,14.951932 +2048,2048,2048,256,2,2,p2p,0,14.951929 +2048,2048,2048,256,2,2,p2p,0,14.951932 +2048,2048,2048,256,2,2,bcast,0,14.950045 +2048,2048,2048,256,2,2,bcast,0,14.950048 +2048,2048,2048,256,2,2,bcast,0,14.950048 +2048,2048,2048,256,2,2,bcast,0,14.950046 +2048,2048,2048,256,2,2,bcast,0,14.950046 +2048,2048,2048,256,2,2,p2p-i-la,1,28.642430 +2048,2048,2048,256,2,2,p2p-i-la,1,28.642433 +2048,2048,2048,256,2,2,p2p-i-la,1,28.642433 +2048,2048,2048,256,2,2,p2p-i-la,1,28.642433 +2048,2048,2048,256,2,2,p2p-i-la,1,28.642436 +2048,2048,2048,256,2,2,p2p-i-la,2,23.366289 +2048,2048,2048,256,2,2,p2p-i-la,2,23.366289 +2048,2048,2048,256,2,2,p2p-i-la,2,23.366289 +2048,2048,2048,256,2,2,p2p-i-la,2,23.366289 +2048,2048,2048,256,2,2,p2p-i-la,2,23.366289 +2048,2048,2048,256,2,2,p2p-i-la,3,28.653563 +2048,2048,2048,256,2,2,p2p-i-la,3,28.653569 +2048,2048,2048,256,2,2,p2p-i-la,3,28.653569 +2048,2048,2048,256,2,2,p2p-i-la,3,28.653566 +2048,2048,2048,256,2,2,p2p-i-la,3,28.653569 +2048,2048,2048,256,2,2,p2p-i-la,4,23.369989 +2048,2048,2048,256,2,2,p2p-i-la,4,23.369989 +2048,2048,2048,256,2,2,p2p-i-la,4,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,4,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,4,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,5,28.653569 +2048,2048,2048,256,2,2,p2p-i-la,5,28.653575 +2048,2048,2048,256,2,2,p2p-i-la,5,28.653575 +2048,2048,2048,256,2,2,p2p-i-la,5,28.653575 +2048,2048,2048,256,2,2,p2p-i-la,5,28.653575 +2048,2048,2048,256,2,2,p2p-i-la,6,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,6,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,6,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,6,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,6,23.369991 +2048,2048,2048,256,2,2,p2p-i-la,7,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,7,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,7,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,7,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,7,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,8,28.659102 +2048,2048,2048,256,2,2,p2p-i-la,8,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,8,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,8,28.659105 +2048,2048,2048,256,2,2,p2p-i-la,8,28.659105 +3072,3072,3072,256,2,2,p2p,0,22.428405 +3072,3072,3072,256,2,2,p2p,0,22.428407 +3072,3072,3072,256,2,2,p2p,0,22.428407 +3072,3072,3072,256,2,2,p2p,0,22.428407 +3072,3072,3072,256,2,2,p2p,0,22.428407 +3072,3072,3072,256,2,2,bcast,0,22.427149 +3072,3072,3072,256,2,2,bcast,0,22.427149 +3072,3072,3072,256,2,2,bcast,0,22.427152 +3072,3072,3072,256,2,2,bcast,0,22.427149 +3072,3072,3072,256,2,2,bcast,0,22.427152 +3072,3072,3072,256,2,2,p2p-i-la,1,42.976658 +3072,3072,3072,256,2,2,p2p-i-la,1,42.976662 +3072,3072,3072,256,2,2,p2p-i-la,1,42.976658 +3072,3072,3072,256,2,2,p2p-i-la,1,42.976662 +3072,3072,3072,256,2,2,p2p-i-la,1,42.976662 +3072,3072,3072,256,2,2,p2p-i-la,2,33.027327 +3072,3072,3072,256,2,2,p2p-i-la,2,33.027327 +3072,3072,3072,256,2,2,p2p-i-la,2,33.027327 +3072,3072,3072,256,2,2,p2p-i-la,2,33.027330 +3072,3072,3072,256,2,2,p2p-i-la,2,33.027327 +3072,3072,3072,256,2,2,p2p-i-la,3,42.987825 +3072,3072,3072,256,2,2,p2p-i-la,3,42.987825 +3072,3072,3072,256,2,2,p2p-i-la,3,42.987829 +3072,3072,3072,256,2,2,p2p-i-la,3,42.987818 +3072,3072,3072,256,2,2,p2p-i-la,3,42.987822 +3072,3072,3072,256,2,2,p2p-i-la,4,37.356416 +3072,3072,3072,256,2,2,p2p-i-la,4,37.356414 +3072,3072,3072,256,2,2,p2p-i-la,4,37.356422 +3072,3072,3072,256,2,2,p2p-i-la,4,37.356416 +3072,3072,3072,256,2,2,p2p-i-la,4,37.356416 +3072,3072,3072,256,2,2,p2p-i-la,5,42.991522 +3072,3072,3072,256,2,2,p2p-i-la,5,42.991526 +3072,3072,3072,256,2,2,p2p-i-la,5,42.991526 +3072,3072,3072,256,2,2,p2p-i-la,5,42.991526 +3072,3072,3072,256,2,2,p2p-i-la,5,42.991522 +3072,3072,3072,256,2,2,p2p-i-la,6,37.359194 +3072,3072,3072,256,2,2,p2p-i-la,6,37.359194 +3072,3072,3072,256,2,2,p2p-i-la,6,37.359194 +3072,3072,3072,256,2,2,p2p-i-la,6,37.359194 +3072,3072,3072,256,2,2,p2p-i-la,6,37.359197 +3072,3072,3072,256,2,2,p2p-i-la,7,42.991526 +3072,3072,3072,256,2,2,p2p-i-la,7,42.991538 +3072,3072,3072,256,2,2,p2p-i-la,7,42.991534 +3072,3072,3072,256,2,2,p2p-i-la,7,42.991534 +3072,3072,3072,256,2,2,p2p-i-la,7,42.991534 +3072,3072,3072,256,2,2,p2p-i-la,8,37.359200 +3072,3072,3072,256,2,2,p2p-i-la,8,37.359202 +3072,3072,3072,256,2,2,p2p-i-la,8,37.359202 +3072,3072,3072,256,2,2,p2p-i-la,8,37.359205 +3072,3072,3072,256,2,2,p2p-i-la,8,37.359202 +3072,3072,3072,256,2,2,p2p-i-la,9,42.991549 +3072,3072,3072,256,2,2,p2p-i-la,9,42.991549 +3072,3072,3072,256,2,2,p2p-i-la,9,42.991549 +3072,3072,3072,256,2,2,p2p-i-la,9,42.991545 +3072,3072,3072,256,2,2,p2p-i-la,9,42.991545 +3072,3072,3072,256,2,2,p2p-i-la,10,37.359205 +3072,3072,3072,256,2,2,p2p-i-la,10,37.359202 +3072,3072,3072,256,2,2,p2p-i-la,10,37.359202 +3072,3072,3072,256,2,2,p2p-i-la,10,37.359214 +3072,3072,3072,256,2,2,p2p-i-la,10,37.359202 +3072,3072,3072,256,2,2,p2p-i-la,11,42.995159 +3072,3072,3072,256,2,2,p2p-i-la,11,42.995159 +3072,3072,3072,256,2,2,p2p-i-la,11,42.995144 +3072,3072,3072,256,2,2,p2p-i-la,11,42.995167 +3072,3072,3072,256,2,2,p2p-i-la,11,42.995152 +3072,3072,3072,256,2,2,p2p-i-la,12,42.995159 +3072,3072,3072,256,2,2,p2p-i-la,12,42.995159 +3072,3072,3072,256,2,2,p2p-i-la,12,42.995152 +3072,3072,3072,256,2,2,p2p-i-la,12,42.995171 +3072,3072,3072,256,2,2,p2p-i-la,12,42.995159 diff --git a/TP2/bench.sh b/TP2/bench.sh new file mode 100755 index 0000000..ac828b4 --- /dev/null +++ b/TP2/bench.sh @@ -0,0 +1,39 @@ +source utils.sh +echo BENCHMARKING THE METHODS +# you can modify these values +p=2 +q=2 +P=$((p * q)) +#generate_hostfile $P + +export OMP_NUM_THREADS=1 +export MKL_NUM_THREADS=1 + +# proper benchmark <--- this could be a TODO for students ? (as in, show weak scaling and/or strong scaling) +#mpi_options="-hostfile hostfiles/hostfile.$P.txt" +mpi_options="-platform platforms/cluster_crossbar.xml -hostfile hostfiles/cluster_hostfile.txt -np $P" +b=256 +iter=5 +traces="bench_traces" +out="bench_outputs" +csv="bench.csv" +echo m,n,k,b,p,q,algo,lookahead,gflops >$csv +for i in 4 8 12; do + + n=$((i * b)) + m=$n + k=$n + la=0 + options="-c" + + for algo in p2p bcast; do + run + done + + for la in $(seq 1 $((n / b))); do + algo="p2p-i-la" + options="-c -l $la" + run + done + +done diff --git a/TP2/check.csv b/TP2/check.csv new file mode 100644 index 0000000..8e8c12d --- /dev/null +++ b/TP2/check.csv @@ -0,0 +1,16 @@ +m,n,k,b,p,q,algo,lookahead,gflops +2,2,2,2,2,2,p2p,0,0.000172 +2,2,2,2,2,2,p2p,0,0.000172 +2,2,2,2,2,2,p2p,0,0.000172 +2,2,2,2,2,2,p2p,0,0.000172 +2,2,2,2,2,2,p2p,0,0.000172 +2,2,2,2,2,2,bcast,0,0.000075 +2,2,2,2,2,2,bcast,0,0.000075 +2,2,2,2,2,2,bcast,0,0.000075 +2,2,2,2,2,2,bcast,0,0.000075 +2,2,2,2,2,2,bcast,0,0.000075 +2,2,2,2,2,2,p2p-i-la,1,0.000223 +2,2,2,2,2,2,p2p-i-la,1,0.000223 +2,2,2,2,2,2,p2p-i-la,1,0.000223 +2,2,2,2,2,2,p2p-i-la,1,0.000223 +2,2,2,2,2,2,p2p-i-la,1,0.000223 diff --git a/TP2/check.sh b/TP2/check.sh new file mode 100755 index 0000000..86b46ba --- /dev/null +++ b/TP2/check.sh @@ -0,0 +1,39 @@ +source utils.sh +echo BENCHMARKING THE METHODS +# you can modify these values +p=2 +q=2 +P=$((p * q)) +#generate_hostfile $P + +export OMP_NUM_THREADS=1 +export MKL_NUM_THREADS=1 + +# proper benchmark <--- this could be a TODO for students ? (as in, show weak scaling and/or strong scaling) +#mpi_options="-hostfile hostfiles/hostfile.$P.txt" +mpi_options="-platform platforms/cluster_crossbar.xml -hostfile hostfiles/cluster_hostfile.txt -np 4" +b=2 +iter=5 +traces="check_traces" +out="check_outputs" +csv="check.csv" +echo m,n,k,b,p,q,algo,lookahead,gflops >$csv +for i in 1; do + + n=$((i * b)) + m=$n + k=$n + la=0 + options="-c" + + for algo in p2p bcast; do + run + done + + for la in $(seq 1 $((n / b))); do + algo="p2p-i-la" + options="-c -l $la" + run + done + +done diff --git a/TP2/hostfiles/cluster_hostfile.txt b/TP2/hostfiles/cluster_hostfile.txt new file mode 100644 index 0000000..f24db7f --- /dev/null +++ b/TP2/hostfiles/cluster_hostfile.txt @@ -0,0 +1,256 @@ +host-0.hawaii.edu +host-1.hawaii.edu +host-2.hawaii.edu +host-3.hawaii.edu +host-4.hawaii.edu +host-5.hawaii.edu +host-6.hawaii.edu +host-7.hawaii.edu +host-8.hawaii.edu +host-9.hawaii.edu +host-10.hawaii.edu +host-11.hawaii.edu +host-12.hawaii.edu +host-13.hawaii.edu +host-14.hawaii.edu +host-15.hawaii.edu +host-16.hawaii.edu +host-17.hawaii.edu +host-18.hawaii.edu +host-19.hawaii.edu +host-20.hawaii.edu +host-21.hawaii.edu +host-22.hawaii.edu +host-23.hawaii.edu +host-24.hawaii.edu +host-25.hawaii.edu +host-26.hawaii.edu +host-27.hawaii.edu +host-28.hawaii.edu +host-29.hawaii.edu +host-30.hawaii.edu +host-31.hawaii.edu +host-32.hawaii.edu +host-33.hawaii.edu +host-34.hawaii.edu +host-35.hawaii.edu +host-36.hawaii.edu +host-37.hawaii.edu +host-38.hawaii.edu +host-39.hawaii.edu +host-40.hawaii.edu +host-41.hawaii.edu +host-42.hawaii.edu +host-43.hawaii.edu +host-44.hawaii.edu +host-45.hawaii.edu +host-46.hawaii.edu +host-47.hawaii.edu +host-48.hawaii.edu +host-49.hawaii.edu +host-50.hawaii.edu +host-51.hawaii.edu +host-52.hawaii.edu +host-53.hawaii.edu +host-54.hawaii.edu +host-55.hawaii.edu +host-56.hawaii.edu +host-57.hawaii.edu +host-58.hawaii.edu +host-59.hawaii.edu +host-60.hawaii.edu +host-61.hawaii.edu +host-62.hawaii.edu +host-63.hawaii.edu +host-64.hawaii.edu +host-65.hawaii.edu +host-66.hawaii.edu +host-67.hawaii.edu +host-68.hawaii.edu +host-69.hawaii.edu +host-70.hawaii.edu +host-71.hawaii.edu +host-72.hawaii.edu +host-73.hawaii.edu +host-74.hawaii.edu +host-75.hawaii.edu +host-76.hawaii.edu +host-77.hawaii.edu +host-78.hawaii.edu +host-79.hawaii.edu +host-80.hawaii.edu +host-81.hawaii.edu +host-82.hawaii.edu +host-83.hawaii.edu +host-84.hawaii.edu +host-85.hawaii.edu +host-86.hawaii.edu +host-87.hawaii.edu +host-88.hawaii.edu +host-89.hawaii.edu +host-90.hawaii.edu +host-91.hawaii.edu +host-92.hawaii.edu +host-93.hawaii.edu +host-94.hawaii.edu +host-95.hawaii.edu +host-96.hawaii.edu +host-97.hawaii.edu +host-98.hawaii.edu +host-99.hawaii.edu +host-100.hawaii.edu +host-101.hawaii.edu +host-102.hawaii.edu +host-103.hawaii.edu +host-104.hawaii.edu +host-105.hawaii.edu +host-106.hawaii.edu +host-107.hawaii.edu +host-108.hawaii.edu +host-109.hawaii.edu +host-110.hawaii.edu +host-111.hawaii.edu +host-112.hawaii.edu +host-113.hawaii.edu +host-114.hawaii.edu +host-115.hawaii.edu +host-116.hawaii.edu +host-117.hawaii.edu +host-118.hawaii.edu +host-119.hawaii.edu +host-120.hawaii.edu +host-121.hawaii.edu +host-122.hawaii.edu +host-123.hawaii.edu +host-124.hawaii.edu +host-125.hawaii.edu +host-126.hawaii.edu +host-127.hawaii.edu +host-128.hawaii.edu +host-129.hawaii.edu +host-130.hawaii.edu +host-131.hawaii.edu +host-132.hawaii.edu +host-133.hawaii.edu +host-134.hawaii.edu +host-135.hawaii.edu +host-136.hawaii.edu +host-137.hawaii.edu +host-138.hawaii.edu +host-139.hawaii.edu +host-140.hawaii.edu +host-141.hawaii.edu +host-142.hawaii.edu +host-143.hawaii.edu +host-144.hawaii.edu +host-145.hawaii.edu +host-146.hawaii.edu +host-147.hawaii.edu +host-148.hawaii.edu +host-149.hawaii.edu +host-150.hawaii.edu +host-151.hawaii.edu +host-152.hawaii.edu +host-153.hawaii.edu +host-154.hawaii.edu +host-155.hawaii.edu +host-156.hawaii.edu +host-157.hawaii.edu +host-158.hawaii.edu +host-159.hawaii.edu +host-160.hawaii.edu +host-161.hawaii.edu +host-162.hawaii.edu +host-163.hawaii.edu +host-164.hawaii.edu +host-165.hawaii.edu +host-166.hawaii.edu +host-167.hawaii.edu +host-168.hawaii.edu +host-169.hawaii.edu +host-170.hawaii.edu +host-171.hawaii.edu +host-172.hawaii.edu +host-173.hawaii.edu +host-174.hawaii.edu +host-175.hawaii.edu +host-176.hawaii.edu +host-177.hawaii.edu +host-178.hawaii.edu +host-179.hawaii.edu +host-180.hawaii.edu +host-181.hawaii.edu +host-182.hawaii.edu +host-183.hawaii.edu +host-184.hawaii.edu +host-185.hawaii.edu +host-186.hawaii.edu +host-187.hawaii.edu +host-188.hawaii.edu +host-189.hawaii.edu +host-190.hawaii.edu +host-191.hawaii.edu +host-192.hawaii.edu +host-193.hawaii.edu +host-194.hawaii.edu +host-195.hawaii.edu +host-196.hawaii.edu +host-197.hawaii.edu +host-198.hawaii.edu +host-199.hawaii.edu +host-200.hawaii.edu +host-201.hawaii.edu +host-202.hawaii.edu +host-203.hawaii.edu +host-204.hawaii.edu +host-205.hawaii.edu +host-206.hawaii.edu +host-207.hawaii.edu +host-208.hawaii.edu +host-209.hawaii.edu +host-210.hawaii.edu +host-211.hawaii.edu +host-212.hawaii.edu +host-213.hawaii.edu +host-214.hawaii.edu +host-215.hawaii.edu +host-216.hawaii.edu +host-217.hawaii.edu +host-218.hawaii.edu +host-219.hawaii.edu +host-220.hawaii.edu +host-221.hawaii.edu +host-222.hawaii.edu +host-223.hawaii.edu +host-224.hawaii.edu +host-225.hawaii.edu +host-226.hawaii.edu +host-227.hawaii.edu +host-228.hawaii.edu +host-229.hawaii.edu +host-230.hawaii.edu +host-231.hawaii.edu +host-232.hawaii.edu +host-233.hawaii.edu +host-234.hawaii.edu +host-235.hawaii.edu +host-236.hawaii.edu +host-237.hawaii.edu +host-238.hawaii.edu +host-239.hawaii.edu +host-240.hawaii.edu +host-241.hawaii.edu +host-242.hawaii.edu +host-243.hawaii.edu +host-244.hawaii.edu +host-245.hawaii.edu +host-246.hawaii.edu +host-247.hawaii.edu +host-248.hawaii.edu +host-249.hawaii.edu +host-250.hawaii.edu +host-251.hawaii.edu +host-252.hawaii.edu +host-253.hawaii.edu +host-254.hawaii.edu +host-255.hawaii.edu diff --git a/TP2/hostfiles/hostfile.txt b/TP2/hostfiles/hostfile.txt new file mode 100644 index 0000000..8132a5a --- /dev/null +++ b/TP2/hostfiles/hostfile.txt @@ -0,0 +1,16 @@ +node-0.simgrid.org +node-1.simgrid.org +node-2.simgrid.org +node-3.simgrid.org +node-4.simgrid.org +node-5.simgrid.org +node-6.simgrid.org +node-7.simgrid.org +node-8.simgrid.org +node-9.simgrid.org +node-10.simgrid.org +node-11.simgrid.org +node-12.simgrid.org +node-13.simgrid.org +node-14.simgrid.org +node-15.simgrid.org diff --git a/TP2/init.sh b/TP2/init.sh new file mode 100644 index 0000000..c985792 --- /dev/null +++ b/TP2/init.sh @@ -0,0 +1,4 @@ +#!/bin/bash +SIMGRID=/mnt/n7fs/ens/tp_guivarch/opt2021/simgrid-3.31 + +export PATH=${SIMGRID}/bin:${PATH} diff --git a/TP2/log.txt b/TP2/log.txt new file mode 100644 index 0000000..590d0e0 --- /dev/null +++ b/TP2/log.txt @@ -0,0 +1,117 @@ +File smpi_simgrid.trace + +Errors : +150 : Unknown container: 0 +153 : Unknown container: 0 +156 : Unknown container: 0 +165 : Unknown container: 0 +168 : Unknown container: 0 +171 : Unknown container: 0 +185 : Unknown container: 0 +191 : Unknown container: 0 +199 : Unknown container: 0 +205 : Unknown container: 0 +207 : Unknown container: 0 +213 : Unknown container: 0 +216 : Unknown container: 0 +221 : Unknown container: 0 +223 : Unknown container: 0 +231 : Unknown container: 0 +236 : Unknown container: 0 +243 : Unknown container: 0 +275 : Unknown container: 0 +283 : Unknown container: 0 +285 : Unknown container: 0 +287 : Unknown container: 0 +294 : Unknown container: 0 +303 : Unknown container: 0 +362 : Unknown container: 0 +364 : Unknown container: 0 +366 : Unknown container: 0 +371 : Unknown container: 0 +373 : Unknown container: 0 +375 : Unknown container: 0 +380 : Unknown container: 0 +382 : Unknown container: 0 +384 : Unknown container: 0 +389 : Unknown container: 0 +391 : Unknown container: 0 +393 : Unknown container: 0 +398 : Unknown container: 0 +400 : Unknown container: 0 +402 : Unknown container: 0 +407 : Unknown container: 0 +409 : Unknown container: 0 +411 : Unknown container: 0 +416 : Unknown container: 0 +418 : Unknown container: 0 +420 : Unknown container: 0 +425 : Unknown container: 0 +427 : Unknown container: 0 +429 : Unknown container: 0 +434 : Unknown container: 0 +436 : Unknown container: 0 +438 : Unknown container: 0 +443 : Unknown container: 0 +445 : Unknown container: 0 +447 : Unknown container: 0 +570 : Unknown container: 0 +573 : Unknown container: 0 +576 : Unknown container: 0 +585 : Unknown container: 0 +588 : Unknown container: 0 +591 : Unknown container: 0 +604 : Unknown container: 0 +612 : Unknown container: 0 +619 : Unknown container: 0 +625 : Unknown container: 0 +627 : Unknown container: 0 +633 : Unknown container: 0 +635 : Unknown container: 0 +641 : Unknown container: 0 +643 : Unknown container: 0 +650 : Unknown container: 0 +656 : Unknown container: 0 +663 : Unknown container: 0 +695 : Unknown container: 0 +703 : Unknown container: 0 +705 : Unknown container: 0 +707 : Unknown container: 0 +713 : Unknown container: 0 +723 : Unknown container: 0 +782 : Unknown container: 0 +784 : Unknown container: 0 +786 : Unknown container: 0 +791 : Unknown container: 0 +793 : Unknown container: 0 +795 : Unknown container: 0 +800 : Unknown container: 0 +802 : Unknown container: 0 +804 : Unknown container: 0 +809 : Unknown container: 0 +811 : Unknown container: 0 +813 : Unknown container: 0 +818 : Unknown container: 0 +820 : Unknown container: 0 +822 : Unknown container: 0 +827 : Unknown container: 0 +829 : Unknown container: 0 +831 : Unknown container: 0 +836 : Unknown container: 0 +838 : Unknown container: 0 +840 : Unknown container: 0 +845 : Unknown container: 0 +847 : Unknown container: 0 +849 : Unknown container: 0 +854 : Unknown container: 0 +856 : Unknown container: 0 +858 : Unknown container: 0 +863 : Unknown container: 0 +865 : Unknown container: 0 +867 : Unknown container: 0 + +Warnings : +1 : the definition is not identified +2 : the definition is not identified + +Your trace has 108 errors and 2 warnings. diff --git a/TP2/platforms/cluster_crossbar.xml b/TP2/platforms/cluster_crossbar.xml new file mode 100644 index 0000000..8ba3b5f --- /dev/null +++ b/TP2/platforms/cluster_crossbar.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/TP2/platforms/cluster_fat_tree.xml b/TP2/platforms/cluster_fat_tree.xml new file mode 100644 index 0000000..3ba6191 --- /dev/null +++ b/TP2/platforms/cluster_fat_tree.xml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/TP2/platforms/default.xml b/TP2/platforms/default.xml new file mode 100644 index 0000000..3ba6191 --- /dev/null +++ b/TP2/platforms/default.xml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/TP2/platforms/simgrid_update_xml.pl b/TP2/platforms/simgrid_update_xml.pl new file mode 100755 index 0000000..daea1f0 --- /dev/null +++ b/TP2/platforms/simgrid_update_xml.pl @@ -0,0 +1,277 @@ +#! /usr/bin/env perl +eval 'exec perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# This script updates the simgrid XML file passed as argument (modification in place) +# It is built to do the conversion incrementally. + +# Copyright (c) 2006-2022. The SimGrid Team. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the license (GNU LGPL) which comes with this package. + +=encoding UTF-8 + +=head1 NAME + +simgrid_update_xml - updates simgrid XML files to latest version + +=head1 SYNOPSIS + +B I + +=head1 DESCRIPTION + +simgrid_update_xml updates the simgrid XML file passed as argument. The file +is modified in place, without any kind of backup. You may want to save a copy +before running the script. + +In SimGrid XML files, the standard version is indicated in the version +attribute of the platform tag. Current version is 4. Here is a list of major +changes in each version. + +=over 4 + +=item B Used before SimGrid 3.3 + +=item B Introduced in SimGrid 3.3 + +=over 4 + +=item + +The version attribute of platform were added to allow file versioning. + +=item + +The link bandwidth changed from Mb/s to b/s; and the CPU power were changed +from MFlop/s to Flop/s + +=back + +=item B Introduced in SimGrid 3.4 + +=over + +=item + +Several tags were renamed: + + CPU -> HOST + NETWORK_LINK -> LINK + ROUTE_ELEMENT -> LINK_CTN + PLATFORM_DESCRIPTION -> PLATFORM + +=back + +=item B Introduced in SimGrid 3.5 + +=over 4 + +=item + +The AS tag were introduced. Every platform should now contain an englobing AS +tag. + +=item + +Routes are now symmetric by default. + +=item + +Several tags were renamed (for sake of XML sanity): + + LINK:CTN -> LINK_CTN + TRACE:CONNECT -> TRACE_CONNECT + +=back + +=item B Introduced in SimGrid 3.13 + +=over 4 + +=item + +Rename the attributes describing the amount of flop that a host / peer / cluster / cabinet can deliver per second. + + -> + +=item + +In , attribute kind="POWER" is now kind="SPEED". + +=item + +The DOCTYPE points to the right URL. + +=item + +Units are now mandatory in attributes. USE THE SCRIPT sg_xml_unit_converter.py TO CONVERT THIS + + - speed. Old default: 'f' or 'flops'. Also defined: + 'Yf', 'Zf', 'Ef', 'Pf', 'Tf', 'Gf', 'Mf', 'kf' + 'yottaflops', 'zettaflops', 'exaflops', 'petaflops', 'teraflops', 'gigaflops', 'megaflops', 'kiloflops' + + - bandwidth. Old default: 'Bps' bytes per second (or 'bps' but 1 Bps = 8 bps) + Also defined in bytes: 'TiBps', 'GiBps', 'MiBps', 'KiBps', 'TBps', 'GBps', 'MBps', 'kBps', 'Bps' + And the same in bits: 'Tibps', 'Gibps', 'Mibps', 'Kibps', 'Tbps', 'Gbps', 'Mbps', 'kbps', 'bps' + + - latency. Old default: 's' second. Also defined: + 'w' week, 'd' day, 'h' hour, 'm' minute, 'ms' millisecond, 'us' microsecond, 'ns' nanosecond, 'ps' picosecond + + +=back + +=item B Introduced in SimGrid 3.16 (this is the current version). + +=over 4 + +=item + +Rename a few tags, but in a backward-compatible manner: the old names are still accepted. + + AS -> zone + ASroute -> zoneRoute + bypassAsRoute -> bypassZoneRoute + process -> actor + +=back + +=item Other backward-compatible changes (old syntax is still accepted) for which we did not bump the DTD version: + +=over 4 + +=item + +Rename the FULLDUPLEX sharing into SPLITDUPLEX. + +=item + +In and , rename the 'availability_file' attribute into 'speed_file'. + +=back + +=back + +=head1 AUTHORS + + The SimGrid team + +=head1 COPYRIGHT AND LICENSE + +Copyright (c) 2006-2022. The SimGrid Team. All rights reserved. + +This program is free software; you may redistribute it and/or modify it +under the terms of GNU LGPL (v2.1) license. + +=cut + + +use strict; + +my $fromversion=-1; +my $toversion=4.1; + +my $filename = $ARGV[0] or die "Usage: simgrid_update_xml.pl file_to_convert.xml\nPlease provide an XML to convert as a parameter.\n"; +open INPUT, "$filename" or die "Cannot open input file $filename: $!\n"; + +my $output_string = "\n". + "\n". + "\n"; + +my($AS_opened)=0; + +my $line; +while (defined($line = )) { + chomp $line; + # eat the header, whatever form it has + next if ($line =~ s/<\?xml[^>]*>// && ! $line =~ /\S/); # just in case several tags are on the same line + next if ($line =~ s/]*>// && ! $line =~ /\S/); + + if ($line =~ s///) { + $fromversion = 0; + print "$filename was using version 0\n"; + next if !$line =~ /\S/; + } elsif ($line =~ s///) { + $fromversion = $1; + if ($fromversion == $toversion) { + warn "Input platform file $filename is already conformant to version $fromversion. This should be a no-op.\n"; + } + if ($fromversion > $toversion) { + die "Input platform file $filename is more recent than this script (file version: $fromversion; script version: $toversion)\n"; + } + next if !$line =~ /\S/; + print "$filename was using version $fromversion\n"; + } + + if ($fromversion == 0) { + while ($line =~ m|^(.*?)/) || ($line=~ /\n"; + $AS_opened=1; + } + + if($line=~/ $filename"; +print OUTPUT $output_string; +close OUTPUT; diff --git a/TP2/src/dsmat.c b/TP2/src/dsmat.c new file mode 100644 index 0000000..e114f57 --- /dev/null +++ b/TP2/src/dsmat.c @@ -0,0 +1,360 @@ +#include +#include +#include +#include + +#include "simgrid/actor.h" +#include + +#include "utils.h" +#include "dsmat.h" + +/* Tracing purposes */ +static char* COMPUTE = "Computing"; +static char* IDLE = "Idling"; + +void init_trace() { +// TRACE_host_state_declare(COMPUTE); +// TRACE_host_state_declare(IDLE); +} + +int dsmat_fill(Matrix* a, int m, int n, int b, int p, int q, char* name) { + int me, node; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + int mb = m/b, nb = n/b; + int ii, jj; + int row, col; + a->mb = mb; + a->nb = nb; + a->b = b; + //printf("%d] %s : m x n (b) = %d x %d (%d)\n", me, name, mb, nb, b); + a->blocks = calloc(mb,sizeof(Block*)); + for (ii = 0; ii < mb;ii++) { + a->blocks[ii] = calloc(nb,sizeof(Block)); + for (jj = 0; jj < nb;jj++) { + node = get_node(p,q,ii,jj); + node_coordinates_2i(p,q,node,&row,&col); + a->blocks[ii][jj].owner = node; + a->blocks[ii][jj].row = row; + a->blocks[ii][jj].col = col; + a->blocks[ii][jj].request = MPI_REQUEST_NULL; + if (me == a->blocks[ii][jj].owner) { + //printf("%d]allocating x_%d,%d\n",me,ii,jj); + a->blocks[ii][jj].c = calloc(b*b,sizeof(float)); + rand_mat(b,b,a->blocks[ii][jj].c,10); + } else { + a->blocks[ii][jj].c = NULL; + } + } + } + return 0; +} + +int dsmat_fill_v(Matrix* a, int m, int n, int b, int p, int q, char* name, float value) { + int me, node; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + int mb = m/b, nb = n/b; + int ii, jj; + int row, col; + a->mb = mb; + a->nb = nb; + a->b = b; + a->blocks = calloc(mb,sizeof(Block*)); + for (ii = 0; ii < mb;ii++) { + a->blocks[ii] = calloc(nb,sizeof(Block)); + for (jj = 0; jj < nb;jj++) { + node = get_node(p,q,ii,jj); + node_coordinates_2i(p,q,node,&row,&col); + a->blocks[ii][jj].owner = node; + a->blocks[ii][jj].row = row; + a->blocks[ii][jj].col = col; + a->blocks[ii][jj].request = MPI_REQUEST_NULL; + if (me == a->blocks[ii][jj].owner) { + //printf("%d]allocating x_%d,%d to fill with %f\n",me,ii,jj, value); + a->blocks[ii][jj].c = calloc(b*b,sizeof(float)); + val_mat(b,b,a->blocks[ii][jj].c,value); + } else { + a->blocks[ii][jj].c = NULL; + } + } + } + return 0; +} + +int dsmat_fill_s(Matrix* a, int m, int n, int b, int p, int q, char* name) { + int me, node; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + int mb = m/b, nb = n/b; + int ii, jj; + int row, col; + a->mb = mb; + a->nb = nb; + a->b = b; + a->blocks = calloc(mb,sizeof(Block*)); + for (ii = 0; ii < mb;ii++) { + a->blocks[ii] = calloc(nb,sizeof(Block)); + for (jj = 0; jj < nb;jj++) { + node = get_node(p,q,ii,jj); + node_coordinates_2i(p,q,node,&row,&col); + a->blocks[ii][jj].owner = node; + a->blocks[ii][jj].row = row; + a->blocks[ii][jj].col = col; + a->blocks[ii][jj].request = MPI_REQUEST_NULL; + if (me == a->blocks[ii][jj].owner) { + //printf("%d] s_allocating %s_%d,%d to fill with %f\n",me,name,ii,jj,(float)nb*(ii+1)+(jj+1)); + a->blocks[ii][jj].c = calloc(b*b,sizeof(float)); + val_mat(b,b,a->blocks[ii][jj].c,(float) nb*(ii+1)+(jj+1)); + } else { + a->blocks[ii][jj].c = NULL; + } + } + } + return 0; +} + +int dsmat_destroy(Matrix* a, char* name) { + int me; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + int mb = a->mb, nb = a->nb; + //printf("[%d] destroying matrix %s (mb=%d,nb=%d,b=%d)\n",me, name, mb, nb, a->b); + int ii, jj; + Block * a_ij; + for (ii = 0; ii < mb ; ii++) { + for (jj = 0; jj < nb ; jj++) { + a_ij = & a->blocks[ii][jj]; + //if (a_ij->c != NULL) { // && a_ij.owner == me) { + if (a_ij->c != NULL && a_ij->owner == me) { + free(a_ij->c); + } + } + free(a->blocks[ii]); + } + free(a->blocks); + return 0; +} + +int dsmat_scal_check(Matrix* A, float alpha) { + int i,j; + int me; + if (alpha == 0.0) return 0; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + Block* Aij; + for(i = 0; i < A->mb; i++) { + for(j = 0; j < A->nb; j++) { + Aij = & A->blocks[i][j]; + if (Aij->owner == me) { + double computation_amount = 2.0*A->b*A->b*A->b; + cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, A->b, A->b, A->b, + 0.0, Aij->c, A->b, Aij->c, A->b, + alpha, Aij->c, A->b); + } + } + } + return 0; +} + +int dsmat_scal(Matrix* A, float alpha) { + int i,j; + int me; + if (alpha == 0.0) return 0; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + Block* Aij; + SMPI_SAMPLE_LOCAL(i = 0, i < A->mb, i++, 10, 0.005) { + SMPI_SAMPLE_LOCAL(j = 0, j < A->nb, j++, 10, 0.005) { + Aij = & A->blocks[i][j]; + if (Aij->owner == me) { + double computation_amount = 2.0*A->b*A->b*A->b; + cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, A->b, A->b, A->b, + 0.0, Aij->c, A->b, Aij->c, A->b, + alpha, Aij->c, A->b); + } + } + } + return 0; +} + +// FIXME : remove alpha/beta +int local_outer_product_check(float alpha, Matrix* A, Matrix* B, Matrix* C, int l, int p, int q) { + int i, j, err; + for(i = 0; i < C->mb; i++) { + for(j = 0; j < C->nb; j++) { + err = compute_local_op(alpha, A, B, C, i, j, l); + if (err != 0) return 1; + } + } + /* free useless memory */ + free_local_op(A, B, l, p, q); + return 0; +} + +int local_outer_product(float alpha, Matrix* A, Matrix* B, Matrix* C, int l, int p, int q) { + int i, j, err; + SMPI_SAMPLE_LOCAL(i = 0, i < C->mb, i++, 10, 0.005) { + SMPI_SAMPLE_LOCAL(j = 0, j < C->nb, j++, 10, 0.005) { + err = compute_local_op(alpha, A, B, C, i, j, l); + if (err != 0) return 1; + } + } + /* free useless memory */ + free_local_op(A, B, l, p, q); + return 0; +} + +int compute_local_op(float alpha, Matrix* A, Matrix* B, Matrix* C, int i, int j, int l) { + int me; + int b; + Block *Ail, *Blj, *Cij; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + Cij = & C->blocks[i][j]; + b = C->b; + if (Cij->owner == me) { + Ail = & A->blocks[i][l]; + if (Ail->c == NULL) { return 1; } + Blj = & B->blocks[l][j]; + if (Blj->c == NULL) { return 2; } +// TRACE_host_set_state(COMPUTE); + cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, b,b,b, + alpha, Ail->c, b, Blj->c, b, + 1.0, Cij->c, b); +// TRACE_host_set_state(IDLE); + } + return 0; +} + +int free_local_op(Matrix* A, Matrix* B, int l, int p, int q) { + int i,j; + int me, me_coord[2]; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates(p,q,me,me_coord); + Block *Ail, *Blj; + for (i = 0; i < A->mb; i++) { + Ail = & A->blocks[i][l]; + if (Ail->owner != me && Ail->c != NULL) { + free(Ail->c); + Ail->c = NULL; + } + } + for (j = 0; j < B->nb; j++) { + Blj = & B->blocks[l][j]; + if (Blj->owner != me && Blj->c != NULL) { + free(Blj->c); + Blj->c = NULL; + } + } + return 0; +} + +int block_copy(float * a, float * b, int m, int n) { + int i, j; + for (i = 0; i < m ; i++) { + for (j = 0; j < n ; j++) { + a[n*i+j] = b[n*i+j]; + } + } + return 0; +} + +int block_print(float * a, int m, int n, char* name) { + int i, j; + printf("block %s\n", name); + for (i = 0; i < m ; i++) { + for (j = 0; j < n ; j++) { + printf("%9.2f\t", a[n*i+j]); + } + printf("\n"); + } + printf("\n"); + return 0; +} + +// A <- B +int dsmat_copy(Matrix * A, Matrix * B) { + int i, j; + int me; + int mb, nb, b; + Block *Aij, *Bij; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + + A->mb = B->mb; + A->nb = B->nb; + A->b = B->b; + + mb = A->mb; + nb = A->nb; + b = A->b; + + A->blocks = calloc(mb, sizeof(Block*)); + for (i = 0; iblocks[i] = calloc(nb, sizeof(Block)); + for (j = 0; jblocks[i][j]; + Bij = & B->blocks[i][j]; + Aij->owner = Bij->owner; + Aij->row = Bij->row; + Aij->col = Bij->col; + Aij->request = MPI_REQUEST_NULL; + if (Bij->owner == me) { + Aij->c = calloc(b*b,sizeof(float)); + block_copy(Aij->c, Bij->c, b, b); + } + } + } + return 0; +} + +int dsmat_copy_to(Matrix * A, Matrix * B, int rcv, char* copy, char* copied) { + int i, j, l; + int me,tag; + int mb, nb, b; + Block *Aij, *Bij; + float* localA; + MPI_Status status; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + A->nb = 1; + A->mb = 1; + A->b = -1; + + mb = B->mb; + nb = B->nb; + b = B->b; + + tag = 0; + A->blocks = malloc(sizeof(Block*)); + A->blocks[0] = malloc(sizeof(Block)); + Aij = & A->blocks[0][0]; + Aij->owner = rcv; + Aij->row = -1; + Aij->col = -1; // not on a grid ... + Aij->request = MPI_REQUEST_NULL; + if (me == rcv) { + Aij->c = malloc(mb*b*nb*b *sizeof(float)); + } + for (i = 0; iblocks[i][j]; + if (Bij->owner == me) { + if (rcv != me) { + MPI_Send(Bij->c, b*b, MPI_FLOAT, + rcv, tag, + MPI_COMM_WORLD); + } else { + for (l = 0; lc[nb*i*b*b+j*b+l*nb*b], Bij->c, 1, b); + } + } + } else if (me == rcv) { + localA = malloc(b*b*sizeof(float)); + MPI_Recv(localA, b*b, MPI_FLOAT, + Bij->owner, tag, + MPI_COMM_WORLD,&status); + for (l = 0; lc[nb*i*b*b+j*b+l*nb*b], localA, 1, b); + } + free(localA); + } + } + } + return 0; +} diff --git a/TP2/src/dsmat.h b/TP2/src/dsmat.h new file mode 100644 index 0000000..043c3bf --- /dev/null +++ b/TP2/src/dsmat.h @@ -0,0 +1,62 @@ +#ifndef DENSE_MAT_FNCT_H +#define DENSE_MAT_FNCT_H + +typedef struct Blocks { + float* c; // The Content of the block stored in an array. + // This pointer is only meaningful to the owner + // otherwise it is NULL. + // Element x_i,j of a given block of size b + // can be accessed as x->c[b*i+j]. + int owner; // The MPI rank of the owner of this block. + // This information is available to all the nodes. + int row, col; // owner = row * q + col in a p x q grid. + MPI_Request request; // The Request can be used when sending the block + // through Immediate Return routines of MPI such as MPI_Irecv +} Block; + +typedef struct Matrices { + int mb, nb, b; // A given Matrix is of size mb*b x nb*b, b being the + // dimension of every of its square blocks i.e. + // nb is the number of column blocks, mb the one of row blocks -- oof + Block** blocks; // This 2D array describes each block of a given Matrix. + // This is meaningful to all the nodes : information on a block A_i,j + // from a matrix A can be accessed through the block A->blocks[i][j] from every MPI rank. +} Matrix; + +// tracing +void init_trace(); + +/* dense matrices routines */ +// fill matrix a with values matching the position of the block in the matrix +// i.e. block a_i,j is full of n*(i+1)+(j+1) with a of size m x n +int dsmat_fill_s(Matrix* a, int m, int n, int b, int p, int q, char* name); +// destroy matrix a +int dsmat_destroy(Matrix* a, char* name); +// scale matrix a by alpha +int dsmat_scal_check(Matrix* a, float alpha); +int dsmat_scal(Matrix* a, float alpha); + +int dsmat_fill_v(Matrix* a, int m, int n, int b, int p, int q, char* name, float value); + +/* dense matrices copy */ +// copy a[0:m-1,0:n-1] into b[0:m-1,0:n-1] +int block_copy(float * a, float * b, int m, int n); +// print a[0:m-1,0:n-1] +int block_print(float * a, int m, int n, char* name); +// copy matrix B into matrix A +int dsmat_copy(Matrix * A, Matrix * B); +// copy matrix B into matrix A owned only by rank rcv +int dsmat_copy_to(Matrix * A, Matrix * B, int rcv, char* copy, char* copied); + +/* gemm generic routines */ +// computing C += A:l * Bl: for all blocks of C I own using compute_local_op +// matrices A and B that I do not own are freed from memory using free_local_op +int local_outer_product_check(float alpha, Matrix* A, Matrix* B, Matrix* C, int l, int p, int q); +int local_outer_product(float alpha, Matrix* A, Matrix* B, Matrix* C, int l, int p, int q); +// compute C_i,j += A_i,l * B_l,j +// if a given block is missing, the corresponding computation is skipped +int compute_local_op(float alpha, Matrix* A, Matrix* B, Matrix* C, int i, int j, int l); +// free A:l and Bl: from memory is I do not own them +int free_local_op(Matrix* A, Matrix* B, int l, int p, int q); + +#endif diff --git a/TP2/src/ex1.c b/TP2/src/ex1.c new file mode 100644 index 0000000..e45e38e --- /dev/null +++ b/TP2/src/ex1.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include "utils.h" +#include "dsmat.h" +#include "gemms.h" + +void p2p_transmit_A(int p, int q, Matrix *A, int i, int l) +{ + int j; + int me, my_row, my_col; + MPI_Status status; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p, q, me, &my_row, &my_col); + + Block *Ail; + int node, tag, b; + tag = 0; + Ail = &A->blocks[i][l]; + b = A->b; + + /* TODO : transmit A[i,l] using MPI_Ssend & MPI_Recv */ + if (Ail->owner == me) + { // I own A[i,l] + /* MPI_Ssend A[i,l] to my row */ + for (j = 0; j < q; j++) + { + node = get_node(p, q, my_row, j); + if (node != me) + { + // printf("%d Sending A[%d,%d] to node %d\n", my_rank, i, l, node); + MPI_Ssend(Ail->c, b * b, MPI_FLOAT, node, tag, MPI_COMM_WORLD); + // printf("%d Sent A[%d,%d] to node %d\n", my_rank, i, l, node); + } + } + } + else if (Ail->row == my_row) + { // A[i,l] is stored on my row + Ail->c = malloc(b * b * sizeof(float)); + /* MPI_Recv A[i,l] */ + // printf("%d Receiving A[%d,%d] from node %d\n", my_rank, i, l, node); + MPI_Recv(Ail->c, b * b, MPI_FLOAT, Ail->owner, tag, MPI_COMM_WORLD, &status); + // printf("%d Received A[%d,%d] from node %d\n", my_rank, i, l, node); + } + /* end TODO */ +} + +void p2p_transmit_B(int p, int q, Matrix *B, int l, int j) +{ + int i; + int me, my_row, my_col; + MPI_Status status; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p, q, me, &my_row, &my_col); + + int node, tag, b; + tag = 1; + Block *Blj; + Blj = &B->blocks[l][j]; + b = B->b; + /* TODO : transmit B[l,j] using MPI_Ssend & MPI_Recv */ + if (Blj->owner == me) + { // I owned B[l,j] + /* MPI_Ssend B[l,j] to my column */ + for (i = 0; i < p; i++) + { + node = get_node(p, q, i, my_col); + if (node != me) + { + // printf("%d Sending B[%d,%d] to node %d\n", me, l, j, node); + MPI_Ssend(Blj->c, b * b, MPI_FLOAT, node, tag, MPI_COMM_WORLD); + // printf("%d Sent B[%d,%d] to node %d\n", me, l, j, node); + } + } + } + else if (Blj->col == my_col) + { // B[l,j] is stored on my column + Blj->c = malloc(b * b * sizeof(float)); + /* MPI_Recv B[l,j] */ + // printf("%d Receiving B[%d,%d] from node %d\n", me, l, j, node); + MPI_Recv(Blj->c, b * b, MPI_FLOAT, Blj->owner, tag, MPI_COMM_WORLD, &status); + // printf("%d Received B[%d,%d] from node %d\n", me, l, j, node); + } + /* end TODO */ +} diff --git a/TP2/src/ex1.c.clem b/TP2/src/ex1.c.clem new file mode 100644 index 0000000..ffd8844 --- /dev/null +++ b/TP2/src/ex1.c.clem @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include "utils.h" +#include "dsmat.h" +#include "gemms.h" + +void p2p_transmit_A(int p, int q, Matrix *A, int i, int l) { + int j; + int me, my_row, my_col; + MPI_Status status; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p,q,me,&my_row,&my_col); + + Block *Ail; + int node, tag, b; + Ail = & A->blocks[i][l]; + b = A->b; + /* TODO : transmit A[i,l] using MPI_Ssend & MPI_Recv */ + if (Ail->owner == me /* I own A[i,l]*/) { + /* MPI_Ssend A[i,l] to my row */ + for (j = 0; j < q; j++) { + node = get_node(p, q, my_row, j); + if (node != me) + MPI_Ssend(Ail->c, b*b, MPI_FLOAT, node, 0, MPI_COMM_WORLD); + } + } else if (Ail->row == my_row /* A[i,l] is stored on my row */) { + Ail->c = malloc(b*b*sizeof(float)); + /* MPI_Recv A[i,l] */ + MPI_Recv(Ail->c, b*b, MPI_FLOAT, Ail->owner, 0, MPI_COMM_WORLD, &status); + } + /* end TODO */ +} + +void p2p_transmit_B(int p, int q, Matrix *B, int l, int j) { + int i; + int me, my_row, my_col; + MPI_Status status; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p,q,me,&my_row,&my_col); + + int node, tag, b; + Block *Blj; + Blj = & B->blocks[l][j]; + b = B->b; + /* TODO : transmit B[l,j] using MPI_Ssend & MPI_Recv */ + if (Blj->owner == me /* I owned B[l,j]*/) { + /* MPI_Ssend B[l,j] to my column */ + for (i = 0; i < p; i++) { + node = get_node(p, q, i, my_col); + if (node != me) + MPI_Ssend(Blj->c, b*b, MPI_FLOAT, node, 1, MPI_COMM_WORLD); + } + } else if (Blj->col == my_col /* B[l,j] is stored on my column */) { + Blj->c = malloc(b*b*sizeof(float)); + /* MPI_Recv B[l,j] */ + MPI_Recv(Blj->c, b*b, MPI_FLOAT, Blj->owner, 1, MPI_COMM_WORLD, &status); + } + /* end TODO */ +} \ No newline at end of file diff --git a/TP2/src/ex1.h b/TP2/src/ex1.h new file mode 100644 index 0000000..71ae2af --- /dev/null +++ b/TP2/src/ex1.h @@ -0,0 +1,5 @@ +#ifndef EXO_1_H +#define EXO_1_H +void p2p_transmit_A(int p, int q, Matrix *A, int i, int l); +void p2p_transmit_B(int p, int q, Matrix *B, int l, int j); +#endif diff --git a/TP2/src/ex2.c b/TP2/src/ex2.c new file mode 100644 index 0000000..890a6d7 --- /dev/null +++ b/TP2/src/ex2.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include "utils.h" +#include "dsmat.h" +#include "gemms.h" + +void bcast_A(int p, int q, Matrix *A, int i, int l, MPI_Comm row_comm) +{ + int me, my_row, my_col; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p, q, me, &my_row, &my_col); + + Block *Ail; + int b = A->b; + Ail = &A->blocks[i][l]; + /* TODO : transmit A[i,l] using MPI_Bcast */ + if (q > 1 && Ail->row == my_row) + { /* Ail is stored on my row */ + if (Ail->owner != me) + { + Ail->c = calloc(b * b, sizeof(float)); + } + // MPI_Bcast + MPI_Bcast(Ail->c, b * b, MPI_FLOAT, Ail->col, row_comm); + } + /* end TODO */ +} + +void bcast_B(int p, int q, Matrix *B, int l, int j, MPI_Comm col_comm) +{ + int me, my_row, my_col; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p, q, me, &my_row, &my_col); + + Block *Blj; + int b = B->b; + Blj = &B->blocks[l][j]; + /* TODO : transmit B[l,j] using MPI_Bcast */ + if (p > 1 && Blj->col == my_col) + { /* Blj is stored on my column */ + if (Blj->owner != me) + { + Blj->c = calloc(b * b, sizeof(float)); + } + // MPI_Bcast + MPI_Bcast(Blj->c, b * b, MPI_FLOAT, Blj->row, col_comm); + } + /* end TODO */ +} diff --git a/TP2/src/ex2.h b/TP2/src/ex2.h new file mode 100644 index 0000000..a0554a3 --- /dev/null +++ b/TP2/src/ex2.h @@ -0,0 +1,5 @@ +#ifndef EXO_2_H +#define EXO_2_H +void bcast_A(int p, int q, Matrix *A, int i, int l, MPI_Comm row_comm); +void bcast_B(int p, int q, Matrix *B, int l, int j, MPI_Comm col_comm); +#endif diff --git a/TP2/src/ex3.c b/TP2/src/ex3.c new file mode 100644 index 0000000..c56d06d --- /dev/null +++ b/TP2/src/ex3.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include "utils.h" +#include "dsmat.h" +#include "gemms.h" + +void p2p_i_transmit_A(int p, int q, Matrix *A, int i, int l) +{ + int j, b; + int me, my_row, my_col; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p, q, me, &my_row, &my_col); + + int node, tag; + tag = 0; + Block *Ail; + Ail = &A->blocks[i][l]; + b = A->b; + + /* TODO : transmit A[i,l] using MPI_Isend/recv */ + if (Ail->owner == me) + { + // MPI_Isend Ail to my row + for (j = 0; j < q; j++) + { + node = get_node(p, q, my_row, j); + if (node != me) + { + MPI_Isend(Ail->c, b * b, MPI_FLOAT, node, tag, MPI_COMM_WORLD, &Ail->request); + } + } + } + else if (Ail->row == my_row) + { + Ail->c = calloc(b * b, sizeof(float)); + // MPI_Irecv Ail + MPI_Irecv(Ail->c, b * b, MPI_FLOAT, Ail->owner, tag, MPI_COMM_WORLD, &Ail->request); + } + /* end TODO */ +} + +void p2p_i_transmit_B(int p, int q, Matrix *B, int l, int j) +{ + int i, b; + int me, my_row, my_col; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p, q, me, &my_row, &my_col); + + int node, tag; + tag = 1; + Block *Blj; + Blj = &B->blocks[l][j]; + b = B->b; + + /* TODO : transmit B[l,j] using MPI_Isend/recv */ + if (Blj->owner == me) + { + // MPI_Isend Blj to my col + for (i = 0; i < p; i++) + { + node = get_node(p, q, i, my_col); + if (node != me) + { + MPI_Isend(Blj->c, b * b, MPI_FLOAT, node, tag, MPI_COMM_WORLD, &Blj->request); + } + } + } + else if (Blj->col == my_col) + { + Blj->c = calloc(b * b, sizeof(float)); + // MPI_Irecv Blj + MPI_Irecv(Blj->c, b * b, MPI_FLOAT, Blj->owner, tag, MPI_COMM_WORLD, &Blj->request); + } + /* end TODO */ +} + +void p2p_i_wait_AB(int p, int q, Matrix *A, Matrix *B, Matrix *C, int l) +{ + int me, my_row, my_col; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates_2i(p, q, me, &my_row, &my_col); + + int i, j; + Block *Ail, *Blj; + /* TODO : wait for A[i,l] and B[l,j] if I need them */ + for (i = 0; i < A->mb; i++) + { + Ail = &A->blocks[i][l]; + if (Ail->owner != me && Ail->row == my_row) + { + // MPI_Wait Ail + MPI_Wait(&Ail->request, MPI_STATUS_IGNORE); + } + } + for (j = 0; j < B->nb; j++) + { + Blj = &B->blocks[l][j]; + if (Blj->owner != me && Blj->col == my_col) + { + // MPI_Wait Blj + MPI_Wait(&Blj->request, MPI_STATUS_IGNORE); + } + } + /* Alternative suggestion : iterate over blocks of C */ + /* end TODO */ +} diff --git a/TP2/src/ex3.h b/TP2/src/ex3.h new file mode 100644 index 0000000..ee1085c --- /dev/null +++ b/TP2/src/ex3.h @@ -0,0 +1,6 @@ +#ifndef EXO_3_H +#define EXO_3_H +void p2p_i_transmit_A(int p, int q, Matrix *A, int i, int l); +void p2p_i_transmit_B(int p, int q, Matrix *B, int l, int j); +void p2p_i_wait_AB(int p, int q, Matrix *A, Matrix* B, Matrix* C,int l); +#endif diff --git a/TP2/src/gemms.c b/TP2/src/gemms.c new file mode 100644 index 0000000..e91fe7f --- /dev/null +++ b/TP2/src/gemms.c @@ -0,0 +1,157 @@ +#include +#include +#include +#include +#include "utils.h" +#include "dsmat.h" +#include "gemms.h" + +#include "ex1.h" +#include "ex2.h" +#include "ex3.h" + +int pgemm_p2p(int check, int p, int q, int m, int n, int k, Matrix* A, Matrix* B, Matrix* C) { + int mb, nb, kb; + int i, j, l; + int me, me_coord[2], my_row, my_col; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates(p,q,me,me_coord); + node_coordinates_2i(p,q,me,&my_row,&my_col); + + if (A->nb != B->mb || A->mb != C-> mb || B->nb != C->nb) { + if (me == 0) { + printf(" A B C\n"); + printf(" mb %d %d %d\n", A->mb, B->mb, C->mb); + printf(" nb %d %d %d\n", A->nb, B->nb, C->nb); + } + return 1; + } + if (B->b != A->b || A->b != C-> b) return 2; + mb = C->mb; + nb = C->nb; + kb = A->nb; + + for (l = 0; l < kb; l++) { + for (i = 0; i < mb; i++) { + p2p_transmit_A(p,q,A,i,l); + } + for (j = 0; j < nb; j++) { + p2p_transmit_B(p,q,B,l,j); + } + if (check) { + local_outer_product_check(1.0f, A, B, C, l, p, q); + } else { + local_outer_product(1.0f, A, B, C, l, p, q); + } + } + // printf("FINI\n"); + return 0; +} + +int pgemm_bcast(int check, int p, int q, int m, int n, int k, Matrix* A, Matrix* B, Matrix* C) { + int mb, nb, kb; + int i, j, l; + int me, me_row_comm, me_col_comm, me_coord[2]; + int my_row, my_col; + MPI_Comm row_comm, col_comm; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + + if (A->nb != B->mb || A->mb != C-> mb || B->nb != C->nb) { + if (me == 0) { + printf(" A B C\n"); + printf(" mb %d %d %d\n", A->mb, B->mb, C->mb); + printf(" nb %d %d %d\n", A->nb, B->nb, C->nb); + } + return 1; + } + if (B->b != A->b || A->b != C-> b) return 2; + mb = C->mb; + nb = C->nb; + kb = A->nb; + + node_coordinates(p,q,me,me_coord); + node_coordinates_2i(p,q,me,&my_row, &my_col); + if (q > 1) { + MPI_Comm_split(MPI_COMM_WORLD, my_row, me, &row_comm); + MPI_Comm_rank(row_comm, &me_row_comm); + } else { + me_row_comm = -1; + } + if (p > 1) { + MPI_Comm_split(MPI_COMM_WORLD, my_col, me, &col_comm); + MPI_Comm_rank(col_comm, &me_col_comm); + } else { + me_col_comm = -1; + } + + for (l = 0; l < kb ; l++) { + for (i = 0; i < mb; i++) { + bcast_A(p,q,A,i,l,row_comm); + } + for (j = 0; j < nb; j++) { + bcast_B(p,q,B,l,j,col_comm); + } + if (check) { + local_outer_product_check(1.0f, A, B, C, l, p, q); + } else { + local_outer_product(1.0f, A, B, C, l, p, q); + } + } + if (q > 1) + MPI_Comm_free(&row_comm); + if (p > 1) + MPI_Comm_free(&col_comm); + return 0; +} + +int pgemm_p2p_i_la(int check, int p, int q, int lookahead, int m, int n, int k, Matrix* A, Matrix* B, Matrix* C) { + int mb, nb, kb; + int i, j, l; + int me, me_coord[2],my_row, my_col; + MPI_Comm_rank(MPI_COMM_WORLD, &me); + node_coordinates(p,q,me,me_coord); + node_coordinates_2i(p,q,me,&my_row,&my_col); + + if (A->nb != B->mb || A->mb != C-> mb || B->nb != C->nb) { + if (me == 0) { + printf(" A B C\n"); + printf(" mb %d %d %d\n", A->mb, B->mb, C->mb); + printf(" nb %d %d %d\n", A->nb, B->nb, C->nb); + } + return 1; + } + if (B->b != A->b || A->b != C-> b) return 2; + mb = C->mb; + nb = C->nb; + kb = A->nb; + if (lookahead <= 0) return 3; + if (lookahead >= kb) lookahead = kb; + //printf("LA = %d, KB = %d\n",lookahead, kb); + for (l = 0; l < lookahead ; l++) { + for (i = 0; i < mb; i++) { + p2p_i_transmit_A(p,q,A,i,l); + } + for (j = 0; j < nb; j++) { + p2p_i_transmit_B(p,q,B,l,j); + } + } + for (l = 0; l < kb ; l++) { + if (l < kb - lookahead) { // "kb-th" lookahead : kb = l + lookahead + for (i= 0; i < mb; i++) { + p2p_i_transmit_A(p,q,A,i,l+lookahead); + } + for (j= 0; j < nb; j++) { + p2p_i_transmit_B(p,q,B,l+lookahead,j); + } + } + p2p_i_wait_AB(p,q,A,B,C,l); + if (check) { + local_outer_product_check(1.0f, A, B, C, l, p, q); + } else { + local_outer_product(1.0f, A, B, C, l, p, q); + } + } + return 0; +} + diff --git a/TP2/src/gemms.h b/TP2/src/gemms.h new file mode 100644 index 0000000..20be264 --- /dev/null +++ b/TP2/src/gemms.h @@ -0,0 +1,9 @@ +#ifndef PROGPARALLEL_GEMMS_H +#define PROGPARALLEL_GEMMS_H + +int pgemm_p2p(int check, int p, int q, int m, int n, int k, Matrix* A, Matrix* B, Matrix* C); +int pgemm_bcast(int check, int p, int q, int m, int n, int k, Matrix* A, Matrix* B, Matrix* C); +//int pgemm_p2p_i(int p, int q, int m, int n, int k, Matrix* A, Matrix* B, Matrix* C); +int pgemm_p2p_i_la(int check, int p, int q, int lookahead, int m, int n, int k, Matrix* A, Matrix* B, Matrix* C); + +#endif diff --git a/TP2/src/main.c b/TP2/src/main.c new file mode 100644 index 0000000..e6fc9da --- /dev/null +++ b/TP2/src/main.c @@ -0,0 +1,270 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "dsmat.h" +#include "gemms.h" + +static char doc[] = +"TP Prog Parallèle -- Ligne de commande"; + + +static char args_doc[] = "-m [m] -n [n] -k [k] -b [b] -p [p] -q [q] --algorithm [p2p|p2p-i-la|bcast] --lookahead [la] --niter [i]"; + +static struct argp_option options[] = { + {"m", 'm', "int", 0, "Number of rows in A and C (deprecated)" }, + {"n", 'n', "int", 0, "Dimension of A B and C" }, + {"k", 'k', "int", 0, "Shared dimension of A and B (deprecated)" }, + {"blocking", 'b', "int", 0, "Size of the square block of A, B and C (must divide m,n and k" }, + {"p", 'p', "int", 0, "Length of the logical grid"}, + {"q", 'q', "int", 0, "Width of the logical grid"}, + {"algorithm",'a', "string", 0, "GEMM distributed algorithm to use"}, + {"lookahead",'l', "int", 0, "Parameter for p2p-i-la algorithm"}, + {"verbose", 'v', 0, 0, "If the program print more"}, + {"checking", 'c', 0, 0, "If the program checks gemm results"}, + {"niter", 'i', "int", 0, "Number of iterations"}, + { 0 } +}; + +struct arguments +{ + int m, n, k, b; + int p, q; + int la; + char* algo; + int verbose, check; + int iter; +}; + + static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + /* Get the input argument from argp_parse, which we + know is a pointer to our arguments structure. */ + struct arguments *arguments = state->input; + + switch (key) + { + case 'm': + arguments->m = atoi(arg); + break; + case 'n': + arguments->n = atoi(arg); + break; + case 'k': + arguments->k = atoi(arg); + break; + case 'b': + arguments->b = atoi(arg); + break; + case 'p': + arguments->p = atoi(arg); + break; + case 'q': + arguments->q = atoi(arg); + break; + case 'l': + arguments->la = atoi(arg); + break; + case 'a': + arguments->algo = arg; + break; + case 'v': + arguments->verbose = 1; + break; + case 'c': + arguments->check = 1; + break; + case 'i': + arguments->iter = atoi(arg); + break; + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static struct argp argp = { options, parse_opt, args_doc, doc }; + +// void print_res(Matrix C, char* algo) { +// int i,j; +// int size, rank; +// MPI_Comm_size(MPI_COMM_WORLD, &size); +// MPI_Comm_rank(MPI_COMM_WORLD, &rank); +// char name[100]; +// for (i=0;i +#include +#include +#include +#include +#include +#include +#include +#include "utils.h" +#include "dsmat.h" +#include "gemms.h" + +int main(int argc, char* argv[]) { + + int p, q; + int m,n,k,b; + int i,j,l,la; + int err, iter, niter; + double d_start, d_stop; // on multiple nodes + clock_t t; // on one node + double time_taken, gflops; + int node,tag; + long unsigned int total_us; + char name[100]; + char * algo; + int vbose, check; + MPI_Status status; + + m = 2; + n = 4; + k = 4; + b = 2; + p = 1; + q = 2; + + // openblas_set_num_threads(1); + srand(time(NULL)); + + MPI_Init(NULL,NULL); + int world_size, world_rank; + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + printf("I am the %d-th node in a world of size %d\n", world_rank, world_size); + if (p*q != world_size) { + printf("bad world size\n"); + return 1; + } + + err = MPI_Barrier(MPI_COMM_WORLD); + if (err != MPI_SUCCESS) return 1; + // this initialization could probably get better + Matrix A = (Matrix){0},B = (Matrix){0},C = (Matrix){0}; + Matrix bA = (Matrix){0},bB = (Matrix){0},bC= (Matrix){0}; + Matrix wA = (Matrix){0},wB = (Matrix){0},wC= (Matrix){0}, bwC= (Matrix){0}; + printf("[%d] m,n,k = %d,%d,%d | b = %d | pxq = %dx%d | la = %d | test %f \n", + world_rank, m,n,k, b, p,q, la, 1.0f); + err = dsmat_fill_s(&A, m, k, b, p, q, "A"); + err = MPI_Barrier(MPI_COMM_WORLD); + if (err != MPI_SUCCESS) return 1; + + err = dsmat_copy(&wA,&A); + MPI_Barrier(MPI_COMM_WORLD); + err = dsmat_copy_to(&wC,&A,0,"wC","A"); + printf("%d ] dsmat_copy_to.err = %d\n", world_rank, err); + err = dsmat_destroy(&wA,"wA"); + err = dsmat_copy(&wA,&A); + err = dsmat_destroy(&wA,"wA"); + err = dsmat_copy(&wA,&A); + err = dsmat_destroy(&wC,"wC"); + err = dsmat_destroy(&A,"A"); + err = MPI_Barrier(MPI_COMM_WORLD); + printf("[%d] matrices destroyed (%d) \n", world_rank, err); + return MPI_Finalize(); +} diff --git a/TP2/src/utils.c b/TP2/src/utils.c new file mode 100644 index 0000000..919d600 --- /dev/null +++ b/TP2/src/utils.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include +//#include +#include +#include "utils.h" + +void val_mat(int m, int n, float* mat, float val) { + int i,j; + for(i = 0; i %f Gflop/s check: %f (block:%d, kernel:%d)\n", name, total_us, gflops, nrm, b, kernel); + printf("CSV %d,%d,%d,%d,%d,%s,%ld,%f\n", m,n,k,b,kernel,name,total_us,gflops); +} + +void print_mat(float* a, int m, int n, char* name) { + int i,j; + for (i = 0; i < m ; i++) { + for (j = 0; j < n ; j++) { + printf("%s[%d,%d] = %f,",name,i,j,a[n*i+j]); + } + printf("\n"); + } + printf("\n"); +} + +// b = alpha*a + b +void myblas_sgepxy(float alpha, float* a, float* b, int m, int n) { + int i; + for (i = 0; i < m ; i++) { + cblas_saxpy(n,alpha,&a[n*i],1,&b[n*i],1); + } +} + +void node_coordinates(int p, int q, int node, int* coordinates) { + // node = q * c[0] + c[1] + coordinates[1] = node % q; + coordinates[0] = (node - coordinates[1])/q; +} + +void node_coordinates_2i(int p, int q, int node, int* my_row, int* my_col) { + // node = q * my_row + my_col + *my_col = node % q; + *my_row = (node - *my_col)/q; +} + +int get_node(int p, int q, int i, int j) { + return q*(i%p) + (j%q); +} + +// cf stackoverflow (https://stackoverflow.com/questions/504810/how-do-i-find-the-current-machines-full-hostname-in-c-hostname-and-domain-info) +void get_host_name(char* hostname, int buffer_size) { + hostname[buffer_size - 1] = '\0'; + gethostname(hostname, buffer_size - 1); +} diff --git a/TP2/src/utils.h b/TP2/src/utils.h new file mode 100644 index 0000000..904d47a --- /dev/null +++ b/TP2/src/utils.h @@ -0,0 +1,34 @@ +#ifndef PROGPARALLEL_UTILS_H +#define PROGPARALLEL_UTILS_H + +#define max(a,b) \ + ({ __typeof__ (a) _a = (a); \ + __typeof__ (b) _b = (b); \ + _a > _b ? _a : _b; }) + +// fill the content of mat with values val +void val_mat(int m, int n, float* mat, float val); +// fill the content of mat with random values from 0.0 to max +void rand_mat(int m, int n, float* mat, float max); +// b = alpha*a + b +void myblas_sgepxy(float alpha, float* a, float* b, int m, int n); + +// return the time between start and stop in µs +long unsigned int time_interval(struct timeval start,struct timeval stop); +// deprecated +void print_gflops(struct timeval stop, struct timeval start, int m, int n, int k, int b, int kernel, char* name, float * c); +// print the content of a[0:m-1,0;n-1] with given name +void print_mat(float* a, int m, int n, char* name); + +// fill coordinates according to node = q * coordinates[0] + coordinates[1] +void node_coordinates(int p, int q, int node, int* coordinates); +// fill my_row/col according to node = q * my_row + my_col +void node_coordinates_2i(int p, int q, int node, int* my_row, int* my_col); +// return the owner node of a block A_i,j on a p x q grid. +int get_node(int p, int q, int i, int j); +// return i*n +j; +int item_2d(int i, int j, int m, int n); + +// get the name of the machine +void get_host_name(char* hostname, int buffer_size); +#endif diff --git a/TP2/src/who_am_i.c b/TP2/src/who_am_i.c new file mode 100644 index 0000000..57b1c8b --- /dev/null +++ b/TP2/src/who_am_i.c @@ -0,0 +1,23 @@ +#include +#include + +int main( int argc, char *argv[] ) { + + int rank, size; + int l; + char name[MPI_MAX_PROCESSOR_NAME]; + + //MPI_Init (&argc, &argv); /* starts MPI */ + MPI_Init (NULL, NULL); /* starts MPI */ + + MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */ + MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */ + + MPI_Get_processor_name(name, &l); /* get processor name */ + + printf("Hello world from process %d of %d on processor named %s\n", rank, size, name); + + MPI_Finalize(); + + return 0; +} diff --git a/TP2/subject_mpi.pdf b/TP2/subject_mpi.pdf new file mode 100644 index 0000000..8801272 Binary files /dev/null and b/TP2/subject_mpi.pdf differ diff --git a/TP2/utils.sh b/TP2/utils.sh new file mode 100755 index 0000000..fbf04df --- /dev/null +++ b/TP2/utils.sh @@ -0,0 +1,53 @@ +TOOLS_DIR=/mnt/n7fs/ens/tp_guivarch/opt2021 +SIMGRID_DIR=$TOOLS_DIR/simgrid-3.31 +VITE_DIR=$TOOLS_DIR/vite + +export PATH=${SIMGRID_DIR}/bin:${PATH} + +# for check and bench + +tmp=$HOME/tmp_simgrid +mkdir -p $tmp +my_mpirun="$SIMGRID_DIR/bin/smpirun -trace --cfg=smpi/tmpdir:$tmp" +traces="traces" +exec=build/bin/main + +generate_hostfile() { + N=${1:-4} + mkdir -p hostfiles + rm -f hostfiles/hostfile.$N.txt + for i in $(seq 1 $N); do + echo node-${i}.simgrid.org >>hostfiles/hostfile.$N.txt + done +} + +run() { + human=${1:-0} + mkdir -p $out + echo $my_mpirun $mpi_options ${exec:-build/bin/main} -m $m -k $k -n $n -b $b -a $algo -p $p -q $q -i $iter $options + $my_mpirun $mpi_options ${exec:-build/bin/main} -m $m -k $k -n $n -b $b -a $algo -p $p -q $q -i $iter $options &>$out/$algo.out + echo reading $out/$algo.out + correct=$(grep -i "gemm is correct" "$out/$algo.out" | wc -l) + trial=$(grep "Gflop/s" $out/$algo.out | grep $algo | wc -l) + echo Found $correct correct GEMM out of $trial + + while read line; do + # [0] (p2p) measured_wtime = 0.000058s (la=0) | 0.002195 Gflop/s + gflops=$(echo $line | grep -o "| .* Gflop/s" | grep -o "[0-9]\\+.[0-9]\\+") + if [ $human -eq 0 ]; then + echo "$m,$k,$n,$b,$p,$q,$algo,$la,$gflops" + else + echo "mxnxk=${m}x${n}x${k},b=$b,p x q = $p x $q | using $algo, (lookahead:$la) => $gflops Gflop/s" + fi + echo "$m,$k,$n,$b,$p,$q,$algo,$la,$gflops" >>$csv + done < <(grep "Gflop/s" $out/$algo.out | grep $algo) + + if [ $la -gt 0 ]; then + algo=$algo-$la + fi + + mkdir -p $traces + mv -f smpi_simgrid.trace $traces/$algo.trace + echo You can open $traces/$algo.trace with $VITE_DIR/build/bin/vite + echo +}